DO NOT MERGE - Merge Android 10 into master

Bug: 139893257
Change-Id: Ia689415b12b13ac64b5e7380205a293eba100bf7
diff --git a/Android.mk b/Android.mk
index 243ef66..90b205f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -22,26 +22,34 @@
 # (for example, projected). See b/30064991
 ifeq (,$(TARGET_BUILD_APPS))
   LOCAL_PACKAGE_NAME := CarSettings
+  LOCAL_OVERRIDES_PACKAGES := Settings
   LOCAL_PRIVATE_PLATFORM_APIS := true
 
   LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
   LOCAL_USE_AAPT2 := true
 
-  LOCAL_JAVA_LIBRARIES += android.car
+  LOCAL_JAVA_LIBRARIES := \
+      android.car \
+      telephony-common
 
   LOCAL_STATIC_ANDROID_LIBRARIES := \
       androidx.car_car \
-      androidx.preference_preference \
-      androidx.legacy_legacy-preference-v14 \
+      androidx.lifecycle_lifecycle-common-java8 \
       androidx.lifecycle_lifecycle-extensions \
-      car-list \
+      androidx.preference_preference \
+      androidx-constraintlayout_constraintlayout \
+      car-apps-common \
       car-settings-lib \
-      setup-wizard-lib-gingerbread-compat \
+      car-setup-wizard-lib-utils \
       SettingsLib
 
-  LOCAL_RESOURCE_DIR := \
-      $(LOCAL_PATH)/res
+  # Including the resources for the static android libraries allows this app to pick up their static overlays.
+  LOCAL_RESOURCE_DIR += \
+      $(LOCAL_PATH)/res \
+      $(LOCAL_PATH)/../libs/car-apps-common/res \
+      $(LOCAL_PATH)/../libs/car-settings-lib/res \
+      $(LOCAL_PATH)/../../../../frameworks/base/packages/SettingsLib/res
 
   LOCAL_CERTIFICATE := platform
 
@@ -53,19 +61,78 @@
 
   LOCAL_DEX_PREOPT := false
 
-  LOCAL_STATIC_JAVA_LIBRARIES += jsr305
+  LOCAL_STATIC_JAVA_LIBRARIES := \
+      android.car.userlib \
+      androidx-constraintlayout_constraintlayout-solver \
+      jsr305
+
+  LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.car.settings
 
   LOCAL_DX_FLAGS := --multi-dex
 
-  ifdef DISABLE_AOSP_PHONE_SETTING
-    ifeq ($(DISABLE_AOSP_PHONE_SETTING),true)
-      # This will hide AOSP phone setting.
-      LOCAL_OVERRIDES_PACKAGES := Settings
-    endif
-  endif
   include $(BUILD_PACKAGE)
 endif
 
+###################################################################################
+# Duplicate of CarSettings which includes testing only resources for Robolectric #
+###################################################################################
+include $(CLEAR_VARS)
+
+# To avoid build errors, build empty package for non-platform builds
+# (for example, projected). See b/30064991
+ifeq (,$(TARGET_BUILD_APPS))
+  LOCAL_PACKAGE_NAME := CarSettingsForTesting
+  LOCAL_OVERRIDES_PACKAGES := Settings
+  LOCAL_PRIVATE_PLATFORM_APIS := true
+
+  LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+  LOCAL_USE_AAPT2 := true
+
+  LOCAL_JAVA_LIBRARIES := \
+      android.car \
+      telephony-common
+
+  LOCAL_STATIC_ANDROID_LIBRARIES := \
+      androidx.car_car \
+      androidx.lifecycle_lifecycle-common-java8 \
+      androidx.lifecycle_lifecycle-extensions \
+      androidx.preference_preference \
+      androidx-constraintlayout_constraintlayout \
+      car-apps-common \
+      car-settings-lib \
+      car-setup-wizard-lib-utils \
+      SettingsLib
+
+  # Testing only resources must be applied first so they take precedence.
+  LOCAL_RESOURCE_DIR := \
+      $(LOCAL_PATH)/tests/robotests/res \
+      $(LOCAL_PATH)/res \
+      $(LOCAL_PATH)/../libs/car-apps-common/res \
+      $(LOCAL_PATH)/../libs/car-settings-lib/res \
+      $(LOCAL_PATH)/../../../../frameworks/base/packages/SettingsLib/res
+
+  LOCAL_CERTIFICATE := platform
+
+  LOCAL_MODULE_TAGS := optional
+
+  LOCAL_PROGUARD_ENABLED := disabled
+
+  LOCAL_PRIVILEGED_MODULE := true
+
+  LOCAL_DEX_PREOPT := false
+
+  LOCAL_STATIC_JAVA_LIBRARIES := \
+      android.car.userlib \
+      androidx-constraintlayout_constraintlayout-solver \
+      jsr305
+
+  LOCAL_DX_FLAGS := --multi-dex
+
+  include $(BUILD_PACKAGE)
+endif
+###################################################################################
+
 # Use the following include to make our test apk.
 ifeq (,$(ONE_SHOT_MAKEFILE))
 include $(call first-makefiles-under, $(LOCAL_PATH))
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a92c87b..6d0416d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,20 +17,23 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.car.settings"
-    android:sharedUserId="android.uid.system"
-    android:versionCode="1"
-    android:versionName="1.0">
+          package="com.android.car.settings"
+          coreApp="true"
+          android:sharedUserId="android.uid.system"
+          android:versionCode="1"
+          android:versionName="1.0">
 
     <uses-sdk
         android:minSdkVersion="24"
         android:targetSdkVersion="24"/>
 
+    <uses-permission android:name="android.car.permission.CAR_ENROLL_TRUST"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.BACKUP"/>
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
     <uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
@@ -49,18 +52,25 @@
     <uses-permission android:name="android.permission.REBOOT"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+    <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
     <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
     <uses-permission android:name="android.permission.SET_TIME"/>
     <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
     <uses-permission android:name="android.permission.START_FOREGROUND"/>
+    <uses-permission android:name="android.permission.STATUS_BAR_SERVICE"/>
     <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>
     <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
 
+    <permission android:name="com.android.car.settings.SET_INITIAL_LOCK"
+        android:protectionLevel="signature|setup"/>
+
     <application
         android:icon="@drawable/ic_launcher_settings"
         android:theme="@style/CarSettingTheme"
         android:label="@string/settings_label"
+        android:requiredForAllUsers="true"
+        android:directBootAware="true"
         android:supportsRtl="true">
 
         <activity
@@ -69,54 +79,335 @@
             android:launchMode="singleTask"
             android:windowSoftInputMode="adjustPan"
             android:exported="true">
-            <!-- Set priority high enough to trump the phone setting app -->
-            <!-- TODO: once phone setting is removed from car system image, set priority to 1 -->
-            <intent-filter android:priority="10">
-                <action android:name="android.intent.action.MAIN" />
+            <!-- Keep the order of intents same as .common.FragmentResolver -->
+            <intent-filter android:priority="1">
                 <action android:name="android.settings.SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.NIGHT_DISPLAY_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.DISPLAY_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.SOUND_SETTINGS" />
+                <action android:name="android.settings.panel.action.VOLUME" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.panel.action.INTERNET_CONNECTIVITY" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.net.wifi.PICK_WIFI_NETWORK" />
+                <action android:name="android.settings.WIFI_SETTINGS" />
+                <action android:name="android.settings.WIRELESS_SETTINGS" />
+                <action android:name="android.settings.panel.action.WIFI" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.WIFI_IP_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.DATA_USAGE_SETTINGS" />
+                <action android:name="android.settings.MOBILE_DATA_USAGE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.DATA_ROAMING_SETTINGS" />
+                <action android:name="android.settings.NETWORK_OPERATOR_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.BLUETOOTH_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.LOCATION_SCANNING_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.APPLICATION_SETTINGS" />
+                <action android:name="android.settings.MANAGE_APPLICATIONS_SETTINGS" />
+                <action android:name="android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.APPLICATION_DETAILS_SETTINGS" />
+                <action android:name="android.settings.NOTIFICATION_SETTINGS" />
+                <action android:name="android.settings.CHANNEL_NOTIFICATION_SETTINGS" />
+                <action android:name="android.settings.APP_NOTIFICATION_SETTINGS" />
+                <data android:scheme="package" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.action.MANAGE_WRITE_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.USAGE_ACCESS_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.DATE_SETTINGS" />
+                <action android:name="android.intent.action.QUICK_CLOCK" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.USER_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.ADD_ACCOUNT_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.SYNC_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.INTERNAL_STORAGE_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.LOCALE_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.REQUEST_SET_AUTOFILL_SERVICE" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:scheme="package" />
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.INPUT_METHOD_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+
+            <intent-filter android:priority="100">
+                <action android:name="android.settings.DEVICE_INFO_SETTINGS" />
+                <action android:name="android.settings.DEVICE_NAME" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+
+            <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity>
+
+        <!-- Alias for launcher activity only, as this belongs to each profile. -->
+        <activity-alias android:name="Settings"
+                        android:label="@string/settings_label"
+                        android:launchMode="singleTask"
+                        android:targetActivity=".common.CarSettingActivity">
+            <intent-filter android:priority="1">
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
             <meta-data android:name="distractionOptimized" android:value="true"/>
-        </activity>
+        </activity-alias>
 
         <activity android:name=".bluetooth.BluetoothPairingDialog"
                   android:excludeFromRecents="true"
                   android:windowSoftInputMode="stateVisible|adjustResize"
+                  android:taskAffinity="car.settings.bluetooth"
+                  android:launchMode="singleTask"
                   android:theme="@*android:style/Theme.DeviceDefault.Settings.Dialog.NoActionBar">
+            <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity>
+
+        <activity android:name=".bluetooth.BluetoothDevicePickerActivity"
+                  android:label="@string/bluetooth_device_picker"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:clearTaskOnLaunch="true">
+            <intent-filter>
+                <action android:name="android.bluetooth.devicepicker.action.LAUNCH" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".bluetooth.BluetoothRequestPermissionActivity"
+                  android:theme="@style/ActionDialogTheme"
+                  android:excludeFromRecents="true"
+                  android:clearTaskOnLaunch="true"
+                  android:launchMode="singleInstance">
+            <intent-filter>
+                <action android:name="android.bluetooth.adapter.action.REQUEST_DISCOVERABLE" />
+                <action android:name="android.bluetooth.adapter.action.REQUEST_ENABLE" />
+                <action android:name="android.bluetooth.adapter.action.REQUEST_DISABLE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
         </activity>
 
         <activity android:name=".accounts.AddAccountActivity"
                   android:theme="@android:style/Theme.Translucent.NoTitleBar"
-                  android:configChanges="orientation|keyboardHidden|screenSize">
+                  android:configChanges="orientation|keyboardHidden|screenSize"/>
+
+        <activity android:name=".applications.managedomainurls.ManageDomainUrlsActivity"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize"
+                  android:exported="true">
             <intent-filter>
-                <action android:name="android.car.settings.ADD_ACCOUNT_SETTINGS" />
+                <action android:name="android.settings.MANAGE_DOMAIN_URLS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity>
+
+        <activity android:name=".applications.assist.ManageAssistActivity"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize"
+                  android:exported="true">
+            <intent-filter>
+                <action android:name="android.settings.VOICE_INPUT_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="distractionOptimized" android:value="true"/>
         </activity>
 
         <activity android:name=".security.SettingsScreenLockActivity"
                   android:configChanges="orientation|keyboardHidden|screenSize"
                   android:windowSoftInputMode="adjustResize">
+            <intent-filter>
+                <action android:name="android.car.settings.SCREEN_LOCK_ACTIVITY" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="distractionOptimized" android:value="true"/>
         </activity>
 
-        <activity android:name=".security.SetupWizardScreenLockActivity"
-                  android:theme="@style/Theme.Car.Shared.SetupWizard.NoActionBar"
+        <activity android:name=".security.CheckLockActivity"
                   android:configChanges="orientation|keyboardHidden|screenSize"
                   android:windowSoftInputMode="adjustResize">
             <intent-filter>
-                <action android:name="android.car.settings.SETUP_WIZARD_SCREEN_LOCK_ACTIVITY" />
+                <action android:name="android.app.action.CONFIRM_DEVICE_CREDENTIAL" />
+                <action android:name="android.app.action.CONFIRM_FRP_CREDENTIAL" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
 
+        <activity android:name=".security.AddTrustedDeviceActivity"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize">
+        </activity>
+
+        <activity android:name=".system.ThirdPartyLicensesActivity"
+                  android:label="@string/settings_license_activity_title"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize">
+            <intent-filter>
+                <action android:name="android.settings.THIRD_PARTY_LICENSE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".system.RegulatoryInfoDisplayActivity"
+            android:label="@string/regulatory_labels"
+            android:enabled="@bool/config_show_regulatory_info">
+            <intent-filter>
+                <action android:name="android.settings.SHOW_REGULATORY_INFO" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".location.LocationSettingsActivity"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize"
+                  android:exported="true">
+            <intent-filter>
+                <action android:name="android.settings.LOCATION_SOURCE_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity>
+
+        <activity android:name=".datausage.DataWarningAndLimitActivity"
+                  android:configChanges="orientation|keyboardHidden|screenSize"
+                  android:windowSoftInputMode="adjustResize"
+                  android:exported="true">
+            <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity>
+
+        <activity
+            android:name=".wifi.WifiRequestToggleActivity"
+            android:theme="@style/ActionDialogTheme"
+            android:excludeFromRecents="true"
+            android:clearTaskOnLaunch="true"
+            android:launchMode="singleInstance">
+            <intent-filter>
+                <action android:name="android.net.wifi.action.REQUEST_ENABLE" />
+                <action android:name="android.net.wifi.action.REQUEST_DISABLE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <!-- This logic is copied from phone.-->
+        <!-- Ensures there's lightweight fallback activity when no other MAIN/HOME activity is present.-->
+        <activity android:name=".FallbackHome"
+                  android:excludeFromRecents="true"
+                  android:label=""
+                  android:screenOrientation="nosensor"
+                  android:theme="@style/FallbackHome">
+            <intent-filter android:priority="-900">
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.HOME" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="distractionOptimized" android:value="true"/>
+        </activity>
+
         <service android:name=".bluetooth.BluetoothPairingService" />
 
+        <service android:name=".setupservice.InitialLockSetupService"
+                 android:exported="true"
+                 android:permission="com.android.car.settings.SET_INITIAL_LOCK"/>
+
         <receiver android:name=".bluetooth.BluetoothPairingRequest">
             <intent-filter>
                 <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
             </intent-filter>
         </receiver>
 
+        <!-- FileProvider to share a generated license html file.
+             Note that "com.android.settings.files" is set here as its authorities because a Uri
+             permission grant should be allowed to share a file with an external browser but it is
+             allowed only for Settings' authorities in ActivityManagerService.  -->
+        <provider android:name="androidx.core.content.FileProvider"
+                  android:authorities="com.android.settings.files"
+                  android:grantUriPermissions="true"
+                  android:exported="false">
+            <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
+                       android:resource="@xml/file_paths" />
+        </provider>
+
     </application>
 </manifest>
diff --git a/res/anim/fade_in_top.xml b/res/anim/fade_in_top.xml
deleted file mode 100644
index b573f21..0000000
--- a/res/anim/fade_in_top.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <alpha
-        android:fromAlpha="0.2"
-        android:toAlpha="1"
-        android:duration="@android:integer/config_mediumAnimTime" />
-    <translate
-        android:fromYDelta="-100%p"
-        android:toYDelta="0"
-        android:interpolator="@android:interpolator/linear_out_slow_in"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
diff --git a/res/anim/fade_out_top.xml b/res/anim/fade_out_top.xml
deleted file mode 100644
index e04518e..0000000
--- a/res/anim/fade_out_top.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <alpha
-        android:fromAlpha="1.0"
-        android:toAlpha="0.2"
-        android:duration="@android:integer/config_mediumAnimTime" />
-    <translate
-        android:fromYDelta="0"
-        android:toYDelta="-100%p"
-        android:interpolator="@android:interpolator/linear_out_slow_in"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
diff --git a/res/anim/trans_fade_in.xml b/res/anim/trans_fade_in.xml
index 86ea64c..518586a 100644
--- a/res/anim/trans_fade_in.xml
+++ b/res/anim/trans_fade_in.xml
@@ -1,24 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
 
 <set xmlns:android="http://schemas.android.com/apk/res/android">
-
     <alpha
+        android:duration="@android:integer/config_mediumAnimTime"
         android:fromAlpha="0.2"
-        android:toAlpha="1"
-        android:duration="@android:integer/config_mediumAnimTime" />
+        android:toAlpha="1"/>
 </set>
diff --git a/res/anim/trans_fade_out.xml b/res/anim/trans_fade_out.xml
index aaa22d5..d53aae0 100644
--- a/res/anim/trans_fade_out.xml
+++ b/res/anim/trans_fade_out.xml
@@ -1,24 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
 
 <set xmlns:android="http://schemas.android.com/apk/res/android">
-
     <alpha
+        android:duration="@android:integer/config_mediumAnimTime"
         android:fromAlpha="1.0"
-        android:toAlpha="0.2"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
+        android:toAlpha="0.2"/>
+</set>
diff --git a/res/anim/trans_right_in.xml b/res/anim/trans_right_in.xml
deleted file mode 100644
index 1a93266..0000000
--- a/res/anim/trans_right_in.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate
-        android:fromXDelta="100%p"
-        android:toXDelta="0"
-        android:interpolator="@android:interpolator/linear_out_slow_in"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
diff --git a/res/anim/trans_right_out.xml b/res/anim/trans_right_out.xml
deleted file mode 100644
index 9e1bc6e..0000000
--- a/res/anim/trans_right_out.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <translate
-        android:fromXDelta="0"
-        android:toXDelta="100%p"
-        android:interpolator="@android:interpolator/linear_out_slow_in"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
diff --git a/res/animator/trans_left_in.xml b/res/animator/trans_left_in.xml
index 2903660..ee3a124 100644
--- a/res/animator/trans_left_in.xml
+++ b/res/animator/trans_left_in.xml
@@ -1,32 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
+
 <set xmlns:android="http://schemas.android.com/apk/res/android">
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="translationX"
         android:valueFrom="-100dp"
         android:valueTo="0dp"
-        android:valueType="floatType"
-        android:propertyName="translationX"
-        android:duration="@android:integer/config_mediumAnimTime" />
+        android:valueType="floatType"/>
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="alpha"
         android:valueFrom="0.0"
         android:valueTo="1.0"
-        android:valueType="floatType"
-        android:propertyName="alpha"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
+        android:valueType="floatType"/>
+</set>
diff --git a/res/animator/trans_left_out.xml b/res/animator/trans_left_out.xml
index eca6489..e5eaf2f 100644
--- a/res/animator/trans_left_out.xml
+++ b/res/animator/trans_left_out.xml
@@ -1,32 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
+
 <set xmlns:android="http://schemas.android.com/apk/res/android">
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="translationX"
         android:valueFrom="0dp"
         android:valueTo="-100dp"
-        android:valueType="floatType"
-        android:propertyName="translationX"
-        android:duration="@android:integer/config_mediumAnimTime" />
+        android:valueType="floatType"/>
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="alpha"
         android:valueFrom="1.0"
         android:valueTo="0.0"
-        android:valueType="floatType"
-        android:propertyName="alpha"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
+        android:valueType="floatType"/>
+</set>
diff --git a/res/animator/trans_right_in.xml b/res/animator/trans_right_in.xml
index bd4e588..c9c339b 100644
--- a/res/animator/trans_right_in.xml
+++ b/res/animator/trans_right_in.xml
@@ -1,34 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
-** Copyright 2017, 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.
-*/
+    Copyright 2017 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.
 -->
+
 <set xmlns:android="http://schemas.android.com/apk/res/android">
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="translationX"
         android:valueFrom="100dp"
         android:valueTo="0dp"
-        android:valueType="floatType"
-        android:propertyName="translationX"
-        android:duration="@android:integer/config_mediumAnimTime" />
+        android:valueType="floatType"/>
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="alpha"
         android:valueFrom="0.0"
         android:valueTo="1.0"
-        android:valueType="floatType"
-        android:propertyName="alpha"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
+        android:valueType="floatType"/>
+</set>
diff --git a/res/animator/trans_right_out.xml b/res/animator/trans_right_out.xml
index 803e1e4..df7e75b 100644
--- a/res/animator/trans_right_out.xml
+++ b/res/animator/trans_right_out.xml
@@ -1,34 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
-** Copyright 2017, 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.
-*/
+    Copyright 2017 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.
 -->
+
 <set xmlns:android="http://schemas.android.com/apk/res/android">
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="translationX"
         android:valueFrom="0dp"
         android:valueTo="100dp"
-        android:valueType="floatType"
-        android:propertyName="translationX"
-        android:duration="@android:integer/config_mediumAnimTime" />
+        android:valueType="floatType"/>
     <objectAnimator
+        android:duration="@android:integer/config_mediumAnimTime"
         android:interpolator="@android:interpolator/decelerate_quint"
+        android:propertyName="alpha"
         android:valueFrom="1.0"
         android:valueTo="0.0"
-        android:valueType="floatType"
-        android:propertyName="alpha"
-        android:duration="@android:integer/config_mediumAnimTime" />
-</set>
\ No newline at end of file
+        android:valueType="floatType"/>
+</set>
diff --git a/res/color/action_bar_btn.xml b/res/color/action_bar_btn.xml
deleted file mode 100644
index a6446d8..0000000
--- a/res/color/action_bar_btn.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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:state_enabled="true"
-          android:color="@color/car_accent" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_accent" />
-</selector>
\ No newline at end of file
diff --git a/res/color/lock_pattern_regular.xml b/res/color/lock_pattern_regular.xml
deleted file mode 100644
index 67e4fba..0000000
--- a/res/color/lock_pattern_regular.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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:state_enabled="true"
-          android:color="@color/car_body1" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_body1" />
-</selector>
\ No newline at end of file
diff --git a/res/color/lock_pattern_regular_dark.xml b/res/color/lock_pattern_regular_dark.xml
deleted file mode 100644
index d3ba4ed..0000000
--- a/res/color/lock_pattern_regular_dark.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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:state_enabled="true"
-          android:color="@color/car_body1_dark" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_body1_dark" />
-</selector>
\ No newline at end of file
diff --git a/res/color/lock_pattern_regular_light.xml b/res/color/lock_pattern_regular_light.xml
deleted file mode 100644
index 5b47d6b..0000000
--- a/res/color/lock_pattern_regular_light.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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:state_enabled="true"
-          android:color="@color/car_body1_light" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_body1_light" />
-</selector>
\ No newline at end of file
diff --git a/res/color/lock_pattern_success.xml b/res/color/lock_pattern_success.xml
deleted file mode 100644
index bee9145..0000000
--- a/res/color/lock_pattern_success.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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:state_enabled="true"
-          android:color="@color/car_blue_500" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_blue_500" />
-</selector>
\ No newline at end of file
diff --git a/res/color/lock_pattern_success_dark.xml b/res/color/lock_pattern_success_dark.xml
deleted file mode 100644
index 33ad70e..0000000
--- a/res/color/lock_pattern_success_dark.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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:state_enabled="true"
-          android:color="@color/car_teal_700" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_teal_700" />
-</selector>
\ No newline at end of file
diff --git a/res/color/lock_pattern_success_light.xml b/res/color/lock_pattern_success_light.xml
deleted file mode 100644
index eb834c4..0000000
--- a/res/color/lock_pattern_success_light.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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:state_enabled="true"
-          android:color="@color/car_teal_200" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_teal_200" />
-</selector>
\ No newline at end of file
diff --git a/res/color/text_body_1.xml b/res/color/text_body_1.xml
deleted file mode 100644
index e7b5f40..0000000
--- a/res/color/text_body_1.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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:state_enabled="true"
-          android:color="@color/car_body1" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_body1" />
-</selector>
\ No newline at end of file
diff --git a/res/color/text_body_2.xml b/res/color/text_body_2.xml
deleted file mode 100644
index 543d2ce..0000000
--- a/res/color/text_body_2.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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:state_enabled="true"
-          android:color="@color/car_body2" />
-    <item android:state_enabled="false"
-          android:alpha="0.5"
-          android:color="@color/car_body2" />
-</selector>
\ No newline at end of file
diff --git a/res/color/toggle_bg.xml b/res/color/toggle_bg.xml
index f48f216..8b5e8d6 100644
--- a/res/color/toggle_bg.xml
+++ b/res/color/toggle_bg.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -16,9 +16,8 @@
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:state_enabled="false"
-      android:color="@color/toggle_bg_disabled"/>
-  <item android:state_enabled="true"
-      android:color="@color/car_accent"/>
-  <item android:color="@color/car_accent"/>
-</selector>
\ No newline at end of file
+    <item
+        android:color="?attr/quickSettingsEnabledColor"
+        android:state_enabled="true"/>
+    <item android:color="?attr/quickSettingsDisabledColor"/>
+</selector>
diff --git a/res/color/toggle_icon_tint.xml b/res/color/toggle_icon_tint.xml
index 41388ba..a977107 100644
--- a/res/color/toggle_icon_tint.xml
+++ b/res/color/toggle_icon_tint.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -16,9 +16,8 @@
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-  <item android:state_enabled="false"
-      android:color="@color/toggle_icon_disabled"/>
-  <item android:state_enabled="true"
-      android:color="@color/car_card"/>
-  <item android:color="@color/car_card"/>
-</selector>
\ No newline at end of file
+    <item
+        android:color="?attr/quickSettingsIconEnabledColor"
+        android:state_enabled="true"/>
+    <item android:color="?attr/quickSettingsIconDisabledColor"/>
+</selector>
diff --git a/res/drawable/brightness_seekbar_track.xml b/res/drawable/brightness_seekbar_track.xml
new file mode 100644
index 0000000..7cacf25
--- /dev/null
+++ b/res/drawable/brightness_seekbar_track.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2017 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">
+    <!-- Use android provided id, as seekbar is expecting that -->
+    <item android:id="@android:id/background">
+        <shape android:shape="line">
+            <corners android:radius="@dimen/brightness_seekbar_track_corner"/>
+            <stroke android:width="@dimen/brightness_seekbar_track_height"/>
+        </shape>
+    </item>
+    <item android:id="@android:id/progress">
+        <clip>
+            <shape android:shape="line">
+                <stroke android:width="@dimen/brightness_seekbar_track_height"/>
+            </shape>
+        </clip>
+    </item>
+</layer-list>
diff --git a/res/drawable/button_ripple_bg.xml b/res/drawable/button_ripple_bg.xml
index 5727754..a32ea39 100644
--- a/res/drawable/button_ripple_bg.xml
+++ b/res/drawable/button_ripple_bg.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -15,9 +15,10 @@
     limitations under the License.
 -->
 
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
-        android:color="@color/car_card_ripple_background"
-        android:radius="@dimen/toggle_ripple">
-    <item android:id="@android:id/mask"
-          android:drawable="@drawable/rectangle_ripple_mask" />
+<ripple
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?android:attr/colorControlHighlight">
+    <item
+        android:id="@android:id/mask"
+        android:drawable="@drawable/rectangle_ripple_mask"/>
 </ripple>
diff --git a/res/drawable/car_add_circle_round.xml b/res/drawable/car_add_circle_round.xml
deleted file mode 100644
index 74fd8a4..0000000
--- a/res/drawable/car_add_circle_round.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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>
-        <shape android:shape="oval">
-            <solid
-                android:color="@color/car_user_switcher_add_user_background_color"/>
-            <size
-                android:width="@dimen/car_user_switcher_image_avatar_size"
-                android:height="@dimen/car_user_switcher_image_avatar_size"/>
-        </shape>
-    </item>
-    <item
-        android:drawable="@drawable/car_ic_add"
-        android:gravity="center"/>
-</layer-list>
\ No newline at end of file
diff --git a/res/drawable/car_ic_add.xml b/res/drawable/car_ic_add.xml
deleted file mode 100644
index 9216efc..0000000
--- a/res/drawable/car_ic_add.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-    Copyright (C) 2018 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="@dimen/car_touch_target_size"
-    android:height="@dimen/car_touch_target_size"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
-  <path
-      android:fillColor="@color/car_user_switcher_add_user_add_sign_color"
-      android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/car_ic_navigation.xml b/res/drawable/car_ic_navigation.xml
new file mode 100644
index 0000000..0a6fa2e
--- /dev/null
+++ b/res/drawable/car_ic_navigation.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2019 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:viewportWidth="44.0"
+        android:viewportHeight="44.0"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size">
+    <path
+        android:pathData="M39.8016667 20.6983333L23.3016667 4.19833333C22.5866667 3.48333333 21.4316667 3.48333333 20.7166667 4.19833333L4.21666667 20.6983333C3.50166667 21.4133333 3.50166667 22.5683333 4.21666667 23.2833333L20.7166667 39.7833333C21.4316667 40.4983333 22.5866667 40.4983333 23.3016667 39.7833333L39.8016667 23.2833333C40.5166667 22.5866667 40.5166667 21.4316667 39.8016667 20.6983333ZM25.6666667 26.5833333L25.6666667 22L18.3333333 22L18.3333333 27.5L14.6666667 27.5L14.6666667 20.1666667C14.6666667 19.1583333 15.4916667 18.3333333 16.5 18.3333333L25.6666667 18.3333333L25.6666667 13.75L32.0833333 20.1666667L25.6666667 26.5833333Z"
+        android:fillColor="?attr/iconColor" />
+</vector>
\ No newline at end of file
diff --git a/res/drawable/car_user_avatar_bg_circle.xml b/res/drawable/car_user_avatar_bg_circle.xml
deleted file mode 100644
index 55840f0..0000000
--- a/res/drawable/car_user_avatar_bg_circle.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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.
--->
-
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="oval">
-
-  <stroke
-      android:color="@color/car_user_switcher_current_user_color"
-      android:width="@dimen/car_user_switcher_current_user_circle_stroke_width"/>
-
-  <size
-      android:width="@dimen/car_user_switcher_current_user_circle_width"
-      android:height="@dimen/car_user_switcher_current_user_circle_width"/>
-
-</shape>
\ No newline at end of file
diff --git a/res/drawable/circle_bg.xml b/res/drawable/circle_bg.xml
index 5fc37ad..7b56ee0 100644
--- a/res/drawable/circle_bg.xml
+++ b/res/drawable/circle_bg.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -18,11 +18,9 @@
 <shape
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="oval">
-
-  <solid
-      android:color="@color/toggle_bg"/>
-
-  <size
-      android:width="@dimen/car_touch_target_size"
-      android:height="@dimen/car_touch_target_size"/>
-</shape>
\ No newline at end of file
+    <solid
+        android:color="@color/toggle_bg"/>
+    <size
+        android:width="@dimen/touch_target_size"
+        android:height="@dimen/touch_target_size"/>
+</shape>
diff --git a/res/drawable/circle_ripple_bg.xml b/res/drawable/circle_ripple_bg.xml
index c9c4cf8..85a9adc 100644
--- a/res/drawable/circle_ripple_bg.xml
+++ b/res/drawable/circle_ripple_bg.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -15,7 +15,8 @@
     limitations under the License.
 -->
 
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
-        android:color="@color/car_card_ripple_background"
-        android:radius="@dimen/toggle_ripple">
+<ripple
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?android:attr/colorControlHighlight"
+    android:radius="@dimen/circle_ripple_bg_radius">
 </ripple>
diff --git a/res/drawable/color_progress_bar.xml b/res/drawable/color_progress_bar.xml
new file mode 100644
index 0000000..10a2891
--- /dev/null
+++ b/res/drawable/color_progress_bar.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@android:id/background"
+          android:gravity="center_vertical|fill_horizontal">
+        <shape android:shape="rectangle"
+               android:tint="@color/config_progress_background_tint">
+            <solid android:color="@color/white_disabled_material"/>
+        </shape>
+    </item>
+    <item android:id="@android:id/progress"
+          android:gravity="center_vertical|fill_horizontal">
+        <scale android:scaleWidth="100%">
+            <shape android:shape="rectangle"
+                   android:tint="?android:attr/colorControlActivated">
+                <solid android:color="@android:color/white"/>
+            </shape>
+        </scale>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/res/drawable/divider.xml b/res/drawable/divider.xml
new file mode 100644
index 0000000..e6ed481
--- /dev/null
+++ b/res/drawable/divider.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<inset
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:insetLeft="@dimen/divider_inset_left"
+    android:insetRight="@dimen/divider_inset_right">
+    <shape>
+        <size android:height="@dimen/divider_height"/>
+        <solid android:color="?attr/dividerColor"/>
+    </shape>
+</inset>
diff --git a/res/drawable/ic_account.xml b/res/drawable/ic_account.xml
index 8dba222..f7a666d 100644
--- a/res/drawable/ic_account.xml
+++ b/res/drawable/ic_account.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M3,5v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2L5,3c-1.11,0 -2,0.9 -2,2zM15,9c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3 1.34,-3 3,-3 3,1.34 3,3zM6,17c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1v1L6,18v-1z"/>
 </vector>
diff --git a/res/drawable/ic_add.xml b/res/drawable/ic_add.xml
index 1282ade..458f8bf 100644
--- a/res/drawable/ic_add.xml
+++ b/res/drawable/ic_add.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint" >
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="?attr/iconColor"
         android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
 </vector>
diff --git a/res/drawable/ic_arrow_back.xml b/res/drawable/ic_arrow_back.xml
index 1314fef..f23c621 100644
--- a/res/drawable/ic_arrow_back.xml
+++ b/res/drawable/ic_arrow_back.xml
@@ -1,30 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
 
 <!-- This Icon is used in as the back icon on ActionBar. ActionBar hard code the icon layout and
   ~  does not provide a way to customize it. Here to center the icon in action bar, we make up
   ~  the margin by add the extra space in the icon itself -->
 <vector
-    android:height="@dimen/car_primary_icon_size"
-    android:width="@dimen/car_primary_icon_size"
-    android:tint="@color/car_accent"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
     android:viewportHeight="24.0"
-    android:viewportWidth="24.0"
-    xmlns:android="http://schemas.android.com/apk/res/android">
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="?attr/iconColor"
         android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
 </vector>
diff --git a/res/drawable/ic_arrow_drop_down.xml b/res/drawable/ic_arrow_drop_down.xml
index 487b2ff..854660a 100644
--- a/res/drawable/ic_arrow_drop_down.xml
+++ b/res/drawable/ic_arrow_drop_down.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="@dimen/car_primary_icon_size"
-        android:width="@dimen/car_primary_icon_size"
-        android:tint="@color/car_tint"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:pathData="M7,10l5,5 5,-5z"
-        android:fillColor="#000000"/>
+        android:fillColor="?attr/iconColor"
+        android:pathData="M7,10l5,5 5,-5z"/>
 </vector>
diff --git a/res/drawable/ic_arrow_forward.xml b/res/drawable/ic_arrow_forward.xml
index 42fcbca..2b6b63c 100644
--- a/res/drawable/ic_arrow_forward.xml
+++ b/res/drawable/ic_arrow_forward.xml
@@ -1,27 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24"
+    android:viewportWidth="24">
+    <path android:pathData="M0 0h24v24H0z"/>
     <path
-        android:pathData="M0 0h24v24H0z" />
-    <path
-        android:fillColor="#FFFFFF"
-        android:pathData="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" />
+        android:fillColor="?attr/iconColor"
+        android:pathData="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/>
 </vector>
diff --git a/res/drawable/ic_arrow_forward_on_disc.xml b/res/drawable/ic_arrow_forward_on_disc.xml
deleted file mode 100644
index 6cff5e5..0000000
--- a/res/drawable/ic_arrow_forward_on_disc.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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>
-        <shape android:shape="oval">
-            <solid android:color="@color/google_blue_600" />
-            <size
-                android:width="@dimen/pin_pad_icon_size"
-                android:height="@dimen/pin_pad_icon_size" />
-        </shape>
-    </item>
-    <item android:drawable="@drawable/ic_arrow_forward" />
-</layer-list>
-
diff --git a/res/drawable/ic_audio_navi.xml b/res/drawable/ic_audio_navi.xml
index f2b1517..4919d18 100644
--- a/res/drawable/ic_audio_navi.xml
+++ b/res/drawable/ic_audio_navi.xml
@@ -1,25 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint" >
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <!-- Use solid fillColor for mask. Icon tint color will be applied after icon is loaded. -->
     <path
         android:fillColor="#FF000000"
         android:pathData="M18.92,5.01C18.72,4.42 18.16,4 17.5,4h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,11v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,12 6.5,12s1.5,0.67 1.5,1.5S7.33,15 6.5,15zM17.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,10l1.5,-4.5h11L19,10L5,10z"/>
diff --git a/res/drawable/ic_backspace.xml b/res/drawable/ic_backspace.xml
index fb0bb24..d2ea585 100644
--- a/res/drawable/ic_backspace.xml
+++ b/res/drawable/ic_backspace.xml
@@ -1,25 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="?attr/iconColor"
         android:pathData="M22,3H7C6.31,3 5.77,3.35 5.41,3.88l-5.04,7.57c-0.22,0.34 -0.22,0.77 0,1.11l5.04,7.56C5.77,20.64 6.31,21 7,21h15c1.1,0 2,-0.9 2,-2V5C24,3.9 23.1,3 22,3zM18.3,16.3L18.3,16.3c-0.39,0.39 -1.02,0.39 -1.41,0L14,13.41l-2.89,2.89c-0.39,0.39 -1.02,0.39 -1.41,0h0c-0.39,-0.39 -0.39,-1.02 0,-1.41L12.59,12L9.7,9.11c-0.39,-0.39 -0.39,-1.02 0,-1.41l0,0c0.39,-0.39 1.02,-0.39 1.41,0L14,10.59l2.89,-2.89c0.39,-0.39 1.02,-0.39 1.41,0v0c0.39,0.39 0.39,1.02 0,1.41L15.41,12l2.89,2.89C18.68,15.27 18.68,15.91 18.3,16.3z"/>
 </vector>
diff --git a/res/drawable/ic_brightness_knob.xml b/res/drawable/ic_brightness_knob.xml
index 603a6f4..db2331a 100644
--- a/res/drawable/ic_brightness_knob.xml
+++ b/res/drawable/ic_brightness_knob.xml
@@ -1,26 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"
-        android:fillColor="@color/car_accent"/>
+        android:fillColor="?attr/quickSettingsEnabledColor"
+        android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"/>
 </vector>
diff --git a/res/drawable/ic_brightness_knob_stretched.xml b/res/drawable/ic_brightness_knob_stretched.xml
index f93a744..3e1b53a 100644
--- a/res/drawable/ic_brightness_knob_stretched.xml
+++ b/res/drawable/ic_brightness_knob_stretched.xml
@@ -1,31 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    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>
         <shape>
             <size
-                android:height="@dimen/brightness_knob_size"
-                android:width="@dimen/brightness_knob_size" />
-
-            <solid android:color="@android:color/transparent" />
+                android:width="@dimen/brightness_knob_size"
+                android:height="@dimen/brightness_knob_size"/>
+            <solid android:color="@android:color/transparent"/>
         </shape>
     </item>
     <item android:drawable="@drawable/ic_brightness_knob"/>
-
 </layer-list>
diff --git a/res/drawable/ic_bt_imaging.xml b/res/drawable/ic_bt_imaging.xml
deleted file mode 100644
index c65a7c2..0000000
--- a/res/drawable/ic_bt_imaging.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-     Copyright (C) 2017 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0"
-    android:tint="@color/car_tint">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M19,8L5,8c-1.66,0 -3,1.34 -3,3v6h4v4h12v-4h4v-6c0,-1.66 -1.34,-3
-            -3,-3zM16,19L8,19v-5h8v5zM19,12c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1
-            -1,1zM18,3L6,3v4h12L18,3z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_bt_laptop.xml b/res/drawable/ic_bt_laptop.xml
deleted file mode 100644
index a9c70ff..0000000
--- a/res/drawable/ic_bt_laptop.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-     Copyright (C) 2017 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0"
-    android:tint="@color/car_tint">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M20,18c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2H4c-1.1,0
-            -2,0.9 -2,2v10c0,1.1 0.9,2 2,2H0v2h24v-2h-4zM4,6h16v10H4V6z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_cellular_data.xml b/res/drawable/ic_cellular_data.xml
index 5a0437c..9b0b27f 100644
--- a/res/drawable/ic_cellular_data.xml
+++ b/res/drawable/ic_cellular_data.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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.
@@ -13,14 +14,16 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24.0dp"
-    android:height="24.0dp"
-    android:viewportWidth="24.0"
-    android:viewportHeight="24.0">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
+        android:fillColor="?attr/iconColor"
         android:pathData="M12.0,12.0m-9.5,0.0a9.5,9.5 0.0,1.0 1.0,19.0 0.0a9.5,9.5 0.0,1.0 1.0,-19.0 0.0
         M10.6,5.4c-0.2,-0.2 -0.5,-0.2 -0.6,0.0L7.6,9.1l2.0,0.0l0.0,3.8L11.0,12.900001L11.0,9.1l2.0,0.0L10.6,5.4z
-        M13.3,18.6c0.2,0.2 0.5,0.2 0.6,0.0l2.4,-3.7l-2.0,0.0l0.0,-3.8l-1.4,0.0l0.0,3.8l-2.0,0.0L13.3,18.6z"
-        android:fillColor="#ffffff"/>
+        M13.3,18.6c0.2,0.2 0.5,0.2 0.6,0.0l2.4,-3.7l-2.0,0.0l0.0,-3.8l-1.4,0.0l0.0,3.8l-2.0,0.0L13.3,18.6z"/>
 </vector>
diff --git a/res/drawable/ic_check.xml b/res/drawable/ic_check.xml
index fce0802..9838470 100644
--- a/res/drawable/ic_check.xml
+++ b/res/drawable/ic_check.xml
@@ -1,27 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24"
-        android:viewportHeight="24">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24"
+    android:viewportWidth="24">
     <path
-        android:pathData="M0 0h24v24H0z" />
+        android:pathData="M0 0h24v24H0z"/>
     <path
-        android:fillColor="#FFFFFF"
-        android:pathData="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z" />
+        android:fillColor="?attr/iconColor"
+        android:pathData="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/>
 </vector>
diff --git a/res/drawable/ic_check_box.xml b/res/drawable/ic_check_box.xml
new file mode 100644
index 0000000..5a7515c
--- /dev/null
+++ b/res/drawable/ic_check_box.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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:drawable="@drawable/ic_check_box_unchecked"
+        android:state_checked="false"/>
+    <item
+        android:drawable="@drawable/ic_check_box_checked"
+        android:state_checked="true"/>
+    <item android:drawable="@drawable/ic_check_box_unchecked"/>
+</selector>
diff --git a/res/drawable/ic_check_box_checked.xml b/res/drawable/ic_check_box_checked.xml
index 25a55d4..479163d 100644
--- a/res/drawable/ic_check_box_checked.xml
+++ b/res/drawable/ic_check_box_checked.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/car_primary_icon_size"
-        android:height="@dimen/car_primary_icon_size"
-        android:tint="@color/car_accent"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"
-        android:fillColor="#000000"/>
+        android:fillColor="?attr/iconColor"
+        android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/>
 </vector>
diff --git a/res/drawable/ic_check_box_unchecked.xml b/res/drawable/ic_check_box_unchecked.xml
index a88452f..70dbcd1 100644
--- a/res/drawable/ic_check_box_unchecked.xml
+++ b/res/drawable/ic_check_box_unchecked.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/car_primary_icon_size"
-        android:height="@dimen/car_primary_icon_size"
-        android:tint="@color/car_tint"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"
-        android:fillColor="#000000"/>
+        android:fillColor="?attr/iconColor"
+        android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
 </vector>
diff --git a/res/drawable/ic_check_on_disc.xml b/res/drawable/ic_check_on_disc.xml
deleted file mode 100644
index 687e199..0000000
--- a/res/drawable/ic_check_on_disc.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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>
-        <shape android:shape="oval">
-            <solid android:color="@color/google_blue_600" />
-            <size
-                android:width="@dimen/pin_pad_icon_size"
-                android:height="@dimen/pin_pad_icon_size" />
-        </shape>
-    </item>
-    <item android:drawable="@drawable/ic_check" />
-
-</layer-list>
-
diff --git a/res/drawable/ic_chevron_right.xml b/res/drawable/ic_chevron_right.xml
index a2e3745..ea9a763 100644
--- a/res/drawable/ic_chevron_right.xml
+++ b/res/drawable/ic_chevron_right.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="?attr/iconColor"
         android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>
 </vector>
diff --git a/res/drawable/ic_close.xml b/res/drawable/ic_close.xml
index 377a889..07c42ef 100644
--- a/res/drawable/ic_close.xml
+++ b/res/drawable/ic_close.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:height="@dimen/car_primary_icon_size"
-        android:width="@dimen/car_primary_icon_size"
-        android:tint="@color/car_tint"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"
-        android:fillColor="#000000"/>
+        android:fillColor="?attr/iconColor"
+        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
 </vector>
diff --git a/res/drawable/ic_delete.xml b/res/drawable/ic_delete.xml
index 84552c1..1f358ca 100644
--- a/res/drawable/ic_delete.xml
+++ b/res/drawable/ic_delete.xml
@@ -1,25 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="@color/car_tint"
-        android:pathData="M12 38c0 2.21 1.79 4 4 4h16c2.21 0 4,-1.79 4,-4V14H12v24zM38 8h-7l-2,-2H19l-2 2h-7v4h28V8z"/>
-</vector>
\ No newline at end of file
+        android:fillColor="?attr/iconColor"
+        android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
+</vector>
diff --git a/res/drawable/ic_done.xml b/res/drawable/ic_done.xml
deleted file mode 100644
index 3637853..0000000
--- a/res/drawable/ic_done.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  ~ Copyright (C) 2018 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
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M9,16.2l-3.5,-3.5a0.984,0.984 0,0 0,-1.4 0,0.984 0.984,0 0,0 0,1.4l4.19,4.19c0.39,0.39 1.02,0.39 1.41,0L20.3,7.7a0.984,0.984 0,0 0,0 -1.4,0.984 0.984,0 0,0 -1.4,0L9,16.2z"/>
-</vector>
diff --git a/res/drawable/ic_edit.xml b/res/drawable/ic_edit.xml
new file mode 100644
index 0000000..8e3332e
--- /dev/null
+++ b/res/drawable/ic_edit.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M20.41,4.94l-1.35,-1.35c-0.78,-0.78 -2.05,-0.78 -2.83,0l0,0L3,16.82V21h4.18L20.41,7.77C21.2,6.99 21.2,5.72 20.41,4.94zM6.41,19.06L5,19v-1.36l9.82,-9.82l1.41,1.41L6.41,19.06z"/>
+</vector>
diff --git a/res/drawable/ic_folder.xml b/res/drawable/ic_folder.xml
new file mode 100644
index 0000000..aed22cf
--- /dev/null
+++ b/res/drawable/ic_folder.xml
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M20,6h-8l-2,-2H4C2.9,4 2.01,4.9 2.01,6L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8C22,6.9 21.1,6 20,6zM20,18H4V8h16V18z"/>
+</vector>
diff --git a/res/drawable/ic_guest_user.xml b/res/drawable/ic_guest_user.xml
deleted file mode 100644
index 1e684b3..0000000
--- a/res/drawable/ic_guest_user.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M12,5.9c1.16,0 2.1,0.94 2.1,2.1s-0.94,2.1 -2.1,2.1S9.9,9.16 9.9,8s0.94,-2.1 2.1,-2.1m0,9c2.97,0 6.1,1.46 6.1,2.1v1.1L5.9,18.1L5.9,17c0,-0.64 3.13,-2.1 6.1,-2.1M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3c0,-2.66 -5.33,-4 -8,-4z"/>
-</vector>
diff --git a/res/drawable/ic_headset.xml b/res/drawable/ic_headset.xml
new file mode 100644
index 0000000..0de143e
--- /dev/null
+++ b/res/drawable/ic_headset.xml
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M19,15v3c0,0.55 -0.45,1 -1,1h-1v-4H19M7,15v4H6c-0.55,0 -1,-0.45 -1,-1v-3H7M12,2c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7C21,6.03 16.97,2 12,2L12,2z"/>
+</vector>
diff --git a/res/drawable/ic_keyboard_arrow_down.xml b/res/drawable/ic_keyboard_arrow_down.xml
new file mode 100644
index 0000000..45eda10
--- /dev/null
+++ b/res/drawable/ic_keyboard_arrow_down.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
+</vector>
diff --git a/res/drawable/ic_keyboard_arrow_up.xml b/res/drawable/ic_keyboard_arrow_up.xml
new file mode 100644
index 0000000..4437437
--- /dev/null
+++ b/res/drawable/ic_keyboard_arrow_up.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
+</vector>
diff --git a/res/drawable/ic_language.xml b/res/drawable/ic_language.xml
index 43cdb7e..eddea9a 100644
--- a/res/drawable/ic_language.xml
+++ b/res/drawable/ic_language.xml
@@ -1,25 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/car_primary_icon_size"
-        android:height="@dimen/car_primary_icon_size"
-        android:viewportHeight="48.0"
-        android:viewportWidth="48.0">
+    Copyright 2018 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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="48.0"
+    android:viewportWidth="48.0">
     <path
-        android:fillColor="@color/car_tint"
+        android:fillColor="?attr/iconColor"
         android:pathData="M23.99,4C12.94,4 4,12.95 4,24s8.94,20 19.99,20C35.04,44 44,35.05 44,24S35.04,4 23.99,4zM37.84,16h-5.9c-0.65,-2.5 -1.56,-4.9 -2.76,-7.12 3.68,1.26 6.74,3.81 8.66,7.12zM24,8.07c1.67,2.4 2.97,5.07 3.82,7.93h-7.64c0.85,-2.86 2.15,-5.53 3.82,-7.93zM8.52,28C8.19,26.72 8,25.38 8,24s0.19,-2.72 0.52,-4h6.75c-0.16,1.31 -0.27,2.64 -0.27,4 0,1.36 0.11,2.69 0.28,4L8.52,28zM10.15,32h5.9c0.65,2.5 1.56,4.9 2.76,7.13 -3.68,-1.26 -6.74,-3.82 -8.66,-7.13zM16.05,16h-5.9c1.92,-3.31 4.98,-5.87 8.66,-7.13 -1.2,2.23 -2.11,4.63 -2.76,7.13zM24,39.93c-1.66,-2.4 -2.96,-5.07 -3.82,-7.93h7.64c-0.86,2.86 -2.16,5.53 -3.82,7.93zM28.68,28h-9.36c-0.19,-1.31 -0.32,-2.64 -0.32,-4 0,-1.36 0.13,-2.69 0.32,-4h9.36c0.19,1.31 0.32,2.64 0.32,4 0,1.36 -0.13,2.69 -0.32,4zM29.19,39.12c1.2,-2.23 2.11,-4.62 2.76,-7.12h5.9c-1.93,3.31 -4.99,5.86 -8.66,7.12zM32.72,28c0.16,-1.31 0.28,-2.64 0.28,-4 0,-1.36 -0.11,-2.69 -0.28,-4h6.75c0.33,1.28 0.53,2.62 0.53,4s-0.19,2.72 -0.53,4h-6.75z"/>
 </vector>
diff --git a/res/drawable/ic_lock.xml b/res/drawable/ic_lock.xml
index 5cdfe79..4caeaf1 100644
--- a/res/drawable/ic_lock.xml
+++ b/res/drawable/ic_lock.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 Google Inc.
+    Copyright 2018 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
+         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,
@@ -14,6 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="48dp" android:height="48dp" android:viewportWidth="48.0" android:viewportHeight="48.0">
-    <path android:pathData="M36,16h-2v-4c0,-5.52 -4.48,-10 -10,-10S14,6.48 14,12v4h-2c-2.21,0 -4,1.79 -4,4v20c0,2.21 1.79,4 4,4h24c2.21,0 4,-1.79 4,-4L40,20c0,-2.21 -1.79,-4 -4,-4zM24,34c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4zM30.2,16L17.8,16v-4c0,-3.42 2.78,-6.2 6.2,-6.2 3.42,0 6.2,2.78 6.2,6.2v4z" android:fillColor="@color/google_blue_600"/>
-</vector>
\ No newline at end of file
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="48.0"
+    android:viewportWidth="48.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M36,16h-2v-4c0,-5.52 -4.48,-10 -10,-10S14,6.48 14,12v4h-2c-2.21,0 -4,1.79 -4,4v20c0,2.21 1.79,4 4,4h24c2.21,0 4,-1.79 4,-4L40,20c0,-2.21 -1.79,-4 -4,-4zM24,34c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4zM30.2,16L17.8,16v-4c0,-3.42 2.78,-6.2 6.2,-6.2 3.42,0 6.2,2.78 6.2,6.2v4z"/>
+</vector>
diff --git a/res/drawable/ic_media_stream.xml b/res/drawable/ic_media_stream.xml
new file mode 100644
index 0000000..c07d1e0
--- /dev/null
+++ b/res/drawable/ic_media_stream.xml
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M12,3l0.01,10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55C7.79,13 6,14.79 6,17c0,2.21 1.79,4 4.01,4S14,19.21 14,17V7h4V3H12zM10.01,19c-1.1,0 -2,-0.9 -2,-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2C12.01,18.1 11.11,19 10.01,19z"/>
+</vector>
diff --git a/res/drawable/ic_remove_circle.xml b/res/drawable/ic_remove_circle.xml
new file mode 100644
index 0000000..16ce5d3
--- /dev/null
+++ b/res/drawable/ic_remove_circle.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="48"
+    android:viewportWidth="48">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M24,4C12.95,4,4,12.95,4,24
+                         s8.95,20,20,20,20-8.95,20-20
+                         S35.05,4,24,4zm10,22H14v-4h20v4z"/>
+</vector>
diff --git a/res/drawable/ic_restore.xml b/res/drawable/ic_restore.xml
new file mode 100644
index 0000000..0c457f5
--- /dev/null
+++ b/res/drawable/ic_restore.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M13.5 7.75v4.5l3.37 2c.34 .2 .46 .65 .25 .99 s-.64 .45 -.98 .24 L12
+13V7.75c0-.41 .34 -.75 .75 -.75s.75 .34 .75 .75 zM13.05 3C8.11 3 4.1 7.02 4.1
+11.95c0 .02 .01 .03 .01 .05H2.05c-.47 0-.71 .57 -.37 .9 l2.95 2.94c.21 .21 .54
+.21 .75 0l2.95-2.94c.33-.33 .1 -.9-.37-.9H5.99c0-.02 .01 -.03 .01 -.05C6 8.06
+9.16 4.9 13.05 4.9S20.1 8.11 20.1 12s-3.16 7.1-7.05 7.1c-1.58
+0-3.08-.51-4.32-1.48a.94 .94 0 0 0-1.32 .16 l-.01 .01 a.94 .94 0 0 0 .16
+1.32l.01 .01 A8.77 8.77 0 0 0 13.05 21c4.94 0 8.95-4.07 8.95-9s-4.02-9-8.95-9z"/>
+</vector>
diff --git a/res/drawable/ic_seekbar_thumb.xml b/res/drawable/ic_seekbar_thumb.xml
deleted file mode 100644
index 2810356..0000000
--- a/res/drawable/ic_seekbar_thumb.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<shape
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:shape="oval">
-    <solid android:color="@color/car_accent" />
-    <size
-        android:width="30dp"
-        android:height="30dp" />
-    <stroke
-        android:width="1dp"
-        android:color="@color/car_accent" />
-</shape>
diff --git a/res/drawable/ic_seekbar_track.xml b/res/drawable/ic_seekbar_track.xml
deleted file mode 100644
index 8c5acff..0000000
--- a/res/drawable/ic_seekbar_track.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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">
-    <!-- Use android provided id, as seekbar is expecting that -->
-    <item android:id="@android:id/background">
-        <shape android:shape="line">
-            <corners
-                android:radius="@dimen/seekbar_track_corner"/>
-            <stroke
-                android:width="@dimen/seekbar_track_height"
-                android:color="@color/seekbar_track" />
-        </shape>
-    </item>
-    <item android:id="@android:id/progress">
-        <clip>
-            <shape android:shape="line">
-                <stroke
-                    android:width="@dimen/seekbar_track_height"
-                    android:color="@color/car_accent" />
-            </shape>
-        </clip>
-    </item>
-</layer-list>
\ No newline at end of file
diff --git a/res/drawable/ic_settings_about.xml b/res/drawable/ic_settings_about.xml
index 57631a5..75647d0 100644
--- a/res/drawable/ic_settings_about.xml
+++ b/res/drawable/ic_settings_about.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,13 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M11.0,17.0l2.0,0.0l0.0,-6.0l-2.0,0.0l0.0,6.0zm1.0,-15.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0zm0.0,18.0c-4.41,0.0 -8.0,-3.59 -8.0,-8.0s3.59,-8.0 8.0,-8.0 8.0,3.59 8.0,8.0 -3.59,8.0 -8.0,8.0zM11.0,9.0l2.0,0.0L13.0,7.0l-2.0,0.0l0.0,2.0z"/>
 </vector>
diff --git a/res/drawable/ic_settings_applications.xml b/res/drawable/ic_settings_applications.xml
index f9c306b..b970c3d 100644
--- a/res/drawable/ic_settings_applications.xml
+++ b/res/drawable/ic_settings_applications.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,13 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M5.0,16.0c0.0,3.87 3.13,7.0 7.0,7.0s7.0,-3.13 7.0,-7.0l0.0,-4.0L5.0,12.0l0.0,4.0zM16.12,4.37l2.1,-2.1 -0.82,-0.83 -2.3,2.31C14.16,3.28 13.12,3.0 12.0,3.0s-2.1,0.28 -3.0,0.75L6.6,1.44l-0.8,0.83 2.1,2.1C6.14,5.64 5.0,7.68 5.0,10.0l0.0,1.0l14.0,0.0l0.0,-1.0c0.0,-2.32 -1.14,-4.36 -2.88,-5.63zM9.0,9.0c-0.55,0.0 -1.0,-0.45 -1.0,-1.0s0.45,-1.0 1.0,-1.0 1.0,0.45 1.0,1.0 -0.45,1.0 -1.0,1.0zm6.0,0.0c-0.55,0.0 -1.0,-0.45 -1.0,-1.0s0.45,-1.0 1.0,-1.0 1.0,0.45 1.0,1.0 -0.45,1.0 -1.0,1.0z"/>
 </vector>
diff --git a/res/drawable/ic_settings_auto_wifi.xml b/res/drawable/ic_settings_auto_wifi.xml
new file mode 100644
index 0000000..5eddaf1
--- /dev/null
+++ b/res/drawable/ic_settings_auto_wifi.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M18 10l3 0 -10 -9 -10 9 3 0 0 8 7.1 0c0 -0.3 -0.1 -0.7 -0.1 -1 0 -3.9 3.1 -7 7 -7z"
+        android:fillColor="?attr/iconColor"/>
+    <path
+        android:pathData="M18 14l0 1.6 2.1 -2.1 -2.1 -2.2 0 1.6c-2.3 0 -4.2 1.9 -4.2 4.3 0 0.8 0.2 1.6 0.7 2.3l0.8 -0.8C15.1 18.3 14.9 17.8 14.9 17.2 14.8 15.4 16.2 14 18 14"
+        android:strokeWidth="0.5"
+        android:fillColor="?attr/iconColor"
+        android:strokeMiterLimit="10" />
+    <path
+        android:pathData="M20.8 15.7c0.2 0.4 0.4 0.9 0.4 1.5 0 1.8 -1.4 3.2 -3.2 3.2l0 -1.6 -2.1 2.1 2.1 2.1 0 -1.6c2.3 0 4.2 -1.9 4.2 -4.2 0 -0.8 -0.2 -1.6 -0.7 -2.3l-0.7 0.8z"
+        android:strokeWidth="0.5"
+        android:fillColor="?attr/iconColor"
+        android:strokeMiterLimit="10" />
+</vector>
diff --git a/res/drawable/ic_settings_bluetooth.xml b/res/drawable/ic_settings_bluetooth.xml
index 6b8623d..52127a8 100644
--- a/res/drawable/ic_settings_bluetooth.xml
+++ b/res/drawable/ic_settings_bluetooth.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,13 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="48.0"
+    android:viewportWidth="48.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M35.41,15.41L24.0,4.0l-2.0,0.0l0.0,15.17L12.83,10.0 10.0,12.83 21.17,24.0 10.0,35.17 12.83,38.0 22.0,28.83L22.0,44.0l2.0,0.0l11.41,-11.41L26.83,24.0l8.58,-8.59zM26.0,11.66l3.76,3.76L26.0,19.17l0.0,-7.51zm3.76,20.93L26.0,36.34l0.0,-7.52l3.76,3.77z"/>
 </vector>
diff --git a/res/drawable/ic_settings_bluetooth_connected.xml b/res/drawable/ic_settings_bluetooth_connected.xml
index 43f29f4..537d239 100644
--- a/res/drawable/ic_settings_bluetooth_connected.xml
+++ b/res/drawable/ic_settings_bluetooth_connected.xml
@@ -1,25 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="20dp"
-        android:height="20dp"
-        android:viewportWidth="20.0"
-        android:viewportHeight="20.0">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="20.0"
+    android:viewportWidth="20.0">
     <path
-        android:pathData="M5.833,10L4.167,8.333L2.5,10l1.667,1.667L5.833,10zM14.758,6.425L10,1.667H9.167v6.325L5.342,4.167L4.167,5.342L8.825,10l-4.658,4.658l1.175,1.175l3.825,-3.825v6.325H10l4.758,-4.758L11.175,10C11.175,10 14.758,6.425 14.758,6.425zM10.833,4.858L12.4,6.425l-1.567,1.567V4.858zM12.4,13.575l-1.567,1.567v-3.133C10.833,12.008 12.4,13.575 12.4,13.575zM15.833,8.333L14.167,10l1.667,1.667L17.5,10L15.833,8.333z"
-        android:fillColor="#FFFFFF"/>
-</vector>
\ No newline at end of file
+        android:fillColor="?attr/iconColor"
+        android:pathData="M5.833,10L4.167,8.333L2.5,10l1.667,1.667L5.833,10zM14.758,6.425L10,1.667H9.167v6.325L5.342,4.167L4.167,5.342L8.825,10l-4.658,4.658l1.175,1.175l3.825,-3.825v6.325H10l4.758,-4.758L11.175,10C11.175,10 14.758,6.425 14.758,6.425zM10.833,4.858L12.4,6.425l-1.567,1.567V4.858zM12.4,13.575l-1.567,1.567v-3.133C10.833,12.008 12.4,13.575 12.4,13.575zM15.833,8.333L14.167,10l1.667,1.667L17.5,10L15.833,8.333z"/>
+</vector>
diff --git a/res/drawable/ic_settings_bluetooth_disabled.xml b/res/drawable/ic_settings_bluetooth_disabled.xml
index 0fbe506..4e4d150 100644
--- a/res/drawable/ic_settings_bluetooth_disabled.xml
+++ b/res/drawable/ic_settings_bluetooth_disabled.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M13,5.83l1.88,1.88 -1.6,1.6 1.41,1.41 3.02,-3.02L12,2h-1v5.03l2,2v-3.2zM5.41,4L4,5.41 10.59,12 5,17.59 6.41,19 11,14.41V22h1l4.29,-4.29 2.3,2.29L20,18.59 5.41,4zM13,18.17v-3.76l1.88,1.88L13,18.17z"/>
 </vector>
diff --git a/res/drawable/ic_settings_cellular.xml b/res/drawable/ic_settings_cellular.xml
new file mode 100644
index 0000000..18b28ff
--- /dev/null
+++ b/res/drawable/ic_settings_cellular.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M2,22h20V2z"/>
+</vector>
diff --git a/res/drawable/ic_settings_data_usage.xml b/res/drawable/ic_settings_data_usage.xml
new file mode 100644
index 0000000..54a9f50
--- /dev/null
+++ b/res/drawable/ic_settings_data_usage.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M13,2.05v3.03c3.39,0.49 6,3.39 6,6.92 0,0.9 -0.18,1.75 -0.48,2.54l2.6,1.53c0.56,-1.24 0.88,-2.62 0.88,-4.07 0,-5.18 -3.95,-9.45 -9,-9.95zM12,19c-3.87,0 -7,-3.13 -7,-7 0,-3.53 2.61,-6.43 6,-6.92V2.05c-5.06,0.5 -9,4.76 -9,9.95 0,5.52 4.47,10 9.99,10 3.31,0 6.24,-1.61 8.06,-4.09l-2.6,-1.53C16.17,17.98 14.21,19 12,19z"/>
+</vector>
diff --git a/res/drawable/ic_settings_date_time.xml b/res/drawable/ic_settings_date_time.xml
index 2202f8d..1cef06a 100644
--- a/res/drawable/ic_settings_date_time.xml
+++ b/res/drawable/ic_settings_date_time.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,16 +14,17 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M11.99,2.0C6.47,2.0 2.0,6.48 2.0,12.0s4.47,10.0 9.99,10.0C17.52,22.0 22.0,17.52 22.0,12.0S17.52,2.0 11.99,2.0zM12.0,20.0c-4.42,0.0 -8.0,-3.58 -8.0,-8.0s3.58,-8.0 8.0,-8.0 8.0,3.58 8.0,8.0 -3.58,8.0 -8.0,8.0z"/>
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M12.5,7.0L11.0,7.0l0.0,6.0l5.25,3.1 0.75,-1.23 -4.5,-2.67z"/>
 </vector>
diff --git a/res/drawable/ic_settings_development.xml b/res/drawable/ic_settings_development.xml
new file mode 100644
index 0000000..6bf4307
--- /dev/null
+++ b/res/drawable/ic_settings_development.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="256.0"
+    android:viewportWidth="256.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="m66.641,197.718c-7.73,-7.73 -7.974,-8.747 -7.974,-33.186 0,-26.1 -1.346,-29.646 -12,-31.605 -9.22,-1.696 -8.063,-11.352 1.884,-15.729l8.783,-3.864 1.333,-26.241c1.262,-24.834 1.744,-26.593 8.986,-32.813 9.335,-8.017 21.681,-7.817 21.681,0.351 0,3.149 -2.974,6.723 -7.333,8.812 -7.171,3.437 -7.333,4.03 -7.333,26.776 0,16.737 -1.164,24.923 -4.151,29.188 -3.757,5.364 -3.757,6.489 0,11.853 3.037,4.336 4.151,12.604 4.151,30.805v24.879l8.145,2.839c6.138,2.14 7.945,4.241 7.333,8.528 -1.331,9.333 -13.894,9.016 -23.504,-0.593zM167.111,203.556c-4.355,-4.355 -1.269,-11.211 6.222,-13.823l8,-2.789v-24.879c0,-18.201 1.114,-26.469 4.151,-30.805 3.757,-5.364 3.757,-6.489 0,-11.853 -2.987,-4.264 -4.151,-12.451 -4.151,-29.188 0,-22.746 -0.162,-23.339 -7.333,-26.776 -4.359,-2.089 -7.333,-5.663 -7.333,-8.812 0,-8.168 12.346,-8.369 21.681,-0.351 7.242,6.22 7.724,7.979 8.986,32.813l1.333,26.241 8.783,3.864c9.947,4.377 11.104,14.033 1.884,15.729 -10.654,1.959 -12,5.505 -12,31.605 0,24.31 -0.279,25.491 -7.795,33.007 -7.235,7.235 -18.253,10.191 -22.427,6.017z"/>
+</vector>
diff --git a/res/drawable/ic_settings_display.xml b/res/drawable/ic_settings_display.xml
index f5f766e..670b286 100644
--- a/res/drawable/ic_settings_display.xml
+++ b/res/drawable/ic_settings_display.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,13 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M20.0,15.31L23.31,12.0 20.0,8.69L20.0,4.0l-4.69,0.0L12.0,0.69 8.69,4.0L4.0,4.0l0.0,4.69L0.69,12.0 4.0,15.31L4.0,20.0l4.69,0.0L12.0,23.31 15.31,20.0L20.0,20.0l0.0,-4.69zM12.0,18.0L12.0,6.0c3.31,0.0 6.0,2.69 6.0,6.0s-2.69,6.0 -6.0,6.0z"/>
 </vector>
diff --git a/res/drawable/ic_settings_gear.xml b/res/drawable/ic_settings_gear.xml
index 1a7db1e..3ef1034 100644
--- a/res/drawable/ic_settings_gear.xml
+++ b/res/drawable/ic_settings_gear.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,12 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
+
 <vector
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="24dp"
-    android:width="24dp"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
     android:viewportHeight="48.0"
-    android:viewportWidth="48.0"
-    android:tint="@color/car_tint" >
-    <path android:fillColor="#000000" android:pathData="M38.86,25.95c0.08,-0.64 0.14,-1.29 0.14,-1.95s-0.06,-1.31 -0.14,-1.95l4.23,-3.31c0.38,-0.3 0.49,-0.84 0.24,-1.28l-4,-6.93c-0.25,-0.43 -0.77,-0.61 -1.22,-0.43l-4.98,2.01c-1.03,-0.79 -2.16,-1.46 -3.38,-1.97L29,4.84c-0.09,-0.47 -0.5,-0.84 -1,-0.84h-8c-0.5,0 -0.91,0.37 -0.99,0.84l-0.75,5.3c-1.22,0.51 -2.35,1.17 -3.38,1.97L9.9,10.1c-0.45,-0.17 -0.97,0 -1.22,0.43l-4,6.93c-0.25,0.43 -0.14,0.97 0.24,1.28l4.22,3.31C9.06,22.69 9,23.34 9,24s0.06,1.31 0.14,1.95l-4.22,3.31c-0.38,0.3 -0.49,0.84 -0.24,1.28l4,6.93c0.25,0.43 0.77,0.61 1.22,0.43l4.98,-2.01c1.03,0.79 2.16,1.46 3.38,1.97l0.75,5.3c0.08,0.47 0.49,0.84 0.99,0.84h8c0.5,0 0.91,-0.37 0.99,-0.84l0.75,-5.3c1.22,-0.51 2.35,-1.17 3.38,-1.97l4.98,2.01c0.45,0.17 0.97,0 1.22,-0.43l4,-6.93c0.25,-0.43 0.14,-0.97 -0.24,-1.28l-4.22,-3.31zM24,31c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z"/>
+    android:viewportWidth="48.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M38.86,25.95c0.08,-0.64 0.14,-1.29 0.14,-1.95s-0.06,-1.31 -0.14,-1.95l4.23,-3.31c0.38,-0.3 0.49,-0.84 0.24,-1.28l-4,-6.93c-0.25,-0.43 -0.77,-0.61 -1.22,-0.43l-4.98,2.01c-1.03,-0.79 -2.16,-1.46 -3.38,-1.97L29,4.84c-0.09,-0.47 -0.5,-0.84 -1,-0.84h-8c-0.5,0 -0.91,0.37 -0.99,0.84l-0.75,5.3c-1.22,0.51 -2.35,1.17 -3.38,1.97L9.9,10.1c-0.45,-0.17 -0.97,0 -1.22,0.43l-4,6.93c-0.25,0.43 -0.14,0.97 0.24,1.28l4.22,3.31C9.06,22.69 9,23.34 9,24s0.06,1.31 0.14,1.95l-4.22,3.31c-0.38,0.3 -0.49,0.84 -0.24,1.28l4,6.93c0.25,0.43 0.77,0.61 1.22,0.43l4.98,-2.01c1.03,0.79 2.16,1.46 3.38,1.97l0.75,5.3c0.08,0.47 0.49,0.84 0.99,0.84h8c0.5,0 0.91,-0.37 0.99,-0.84l0.75,-5.3c1.22,-0.51 2.35,-1.17 3.38,-1.97l4.98,2.01c0.45,0.17 0.97,0 1.22,-0.43l4,-6.93c0.25,-0.43 0.14,-0.97 -0.24,-1.28l-4.22,-3.31zM24,31c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z"/>
 </vector>
diff --git a/res/drawable/ic_settings_location.xml b/res/drawable/ic_settings_location.xml
new file mode 100644
index 0000000..83bbf87
--- /dev/null
+++ b/res/drawable/ic_settings_location.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z"/>
+</vector>
diff --git a/res/drawable/ic_settings_night_display.xml b/res/drawable/ic_settings_night_display.xml
index f1137fe..6b4d4b4 100644
--- a/res/drawable/ic_settings_night_display.xml
+++ b/res/drawable/ic_settings_night_display.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -15,9 +15,13 @@
     limitations under the License.
 -->
 
-<vector android:height="24dp" android:viewportHeight="44.0"
-    android:viewportWidth="44.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#212121" android:fillType="nonZero"
-        android:pathData="M26.5,40.33C28.42,40.33 30.26,40.04 32,39.49C24.56,37.16 19.17,30.21 19.17,22C19.17,13.79 24.56,6.84 32,4.51C30.26,3.96 28.42,3.67 26.5,3.67C16.38,3.67 8.17,11.88 8.17,22C8.17,32.12 16.38,40.33 26.5,40.33Z"
-        android:strokeColor="#00000000" android:strokeWidth="1"/>
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="44.0"
+    android:viewportWidth="44.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M26.5,40.33C28.42,40.33 30.26,40.04 32,39.49C24.56,37.16 19.17,30.21 19.17,22C19.17,13.79 24.56,6.84 32,4.51C30.26,3.96 28.42,3.67 26.5,3.67C16.38,3.67 8.17,11.88 8.17,22C8.17,32.12 16.38,40.33 26.5,40.33Z"/>
 </vector>
diff --git a/res/drawable/ic_settings_sound.xml b/res/drawable/ic_settings_sound.xml
index ca9a84d..2b8becb 100644
--- a/res/drawable/ic_settings_sound.xml
+++ b/res/drawable/ic_settings_sound.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,13 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M3.0,9.0l0.0,6.0l4.0,0.0l5.0,5.0L12.0,4.0L7.0,9.0L3.0,9.0zm13.5,3.0c0.0,-1.77 -1.02,-3.29 -2.5,-4.03l0.0,8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14.0,3.23l0.0,2.06c2.8,0.86 5.0,3.54 5.0,6.71s-2.11,5.85 -5.0,6.71l0.0,2.06c4.01,-0.91 7.0,-4.49 7.0,-8.77s-2.99,-7.86 -7.0,-8.77z"/>
 </vector>
diff --git a/res/drawable/ic_settings_units.xml b/res/drawable/ic_settings_units.xml
new file mode 100644
index 0000000..22142c8
--- /dev/null
+++ b/res/drawable/ic_settings_units.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M17.66,17.66l-1.06,1.06l-0.71-0.71l1.06-1.06l-1.94-1.94l-1.06,1.06l-0.71-0.71l1.06-1.06l-1.94-1.94l-1.06,1.06    l-0.71-0.71l1.06-1.06L9.7,9.7l-1.06,1.06l-0.71-0.71l1.06-1.06L7.05,7.05L5.99,8.11L5.28,7.4l1.06-1.06L4,4v14c0,1.1,0.9,2,2,2    h14L17.66,17.66z M7,17v-5.76L12.76,17H7z"/>
+</vector>
diff --git a/res/drawable/ic_settings_wifi.xml b/res/drawable/ic_settings_wifi.xml
index eed2eff..c6324c7 100644
--- a/res/drawable/ic_settings_wifi.xml
+++ b/res/drawable/ic_settings_wifi.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,13 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="18.0"
-        android:viewportHeight="18.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="18.0"
+    android:viewportWidth="18.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M9.01,15.99l8.8,-10.96C17.47,4.77 14.08,2.0 9.0,2.0S0.53,4.7 0.19,5.03l8.8,10.96l0.02,0.0z"/>
 </vector>
diff --git a/res/drawable/ic_settings_wifi_disabled.xml b/res/drawable/ic_settings_wifi_disabled.xml
index 1b2ac4e..b4bd202 100644
--- a/res/drawable/ic_settings_wifi_disabled.xml
+++ b/res/drawable/ic_settings_wifi_disabled.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M23.64,7c-0.45,-0.34 -4.93,-4 -11.64,-4 -1.5,0 -2.89,0.19 -4.15,0.48L18.18,13.8 23.64,7zM17.04,15.22L3.27,1.44 2,2.72l2.05,2.06C1.91,5.76 0.59,6.82 0.36,7l11.63,14.49 0.01,0.01 0.01,-0.01 3.9,-4.86 3.32,3.32 1.27,-1.27 -3.46,-3.46z"/>
 </vector>
diff --git a/res/drawable/ic_storage.xml b/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..e02e7f0
--- /dev/null
+++ b/res/drawable/ic_storage.xml
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M3,20h18v-4H3V20zM5,17h2v2H5V17zM3,4v4h18V4H3zM7,7H5V5h2V7zM3,14h18v-4H3V14zM5,11h2v2H5V11z"/>
+</vector>
diff --git a/res/drawable/ic_storage_apps.xml b/res/drawable/ic_storage_apps.xml
new file mode 100644
index 0000000..5d080c8
--- /dev/null
+++ b/res/drawable/ic_storage_apps.xml
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M6,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM16,6c0,1.1 0.9,2 2,2s2,-0.9 2,-2 -0.9,-2 -2,-2 -2,0.9 -2,2zM12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/>
+</vector>
diff --git a/res/drawable/ic_sync.png b/res/drawable/ic_sync.png
new file mode 100644
index 0000000..f5e19bd
--- /dev/null
+++ b/res/drawable/ic_sync.png
Binary files differ
diff --git a/res/drawable/ic_sync_anim.xml b/res/drawable/ic_sync_anim.xml
new file mode 100644
index 0000000..b5f5433
--- /dev/null
+++ b/res/drawable/ic_sync_anim.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:drawable="@drawable/ic_sync"
+                 android:pivotX="50%"
+                 android:pivotY="50%"/>
diff --git a/res/drawable/ic_sync_problem.xml b/res/drawable/ic_sync_problem.xml
new file mode 100644
index 0000000..4e0c72b
--- /dev/null
+++ b/res/drawable/ic_sync_problem.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright 2018 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="32dp"
+        android:height="32dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M3,12c0,2.21 0.91,4.2 2.36,5.64L3,20h6v-6l-2.24,2.24C5.68,15.15 5,13.66 5,12c0,-2.61 1.67,-4.83 4,-5.65L9,4.26C5.55,5.15 3,8.27 3,12zM11,17h2v-2h-2v2zM21,4h-6v6l2.24,-2.24C18.32,8.85 19,10.34 19,12c0,2.61 -1.67,4.83 -4,5.65v2.09c3.45,-0.89 6,-4.01 6,-7.74 0,-2.21 -0.91,-4.2 -2.36,-5.64L21,4zM11,13h2L13,7h-2v6z"/>
+</vector>
diff --git a/res/drawable/ic_system_update.xml b/res/drawable/ic_system_update.xml
index ead6ff0..69ccc06 100644
--- a/res/drawable/ic_system_update.xml
+++ b/res/drawable/ic_system_update.xml
@@ -1,5 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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.
@@ -13,13 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z"
-        android:fillColor="#FFFFFFFF"/>
+        android:fillColor="?attr/iconColor"
+        android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z"/>
 </vector>
diff --git a/res/drawable/ic_translate.xml b/res/drawable/ic_translate.xml
new file mode 100644
index 0000000..6e22fc5
--- /dev/null
+++ b/res/drawable/ic_translate.xml
@@ -0,0 +1,26 @@
+<!--
+    Copyright 2018 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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/iconColor"
+        android:pathData="M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z"/>
+</vector>
diff --git a/res/drawable/ic_user.xml b/res/drawable/ic_user.xml
index bfce534..3906c00 100644
--- a/res/drawable/ic_user.xml
+++ b/res/drawable/ic_user.xml
@@ -1,26 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="@color/car_tint">
+    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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/icon_size"
+    android:height="@dimen/icon_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:fillColor="#FFFFFFFF"
+        android:fillColor="?attr/iconColor"
         android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,5c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM12,19.2c-2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22z"/>
 </vector>
diff --git a/res/drawable/ic_user_add.xml b/res/drawable/ic_user_add.xml
new file mode 100644
index 0000000..213b343
--- /dev/null
+++ b/res/drawable/ic_user_add.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="@dimen/touch_target_size"
+    android:height="@dimen/touch_target_size"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
+    <path
+        android:fillColor="?attr/userSwitcherAddIconColor"
+        android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+</vector>
diff --git a/res/drawable/ic_wifi_signal_0.xml b/res/drawable/ic_wifi_signal_0.xml
index 9f37b04..363edbb 100644
--- a/res/drawable/ic_wifi_signal_0.xml
+++ b/res/drawable/ic_wifi_signal_0.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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
+         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,
@@ -14,13 +14,15 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-  android:width="26dp"
-  android:height="24dp"
-  android:viewportWidth="26"
-  android:viewportHeight="24">
-  <path
-    android:fillAlpha="0.3"
-    android:fillColor="?attr/WifiSignalColor"
-    android:pathData="M13.0,22.0L25.6,6.5C25.1,6.1 20.3,2.1 13.0,2.1S0.9,6.1 0.4,6.5L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0z"/>
-</vector>
\ No newline at end of file
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="26dp"
+    android:height="24dp"
+    android:viewportHeight="24"
+    android:viewportWidth="26">
+    <path
+        android:fillAlpha="0.3"
+        android:fillColor="?attr/wifiSignalColor"
+        android:pathData="M13.0,22.0L25.6,6.5C25.1,6.1 20.3,2.1 13.0,2.1S0.9,6.1 0.4,6.5L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0z"/>
+</vector>
diff --git a/res/drawable/ic_wifi_signal_1.xml b/res/drawable/ic_wifi_signal_1.xml
index 4b9139e..0c31c22 100644
--- a/res/drawable/ic_wifi_signal_1.xml
+++ b/res/drawable/ic_wifi_signal_1.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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
+         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,
@@ -14,16 +14,18 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="26dp"
     android:height="24dp"
-    android:viewportWidth="26"
-    android:viewportHeight="24">
+    android:viewportHeight="24"
+    android:viewportWidth="26">
     <path
         android:fillAlpha="0.3"
-        android:fillColor="?attr/WifiSignalColor"
+        android:fillColor="?attr/wifiSignalColor"
         android:pathData="M13.1,22.0L25.6,6.5C25.1,6.1 20.3,2.1 13.0,2.1S0.9,6.1 0.5,6.5L13.1,22.0L13.1,22.0L13.1,22.0L13.1,22.0L13.1,22.0z"/>
     <path
-        android:fillColor="?attr/WifiSignalColor"
+        android:fillColor="?attr/wifiSignalColor"
         android:pathData="M13.1,22.0l5.5,-6.8c-0.2,-0.2 -2.3,-1.9 -5.5,-1.9s-5.3,1.8 -5.5,1.9L13.1,22.0L13.1,22.0L13.1,22.0L13.1,22.0L13.1,22.0z"/>
 </vector>
diff --git a/res/drawable/ic_wifi_signal_2.xml b/res/drawable/ic_wifi_signal_2.xml
index 66e1d7c..f8466d9 100644
--- a/res/drawable/ic_wifi_signal_2.xml
+++ b/res/drawable/ic_wifi_signal_2.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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
+         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,
@@ -14,16 +14,18 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="26dp"
     android:height="24dp"
-    android:viewportWidth="26"
-    android:viewportHeight="24">
+    android:viewportHeight="24"
+    android:viewportWidth="26">
     <path
         android:fillAlpha="0.3"
-        android:fillColor="?attr/WifiSignalColor"
+        android:fillColor="?attr/wifiSignalColor"
         android:pathData="M13.0,22.0L25.6,6.5C25.1,6.1 20.3,2.1 13.0,2.1S0.9,6.1 0.4,6.5L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0z"/>
     <path
-        android:fillColor="?attr/WifiSignalColor"
+        android:fillColor="?attr/wifiSignalColor"
         android:pathData="M13.0,22.0l7.6,-9.4C20.3,12.4 17.4,10.0 13.0,10.0s-7.3,2.4 -7.6,2.7L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0z"/>
 </vector>
diff --git a/res/drawable/ic_wifi_signal_3.xml b/res/drawable/ic_wifi_signal_3.xml
index f37fa59..2f0d8a4 100644
--- a/res/drawable/ic_wifi_signal_3.xml
+++ b/res/drawable/ic_wifi_signal_3.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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
+         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,
@@ -14,16 +14,18 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="26dp"
     android:height="24dp"
-    android:viewportWidth="26"
-    android:viewportHeight="24">
+    android:viewportHeight="24"
+    android:viewportWidth="26">
     <path
         android:fillAlpha="0.3"
-        android:fillColor="?attr/WifiSignalColor"
+        android:fillColor="?attr/wifiSignalColor"
         android:pathData="M13.0,22.0L25.6,6.5C25.1,6.1 20.3,2.1 13.0,2.1S0.9,6.1 0.4,6.5L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0z"/>
     <path
-        android:fillColor="?attr/WifiSignalColor"
+        android:fillColor="?attr/wifiSignalColor"
         android:pathData="M13.0,22.0l9.2,-11.4c-0.4,-0.3 -3.9,-3.2 -9.2,-3.2s-8.9,3.0 -9.2,3.2L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0z"/>
 </vector>
diff --git a/res/drawable/ic_wifi_signal_4.xml b/res/drawable/ic_wifi_signal_4.xml
index 1cc86b6..50d8e04 100644
--- a/res/drawable/ic_wifi_signal_4.xml
+++ b/res/drawable/ic_wifi_signal_4.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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
+         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,
@@ -14,12 +14,14 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="26dp"
     android:height="24dp"
-    android:viewportWidth="26"
-    android:viewportHeight="24">
+    android:viewportHeight="24"
+    android:viewportWidth="26">
     <path
-        android:fillColor="?attr/WifiSignalColor"
+        android:fillColor="?attr/wifiSignalColor"
         android:pathData="M13.0,22.0L25.6,6.5C25.1,6.1 20.3,2.1 13.0,2.1S0.9,6.1 0.4,6.5L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0L13.0,22.0z"/>
 </vector>
diff --git a/res/drawable/ic_wifi_signal_lock.xml b/res/drawable/ic_wifi_signal_lock.xml
index cf420d4..a5ea3fe 100644
--- a/res/drawable/ic_wifi_signal_lock.xml
+++ b/res/drawable/ic_wifi_signal_lock.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2017 The Android Open Source Project
+    Copyright 2017 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
+         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,
@@ -14,16 +14,18 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="24dp"
     android:height="24dp"
-    android:viewportWidth="72"
-    android:viewportHeight="72">
+    android:viewportHeight="72"
+    android:viewportWidth="72">
     <group
         android:translateX="52.0"
         android:translateY="42.0">
         <path
-            android:fillColor="?attr/WifiSignalColor"
+            android:fillColor="?attr/wifiSignalColor"
             android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.76 -2.24,-5.0 -5.0,-5.0S7.0,3.24 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.0 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-6.0,9.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0 2.0,0.9 2.0,2.0 -0.9,2.0 -2.0,2.0zm3.1,-9.0L8.9,8.0L8.9,6.0c0.0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0.0 3.1,1.39 3.1,3.1l0.0,2.0z"/>
     </group>
-</vector>
\ No newline at end of file
+</vector>
diff --git a/res/drawable/ic_wifi_tethering.xml b/res/drawable/ic_wifi_tethering.xml
new file mode 100644
index 0000000..402a69b
--- /dev/null
+++ b/res/drawable/ic_wifi_tethering.xml
@@ -0,0 +1,24 @@
+<!--
+    Copyright (C) 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/icon_size"
+        android:height="@dimen/icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M12,11c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,13a6,6 0,0 0,-6.75 -5.95c-2.62,0.32 -4.78,2.41 -5.18,5.02 -0.32,2.14 0.49,4.11 1.92,5.39 0.48,0.43 1.24,0.33 1.56,-0.23 0.24,-0.42 0.14,-0.94 -0.22,-1.26a3.99,3.99 0,0 1,-1.22 -3.94,3.954 3.954,0 0,1 2.9,-2.91A4.007,4.007 0,0 1,16 13c0,1.18 -0.51,2.23 -1.33,2.96 -0.36,0.33 -0.47,0.85 -0.23,1.27 0.31,0.54 1.04,0.69 1.5,0.28A5.97,5.97 0,0 0,18 13zM10.83,3.07c-4.62,0.52 -8.35,4.33 -8.78,8.96a9.966,9.966 0,0 0,4.02 9.01c0.48,0.35 1.16,0.2 1.46,-0.31 0.25,-0.43 0.14,-0.99 -0.26,-1.29 -2.28,-1.69 -3.65,-4.55 -3.16,-7.7 0.54,-3.5 3.46,-6.29 6.98,-6.68C15.91,4.51 20,8.28 20,13c0,2.65 -1.29,4.98 -3.27,6.44 -0.4,0.3 -0.51,0.85 -0.26,1.29 0.3,0.52 0.98,0.66 1.46,0.31A9.96,9.96 0,0 0,22 13c0,-5.91 -5.13,-10.62 -11.17,-9.93z"
+        android:fillColor="?attr/iconColor"/>
+</vector>
diff --git a/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml b/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml
index 6491f8f..c9ef48f 100644
--- a/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml
+++ b/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml
@@ -1,28 +1,30 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!--
+    Copyright 2017 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
+    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
+         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.
+    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.
 -->
 
 <!-- Variant of progress_indeterminate_horizontal_material in frameworks/base/core/res, which
      draws the whole height of the progress bar instead having blank space above and below the
      bar. -->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:drawable="@drawable/vector_drawable_progress_indeterminate_horizontal_trimmed" >
+<animated-vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/vector_drawable_progress_indeterminate_horizontal_trimmed">
     <target
         android:name="rect2_grp"
-        android:animation="@*android:anim/progress_indeterminate_horizontal_rect2" />
+        android:animation="@*android:anim/progress_indeterminate_horizontal_rect2"/>
     <target
         android:name="rect1_grp"
-        android:animation="@*android:anim/progress_indeterminate_horizontal_rect1" />
+        android:animation="@*android:anim/progress_indeterminate_horizontal_rect1"/>
 </animated-vector>
diff --git a/res/drawable/rectangle_ripple_mask.xml b/res/drawable/rectangle_ripple_mask.xml
index 69eaf8b..6eb2a75 100644
--- a/res/drawable/rectangle_ripple_mask.xml
+++ b/res/drawable/rectangle_ripple_mask.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -15,8 +15,9 @@
     limitations under the License.
 -->
 
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
-  <corners android:radius="@dimen/car_radius_1" />
-  <solid android:color="@android:color/white" />
-</shape>
\ No newline at end of file
+    <corners android:radius="@dimen/button_ripple_radius"/>
+    <solid android:color="@android:color/white"/>
+</shape>
diff --git a/res/drawable/regulatory_info.png b/res/drawable/regulatory_info.png
new file mode 100644
index 0000000..65de26c
--- /dev/null
+++ b/res/drawable/regulatory_info.png
Binary files differ
diff --git a/res/drawable/spinner_background.xml b/res/drawable/spinner_background.xml
deleted file mode 100644
index 8fac0f9..0000000
--- a/res/drawable/spinner_background.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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>
-        <layer-list>
-            <item android:gravity="right" android:drawable="@drawable/ic_arrow_drop_down" />
-        </layer-list>
-    </item>
-
-</selector>
\ No newline at end of file
diff --git a/res/drawable/suw_button_ripple_bg.xml b/res/drawable/suw_button_ripple_bg.xml
deleted file mode 100644
index bc49f56..0000000
--- a/res/drawable/suw_button_ripple_bg.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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.
--->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
-        android:color="@color/car_card_ripple_background">
-</ripple>
diff --git a/res/drawable/user_add_circle.xml b/res/drawable/user_add_circle.xml
new file mode 100644
index 0000000..0fd0ebc
--- /dev/null
+++ b/res/drawable/user_add_circle.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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>
+        <shape android:shape="oval">
+            <solid android:color="?attr/userSwitcherAddIconBackgroundColor"/>
+            <size
+                android:width="@dimen/user_switcher_image_avatar_size"
+                android:height="@dimen/user_switcher_image_avatar_size"/>
+        </shape>
+    </item>
+    <item
+        android:drawable="@drawable/ic_user_add"
+        android:gravity="center"/>
+</layer-list>
diff --git a/res/drawable/user_avatar_bg_circle.xml b/res/drawable/user_avatar_bg_circle.xml
new file mode 100644
index 0000000..52a81cc
--- /dev/null
+++ b/res/drawable/user_avatar_bg_circle.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <stroke
+        android:width="@dimen/user_switcher_current_user_circle_stroke_width"
+        android:color="?attr/userSwitcherCurrentUserColor"/>
+    <size
+        android:width="@dimen/user_switcher_current_user_circle_width"
+        android:height="@dimen/user_switcher_current_user_circle_width"/>
+</shape>
diff --git a/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml b/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml
index 2d65ad3..b14a04a 100644
--- a/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml
+++ b/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml
@@ -1,53 +1,55 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!--
+    Copyright 2017 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
+    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
+         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.
+    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.
 -->
 
 <!-- Variant of vector_drawable_progress_indeterminate_horizontal in frameworks/base/core/res, which
      draws the whole height of the progress bar instead having blank space above and below the
      bar. -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:height="10dp"
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:width="360dp"
+    android:height="10dp"
     android:viewportHeight="10"
-    android:viewportWidth="360" >
+    android:viewportWidth="360">
     <group
         android:name="progress_group"
         android:translateX="180"
-        android:translateY="5" >
+        android:translateY="5">
         <path
             android:name="background_track"
-            android:pathData="M -180.0,-5.0 l 360.0,0 l 0,10.0 l -360.0,0 Z"
+            android:fillAlpha="?android:attr/disabledAlpha"
             android:fillColor="?android:attr/colorControlActivated"
-            android:fillAlpha="?android:attr/disabledAlpha"/>
+            android:pathData="M -180.0,-5.0 l 360.0,0 l 0,10.0 l -360.0,0 Z"/>
         <group
             android:name="rect2_grp"
-            android:translateX="-197.60001"
-            android:scaleX="0.1" >
+            android:scaleX="0.1"
+            android:translateX="-197.60001">
             <path
                 android:name="rect2"
-                android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z"
-                android:fillColor="?android:attr/colorControlActivated" />
+                android:fillColor="?android:attr/colorControlActivated"
+                android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z"/>
         </group>
         <group
             android:name="rect1_grp"
-            android:translateX="-522.59998"
-            android:scaleX="0.1" >
+            android:scaleX="0.1"
+            android:translateX="-522.59998">
             <path
                 android:name="rect1"
-                android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z"
-                android:fillColor="?android:attr/colorControlActivated" />
+                android:fillColor="?android:attr/colorControlActivated"
+                android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z"/>
         </group>
     </group>
 </vector>
diff --git a/res/drawable/wifi_signal.xml b/res/drawable/wifi_signal.xml
index 884aefc..80aef79 100644
--- a/res/drawable/wifi_signal.xml
+++ b/res/drawable/wifi_signal.xml
@@ -1,41 +1,64 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!--
+    Copyright 2017 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
+    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
+         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.
+    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"
-        xmlns:settings="http://schemas.android.com/apk/res/com.android.car.settings">
+<selector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.car.settings">
     <item settings:state_encrypted="true">
         <layer-list>
             <item>
                 <level-list>
-                    <item android:maxLevel="0" android:drawable="@drawable/ic_wifi_signal_1" />
-                    <item android:maxLevel="1" android:drawable="@drawable/ic_wifi_signal_2" />
-                    <item android:maxLevel="2" android:drawable="@drawable/ic_wifi_signal_3" />
-                    <item android:maxLevel="3" android:drawable="@drawable/ic_wifi_signal_4" />
+                    <item
+                        android:drawable="@drawable/ic_wifi_signal_0"
+                        android:maxLevel="0"/>
+                    <item
+                        android:drawable="@drawable/ic_wifi_signal_1"
+                        android:maxLevel="1"/>
+                    <item
+                        android:drawable="@drawable/ic_wifi_signal_2"
+                        android:maxLevel="2"/>
+                    <item
+                        android:drawable="@drawable/ic_wifi_signal_3"
+                        android:maxLevel="3"/>
+                    <item
+                        android:drawable="@drawable/ic_wifi_signal_4"
+                        android:maxLevel="4"/>
                 </level-list>
             </item>
-            <item android:drawable="@drawable/ic_wifi_signal_lock" />
+            <item android:drawable="@drawable/ic_wifi_signal_lock"/>
         </layer-list>
     </item>
     <item settings:state_encrypted="false">
         <level-list>
-            <item android:maxLevel="0" android:drawable="@drawable/ic_wifi_signal_1" />
-            <item android:maxLevel="1" android:drawable="@drawable/ic_wifi_signal_2" />
-            <item android:maxLevel="2" android:drawable="@drawable/ic_wifi_signal_3" />
-            <item android:maxLevel="3" android:drawable="@drawable/ic_wifi_signal_4" />
+            <item
+                android:drawable="@drawable/ic_wifi_signal_0"
+                android:maxLevel="0"/>
+            <item
+                android:drawable="@drawable/ic_wifi_signal_1"
+                android:maxLevel="1"/>
+            <item
+                android:drawable="@drawable/ic_wifi_signal_2"
+                android:maxLevel="2"/>
+            <item
+                android:drawable="@drawable/ic_wifi_signal_3"
+                android:maxLevel="3"/>
+            <item
+                android:drawable="@drawable/ic_wifi_signal_4"
+                android:maxLevel="4"/>
         </level-list>
     </item>
 </selector>
-
diff --git a/res/layout/action_bar.xml b/res/layout/action_bar.xml
index a06c991..f3d3d91 100644
--- a/res/layout/action_bar.xml
+++ b/res/layout/action_bar.xml
@@ -1,45 +1,60 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<RelativeLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_app_bar_height"
-        android:gravity="end|center_vertical" >
+    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.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
     <FrameLayout
         android:id="@+id/action_bar_icon_container"
-        android:layout_width="@dimen/car_margin"
-        android:layout_height="@dimen/car_app_bar_height"
-        android:layout_alignParentStart="true"
-        android:background="@drawable/button_ripple_bg">
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@drawable/button_ripple_bg"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/start_margin"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
         <ImageView
             android:id="@+id/back_button"
-            style="@style/ListIcon.ActionBar"/>
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:layout_gravity="center"
+            android:scaleType="fitCenter"
+            android:src="@drawable/ic_arrow_back"/>
     </FrameLayout>
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/start_margin"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_begin="@*android:dimen/action_bar_margin_start"/>
+
     <TextView
         android:id="@+id/title"
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/car_margin"
-        android:layout_marginTop="@dimen/optical_center_offset"
-        android:textAppearance="@style/TextAppearance.Car.Title2"
-        android:layout_gravity="center_vertical"
-        android:layout_centerVertical="true"
-        android:layout_alignParentStart="true"
+        android:ellipsize="end"
         android:maxLines="1"
-        android:ellipsize="end"/>
-</RelativeLayout>
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/start_margin"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/action_bar_quick_settings.xml b/res/layout/action_bar_quick_settings.xml
index 40de003..193b199 100644
--- a/res/layout/action_bar_quick_settings.xml
+++ b/res/layout/action_bar_quick_settings.xml
@@ -1,106 +1,90 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 The Android Open Source Project
 
-<RelativeLayout
+    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.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/car_app_bar_height"
-    android:layout_gravity="top">
+    android:layout_height="match_parent">
 
     <FrameLayout
         android:id="@+id/action_bar_icon_container"
-        android:layout_width="@dimen/car_margin"
-        android:layout_height="match_parent"
-        android:layout_alignParentStart="true"
-        android:background="@drawable/button_ripple_bg">
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@drawable/button_ripple_bg"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/start_margin"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
         <ImageView
             android:id="@+id/exit_button"
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
             android:layout_gravity="center"
-            android:src="@drawable/ic_close"
-            style="@style/ListIcon.ActionBar"/>
+            android:scaleType="fitCenter"
+            android:src="@drawable/ic_close"/>
     </FrameLayout>
 
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/start_margin"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_begin="@*android:dimen/action_bar_margin_start"/>
+
     <TextView
         android:id="@+id/title"
         android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_marginEnd="@dimen/car_keyline_1"
-        android:layout_toEndOf="@id/action_bar_icon_container"
-        android:gravity="center_vertical"
-        android:textAppearance="@style/TextAppearance.Car.Title2"/>
+        android:layout_height="wrap_content"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/start_margin"
+        app:layout_constraintTop_toTopOf="parent"/>
 
-    <LinearLayout
-        android:id="@+id/button_container"
+    <Button
+        android:id="@+id/user_switcher_btn"
+        style="@*android:style/ActionBarButton"
         android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_alignParentEnd="true"
-        android:layout_marginEnd="@dimen/car_keyline_1"
-        android:orientation="horizontal">
+        android:layout_height="0dp"
+        android:drawableStart="@drawable/ic_user"
+        android:drawableTint="?android:attr/textColorPrimary"
+        android:textColor="?android:attr/textColorPrimary"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/full_settings_btn"
+        app:layout_constraintHorizontal_bias="1.0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toEndOf="@+id/title"
+        app:layout_constraintTop_toTopOf="parent"/>
 
-        <LinearLayout
-            android:id="@+id/user_switcher_btn"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="center_vertical"
-            android:layout_marginEnd="@dimen/car_padding_4"
-            android:background="@drawable/button_ripple_bg"
-            style="@style/Widget.Car.Settings.ActionBar.Button.Borderless.Colored"
-            android:orientation="horizontal">
-            <ImageView
-                android:id="@+id/user_icon"
-                android:src="@drawable/ic_user"
-                android:background="@null"
-                android:layout_width="@dimen/car_primary_icon_size"
-                android:layout_height="@dimen/car_primary_icon_size"
-                android:layout_centerVertical="true"
-                android:gravity="center_vertical"
-                android:scaleType="fitCenter" />
-            <TextView
-                android:id="@+id/user_switcher_text"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:background="@null"
-                android:textAppearance="@style/TextAppearance.Car.Label1"
-                android:layout_marginStart="@dimen/car_padding_2"
-                android:layout_marginEnd="@dimen/car_padding_2"/>
-        </LinearLayout>
-        <LinearLayout
-            android:id="@+id/full_setting_btn"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="center_vertical"
-            android:layout_marginEnd="@dimen/car_padding_4"
-            android:background="@drawable/button_ripple_bg"
-            style="@style/Widget.Car.Settings.ActionBar.Button.Borderless.Colored"
-            android:orientation="horizontal">
-            <ImageView
-                android:src="@drawable/ic_settings_gear"
-                android:background="@null"
-                style="@style/ListIcon"/>
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:text="@string/more_settings_label"
-                android:textAppearance="@style/TextAppearance.Car.Label1"
-                android:background="@null"
-                android:layout_marginStart="@dimen/car_padding_2"
-                android:layout_marginEnd="@dimen/car_padding_2"/>
-        </LinearLayout>
-    </LinearLayout>
-</RelativeLayout>
+    <Button
+        android:id="@+id/full_settings_btn"
+        style="@*android:style/ActionBarButton"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:layout_marginHorizontal="@*android:dimen/action_bar_button_margin"
+        android:drawableStart="@drawable/ic_settings_gear"
+        android:text="@string/more_settings_label"
+        android:drawableTint="?android:attr/textColorPrimary"
+        android:textColor="?android:attr/textColorPrimary"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/user_switcher_btn"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/action_bar_with_button.xml b/res/layout/action_bar_with_button.xml
index 1227d9c..96864be 100644
--- a/res/layout/action_bar_with_button.xml
+++ b/res/layout/action_bar_with_button.xml
@@ -1,77 +1,84 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<RelativeLayout
+    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.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/car_app_bar_height">
+    android:layout_height="match_parent">
 
     <FrameLayout
         android:id="@+id/action_bar_icon_container"
-        android:layout_width="@dimen/car_margin"
-        android:layout_height="match_parent"
-        android:layout_alignParentStart="true"
-        android:background="@drawable/button_ripple_bg">
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@drawable/button_ripple_bg"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/start_margin"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
         <ImageView
             android:id="@+id/back_button"
-            style="@style/ListIcon.ActionBar"/>
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:layout_gravity="center"
+            android:scaleType="fitCenter"
+            android:src="@drawable/ic_arrow_back"/>
     </FrameLayout>
 
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/start_margin"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_begin="@*android:dimen/action_bar_margin_start"/>
+
     <TextView
         android:id="@+id/title"
         android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_marginEnd="@dimen/car_keyline_1"
-        android:layout_toEndOf="@id/action_bar_icon_container"
-        android:gravity="center_vertical"
-        android:textAppearance="@style/TextAppearance.Car.Title2"/>
-
-    <LinearLayout
-        android:id="@+id/button_container"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_alignParentEnd="true"
-        android:layout_marginEnd="@dimen/car_keyline_1"
-        android:orientation="horizontal">
-
-        <Button
-            android:id="@+id/action_button2"
-            android:visibility="gone"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            style="?android:attr/borderlessButtonStyle"
-            android:layout_marginEnd="@dimen/car_padding_3"/>
-
-        <Button
-            android:id="@+id/action_button1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            style="?android:attr/borderlessButtonStyle"
-            android:layout_marginEnd="@dimen/action_bar_end_widget_margin_end" />
-    </LinearLayout>
-
-    <ProgressBar
-        android:id="@+id/progress_bar"
-        style="@style/Widget.Car.ProgressBar.Horizontal"
-        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/start_margin"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+    <Button
+        android:id="@+id/action_button2"
+        style="@*android:style/ActionBarButton"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
         android:visibility="gone"
-        android:indeterminate="true"/>
-</RelativeLayout>
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/action_button1"
+        app:layout_constraintHorizontal_bias="1.0"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toEndOf="@+id/title"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+    <Button
+        android:id="@+id/action_button1"
+        style="@*android:style/ActionBarButton"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:layout_marginHorizontal="@*android:dimen/action_bar_button_margin"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/action_button2"
+        app:layout_constraintTop_toTopOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/action_bar_with_toggle.xml b/res/layout/action_bar_with_toggle.xml
index ec03e99..d18a20e 100644
--- a/res/layout/action_bar_with_toggle.xml
+++ b/res/layout/action_bar_with_toggle.xml
@@ -1,55 +1,75 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!--
+    Copyright 2017 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
+    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
+         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.
+    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.
 -->
 
-<RelativeLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_app_bar_height"
-        android:gravity="center_vertical" >
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
 
     <FrameLayout
         android:id="@+id/action_bar_icon_container"
-        android:layout_width="@dimen/car_margin"
-        android:layout_height="@dimen/car_app_bar_height"
-        android:layout_alignParentStart="true"
-        android:background="@drawable/button_ripple_bg">
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:background="@drawable/button_ripple_bg"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/start_margin"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
         <ImageView
             android:id="@+id/back_button"
-            style="@style/ListIcon.ActionBar"/>
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:layout_gravity="center"
+            android:scaleType="fitCenter"
+            android:src="@drawable/ic_arrow_back"/>
     </FrameLayout>
 
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/start_margin"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_begin="@*android:dimen/action_bar_margin_start"/>
+
     <TextView
         android:id="@+id/title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textAppearance="@style/TextAppearance.Car.Title2"
-        android:layout_marginTop="@dimen/optical_center_offset"
-        android:layout_gravity="center_vertical"
-        android:layout_centerVertical="true"
-        android:layout_alignParentStart="true"
-        android:layout_marginStart="@dimen/car_margin"
+        android:ellipsize="end"
         android:maxLines="1"
-        android:ellipsize="end"/>
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/start_margin"
+        app:layout_constraintTop_toTopOf="parent"/>
 
-    <Switch
-        android:id="@+id/toggle_switch"
-        android:background="@null"
-        style="@style/ListSwitch"
-        android:layout_centerVertical="true"
-        android:layout_alignParentEnd="true"
-        android:layout_marginEnd="@dimen/action_bar_end_widget_margin_end" />
-
-</RelativeLayout>
+    <FrameLayout
+        android:layout_width="@*android:dimen/action_bar_margin_end"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+        <Switch
+            android:id="@+id/toggle_switch"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:paddingStart="@*android:dimen/action_bar_toggle_internal_padding"
+            android:paddingEnd="@*android:dimen/action_bar_toggle_internal_padding"
+            android:background="@null"/>
+    </FrameLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/add_wifi.xml b/res/layout/add_wifi.xml
deleted file mode 100644
index 0786fd2..0000000
--- a/res/layout/add_wifi.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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="match_parent"
-    android:orientation="vertical" >
-    <ViewSwitcher
-        android:id="@+id/wifi_name"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-        <TextView
-            android:id="@+id/wifi_name_display"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            style="@style/TextAppearance.Car.Body1.SingleLine" />
-        <com.google.android.material.textfield.TextInputLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:theme="@style/Theme.AppCompat.Light">
-            <EditText
-                android:id="@+id/wifi_name_input"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:focusableInTouchMode="true"
-                style="@style/TextAppearance.Car.Body1"
-                android:hint="@string/wifi_ssid_hint" />
-        </com.google.android.material.textfield.TextInputLayout>
-    </ViewSwitcher>
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/wifi_password_wrapper"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:theme="@style/Theme.AppCompat.Light">
-        <EditText
-            android:id="@+id/wifi_password"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:focusableInTouchMode="true"
-            style="@style/TextAppearance.Car.Body1"
-            android:inputType="textPassword"
-            android:hint="@string/wifi_password" />
-    </com.google.android.material.textfield.TextInputLayout>
-    <Button
-        android:id="@+id/wifi_connect"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/wifi_setup_connect" />
-</LinearLayout>
diff --git a/res/layout/app_compat_activity.xml b/res/layout/app_compat_activity.xml
deleted file mode 100644
index d186653..0000000
--- a/res/layout/app_compat_activity.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-    <androidx.appcompat.widget.Toolbar
-        android:id="@+id/toolbar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_app_bar_height"
-        app:contentInsetStart="0dp"
-        style="@style/ActionBarStyle.Car" />
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_list_divider_height"
-        android:background="@color/car_list_divider"/>
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-        <FrameLayout
-            android:id="@+id/fragment_container"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-        <!-- set the text clickable to true so that it blocks touch event -->
-        <TextView
-            android:id="@+id/restricted_message"
-            android:gravity="center"
-            android:background="@color/car_grey_1000"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:text="@string/restricted_while_driving"
-            android:clickable="true"
-            android:visibility="gone"
-            android:textAppearance="@style/TextAppearance.Car.Body1.Light" />
-    </FrameLayout>
-</LinearLayout>
diff --git a/res/layout/bluetooth_list.xml b/res/layout/bluetooth_list.xml
deleted file mode 100644
index 07073a5..0000000
--- a/res/layout/bluetooth_list.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-    <ProgressBar
-        android:id="@+id/bt_search_progress"
-        android:visibility="gone"
-        style="@style/TrimmedHorizontalProgressBar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:indeterminate="true" />
-    <ViewSwitcher
-        android:id="@+id/view_switcher"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-            android:id="@+id/swiperefresh"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
-            <androidx.car.widget.PagedListView
-                android:id="@+id/list"
-                style="@style/SettingList"
-                app:showPagedListViewDivider="false"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent" />
-        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
-        <TextView
-            android:id="@+id/bt_message"
-            android:layout_gravity="center"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="@string/bluetooth_disabled"
-            style="@style/TextAppearance.Car.Body1" />
-    </ViewSwitcher>
-</LinearLayout>
diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml
index 4a9a2be..6d510d0 100644
--- a/res/layout/bluetooth_pin_confirm.xml
+++ b/res/layout/bluetooth_pin_confirm.xml
@@ -1,91 +1,95 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
-** Copyright 2017, 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.
-*/
+    Copyright 2017 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.
 -->
 
 <ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent">
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
 
     <LinearLayout
-        android:layout_marginStart="@dimen/car_keyline_1"
-        android:layout_marginEnd="@dimen/car_keyline_1"
-        android:layout_height="match_parent"
         android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginEnd="@dimen/bluetooth_pin_dialog_margin_end"
+        android:layout_marginStart="@dimen/bluetooth_pin_dialog_margin_start"
         android:orientation="vertical">
 
         <RelativeLayout
-            android:layout_height="@dimen/car_double_line_list_item_height"
-            android:layout_width="match_parent" >
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/bluetooth_pin_dialog_section_height">
             <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:orientation="vertical"
+                android:layout_alignParentStart="true"
                 android:layout_centerVertical="true"
                 android:gravity="center_vertical"
-                android:layout_alignParentStart="true">
+                android:orientation="vertical">
                 <TextView
                     android:id="@+id/pairing_caption"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
+                    android:ellipsize="end"
+                    android:maxLines="1"
                     android:text="@string/bluetooth_pairing_key_msg"
-                    android:visibility="gone"
-                    style="@style/TextAppearance.Car.Body2.SingleLine" />
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:visibility="gone"/>
                 <TextView
                     android:id="@+id/pairing_subhead"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:visibility="gone"
-                    style="@style/TextAppearance.Car.Body1.SingleLine"
-                    android:layout_marginTop="@dimen/car_padding_1" />
+                    android:layout_marginTop="@dimen/bluetooth_pin_dialog_subtext_margin_top"
+                    android:ellipsize="marquee"
+                    android:maxLines="1"
+                    android:textAppearance="?android:attr/textAppearanceLarge"
+                    android:visibility="gone"/>
             </LinearLayout>
         </RelativeLayout>
 
         <TextView
             android:id="@+id/pairing_code_message"
             android:layout_width="wrap_content"
-            android:layout_height="@dimen/car_single_line_list_item_height"
+            android:layout_height="@dimen/bluetooth_pin_dialog_section_height"
             android:gravity="center_vertical"
             android:text="@string/bluetooth_enter_passkey_msg"
-            style="@style/TextAppearance.Car.Body2"
-            android:visibility="gone" />
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:visibility="gone"/>
 
         <RelativeLayout
             android:id="@+id/phonebook_sharing_message_confirm_pin_container"
-            android:layout_height="@dimen/car_double_line_list_item_height"
-            android:layout_width="match_parent" >
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/bluetooth_pin_dialog_section_height">
             <CheckBox
                 android:id="@+id/phonebook_sharing_message_confirm_pin"
-                android:layout_width="@dimen/car_primary_icon_size"
-                android:layout_height="@dimen/car_primary_icon_size"
-                android:button="@drawable/ic_check_box"
+                android:layout_width="@dimen/icon_size"
+                android:layout_height="@dimen/icon_size"
                 android:layout_alignParentStart="true"
-                android:layout_centerVertical="true" />
+                android:layout_centerVertical="true"
+                android:button="@drawable/ic_check_box"/>
             <TextView
                 android:id="@+id/phonebook_sharing_message_confirm_pin_text"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_alignParentStart="true"
                 android:layout_centerVertical="true"
-                android:layout_marginStart="@dimen/car_keyline_3"
-                android:layout_marginEnd="@dimen/car_keyline_3"
-                style="@style/TextAppearance.Car.Body2.SingleLine"
-                android:gravity="center_vertical"/>
+                android:layout_marginEnd="@dimen/bluetooth_pin_dialog_text_margin_end"
+                android:layout_marginStart="@dimen/bluetooth_pin_dialog_text_margin_start"
+                android:ellipsize="end"
+                android:gravity="center_vertical"
+                android:maxLines="1"
+                android:textAppearance="?android:attr/textAppearanceMedium"/>
         </RelativeLayout>
 
     </LinearLayout>
diff --git a/res/layout/bluetooth_pin_entry.xml b/res/layout/bluetooth_pin_entry.xml
index 1e6bc03..343386f 100644
--- a/res/layout/bluetooth_pin_entry.xml
+++ b/res/layout/bluetooth_pin_entry.xml
@@ -1,107 +1,112 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
-** Copyright 2017, 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.
-*/
+    Copyright 2017 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.
 -->
+
 <ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent">
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
 
     <LinearLayout
-        android:layout_height="match_parent"
         android:layout_width="match_parent"
-        android:layout_marginStart="@dimen/car_keyline_1"
-        android:layout_marginEnd="@dimen/car_keyline_1"
+        android:layout_height="match_parent"
+        android:layout_marginEnd="@dimen/bluetooth_pin_dialog_margin_end"
+        android:layout_marginStart="@dimen/bluetooth_pin_dialog_margin_start"
         android:orientation="vertical">
 
         <TextView
             android:id="@+id/message_below_pin"
             android:layout_width="wrap_content"
-            android:layout_height="@dimen/car_single_line_list_item_height"
+            android:layout_height="@dimen/bluetooth_pin_dialog_section_height"
             android:gravity="center_vertical"
-            style="@style/TextAppearance.Car.Body2"/>
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
 
         <FrameLayout
-            android:layout_height="@dimen/car_double_line_list_item_height"
-            android:layout_width="match_parent" >
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/bluetooth_pin_dialog_section_height">
             <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:orientation="vertical"
-                android:layout_gravity="center_vertical">
+                android:layout_gravity="center_vertical"
+                android:orientation="vertical">
                 <EditText
                     android:id="@+id/text"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    style="@style/TextAppearance.Car.Body1"
                     android:inputType="textPassword"
-                    android:maxLines="1" />
+                    android:maxLines="1"
+                    android:textAppearance="?android:attr/textAppearanceLarge"/>
                 <TextView
                     android:id="@+id/pin_values_hint"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginTop="@dimen/car_padding_2"
+                    android:layout_marginTop="@dimen/bluetooth_pin_dialog_subtext_margin_top"
+                    android:ellipsize="end"
+                    android:maxLines="1"
                     android:text="@string/bluetooth_pin_values_hint"
-                    style="@style/TextAppearance.Car.Body2.SingleLine" />
+                    android:textAppearance="?android:attr/textAppearanceMedium"/>
             </LinearLayout>
         </FrameLayout>
 
         <RelativeLayout
-            android:layout_height="@dimen/car_double_line_list_item_height"
-            android:layout_width="match_parent" >
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/bluetooth_pin_dialog_section_height">
             <CheckBox
                 android:id="@+id/alphanumeric_pin"
-                android:layout_width="@dimen/car_primary_icon_size"
-                android:layout_height="@dimen/car_primary_icon_size"
-                android:button="@drawable/ic_check_box"
+                android:layout_width="@dimen/icon_size"
+                android:layout_height="@dimen/icon_size"
                 android:layout_alignParentStart="true"
-                android:layout_centerVertical="true" />
+                android:layout_centerVertical="true"
+                android:button="@drawable/ic_check_box"/>
             <TextView
-                android:text="@string/bluetooth_enable_alphanumeric_pin"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_alignParentStart="true"
                 android:layout_centerVertical="true"
-                android:layout_marginStart="@dimen/car_keyline_3"
-                android:layout_marginEnd="@dimen/car_keyline_3"
-                style="@style/TextAppearance.Car.Body2.SingleLine"
-                android:gravity="center_vertical"/>
+                android:layout_marginEnd="@dimen/bluetooth_pin_dialog_text_margin_end"
+                android:layout_marginStart="@dimen/bluetooth_pin_dialog_text_margin_start"
+                android:ellipsize="end"
+                android:gravity="center_vertical"
+                android:maxLines="1"
+                android:text="@string/bluetooth_enable_alphanumeric_pin"
+                android:textAppearance="?android:attr/textAppearanceMedium"/>
         </RelativeLayout>
 
         <RelativeLayout
-            android:layout_height="@dimen/car_double_line_list_item_height"
-            android:layout_width="match_parent" >
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/bluetooth_pin_dialog_section_height">
             <CheckBox
                 android:id="@+id/phonebook_sharing_message_entry_pin"
-                android:layout_width="@dimen/car_primary_icon_size"
-                android:layout_height="@dimen/car_primary_icon_size"
-                android:button="@drawable/ic_check_box"
+                android:layout_width="@dimen/icon_size"
+                android:layout_height="@dimen/icon_size"
                 android:layout_alignParentStart="true"
-                android:layout_centerVertical="true" />
+                android:layout_centerVertical="true"
+                android:button="@drawable/ic_check_box"/>
             <TextView
-                android:text="@string/bluetooth_pairing_shares_phonebook"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_alignParentStart="true"
                 android:layout_centerVertical="true"
-                android:layout_marginStart="@dimen/car_keyline_3"
-                android:layout_marginEnd="@dimen/car_keyline_3"
-                style="@style/TextAppearance.Car.Body2.SingleLine"
-                android:gravity="center_vertical"/>
+                android:layout_marginEnd="@dimen/bluetooth_pin_dialog_text_margin_end"
+                android:layout_marginStart="@dimen/bluetooth_pin_dialog_text_margin_start"
+                android:ellipsize="end"
+                android:gravity="center_vertical"
+                android:maxLines="1"
+                android:text="@string/bluetooth_pairing_shares_phonebook"
+                android:textAppearance="?android:attr/textAppearanceMedium"/>
         </RelativeLayout>
     </LinearLayout>
 
diff --git a/res/layout/brightness_tile.xml b/res/layout/brightness_tile.xml
index 80e2480..1cf7a5f 100644
--- a/res/layout/brightness_tile.xml
+++ b/res/layout/brightness_tile.xml
@@ -1,26 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2018 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
-  -->
+    Copyright 2018 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.
+-->
 
 <SeekBar
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/seekbar"
-    android:layout_marginBottom="@dimen/car_padding_4"
-    android:progressDrawable="@drawable/ic_seekbar_track"
-    android:thumb="@drawable/ic_brightness_knob_stretched"
-    android:splitTrack="true"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/car_single_line_list_item_height"/>
+    android:layout_height="@dimen/brightness_seekbar_height"
+    android:layout_marginBottom="@dimen/brightness_seekbar_margin_bottom"
+    android:progressBackgroundTint="?attr/quickSettingsDisabledColor"
+    android:progressDrawable="@drawable/brightness_seekbar_track"
+    android:progressTint="?attr/quickSettingsEnabledColor"
+    android:splitTrack="true"
+    android:thumb="@drawable/ic_brightness_knob_stretched"/>
diff --git a/res/layout/car_setting_activity.xml b/res/layout/car_setting_activity.xml
new file mode 100644
index 0000000..127c62f
--- /dev/null
+++ b/res/layout/car_setting_activity.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2017 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="match_parent"
+    android:orientation="vertical">
+    <FrameLayout
+        android:id="@+id/action_bar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/action_bar_height"/>
+    <ProgressBar
+        android:id="@+id/progress_bar"
+        style="@style/TrimmedHorizontalProgressBar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:indeterminate="true"
+        android:visibility="gone"/>
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/divider_height"
+        android:background="?attr/dividerColor"/>
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <FrameLayout
+            android:id="@+id/fragment_container"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+        <!-- set the text clickable to true so that it blocks touch event -->
+        <TextView
+            android:id="@+id/restricted_message"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="?android:attr/colorPrimary"
+            android:clickable="true"
+            android:gravity="center"
+            android:text="@string/restricted_while_driving"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:visibility="gone"/>
+    </FrameLayout>
+</LinearLayout>
diff --git a/res/layout/car_user_switcher.xml b/res/layout/car_user_switcher.xml
deleted file mode 100644
index 26c9329..0000000
--- a/res/layout/car_user_switcher.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2018 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"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="@color/car_user_switcher_background_color"
-        android:orientation="vertical">
-
-
-    <com.android.car.settings.users.UserGridRecyclerView
-        android:id="@+id/user_grid"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginTop="@dimen/car_user_switcher_margin_top"
-        app:verticallyCenterListContent="true"
-        app:showPagedListViewDivider="false"
-        app:gutter="both"
-        app:itemSpacing="@dimen/car_user_switcher_vertical_spacing_between_users"/>
-
-</LinearLayout>
diff --git a/res/layout/car_user_switcher_pod.xml b/res/layout/car_user_switcher_pod.xml
deleted file mode 100644
index f7503d8..0000000
--- a/res/layout/car_user_switcher_pod.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-     Copyright (C) 2018 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:clipChildren="false"
-    android:alpha="0"
-    android:layout_height="wrap_content"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:gravity="center">
-
-    <FrameLayout
-        android:id="@+id/current_user_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-
-        <ImageView android:id="@+id/user_avatar"
-            android:layout_width="@dimen/car_user_switcher_image_avatar_size"
-            android:layout_height="@dimen/car_user_switcher_image_avatar_size"
-            android:background="@drawable/car_button_ripple_background_inverse"
-            android:layout_gravity="center"/>
-    </FrameLayout>
-
-    <TextView android:id="@+id/user_name"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/car_user_switcher_vertical_spacing_between_name_and_avatar"
-        android:textSize="@dimen/car_user_switcher_name_text_size"
-        android:textColor="@color/car_user_switcher_name_text_color"
-        android:ellipsize="end"
-        android:singleLine="true"
-        android:gravity="center"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/choose_lock_password.xml b/res/layout/choose_lock_password.xml
index 82ef2d8..1dd716a 100644
--- a/res/layout/choose_lock_password.xml
+++ b/res/layout/choose_lock_password.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 The Android Open Source Project
 
-    Licensed under the Apache License, Version 2.0 (the "License")
+    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
+         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,
@@ -17,10 +17,9 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:layout_marginHorizontal="@dimen/car_margin"
+    android:layout_marginHorizontal="@*android:dimen/action_bar_margin"
     android:orientation="horizontal">
 
     <FrameLayout
@@ -28,25 +27,18 @@
         android:layout_height="match_parent"
         android:layout_weight="@integer/content_weight">
 
-        <com.google.android.material.textfield.TextInputLayout
+        <EditText
+            android:id="@+id/password_entry"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
-            android:paddingHorizontal="@dimen/car_padding_2"
-            app:hintTextAppearance="@style/TextAppearance.Car.Hint">
-
-            <com.google.android.material.textfield.TextInputEditText
-                android:id="@+id/password_entry"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:focusableInTouchMode="true"
-                android:hint="@string/security_lock_password"
-                android:imeOptions="actionDone|flagNoExtractUi"
-                android:inputType="textPassword"
-                android:maxLines="1"
-                android:textAppearance="@style/TextAppearance.Car.Body2"/>
-
-        </com.google.android.material.textfield.TextInputLayout>
+            android:focusableInTouchMode="true"
+            android:hint="@string/security_lock_password"
+            android:imeOptions="actionDone|flagNoExtractUi"
+            android:inputType="textPassword"
+            android:maxLines="1"
+            android:paddingHorizontal="@dimen/pin_password_entry_padding_horizontal"
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
 
     </FrameLayout>
 
@@ -58,33 +50,26 @@
         android:orientation="vertical">
 
         <ImageView
-            android:src="@drawable/ic_lock"
-            android:layout_height="@dimen/car_primary_icon_size"
-            android:layout_width="@dimen/car_primary_icon_size"/>
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:src="@drawable/ic_lock"/>
 
         <TextView
             android:id="@+id/title_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/choose_title_text_margin_bottom"
             android:gravity="center"
-            android:layout_marginBottom="@dimen/car_padding_2"
-            android:textAppearance="@style/TextAppearance.Car.Body1"
-            android:text="@string/lockscreen_choose_your_password"/>
+            android:text="@string/lockscreen_choose_your_password"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
 
         <TextView
             android:id="@+id/hint_text"
-            android:text="@string/choose_lock_password_hints"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:gravity="center"
-            android:textAppearance="@style/TextAppearance.Car.Body2" />
+            android:text="@string/choose_lock_password_hints"
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
 
-        <Button
-            android:id="@+id/screen_lock_options"
-            style="@style/Widget.Car.Button.Borderless.Colored"
-            android:layout_width="wrap_content"
-            android:layout_marginTop="@dimen/car_padding_2"
-            android:text="@string/screen_lock_options"
-            android:visibility="gone"/>
     </LinearLayout>
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/res/layout/choose_lock_pattern.xml b/res/layout/choose_lock_pattern.xml
index 76d4d02..fc9bfbc 100644
--- a/res/layout/choose_lock_pattern.xml
+++ b/res/layout/choose_lock_pattern.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 The Android Open Source Project
 
-    Licensed under the Apache License, Version 2.0 (the "License")
+    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
+         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,
@@ -19,21 +19,21 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:layout_marginHorizontal="@dimen/car_margin"
+    android:layout_marginHorizontal="@*android:dimen/action_bar_margin"
     android:orientation="horizontal"
-    android:paddingTop="@dimen/car_app_bar_height"
-    android:paddingBottom="@dimen/car_app_bar_height">
+    android:paddingBottom="@dimen/action_bar_height"
+    android:paddingTop="@dimen/action_bar_height">
 
     <!-- Start side: lock pattern -->
     <FrameLayout
         android:layout_width="0dp"
         android:layout_height="match_parent"
-        android:layout_weight="@integer/content_weight"
-        android:layout_gravity="center_vertical">
+        android:layout_gravity="center_vertical"
+        android:layout_weight="@integer/content_weight">
 
         <com.android.internal.widget.LockPatternView
-            style="@style/LockPatternStyle"
             android:id="@+id/lockPattern"
+            style="@style/LockPattern"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center"/>
@@ -48,32 +48,25 @@
         android:orientation="vertical">
 
         <ImageView
-            android:src="@drawable/ic_lock"
-            android:layout_height="@dimen/car_primary_icon_size"
-            android:layout_width="@dimen/car_primary_icon_size"/>
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:src="@drawable/ic_lock"/>
 
         <TextView
             android:id="@+id/title_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/choose_title_text_margin_bottom"
             android:gravity="center"
-            android:layout_marginBottom="@dimen/car_padding_2"
-            android:textAppearance="@style/TextAppearance.Car.Body1"
-            android:text="@string/lockscreen_choose_your_pattern"/>
+            android:text="@string/lockscreen_choose_your_pattern"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
 
         <TextView
             android:id="@+id/description_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:gravity="center"
-            android:textAppearance="@style/TextAppearance.Car.Body2"/>
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
 
-        <Button
-            android:id="@+id/screen_lock_options"
-            style="@style/Widget.Car.Button.Borderless.Colored"
-            android:layout_width="wrap_content"
-            android:layout_marginTop="@dimen/car_padding_2"
-            android:text="@string/screen_lock_options"
-            android:visibility="gone"/>
     </LinearLayout>
 </LinearLayout>
diff --git a/res/layout/choose_lock_pin.xml b/res/layout/choose_lock_pin.xml
index 7980665..aa74736 100644
--- a/res/layout/choose_lock_pin.xml
+++ b/res/layout/choose_lock_pin.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 The Android Open Source Project
 
-    Licensed under the Apache License, Version 2.0 (the "License")
+    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
+         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,
@@ -19,14 +19,14 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:layout_marginHorizontal="@dimen/car_margin"
+    android:layout_marginHorizontal="@*android:dimen/action_bar_margin"
     android:orientation="horizontal">
 
     <!-- Start side: lock pattern -->
     <FrameLayout
-        android:layout_weight="@integer/content_weight"
         android:layout_width="0dp"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:layout_weight="@integer/content_weight">
 
         <com.android.car.settings.security.PinPadView
             android:id="@+id/pin_pad"
@@ -38,54 +38,47 @@
 
     <!-- End side: pin entry field and messages -->
     <LinearLayout
-        android:layout_height="wrap_content"
         android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
         android:layout_weight="@integer/illustration_weight"
         android:gravity="center"
-        android:orientation="vertical"
-        android:layout_gravity="center_vertical">
+        android:orientation="vertical">
 
         <ImageView
-            android:src="@drawable/ic_lock"
-            android:layout_height="@dimen/car_primary_icon_size"
-            android:layout_width="@dimen/car_primary_icon_size"/>
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:src="@drawable/ic_lock"/>
 
         <TextView
             android:id="@+id/title_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/choose_pin_title_text_margin_bottom"
             android:gravity="center"
-            android:layout_marginBottom="@dimen/car_padding_5"
-            android:textAppearance="@style/TextAppearance.Car.Body1"
-            android:text="@string/lockscreen_choose_your_pin"/>
+            android:text="@string/lockscreen_choose_your_pin"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
 
         <EditText
             android:id="@+id/password_entry"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:paddingHorizontal="@dimen/car_padding_2"
-            android:gravity="center"
-            android:textAppearance="@style/TextAppearance.Car.Body1"
-            android:maxLines="1"
-            android:inputType="textPassword"
             android:cursorVisible="false"
-            android:focusable="false"/>
+            android:focusable="false"
+            android:gravity="center"
+            android:inputType="textPassword"
+            android:maxLines="1"
+            android:paddingHorizontal="@dimen/pin_password_entry_padding_horizontal"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
 
         <!--  hint text -->
         <TextView
             android:id="@+id/hint_text"
-            android:text="@string/choose_lock_pin_hints"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:gravity="center"
-            android:textAppearance="@style/TextAppearance.Car.Body2" />
+            android:text="@string/choose_lock_pin_hints"
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
 
-        <Button
-            android:id="@+id/screen_lock_options"
-            style="@style/Widget.Car.Button.Borderless.Colored"
-            android:layout_width="wrap_content"
-            android:layout_marginTop="@dimen/car_padding_2"
-            android:text="@string/screen_lock_options"
-            android:visibility="gone"/>
     </LinearLayout>
 </LinearLayout>
diff --git a/res/layout/confirm_lock_password.xml b/res/layout/confirm_lock_password.xml
new file mode 100644
index 0000000..437fa4d
--- /dev/null
+++ b/res/layout/confirm_lock_password.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <EditText
+        android:id="@+id/password_entry"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginHorizontal="@*android:dimen/action_bar_margin"
+        android:gravity="center"
+        android:inputType="textPassword"
+        android:maxLines="1"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:text="@string/lock_settings_enter_password"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    <TextView
+        android:id="@+id/message"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:freezesText="true"
+        android:gravity="center"
+        android:textAppearance="?android:attr/textAppearanceMedium"/>
+</LinearLayout>
diff --git a/res/layout/confirm_lock_password_fragment.xml b/res/layout/confirm_lock_password_fragment.xml
deleted file mode 100644
index 7895cad..0000000
--- a/res/layout/confirm_lock_password_fragment.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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:id="@+id/container"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:gravity="center">
-
-    <EditText
-        android:id="@+id/password_entry"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginHorizontal="@dimen/car_margin"
-        android:gravity="center"
-        android:textAppearance="@style/TextAppearance.Car.Body1"
-        android:maxLines="1"
-        android:inputType="textPassword"/>
-
-    <TextView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:textAppearance="@style/TextAppearance.Car.Body1"
-        android:text="@string/lock_settings_enter_password"/>
-
-    <TextView
-        android:id="@+id/message"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:textAppearance="@style/TextAppearance.Car.Body2"
-        android:freezesText="true"/>
-</LinearLayout>
diff --git a/res/layout/confirm_lock_pattern.xml b/res/layout/confirm_lock_pattern.xml
new file mode 100644
index 0000000..eac1720
--- /dev/null
+++ b/res/layout/confirm_lock_pattern.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/confirm_lock_message_vertical_spacing"
+        android:text="@string/lock_settings_enter_pattern"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    <TextView
+        android:id="@+id/message"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/confirm_lock_message_vertical_spacing"
+        android:gravity="center"
+        android:textAppearance="?android:attr/textAppearanceMedium"/>
+
+    <com.android.internal.widget.LockPatternView
+        android:id="@+id/lockPattern"
+        style="@style/LockPattern"
+        android:layout_width="@dimen/confirm_pattern_dimension"
+        android:layout_height="@dimen/confirm_pattern_dimension"/>
+</LinearLayout>
diff --git a/res/layout/confirm_lock_pattern_fragment.xml b/res/layout/confirm_lock_pattern_fragment.xml
deleted file mode 100644
index 01c45e3..0000000
--- a/res/layout/confirm_lock_pattern_fragment.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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:id="@+id/container"
-    android:layout_height="match_parent"
-    android:layout_width="match_parent"
-    android:orientation="vertical"
-    android:gravity="center">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/car_padding_2"
-        android:textAppearance="@style/TextAppearance.Car.Title2"
-        android:text="@string/lock_settings_enter_pattern"/>
-
-    <TextView
-        android:id="@+id/message"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="@dimen/car_padding_2"
-        android:gravity="center"
-        android:textAppearance="@style/TextAppearance.Car.Body2"/>
-
-    <com.android.internal.widget.LockPatternView
-        style="@style/LockPatternStyle"
-        android:id="@+id/lockPattern"
-        android:layout_width="@dimen/confirm_pattern_dimension"
-        android:layout_height="@dimen/confirm_pattern_dimension"/>
-</LinearLayout>
diff --git a/res/layout/confirm_lock_pin.xml b/res/layout/confirm_lock_pin.xml
new file mode 100644
index 0000000..bb7cec4
--- /dev/null
+++ b/res/layout/confirm_lock_pin.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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="match_parent"
+    android:layout_marginHorizontal="@*android:dimen/action_bar_margin"
+    android:orientation="horizontal">
+
+    <!-- Start side: lock PIN -->
+    <FrameLayout
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="@integer/content_weight"
+        android:gravity="center">
+
+        <com.android.car.settings.security.PinPadView
+            android:id="@+id/pin_pad"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:columnCount="3"/>
+    </FrameLayout>
+
+    <!-- End side: pin entry field and messages -->
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:layout_weight="@integer/illustration_weight"
+        android:orientation="vertical">
+
+        <EditText
+            android:id="@+id/password_entry"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="@dimen/pin_password_entry_padding_horizontal"
+            android:cursorVisible="false"
+            android:focusable="false"
+            android:gravity="center"
+            android:inputType="textPassword"
+            android:maxLines="1"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/confirm_lock_message_vertical_spacing"
+            android:gravity="center"
+            android:text="@string/lock_settings_enter_pin"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+        <TextView
+            android:id="@+id/message"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/confirm_lock_pin_fragment.xml b/res/layout/confirm_lock_pin_fragment.xml
deleted file mode 100644
index accb52a..0000000
--- a/res/layout/confirm_lock_pin_fragment.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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="match_parent"
-    android:orientation="horizontal">
-
-    <!-- Start side: lock PIN -->
-    <FrameLayout
-        android:layout_weight="1"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:gravity="center">
-
-        <com.android.car.settings.security.PinPadView
-            android:id="@+id/pin_pad"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:columnCount="3"/>
-    </FrameLayout>
-
-    <!-- End side: pin entry field and messages -->
-    <LinearLayout
-        android:layout_height="wrap_content"
-        android:layout_width="0dp"
-        android:layout_weight="1"
-        android:orientation="vertical"
-        android:layout_gravity="center_vertical">
-
-        <EditText
-            android:id="@+id/password_entry"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginHorizontal="@dimen/car_padding_5"
-            android:gravity="center"
-            android:textAppearance="@style/TextAppearance.Car.Body1"
-            android:maxLines="1"
-            android:inputType="textPassword"
-            android:cursorVisible="false"
-            android:focusable="false"/>
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:layout_marginBottom="@dimen/car_padding_2"
-            android:textAppearance="@style/TextAppearance.Car.Body1"
-            android:text="@string/lock_settings_enter_pin"/>
-
-        <TextView
-            android:id="@+id/message"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center"
-            android:textAppearance="@style/TextAppearance.Car.Body2" />
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/layout/data_usage_summary_preference.xml b/res/layout/data_usage_summary_preference.xml
new file mode 100644
index 0000000..b3c7c4b
--- /dev/null
+++ b/res/layout/data_usage_summary_preference.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:orientation="vertical"
+    android:paddingBottom="@dimen/data_usage_summary_preference_padding_bottom"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/usage_indicator_preference_title_margin_bottom"
+        android:layout_marginTop="@dimen/usage_indicator_preference_title_margin_top"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    <ProgressBar
+        android:id="@android:id/progress"
+        style="?android:attr/progressBarStyleHorizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="@dimen/usage_indicator_preference_progressbar_height"
+        android:progressDrawable="@drawable/color_progress_bar"/>
+
+    <LinearLayout
+        android:id="@+id/progress_bar_labels"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/usage_indicator_preference_label_margin_bottom"
+        android:layout_marginTop="@dimen/usage_indicator_preference_label_margin_top"
+        android:orientation="horizontal">
+        <TextView android:id="@android:id/text1"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textAppearance="?android:attr/textAppearanceSmall"/>
+
+        <Space
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"/>
+
+        <TextView android:id="@android:id/text2"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textAppearance="?android:attr/textAppearanceSmall"/>
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/data_limit_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceSmall"/>
+    <TextView
+        android:id="@+id/remaining_billing_cycle_time_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceSmall"/>
+    <TextView
+        android:id="@+id/carrier_info_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceSmall"/>
+    <Button
+        android:id="@+id/manage_subscription_button"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/data_usage_summary_preference_button_height"
+        android:layout_marginTop="@dimen/data_usage_summary_preference_button_margin_top"
+        android:minWidth="@dimen/data_usage_summary_preference_button_min_width"
+        android:text="@string/launch_manage_plan_text"/>
+</LinearLayout>
diff --git a/res/layout/date_picker.xml b/res/layout/date_picker.xml
index ebcc35c..23c37f2 100644
--- a/res/layout/date_picker.xml
+++ b/res/layout/date_picker.xml
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
 
 <DatePicker
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/date_picker"
-    android:scaleX="1.6"
-    android:scaleY="1.6"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
     android:layout_gravity="center"
     android:datePickerMode="spinner"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content" />
+    android:scaleX="1.6"
+    android:scaleY="1.6"/>
diff --git a/res/layout/delete_preference_widget.xml b/res/layout/delete_preference_widget.xml
new file mode 100644
index 0000000..7c2690e
--- /dev/null
+++ b/res/layout/delete_preference_widget.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:src="@drawable/ic_delete"/>
diff --git a/res/layout/details_preference_widget.xml b/res/layout/details_preference_widget.xml
new file mode 100644
index 0000000..4f9fc41
--- /dev/null
+++ b/res/layout/details_preference_widget.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:src="@drawable/ic_settings_gear"/>
diff --git a/res/layout/dropdown_preference_widget.xml b/res/layout/dropdown_preference_widget.xml
new file mode 100644
index 0000000..f6eb1a2
--- /dev/null
+++ b/res/layout/dropdown_preference_widget.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:src="@drawable/ic_arrow_drop_down"/>
diff --git a/res/layout/edit_icon_preference_widget.xml b/res/layout/edit_icon_preference_widget.xml
new file mode 100644
index 0000000..3797630
--- /dev/null
+++ b/res/layout/edit_icon_preference_widget.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:src="@drawable/ic_edit"/>
diff --git a/res/layout/edit_username_fragment.xml b/res/layout/edit_username_fragment.xml
index a9fe7be..2980e6a 100644
--- a/res/layout/edit_username_fragment.xml
+++ b/res/layout/edit_username_fragment.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 Google Inc.
+    Copyright 2018 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
+         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,
@@ -17,30 +17,20 @@
 
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:paddingStart="@dimen/car_margin"
-    android:paddingEnd="@dimen/car_margin">
+    android:paddingEnd="@dimen/edit_username_padding_end"
+    android:paddingStart="@dimen/edit_username_padding_start"
+    android:paddingTop="@dimen/edit_username_text_padding_top">
 
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/user_name"
+    <EditText
+        android:id="@+id/user_name_text_edit"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:focusableInTouchMode="true"
         android:hint="@string/user_name_label"
-        android:paddingEnd="@dimen/car_keyline_1"
-        android:paddingStart="@dimen/car_keyline_1"
-        android:paddingTop="@dimen/car_padding_3"
-        app:hintTextAppearance="@style/TextAppearance.Car.Hint">
-
-        <com.google.android.material.textfield.TextInputEditText
-            android:id="@+id/user_name_text_edit"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:focusableInTouchMode="true"
-            android:imeOptions="actionDone|flagNoExtractUi"
-            android:inputType="text"
-            android:maxLines="1"
-            android:textAppearance="@style/TextAppearance.Car.Body1"/>
-    </com.google.android.material.textfield.TextInputLayout>
+        android:imeOptions="actionDone|flagNoExtractUi"
+        android:inputType="text"
+        android:maxLines="1"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
 </FrameLayout>
diff --git a/res/layout/fallback_home_finishing_boot.xml b/res/layout/fallback_home_finishing_boot.xml
new file mode 100644
index 0000000..9331ea0
--- /dev/null
+++ b/res/layout/fallback_home_finishing_boot.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#80000000"
+    android:forceHasOverlappingRendering="false">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_marginEnd="16dp"
+        android:layout_marginStart="16dp"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@*android:string/android_start_title"
+            android:textColor="?android:attr/textColorPrimary"
+            android:textSize="20sp"/>
+
+        <ProgressBar
+            style="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="12.75dp"
+            android:colorControlActivated="?android:attr/textColorPrimary"
+            android:indeterminate="true"/>
+
+    </LinearLayout>
+</FrameLayout>
diff --git a/res/layout/homepage.xml b/res/layout/homepage.xml
deleted file mode 100644
index 68fc7c2..0000000
--- a/res/layout/homepage.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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.
--->
-
-<androidx.recyclerview.widget.RecyclerView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/recycler_view"
-        android:scrollbars="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
\ No newline at end of file
diff --git a/res/layout/icon_widget_line_item.xml b/res/layout/icon_widget_line_item.xml
deleted file mode 100644
index 6b2888f..0000000
--- a/res/layout/icon_widget_line_item.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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.
--->
-
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    style="@style/LineItem" >
-    <ImageView
-        android:id="@+id/icon"
-        android:layout_marginStart="@dimen/car_keyline_1"
-        android:layout_alignParentStart="true"
-        style="@style/ListIcon"/>
-    <LinearLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:layout_alignParentStart="true"
-        android:layout_centerVertical="true"
-        android:layout_marginStart="@dimen/car_keyline_3"
-        android:layout_marginEnd="@dimen/car_keyline_3" >
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            style="@style/TextAppearance.Car.Body1.SingleLine" />
-        <TextView
-            android:id="@+id/desc"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            style="@style/TextAppearance.Car.Body2.SingleLine"
-            android:visibility="gone" />
-    </LinearLayout>
-    <ImageButton
-        android:id="@+id/action"
-        style="@style/ListIcon"
-        android:layout_marginEnd="@dimen/car_keyline_1"
-        android:layout_alignParentEnd="true"
-        android:layout_centerVertical="true"
-        android:src="@drawable/ic_settings_gear"
-        android:background="@null"
-        android:visibility="gone" />
-    <View
-        android:id="@+id/line_item_divider"
-        android:layout_alignParentBottom="true"
-        android:background="@color/car_list_divider"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_list_divider_height" />
-</RelativeLayout>
diff --git a/res/layout/list_fragment.xml b/res/layout/list_fragment.xml
deleted file mode 100644
index 4b78932..0000000
--- a/res/layout/list_fragment.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2017 Google Inc.
-
-    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.
--->
-
-<androidx.car.widget.PagedListView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/list"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    app:showPagedListViewDivider="true"
-    app:alignDividerStartTo="@id/container"
-    style="@style/SettingList" />
-
diff --git a/res/layout/logical_preference_group.xml b/res/layout/logical_preference_group.xml
new file mode 100644
index 0000000..6845054
--- /dev/null
+++ b/res/layout/logical_preference_group.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"/>
diff --git a/res/layout/make_admin_preference_widget.xml b/res/layout/make_admin_preference_widget.xml
new file mode 100644
index 0000000..981b235
--- /dev/null
+++ b/res/layout/make_admin_preference_widget.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:maxEms="@integer/button_max_ems"
+    android:text="@string/grant_admin_permissions_button_text"
+    android:textAppearance="@style/PreferenceButtonTextAppearance"/>
diff --git a/res/layout/master_switch_widget.xml b/res/layout/master_switch_widget.xml
new file mode 100644
index 0000000..1b6bfff
--- /dev/null
+++ b/res/layout/master_switch_widget.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<Switch
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/master_switch"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:clickable="false"
+    android:focusable="false"/>
diff --git a/res/layout/pin_pad_view.xml b/res/layout/pin_pad_view.xml
index 5952ac4..ffe6162 100644
--- a/res/layout/pin_pad_view.xml
+++ b/res/layout/pin_pad_view.xml
@@ -1,17 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
+<!--
+    Copyright 2018 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
+    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
+         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.
+    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.
 -->
 
 <merge xmlns:android="http://schemas.android.com/apk/res/android">
@@ -19,69 +20,103 @@
     <Button
         android:id="@+id/key1"
         style="@style/PinPadKey"
-        android:text="@string/one"
-        android:tag="1"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="1"
+        android:text="@string/one"/>
     <Button
         android:id="@+id/key2"
         style="@style/PinPadKey"
-        android:text="@string/two"
-        android:tag="2"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="2"
+        android:text="@string/two"/>
     <Button
         android:id="@+id/key3"
         style="@style/PinPadKey"
-        android:text="@string/three"
-        android:tag="3"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="3"
+        android:text="@string/three"/>
 
     <!-- Row 2 -->
     <Button
         android:id="@+id/key4"
         style="@style/PinPadKey"
-        android:text="@string/four"
-        android:tag="4"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="4"
+        android:text="@string/four"/>
     <Button
         android:id="@+id/key5"
         style="@style/PinPadKey"
-        android:text="@string/five"
-        android:tag="5"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="5"
+        android:text="@string/five"/>
     <Button
         android:id="@+id/key6"
         style="@style/PinPadKey"
-        android:text="@string/six"
-        android:tag="6"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="6"
+        android:text="@string/six"/>
 
     <!-- Row 3 -->
     <Button
         android:id="@+id/key7"
         style="@style/PinPadKey"
-        android:text="@string/seven"
-        android:tag="7"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="7"
+        android:text="@string/seven"/>
     <Button
         android:id="@+id/key8"
         style="@style/PinPadKey"
-        android:text="@string/eight"
-        android:tag="8"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="8"
+        android:text="@string/eight"/>
     <Button
         android:id="@+id/key9"
         style="@style/PinPadKey"
-        android:text="@string/nine"
-        android:tag="9"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="9"
+        android:text="@string/nine"/>
 
     <!-- Row 4 -->
     <ImageButton
         android:id="@+id/key_backspace"
         style="@style/PinPadKey"
-        android:src="@drawable/ic_backspace"
-        android:tint="@color/car_body3"
-        android:contentDescription="@string/backspace_key"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:contentDescription="@string/backspace_key"
+        android:src="@drawable/ic_backspace"/>
     <Button
         android:id="@+id/key0"
         style="@style/PinPadKey"
-        android:text="@string/zero"
-        android:tag="0"/>
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:tag="0"
+        android:text="@string/zero"/>
     <ImageButton
         android:id="@+id/key_enter"
         style="@style/PinPadKey"
-        android:src="@drawable/ic_done"
-        android:tint="@color/car_body3"
-        android:contentDescription="@string/enter_key"/>
-</merge>
\ No newline at end of file
+        android:layout_width="@dimen/pin_pad_key_width"
+        android:layout_height="@dimen/pin_pad_key_height"
+        android:layout_margin="@dimen/pin_pad_key_margin"
+        android:contentDescription="@string/enter_key"
+        android:src="@drawable/ic_check"/>
+</merge>
diff --git a/res/layout/preference_dialog_edittext.xml b/res/layout/preference_dialog_edittext.xml
new file mode 100644
index 0000000..6fcd61f
--- /dev/null
+++ b/res/layout/preference_dialog_edittext.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginBottom="@dimen/alert_dialog_margin_bottom"
+    android:layout_marginTop="@dimen/alert_dialog_margin_top"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@android:id/message"
+        style="?android:attr/textAppearanceSmall"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/alert_dialog_title_margin_bottom"
+        android:layout_marginEnd="@dimen/alert_dialog_title_margin_end"
+        android:layout_marginStart="@dimen/alert_dialog_title_margin_start"
+        android:textColor="?android:attr/textColorSecondary"
+        android:visibility="gone"/>
+
+    <EditText
+        android:id="@android:id/edit"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/alert_dialog_edit_text_margin_end"
+        android:layout_marginStart="@dimen/alert_dialog_edit_text_margin_start"/>
+
+</LinearLayout>
diff --git a/res/layout/preference_dialog_password_edittext.xml b/res/layout/preference_dialog_password_edittext.xml
new file mode 100644
index 0000000..bcfd422
--- /dev/null
+++ b/res/layout/preference_dialog_password_edittext.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginBottom="@dimen/alert_dialog_margin_bottom"
+    android:layout_marginTop="@dimen/alert_dialog_margin_top"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@android:id/message"
+        style="?android:attr/textAppearanceSmall"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/alert_dialog_title_margin_bottom"
+        android:layout_marginEnd="@dimen/alert_dialog_title_margin_end"
+        android:layout_marginStart="@dimen/alert_dialog_title_margin_start"
+        android:textColor="?android:attr/textColorSecondary"
+        android:visibility="gone"/>
+
+    <EditText
+        android:id="@android:id/edit"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/alert_dialog_edit_text_margin_end"
+        android:layout_marginStart="@dimen/alert_dialog_edit_text_margin_start"/>
+
+    <CheckBox
+        android:id="@+id/checkbox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/alert_dialog_password_checkbox_margin_end"
+        android:layout_marginStart="@dimen/alert_dialog_password_checkbox_margin_start"
+        android:layout_marginTop="@dimen/alert_dialog_password_checkbox_margin_top"
+        android:text="@string/show_password"/>
+
+</LinearLayout>
diff --git a/res/layout/progress_bar_preference.xml b/res/layout/progress_bar_preference.xml
new file mode 100644
index 0000000..c224c01
--- /dev/null
+++ b/res/layout/progress_bar_preference.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<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="?android:attr/listPreferredItemHeightSmall"
+              android:orientation="horizontal"
+              android:paddingBottom="@dimen/progress_bar_preference_padding_bottom"
+              android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+              android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+              android:paddingTop="@dimen/progress_bar_preference_padding_top">
+    <androidx.preference.internal.PreferenceImageView
+        android:id="@android:id/icon"
+        android:layout_width="@dimen/icon_size"
+        android:layout_height="@dimen/icon_size"
+        android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ellipsize="end"
+                android:singleLine="true"
+                android:textAlignment="viewStart"
+                android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+            <Space
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"/>
+
+            <TextView
+                android:id="@android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:maxLines="1"
+                android:textAlignment="viewEnd"
+                android:textAppearance="?android:attr/textAppearanceSmall"/>
+        </LinearLayout>
+
+        <ProgressBar
+            android:id="@android:id/progress"
+            style="?android:attr/progressBarStyleHorizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/progress_bar_preference_progressbar_margin_top"/>
+
+        <LinearLayout
+            android:id="@+id/progress_bar_labels"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/progress_bar_preference_label_margin_top"
+            android:orientation="horizontal">
+            <TextView android:id="@android:id/text1"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:textAppearance="?android:attr/textAppearanceSmall"/>
+
+            <Space
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"/>
+
+            <TextView android:id="@android:id/text2"
+                      android:layout_width="wrap_content"
+                      android:layout_height="wrap_content"
+                      android:textAppearance="?android:attr/textAppearanceSmall"/>
+        </LinearLayout>
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/quick_settings.xml b/res/layout/quick_settings.xml
index e6d14c1..2e4c110 100644
--- a/res/layout/quick_settings.xml
+++ b/res/layout/quick_settings.xml
@@ -1,25 +1,38 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 The Android Open Source Project
 
-<androidx.car.widget.PagedListView
+    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.
+-->
+
+<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/list"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    app:showPagedListViewDivider="false"
-    style="@style/SettingList" />
\ No newline at end of file
+    android:layout_height="match_parent">
+
+    <com.android.car.apps.common.widget.PagedRecyclerView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/build_info"/>
+
+    <TextView
+        android:id="@+id/build_info"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:gravity="center"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:visibility="gone"/>
+
+</RelativeLayout>
diff --git a/res/layout/regulatory_info.xml b/res/layout/regulatory_info.xml
new file mode 100644
index 0000000..b4526c5
--- /dev/null
+++ b/res/layout/regulatory_info.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+  <ImageView
+      android:id="@+id/regulatory_info"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:adjustViewBounds="true"
+      android:contentDescription="@string/regulatory_labels"
+      android:scaleType="centerCrop"
+      android:src="@drawable/regulatory_info"/>
+</ScrollView>
diff --git a/res/layout/seekbar_preference.xml b/res/layout/seekbar_preference.xml
new file mode 100644
index 0000000..247e84e
--- /dev/null
+++ b/res/layout/seekbar_preference.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:orientation="horizontal"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+
+    <androidx.preference.internal.PreferenceImageView
+        android:id="@android:id/icon"
+        android:layout_width="@*android:dimen/car_primary_icon_size"
+        android:layout_height="@*android:dimen/car_primary_icon_size"
+        android:layout_marginBottom="@*android:dimen/car_padding_2"
+        android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"
+        android:layout_marginTop="@*android:dimen/car_padding_2"/>
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@*android:dimen/car_padding_2"
+        android:layout_marginTop="@*android:dimen/car_padding_2"
+        android:layout_weight="1">
+
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:ellipsize="end"
+            android:singleLine="true"
+            android:textAppearance="?android:attr/textAppearanceListItem"/>
+
+        <TextView
+            android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignStart="@android:id/title"
+            android:layout_below="@android:id/title"
+            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+            android:textColor="?android:attr/textColorSecondary"/>
+
+        <!-- Using UnPressableLinearLayout as a workaround to disable the pressed state propagation
+        to the children of this container layout. Otherwise, the animated pressed state will also
+        play for the thumb in the AbsSeekBar in addition to the preference's ripple background.
+        The background of the SeekBar is also set to null to disable the ripple background -->
+        <androidx.preference.UnPressableLinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignStart="@android:id/title"
+            android:layout_below="@android:id/summary"
+            android:clipChildren="false"
+            android:clipToPadding="false">
+            <SeekBar
+                android:id="@+id/seekbar"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:background="@null"
+                android:clickable="false"
+                android:focusable="false"/>
+
+            <TextView
+                android:id="@+id/seekbar_value"
+                android:layout_width="@*android:dimen/car_keyline_3"
+                android:layout_height="wrap_content"
+                android:fadingEdge="horizontal"
+                android:gravity="end|center_vertical"
+                android:scrollbars="none"
+                android:textAppearance="?android:attr/textAppearanceListItemSecondary"/>
+        </androidx.preference.UnPressableLinearLayout>
+
+    </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/settings_fragment.xml b/res/layout/settings_fragment.xml
new file mode 100644
index 0000000..e4628de
--- /dev/null
+++ b/res/layout/settings_fragment.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:ignore="NewApi">
+
+    <FrameLayout
+        android:id="@android:id/list_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <com.android.car.apps.common.widget.PagedRecyclerView
+            android:id="@+id/recycler_view"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
+    </FrameLayout>
+    <TextView
+        android:id="@android:id/empty"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:visibility="gone"/>
+
+</FrameLayout>
diff --git a/res/layout/spinner.xml b/res/layout/spinner.xml
deleted file mode 100644
index 1178f82..0000000
--- a/res/layout/spinner.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-          android:id="@+id/spinnerTarget"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:textAppearance="@style/TextAppearance.Car.Body1.SingleLine"
-/>
diff --git a/res/layout/spinner_drop_down.xml b/res/layout/spinner_drop_down.xml
deleted file mode 100644
index 4f401a8..0000000
--- a/res/layout/spinner_drop_down.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2017 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
-  -->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
-          android:id="@+id/spinnerTarget"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:paddingTop="@dimen/tile_top_bottom_padding"
-          android:paddingBottom="@dimen/tile_top_bottom_padding"
-          android:paddingStart="@dimen/car_keyline_1"
-          android:textAppearance="@style/TextAppearance.Car.Body1.SingleLine"
-/>
diff --git a/res/layout/suggestion_preference.xml b/res/layout/suggestion_preference.xml
new file mode 100644
index 0000000..c834522
--- /dev/null
+++ b/res/layout/suggestion_preference.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginBottom="@dimen/suggestions_top_bottom_margin"
+    android:layout_marginTop="@dimen/suggestions_top_bottom_margin"
+    android:background="@android:color/transparent">
+    <androidx.cardview.widget.CardView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:foreground="?android:attr/selectableItemBackground"
+        app:cardCornerRadius="@dimen/suggestions_corner_radius">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="?attr/suggestionsPrimaryColor"
+                android:paddingBottom="@dimen/suggestions_text_padding_bottom"
+                android:paddingEnd="@dimen/suggestions_padding_end"
+                android:paddingStart="@dimen/suggestions_padding_start"
+                android:paddingTop="@dimen/suggestions_text_padding_top">
+                <TextView
+                    android:id="@android:id/title"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:ellipsize="end"
+                    android:maxLines="1"
+                    android:textAppearance="?android:attr/textAppearanceLarge"
+                    android:hyphenationFrequency="none"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"/>
+                <TextView
+                    android:id="@android:id/summary"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/suggestions_subtext_margin_top"
+                    android:ellipsize="end"
+                    android:maxLines="1"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:hyphenationFrequency="none"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@android:id/title"/>
+                <ImageView
+                    android:id="@android:id/icon"
+                    android:layout_width="@dimen/icon_size"
+                    android:layout_height="@dimen/icon_size"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"/>
+            </androidx.constraintlayout.widget.ConstraintLayout>
+            <FrameLayout
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/suggestions_action_bar_height"
+                android:background="?attr/suggestionsSecondaryColor"
+                android:paddingEnd="@dimen/suggestions_padding_end"
+                android:paddingStart="@dimen/suggestions_padding_start">
+                <Button
+                    android:id="@+id/dismiss_button"
+                    style="?android:attr/borderlessButtonStyle"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center_vertical"
+                    android:text="@string/suggestion_dismiss_button"
+                    android:textColor="?android:attr/textColorPrimary"/>
+            </FrameLayout>
+        </LinearLayout>
+    </androidx.cardview.widget.CardView>
+</FrameLayout>
diff --git a/res/layout/summary_preference_widget.xml b/res/layout/summary_preference_widget.xml
new file mode 100644
index 0000000..a69094c
--- /dev/null
+++ b/res/layout/summary_preference_widget.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/widget_summary"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical|end"
+    android:textAlignment="viewEnd"
+    android:textAppearance="?android:attr/textAppearanceSmall"
+    android:textColor="?android:attr/textColorSecondary"/>
diff --git a/res/layout/suw_action_bar_with_button.xml b/res/layout/suw_action_bar_with_button.xml
deleted file mode 100644
index fc5ba27..0000000
--- a/res/layout/suw_action_bar_with_button.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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
-  -->
-
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="@dimen/car_app_bar_height">
-
-    <FrameLayout
-        android:id="@+id/action_bar_icon_container"
-        android:layout_width="@dimen/car_margin"
-        android:layout_height="match_parent"
-        android:layout_alignParentStart="true">
-
-        <ImageView
-            android:id="@+id/back_button"
-            android:background="@drawable/suw_button_ripple_bg"
-            style="@style/ListIcon.ActionBar"/>
-    </FrameLayout>
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:layout_marginEnd="@dimen/car_keyline_1"
-        android:layout_toEndOf="@id/action_bar_icon_container"
-        android:gravity="center_vertical"
-        android:textAppearance="@style/TextAppearance.Car.Title2"/>
-
-    <Button
-        android:id="@+id/action_button2"
-        style="?android:attr/borderlessButtonStyle"
-        android:visibility="gone"
-        android:layout_width="wrap_content"
-        android:layout_height="@dimen/car_button_height"
-        android:layout_toStartOf="@id/action_button1"
-        android:layout_centerVertical="true"
-        android:ellipsize="end"
-        android:maxLines="1"/>
-
-    <Button
-        android:id="@+id/action_button1"
-        android:layout_width="wrap_content"
-        android:layout_height="@dimen/car_button_height"
-        android:layout_alignParentEnd="true"
-        android:layout_centerVertical="true"
-        android:layout_marginStart="@dimen/car_padding_4"
-        android:ellipsize="end"
-        android:maxLines="1"/>
-
-    <ProgressBar
-        android:id="@+id/progress_bar"
-        style="@style/Widget.Car.ProgressBar.Horizontal"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:visibility="gone"
-        android:indeterminate="true"/>
-</RelativeLayout>
diff --git a/res/layout/suw_activity.xml b/res/layout/suw_activity.xml
deleted file mode 100644
index 78d688c..0000000
--- a/res/layout/suw_activity.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 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"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-    <androidx.appcompat.widget.Toolbar
-        android:id="@+id/toolbar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_app_bar_height"
-        app:contentInsetStart="0dp"
-        style="@style/ActionBarStyle.Car" />
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:id="@+id/fragment_container"/>
-</LinearLayout>
diff --git a/res/layout/tile.xml b/res/layout/tile.xml
index b24c34f..28d71da 100644
--- a/res/layout/tile.xml
+++ b/res/layout/tile.xml
@@ -1,36 +1,36 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2018 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:padding="@dimen/toggle_padding"
-    android:layout_marginStart="@dimen/car_padding_2"
-    android:layout_marginEnd="@dimen/car_padding_2"
-    android:layout_marginBottom="@dimen/car_padding_5"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:layout_marginBottom="@dimen/tile_margin_bottom"
+    android:layout_marginEnd="@dimen/tile_margin_end"
+    android:layout_marginStart="@dimen/tile_margin_start"
     android:gravity="center_horizontal"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:padding="@dimen/tile_padding">
     <FrameLayout
         android:id="@+id/icon_container"
-        android:layout_width="@dimen/car_touch_target_size"
-        android:layout_height="@dimen/car_touch_target_size"
+        android:layout_width="@dimen/touch_target_size"
+        android:layout_height="@dimen/touch_target_size"
+        android:layout_marginBottom="@dimen/tile_icon_margin_bottom"
         android:background="@drawable/circle_ripple_bg"
-        android:layout_marginBottom="@dimen/car_padding_4"
         android:gravity="center">
         <View
             android:id="@+id/icon_background"
@@ -39,31 +39,15 @@
             android:background="@drawable/circle_bg"/>
         <ImageView
             android:id="@+id/tile_icon"
-            android:layout_width="@dimen/car_primary_icon_size"
-            android:layout_height="@dimen/car_primary_icon_size"
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
             android:layout_gravity="center"
+            android:scaleType="fitCenter"
             android:src="@drawable/ic_settings_wifi"
-            android:tint="@color/toggle_icon_tint"
-            style="@style/ListIcon" />
+            android:tint="@color/toggle_icon_tint"/>
     </FrameLayout>
-    <LinearLayout
-        android:id="@+id/text_container"
-        android:layout_height="wrap_content"
+    <TextView
+        android:id="@+id/tile_text"
         android:layout_width="wrap_content"
-        android:orientation="horizontal">
-        <TextView
-            android:id="@+id/tile_text"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:gravity="center"
-            android:textAppearance="@style/TextAppearance.Car.Label1"/>
-        <ImageView
-            android:id="@+id/deep_dive_icon"
-            android:layout_width="@dimen/car_primary_icon_size"
-            android:layout_height="@dimen/car_primary_icon_size"
-            android:src="@drawable/ic_arrow_drop_down"
-            android:tint="@color/car_label1"
-            android:layout_marginStart="@dimen/car_padding_1"
-            android:visibility="gone"/>
-    </LinearLayout>
-</LinearLayout>
\ No newline at end of file
+        android:layout_height="wrap_content"/>
+</LinearLayout>
diff --git a/res/layout/time_picker.xml b/res/layout/time_picker.xml
index 9666a9f..404467c 100644
--- a/res/layout/time_picker.xml
+++ b/res/layout/time_picker.xml
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
 
 <TimePicker
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/time_picker"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
     android:scaleX="1.6"
     android:scaleY="1.6"
-    android:layout_gravity="center"
-    android:timePickerMode="spinner"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"/>
+    android:timePickerMode="spinner"/>
diff --git a/res/layout/two_action_preference.xml b/res/layout/two_action_preference.xml
new file mode 100644
index 0000000..06c09cb
--- /dev/null
+++ b/res/layout/two_action_preference.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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:color/transparent"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall">
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:background="?android:attr/selectableItemBackground"
+        android:clipToPadding="false"
+        android:gravity="start|center_vertical"
+        android:paddingBottom="@dimen/preference_padding_bottom"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingTop="@dimen/preference_padding_top">
+        <androidx.preference.internal.PreferenceImageView
+            android:id="@android:id/icon"
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:layout_marginEnd="?android:attr/listPreferredItemPaddingEnd"/>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:orientation="vertical">
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ellipsize="end"
+                android:hyphenationFrequency="none"
+                android:singleLine="true"
+                android:textAppearance="?android:attr/textAppearanceLarge"/>
+            <TextView
+                android:id="@android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:hyphenationFrequency="none"
+                android:textAppearance="?android:attr/textAppearanceSmall"/>
+        </LinearLayout>
+    </LinearLayout>
+    <LinearLayout
+        android:id="@+id/action_widget_container"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent">
+        <View
+            android:layout_width="@dimen/two_action_preference_divider_width"
+            android:layout_height="match_parent"
+            android:layout_marginBottom="@dimen/preference_padding_bottom"
+            android:layout_marginTop="@dimen/preference_padding_top"
+            android:background="?attr/dividerColor"/>
+        <!-- Preference should place its actual preference widget here. -->
+        <FrameLayout
+            android:id="@android:id/widget_frame"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:background="?android:attr/selectableItemBackground"
+            android:minWidth="?android:attr/listPreferredItemHeightSmall"
+            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+            android:paddingStart="?android:attr/listPreferredItemPaddingStart"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/usage_bytes_threshold_picker.xml b/res/layout/usage_bytes_threshold_picker.xml
new file mode 100644
index 0000000..a8cf70f
--- /dev/null
+++ b/res/layout/usage_bytes_threshold_picker.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent">
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/guideline_top"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintGuide_begin="@dimen/usage_pickers_margin_vertical"/>
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/guideline_start"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_begin="@dimen/usage_bytes_picker_margin_horizontal"/>
+
+    <FrameLayout
+        android:id="@+id/bytes_threshold_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/usage_pickers_text_margin_end"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        app:layout_constraintBottom_toTopOf="@+id/guideline_bottom"
+        app:layout_constraintEnd_toStartOf="@+id/bytes_units"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="@+id/guideline_start"
+        app:layout_constraintTop_toBottomOf="@+id/guideline_top">
+        <EditText
+            android:id="@+id/bytes_threshold"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:ems="@integer/data_usage_bytes_threshold_ems"
+            android:inputType="numberDecimal"
+            android:minWidth="@dimen/usage_bytes_picker_edit_text_min_width"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
+    </FrameLayout>
+
+    <FrameLayout
+        android:id="@+id/up_arrow_container"
+        android:layout_width="@dimen/touch_target_size"
+        android:layout_height="@dimen/touch_target_size"
+        android:background="?android:attr/selectableItemBackground"
+        app:layout_constraintEnd_toEndOf="@+id/bytes_units"
+        app:layout_constraintStart_toStartOf="@+id/bytes_units"
+        app:layout_constraintTop_toBottomOf="@+id/guideline_top">
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:src="@drawable/ic_keyboard_arrow_up"/>
+    </FrameLayout>
+
+    <NumberPicker
+        android:id="@+id/bytes_units"
+        android:layout_width="@dimen/touch_target_size"
+        android:layout_height="match_parent"
+        app:layout_constraintBottom_toTopOf="@+id/down_arrow_container"
+        app:layout_constraintEnd_toEndOf="@+id/guideline_end"
+        app:layout_constraintStart_toEndOf="@+id/bytes_threshold_container"
+        app:layout_constraintTop_toBottomOf="@+id/up_arrow_container"/>
+
+    <FrameLayout
+        android:id="@+id/down_arrow_container"
+        android:layout_width="@dimen/touch_target_size"
+        android:layout_height="@dimen/touch_target_size"
+        android:background="?android:attr/selectableItemBackground"
+        app:layout_constraintBottom_toTopOf="@+id/guideline_bottom"
+        app:layout_constraintEnd_toEndOf="@+id/bytes_units"
+        app:layout_constraintStart_toStartOf="@+id/bytes_units">
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:src="@drawable/ic_keyboard_arrow_down"/>
+    </FrameLayout>
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/guideline_end"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintGuide_end="@dimen/usage_bytes_picker_margin_horizontal"/>
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/guideline_bottom"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintGuide_end="@dimen/usage_pickers_margin_vertical"/>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/usage_cycle_reset_day_of_month_picker.xml b/res/layout/usage_cycle_reset_day_of_month_picker.xml
new file mode 100644
index 0000000..93d18e0
--- /dev/null
+++ b/res/layout/usage_cycle_reset_day_of_month_picker.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent">
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/guideline_top"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintGuide_begin="@dimen/usage_pickers_margin_vertical"/>
+
+    <TextView
+        android:id="@+id/subtitle_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/usage_pickers_text_margin_end"
+        android:text="@string/cycle_reset_day_of_month_picker_subtitle"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        app:layout_constraintBottom_toTopOf="@+id/guideline_bottom"
+        app:layout_constraintEnd_toStartOf="@+id/cycle_reset_day_of_month"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/guideline_top"/>
+
+    <FrameLayout
+        android:id="@+id/up_arrow_container"
+        android:layout_width="@dimen/touch_target_size"
+        android:layout_height="@dimen/touch_target_size"
+        android:background="?android:attr/selectableItemBackground"
+        app:layout_constraintEnd_toEndOf="@+id/cycle_reset_day_of_month"
+        app:layout_constraintStart_toStartOf="@+id/cycle_reset_day_of_month"
+        app:layout_constraintTop_toBottomOf="@+id/guideline_top">
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:src="@drawable/ic_keyboard_arrow_up"/>
+    </FrameLayout>
+
+    <NumberPicker
+        android:id="@+id/cycle_reset_day_of_month"
+        android:layout_width="@dimen/touch_target_size"
+        android:layout_height="match_parent"
+        app:layout_constraintBottom_toTopOf="@+id/down_arrow_container"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/subtitle_text"
+        app:layout_constraintTop_toBottomOf="@+id/up_arrow_container"/>
+
+    <FrameLayout
+        android:id="@+id/down_arrow_container"
+        android:layout_width="@dimen/touch_target_size"
+        android:layout_height="@dimen/touch_target_size"
+        android:background="?android:attr/selectableItemBackground"
+        app:layout_constraintBottom_toTopOf="@+id/guideline_bottom"
+        app:layout_constraintEnd_toEndOf="@+id/cycle_reset_day_of_month"
+        app:layout_constraintStart_toStartOf="@+id/cycle_reset_day_of_month">
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:src="@drawable/ic_keyboard_arrow_down"/>
+    </FrameLayout>
+
+    <androidx.constraintlayout.widget.Guideline
+        android:id="@+id/guideline_bottom"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintGuide_end="@dimen/usage_pickers_margin_vertical"/>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/usage_indicator_preference.xml b/res/layout/usage_indicator_preference.xml
new file mode 100644
index 0000000..b6ad180
--- /dev/null
+++ b/res/layout/usage_indicator_preference.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center_vertical"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:orientation="vertical"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart">
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/usage_indicator_preference_title_margin_top"
+        android:layout_marginBottom="@dimen/usage_indicator_preference_title_margin_bottom"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    <ProgressBar
+        android:id="@android:id/progress"
+        style="?android:attr/progressBarStyleHorizontal"
+        android:layout_width="match_parent"
+        android:minHeight="@dimen/usage_indicator_preference_progressbar_height"
+        android:layout_height="wrap_content"
+        android:progressDrawable="@drawable/color_progress_bar"/>
+
+    <LinearLayout
+        android:id="@+id/progress_bar_labels"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/usage_indicator_preference_label_margin_top"
+        android:layout_marginBottom="@dimen/usage_indicator_preference_label_margin_bottom"
+        android:orientation="horizontal">
+        <TextView android:id="@android:id/text1"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textAppearance="?android:attr/textAppearanceSmall"/>
+
+        <Space
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"/>
+
+        <TextView android:id="@android:id/text2"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textAppearance="?android:attr/textAppearanceSmall"/>
+    </LinearLayout>
+
+    <TextView
+        android:id="@android:id/summary"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/usage_indicator_preference_summary_margin_bottom"
+        android:textAppearance="?android:attr/textAppearanceSmall"/>
+</LinearLayout>
diff --git a/res/layout/user_details_fragment.xml b/res/layout/user_details_fragment.xml
deleted file mode 100644
index db883d3..0000000
--- a/res/layout/user_details_fragment.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 Google Inc.
-
-    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.
--->
-
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingStart="@dimen/car_margin"
-    android:paddingEnd="@dimen/car_margin">
-    <com.google.android.material.textfield.TextInputLayout
-        android:id="@+id/user_name"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:hint="@string/user_name_label"
-        android:paddingEnd="@dimen/car_keyline_1"
-        android:paddingStart="@dimen/car_keyline_1"
-        android:paddingTop="@dimen/car_padding_3"
-        app:hintTextAppearance="@style/TextAppearance.Car.Hint">
-        <com.google.android.material.textfield.TextInputEditText
-            android:id="@+id/user_name_text_edit"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:focusableInTouchMode="true"
-            android:imeOptions="actionDone|flagNoExtractUi"
-            android:inputType="text"
-            android:maxLines="1"
-            android:textAppearance="@style/TextAppearance.Car.Body1"/>
-    </com.google.android.material.textfield.TextInputLayout>
-
-    <Button
-        android:id="@+id/ok_button"
-        android:visibility="gone"
-        android:layout_width="wrap_content"
-        android:layout_height="@dimen/car_button_height"
-        android:layout_gravity="center_vertical"
-        android:text="@android:string/ok"
-        android:maxLines="1"
-        android:ellipsize="end"
-        style="@style/Widget.Car.Button.Borderless.Colored"
-        android:minWidth="@dimen/car_button_min_width"
-        android:textColor="@color/action_bar_btn"
-        android:layout_toStartOf="@id/cancel_button"
-        android:layout_below="@id/user_name"/>
-
-    <Button
-        android:id="@+id/cancel_button"
-        android:visibility="gone"
-        android:layout_width="wrap_content"
-        android:layout_height="@dimen/car_button_height"
-        android:layout_gravity="center_vertical"
-        android:text="@string/cancel"
-        android:maxLines="1"
-        android:ellipsize="end"
-        style="@style/Widget.Car.Button.Borderless.Colored"
-        android:minWidth="@dimen/car_button_min_width"
-        android:textColor="@color/action_bar_btn"
-        android:layout_alignEnd="@id/user_name"
-        android:layout_below="@id/user_name"/>
-</RelativeLayout>
diff --git a/res/layout/user_switcher.xml b/res/layout/user_switcher.xml
new file mode 100644
index 0000000..ad2d456
--- /dev/null
+++ b/res/layout/user_switcher.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<com.android.car.settings.users.UserGridRecyclerView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/user_grid"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center_vertical"
+    android:background="?attr/userSwitcherBackground"/>
diff --git a/res/layout/user_switcher_pod.xml b/res/layout/user_switcher_pod.xml
new file mode 100644
index 0000000..086d8fb
--- /dev/null
+++ b/res/layout/user_switcher_pod.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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:alpha="0"
+    android:clipChildren="false"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <FrameLayout
+        android:id="@+id/current_user_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <ImageView
+            android:id="@+id/user_avatar"
+            android:layout_width="@dimen/user_switcher_image_avatar_size"
+            android:layout_height="@dimen/user_switcher_image_avatar_size"
+            android:layout_gravity="center"
+            android:background="?android:attr/selectableItemBackgroundBorderless"/>
+    </FrameLayout>
+
+    <TextView
+        android:id="@+id/user_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/user_switcher_vertical_spacing_between_name_and_avatar"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:singleLine="true"
+        android:textAppearance="?attr/userSwitcherNameTextAppearance"/>
+
+</LinearLayout>
diff --git a/res/layout/wifi_list.xml b/res/layout/wifi_list.xml
deleted file mode 100644
index 1bb82df..0000000
--- a/res/layout/wifi_list.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-    <ProgressBar
-        android:id="@+id/wifi_search_progress"
-        android:visibility="gone"
-        style="@style/TrimmedHorizontalProgressBar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:indeterminate="true" />
-    <ViewSwitcher
-        android:id="@+id/view_switcher"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-        <androidx.car.widget.PagedListView
-            android:id="@+id/list"
-            style="@style/SettingList"
-            app:showPagedListViewDivider="false"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent" />
-        <TextView
-            android:id="@+id/message"
-            android:layout_gravity="center"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            style="@style/TextAppearance.Car.Body1"/>
-    </ViewSwitcher>
-</LinearLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 6ec3a98..19ad542 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"dowwe skerm, raakskerm, battery"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"dowwe skerm, nag, tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nagmodus"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Netwerk en internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Selnetwerk"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiele data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Kry toegang tot data deur selnetwerk"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Skakel mobiele data af?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Datagebruik"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Datawaarskuwing en -limiet"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Programdatagebruiksiklus"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Stel datawaarskuwing"</string>
+    <string name="data_warning" msgid="116776633806885370">"Datawaarskuwing"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Stel datalimiet"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datalimiet"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Beperk datagebruik"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Jou voertuig se hoofeenheid sal mobiele data afskakel wanneer dit die limiet wat jy gestel het, bereik het.\n\nOorweeg dit om \'n konserwatiewe limiet te stel omdat die datagebruik deur die hoofeenheid gemeet word terwyl jou diensverskaffer die gebruik dalk anders bereken."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Stel draadlose toegangspunte op en bestuur hulle"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Skakel tans Wi-Fi aan …"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Skakel tans Wi-Fi af …"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Laai tans Wi‑Fi-lys"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi is gedeaktiveer"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Kon netwerk nie vergeet nie"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Kon nie aan netwerk koppel nie"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Voeg netwerk by"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi is gedeaktiveer"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Koppel"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Wagwoord"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Wys wagwoord"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Netwerknaam"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Voer die SSID in"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sekuriteit"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Seinsterkte"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Seinsterkte"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Koppelspoed"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekwensie"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-adres"</string>
+    <string name="show_password" msgid="2074628020371139240">"Wys wagwoord"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Voer netwerknaam in"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Voer wagwoord in"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Swak"</item>
-    <item msgid="2032262610626057081">"Redelik"</item>
-    <item msgid="3859756017461098953">"Goed"</item>
-    <item msgid="1521103743353335724">"Uitstekend"</item>
+    <item msgid="7683058295076342057">"Swak"</item>
+    <item msgid="1639222824821660744">"Redelik"</item>
+    <item msgid="1838705897358163300">"Goed"</item>
+    <item msgid="6067166649320533751">"Uitstekend"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Skakel Bluetooth aan"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth is gedeaktiveer"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Netwerkbesonderhede"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-adres"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-adres"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnetmasker"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-adresse"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Deurgang"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi-voorkeure"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Skakel Wi-Fi outomaties aan"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi aan by gestoorde hoëgehaltenetwerke, soos tuisnetwerk"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Onbeskikbaar omdat ligging af is. Skakel "<annotation id="link">"ligging"</annotation>" aan."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Skakel Wi‑Fi-opsporing aan?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Skakel aan"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi-opsporing is aangeskakel"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Skakel outomaties oor na mobiele data"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Gebruik mobiele data wanneer Wi-Fi geen internettoegang het nie. Datagebruikheffings kan geld."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Kom meer te wete"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Beheer verbindings, stel toestelnaam en opspoorbaarheid"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Rekenaar"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Kopstuk"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Foon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Prenttoestel"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Oorfoon"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Randinvoertoestel"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Saamgebinde toestelle"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Beskikbare toestelle"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Geen saamgebinde toestelle nie"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Geen beskikbare toestelle nie"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Saamgebinde toestel"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Naam"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Gebruik vir"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Verander Bluetooth-toestel se naam"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Naamlose toestel"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Saamgebinde toestelle"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Bind nuwe toestel saam"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth sal aangeskakel word om saam te bind"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Ontkoppel toestel?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Jou voertuig sal van <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ontkoppel word."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Voertuig se Bluetooth-adres: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Toestel se Bluetooth-adres: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Voertuignaam"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Hernoem hierdie voertuig"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Hernoem toestel"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Hernoem"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Beskikbare toestelle"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiele"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth-saambindversoek"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Bind saam en koppel"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-saambindkode"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN bevat letters of simbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Voer die saambindkode in en druk dan Return of Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Gewoonlik 0000 of 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Saambindversoek"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tik om met <xliff:g id="DEVICE_NAME">%1$s</xliff:g> saam te bind."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Tale"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Tale en invoer"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Sleutelbord"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Bestuur sleutelborde"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Teks-na-spraak-uitset"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Voorkeurenjin"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Huidige enjin"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Spraaktempo"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Toonhoogte"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Stel terug"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Klank"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Luivolume"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigasievolume"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Stel volume vir musiek en video\'s"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Wekker"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Foonluitoon"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Verstekkennisgewingklank"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Verstekwekkerklank"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Programme en kennisgewings"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Wys alle programme"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Verstekprogramme"</string>
     <string name="applications_settings" msgid="794261395191035632">"Programinligting"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Dwing stop"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Dwing stop?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"As jy \'n program dwing om te stop, kan dit wangedra."</string>
     <string name="disable_text" msgid="4358165448648990820">"Deaktiveer"</string>
     <string name="enable_text" msgid="1794971777861881238">"Aktiveer"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Deïnstalleer"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"As jy hierdie program deaktiveer, sal Android en ander programme dalk nie meer soos bedoel werk nie."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Deaktiveer program"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Toestemmings"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Weergawe: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Geen toestemmings is verleen nie"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Geen toestemmings is versoek nie"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Datagebruik"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Programdatagebruik"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Dwing stop"</string>
     <string name="computing_size" msgid="5791407621793083965">"Bereken tans …"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> bykomende toestemmings</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> bykomende toestemming</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Bystand en steminvoer"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Bystandprogram"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Gebruik teks op die skerm"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Gee die bystandprogram toegang tot die skerminhoud as teks"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Gebruik skermkiekie"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Gee die bystandprogram toegang tot \'n prent van die skerm"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Outovuldiens"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Geen"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Is gekies"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Die assistent sal inligting oor programme wat tans op jou stelsel gebruik word, kan lees, insluitend inligting wat op jou skerm sigbaar is of toeganklik is binne die programme."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Maak seker dat jy hierdie program vertrou&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Outovul&gt;%1$s&lt;/xliff:g&gt; gebruik wat op jou skerm is om te bepaal wat outomaties ingevul kan word."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Voeg diens by"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Ligging"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Onlangse liggingversoeke"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Geen onlangse liggingversoeke nie"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Programvlaktoestemmings"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skandering"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Liggingdienste"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi-opsporing"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Laat programme en dienste toe om enige tyd na Wi-Fi-netwerke te soek, selfs wanneer Wi-Fi af is. Dit kan byvoorbeeld gebruik word om ligginggegronde kenmerke en dienste te verbeter."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-opsporing"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Laat programme en dienste toe om enige tyd na toestelle in die omtrek te soek, selfs wanneer Bluetooth af is. Dit kan byvoorbeeld gebruik word om ligginggegronde kenmerke en dienste te verbeter."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Stelsel"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Stelselopdaterings"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Stelselopdaterings"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-weergawe"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-sekuriteitregstellingvlak"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basisband-weergawe"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernweergawe"</string>
     <string name="build_number" msgid="3997326631001009102">"Bounommer"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-adres"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nie beskikbaar nie"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Kopiereg"</string>
     <string name="license_title" msgid="936705938435249965">"Lisensie"</string>
     <string name="terms_title" msgid="5201471373602628765">"Bepalings en voorwaardes"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Stelsel se WebView-lisensie"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Webaansig-stelsellisensies"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Muurpapiere"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Verskaffers van satellietbeelde:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Derdepartylisensies"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kon nie die lisensies laai nie."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Laai tans …"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Jy het nou <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> stappe oor voordat jy \'n ontwikkelaar is.</item>
+      <item quantity="one">Jy het nou <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> stap oor voordat jy \'n ontwikkelaar is.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Jy is nou \'n ontwikkelaar!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Dis nie nodig nie – jy is reeds \'n ontwikkelaar."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Ontwikkelaaropsies"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Terugstellingopsies"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Terugstelling van netwerk, programme of toestel"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Stel netwerk terug"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Dit sal alle netwerkinstellings terugstel, insluitend:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobiele data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Vee alle voertuig-e-SIM\'e uit"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Dit sal nie jou diensplan kanselleer nie."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Kan nie e-SIM\'e terugstel nie"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Kies netwerk"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Stel instellings terug"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Stel terug?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Stel alle netwerkinstellings terug? Jy kan nie hierdie handeling ontdoen nie!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Stel instellings terug"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Netwerkinstellings is teruggestel"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Stel programvoorkeure terug"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Dit sal al die voorkeure terugstel vir:\n\n"<li>"Gedeaktiveerde programme"</li>\n<li>"Gedeaktiveerdeprogram-kennisgewings"</li>\n<li>"Verstekprogramme vir handelinge"</li>\n<li>"Agtergronddatabeperkings vir programme"</li>\n<li>"Enige toestemmingbeperkings"</li>\n\n"Jy sal geen programdata verloor nie."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Stel programme terug"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Programvoorkeure is teruggestel"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Vee alle data uit (fabriekterugstelling)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Dit sal alle data van jou voertuig se beheerpaneel uitvee, insluitend:\n\n"<li>"Jou Google-rekening"</li>\n<li>"Stelsel- en programdata en -instellings"</li>\n<li>"Afgelaaide programme"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Jy is tans aangemeld by die volgende rekeninge:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Daar is ander gebruikers op hierdie voertuig teenwoordig."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Stel voertuig terug"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Stel terug?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Vee al jou persoonlike inligting en afgelaaide programme uit? Jy kan nie hierdie handeling ontdoen nie!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Vee alles uit"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Vee tans uit"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Wag asseblief …"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum en tyd"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Stel datum en tyd"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Stel datum, tyd, tydsones en formate"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Rangskik volgens tydsone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Tyd"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Voeg gebruiker by"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Voeg rekening by"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Vee gebruiker uit"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nuwe gebruiker"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gas"</string>
     <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Aangemeld as admin"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Alle admin-toestemmings"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Maak administrateur"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Die gebruiker sal gebruikers kan uitvee, insluitend ander administrateurs, en \'n fabriekterugstelling op die stelsel kan uitvoer."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Hierdie handeling is nie omkeerbaar nie."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ja, maak administrateur"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Skep nuwe gebruikers"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Maak foonoproepe"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Stuur SMS\'e met motor se mobiele data"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Installeer nuwe programme"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Deïnstalleer programme"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Voeg gebruiker by"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nuwe gebruiker"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Voeg nuwe gebruiker by?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Enige gebruiker kan programme vir al die ander gebruikers opdateer."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Gebruikerlimiet is bereik"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Jy kan tot <xliff:g id="COUNT">%d</xliff:g> gebruikers skep.</item>
+      <item quantity="one">Net een gebruiker kan geskep word.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Kon nie \'n nuwe gebruiker skep nie"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Vee hierdie gebruiker uit?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Alle programme en data sal uitgevee word."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Kon nie gebruiker uitvee nie."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Maak toe"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Herprobeer"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Vee laaste gebruiker uit?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"\'n Nuwe admin-gebruiker sal geskep word as die enigste oorblywende gebruiker vir hierdie motor uitgevee word."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Alle data, instellings en programme wat met hierdie gebruiker geassosieer word, sal uitgevee word. Jy sal die stelsel weer moet opstel."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Kies nuwe admin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Jy het minstens een admin nodig. As jy hierdie een wil uitvee, moet jy eers \'n plaasvervanger kies."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Kies admin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gas"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gas"</string>
     <string name="user_switch" msgid="6544839750534690781">"Wissel"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Jy (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Naam"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nie opgestel nie"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Wysig gebruikernaam"</string>
     <string name="users_list_title" msgid="770764290290240909">"Gebruikers"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Toestemmings gegee aan %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Rekeninge"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Gebruiker"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Voeg rekening by"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Geen rekeninge is bygevoeg nie"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Rekeninge van <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sinkroniseer data outomaties"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Laat programme data outomaties herlaai"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Skakel dataoutosinkroniseer aan?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Enige veranderinge wat jy aan jou rekeninge op die web aanbring, sal outomaties na jou toestel toe gekopieer word.\n\nSommige rekeninge kan ook outomaties enige veranderinge wat jy op die foon maak, na die web toe kopieer. \'n Google-rekening werk só."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Skakel dataoutosinkroniseer af?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Dit sal data bespaar, maar jy sal elke rekening self moet sinkroniseer om onlangse inligting in te samel. En jy sal nie kennisgewings ontvang wanneer opdaterings plaasvind nie."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Rekeninginligting"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Voeg rekening by"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Voeg \'n rekening by"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Verwyder rekening"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Verwyder rekening?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"As hierdie rekening verwyder word, sal al sy boodskappe, kontakte en ander data op die toestel uitgevee word!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Jou administrateur laat nie hierdie verandering toe nie"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Verwyder dié gebruiker?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Alle programme en data sal uitgevee word."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Kon nie gebruiker verwyder nie."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Probeer weer?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Maak toe"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Herprobeer"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Voeg nuwe gebruiker by?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Enige gebruiker kan programme vir al die ander gebruikers opdateer."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Kon nie rekening verwyder nie."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Rekeningsinkronisering"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinkronisering is aan vir <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g> items"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinkronisering is aan vir alle items"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinkronisering is af vir alle items"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinkronisering is AF"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sinkroniseerfout"</string>
+    <string name="last_synced" msgid="4745124489150101529">"<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g> laas gesinkroniseer"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinkroniseer tans …"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tik om nou te sinkroniseer<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkroniseer nou"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Kanselleer sinkronisering"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronisering ondervind tans probleme. Dit sal binnekort terug wees."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sekuriteit"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skermslot"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Geen"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Wagwoord"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Kies \'n slottipe"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Skermslotopsies"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Slotopsies"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Voer jou patroon in"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Bevestig"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Teken oor"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Stel \'n skermslot"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Kies jou PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Kies jou patroon"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Kies jou wagwoord"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Kies jou wagwoord"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Huidige skermslot"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Stel \'n patroon vir sekuriteit"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Vee uit"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Jou IT-administrateur blokkeer algemene wagwoorde. Probeer \'n ander wagwoord."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Stygende, dalende of herhalende groep syfers word nie toegelaat nie."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Skermslotopsies"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> dae gelede"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Voeg vertroude toestel by"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Vertroude toestelle"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> toestelle</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> toestel</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Jou <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> sal hierdie motor ontsluit wanneer dit gekoppel is. As iemand jou <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> vat, kan hulle dalk toegang tot hierdie toestel verkry"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Bevestig"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Verwyder vertroude toestel"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Klaar"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Gebruik die metgeselprogram om \'n vertroude toestel op te stel. Sodra dit opgestel is, sal jy jou gebruikerprofiel kan ontsluit wanneer jou foon deur die voertuig bespeur word"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Laai die metgeselprogram af op jou foon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Kies <xliff:g id="CAR_NAME">%1$s</xliff:g> op jou foon om die toestelle saam te bind"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock kan nie die sekuriteitkenmerke van hierdie toestel bespeur nie. Om jou motor te help beskerm, sal vertroude toestel net jou motor ontsluit kan hou as jy dit reeds ontsluit het. Jou vertroude toestel kan jou motor ontsluit hou wanneer dit naby is, selfs al hou iemand anders dit vas."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Voeg <xliff:g id="DEVICE_NAME">%1$s</xliff:g> as \'n vertroude toestel by"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> is suksesvol as \'n vertroude toestel bygevoeg"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-inskrywing het misluk"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"As jy \'n vertroude toestel byvoeg, sal daar van jou vereis word om volgende \'n stawingsmetode op te stel. As jy nie jou vertroude toestel by jou het nie, sal stawing vereis word om by jou profiel in te gaan."</string>
     <string name="forget" msgid="3971143908183848527">"Vergeet"</string>
+    <string name="connect" msgid="5861699594602380150">"Koppel"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Ontkoppel"</string>
     <string name="delete_button" msgid="5840500432614610850">"Vee uit"</string>
     <string name="remove_button" msgid="6664656962868194178">"Verwyder"</string>
     <string name="cancel" msgid="750286395700355455">"Kanselleer"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Verlaat demonstrasiemodus"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Dit sal die demonstrasierekening uitvee en \'n fabriekterugstelling op die stelsel uitvoer. Alle gebruikerdata sal verloor word."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Verlaat demonstrasie"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"voltooi opstelling"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"nie nou nie"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"WYS AF"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Kenmerk is nie beskikbaar terwyl jy bestuur nie."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Kan nie gebruiker byvoeg terwyl jy bestuur nie."</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index f856f43..2b45d8f 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ደብዛዛ ማያ ገጽ፣ ማያንካ፣ ባትሪ"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ደብዛዛ ማያ ገጽ፣ ሌሌት፣ ቅልም"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"የሌሊት ሁነታ"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"አውታረ መረብ እና በይነመረብ"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"የተንቀሳቃሽ ስልክ አውታረ መረብ"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"የተንቀሳቃሽ ስልክ ውሂብ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"የተንቀሳቃሽ ስልክ አውታረ መረብን በመጠቀም ውሂብን ይድረሱበት"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"የተንቀሳቃሽ ስልክ ውሂብ ይጥፋ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"የውሂብ አጠቃቀም"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"የውሂብ ማስጠንቀቂያ እና ገደብ"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"የመተግበሪያ ውሂብ አጠቃቀም ዑደት"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"የውሂብ ማስጠንቀቂያ አዘጋጅ"</string>
+    <string name="data_warning" msgid="116776633806885370">"የውሂብ ማስጠንቀቂያ"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"የውሂብ ገደብ ያዘጋጁ"</string>
+    <string name="data_limit" msgid="227338836292511425">"የውሂብ ገደብ"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"የውሂብ አጠቃቀም መወሰን"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"የእርስዎ ተሽከርካሪ ዋናው አሃድ አንዴ ያዘጋጁት ገደብ ላይ ሲደርስ የተንቀሳቃሽ ስልክ ውሂቡን ያጠፋዋል።\n\nየውሂብ አጠቃቀም የሚለካው በዋናው አሃድ፣ እና የአገልግሎት አቅራቢዎ አጠቃቀም በተለየ መልኩ ሊቆጥር የሚችል እንደመሆኑ መጠን ቆጠብ ያለ ገደብ ማዘጋጀቱን ያስቡበት።"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"የገመድ አልባ መገናኛ ነጥቦችን ያቀናብሩ"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fiን በማብራት ላይ…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi በማጥፋት ላይ…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"የWi‑Fi ዝርዝር በመጫን ላይ"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi ተሰናክሏል"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"አውታረ መረብን መርሳት አልተሳካም"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ከአውታረ መረቡ ጋር መገናኘት አልተሳካም"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"አውታረ መረብ አክል"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi ተሰናክሏል"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"አገናኝ"</string>
     <string name="wifi_password" msgid="5565632142720292397">"የይለፍ ቃል"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"የይለፍ ቃል አሳይ"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"የአውታረ መረብ ስም"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID ያስገቡ"</string>
     <string name="wifi_security" msgid="158358046038876532">"ደኅንነት"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"የሲግናል ጥንካሬ"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"የሲግናል ጥንካሬ"</string>
     <string name="wifi_status" msgid="5688013206066543952">"ሁኔታ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"የአገናኝ ፍጥነት"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ድግግሞሽ"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"የአይፒ አድራሻ"</string>
+    <string name="show_password" msgid="2074628020371139240">"የይለፍ ቃል አሳይ"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"የአውታረ መረብ ስም ያስገቡ"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"የይለፍ ቃል ያስገቡ"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"የመዳረሻ_ነጥብ_መለያ_ቁልፍ"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ደካማ"</item>
-    <item msgid="2032262610626057081">"ደህና"</item>
-    <item msgid="3859756017461098953">"ጥሩ"</item>
-    <item msgid="1521103743353335724">"እጅግ በጣም ጥሩ"</item>
+    <item msgid="7683058295076342057">"ደካማ"</item>
+    <item msgid="1639222824821660744">"ደህና"</item>
+    <item msgid="1838705897358163300">"ጥሩ"</item>
+    <item msgid="6067166649320533751">"እጅግ በጣም ጥሩ"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ብሉቱዝ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ብሉቱዝን አብራ"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ብሉቱዝ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ብሉቱዝ ተሰናክሏል"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d ሜቢ/ሴ"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 ጊኸ"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ጊኸ"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"የአውታረ መረብ ዝርዝሮች"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"የማክ አድራሻ"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"የአይፒ አድራሻ"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"የንዑስ አውታር ጭንብል"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"ዲኤንኤስ"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"የIPv6 አድራሻዎች"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"መውጫ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"የWi‑Fi ምርጫዎች"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fiን በራስ-ሰር አብራ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"የቤትዎን የመሳሰሉ የተቀመጡ ባለ ከፍተኛ ጥራት አውታረ መረቦች አጠገብ Wi‑Fi ተመልሶ ይበራል"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"መገኛ አካባቢ ስለጠፋ ሊገኝ አይችልም። "<annotation id="link">"መገኛ አካባቢን"</annotation>" አብራ።"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"የWi‑Fi ቅኝትን ይብራ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"አብራ"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi ቅኝት በርቷል"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"በራስ-ሰር ወደ የተንቀሳቃሽ ስልክ ውሂብ ቀይር"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"የWi-Fi በይነመረብ መዳረሻ በማይኖርበት ጊዜ የተንቀሳቃሽ ስልክ ውሂብ ይጠቀሙ። የውሂብ ክፍያዎች ሊከፈልባቸው ይችላል።"</string>
+    <string name="learn_more" msgid="8214605928933358604">"የበለጠ ለመረዳት"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ብሉቱዝ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"ግንኙነቶችን ያቀናብሩ፣ የመሣሪያ ስም እና ተገኝነትን ያቀናብሩ"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"ኮምፒውተር"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ማዳመጫ"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ስልክ"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ምስል መስራት"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"የጆሮ ማዳመጫ"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"የግቤት መለዋወጫ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ብሉቱዝ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"የተጣመሩ መሣሪያዎች"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"የሚገኙ መሣሪያዎች"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ምንም የተጣመሩ መሣሪያዎች የሉም"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"ምንም የሚገኙ መሣሪያዎች የሉም"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"የተጣመረ መሣሪያ"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"ስም"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"ተጠቀም ለ"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"የብሉቱዝ መሣሪያውን ስም ይቀይሩ"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"ያልተሰየመ መሳሪያ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"የተጣመሩ መሣሪያዎች"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"አዲስ መሣሪያ ያጣምሩ"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"ብሉቱዝ ለማጣመር ይበራል"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"የመሣሪያ ግንኙነት ይቋረጥ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"ተሽከርካሪዎ ከ<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ጋር ያለው ግንኙነት ይቋረጣል።"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"የተሽከርካሪ ብሉቱዝ አድራሻ፦ <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"የመሣሪያ የብሉቱዝ አድራሻ፦ <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"የተሽከርካሪ ስም"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ይህን ተሽከርካሪ ዳግም ሰይም"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"መሣሪያን ዳግም ሰይም"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"ዳግም ሰይም"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"የሚገኙ መሣሪያዎች"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"መገለጫዎች"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"የብሉቱዝ ማጣመር ጥያቄ"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"አጣምር እና ተገናኝ"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ብሉቱዝ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"የብሉቱዝ ማጣመሪያ ኮድ"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ፒን ፊደሎችን ወይም ምልክቶችን ይይዛል"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"የማጣመር ኮድ ይተይቡና ከዚያም Return ወይም Enter የሚለውን ይጫኑ"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"አብዛኛውን ጊዜ 0000 ወይም 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"የማጣመር ጥየቃ"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"ከ«<xliff:g id="DEVICE_NAME">%1$s</xliff:g>» ጋር ለማጣመር ነካ ያድርጉ።"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ቋንቋዎች"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ቋንቋዎች እና ግቤት"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"የቁልፍ ሰሌዳ"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"የቁልፍ ሰሌዳዎችን አቀናብር"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"የጽሑፍ-ወደ-ንግግር ቅንብሮች"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"የተመረጠው ፕሮግራም"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"አሁን ያለ ፕሮግራም"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"የንግግር ፍጥነት"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"የድምጽ ውፍረት"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ዳግም አስጀምር"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ድምጽ"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"የጥሪ የድምጽ መጠን"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"የአሰሳ ድምጽ መጠን"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"ማህደረ መረጃ"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"ለሙዚቃ እና ቪዲዮዎች የድምፅ መጠን ያቀናብሩ"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"ማንቂያ"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"የስልክ ጥሪ ቅላጼ"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ነባሪ የማሳወቂያ ድምጽ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ነባሪ የማንቂያ ድምጽ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"መተግበሪያዎች እና ማሳወቂያዎች"</string>
+    <string name="all_applications" msgid="7798210477486822168">"ሁሉንም መተግበሪያዎች አሳይ"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ነባሪ መተግበሪያዎች"</string>
     <string name="applications_settings" msgid="794261395191035632">"የመተግበሪያ መረጃ"</string>
+    <string name="force_stop" msgid="2153183697014720520">"በኃይል አቁም"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"በኃይል አቁም?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"መተግበሪያን በጉልበት እንዲቆም ካደረጉት ከአደብ ውጪ ሊሆን ይችላል።"</string>
     <string name="disable_text" msgid="4358165448648990820">"አሰናክል"</string>
     <string name="enable_text" msgid="1794971777861881238">"አንቃ"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"አራግፍ"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ይህን መተግበሪያ ካሰናከሉት ከዚህ በኋላ Android እና ሌሎች መተግበሪያዎች እንደተፈለገው ላይሠሩ ይችላሉ።"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"መተግበሪያን አሰናክል"</string>
     <string name="permissions_label" msgid="2701446753515612685">"ፈቃዶች"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ስሪት፦ %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ምንም ፈቃዶች አልተሰጡም"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ምንም ፈቃዶች አልተጠየቁም"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"የውሂብ አጠቃቀም"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"የመተግበሪያ ውሂብ አጠቃቀም"</string>
-    <string name="force_stop" msgid="2153183697014720520">"በኃይል አቁም"</string>
     <string name="computing_size" msgid="5791407621793083965">"በማስላት ላይ…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ተጨማሪ ፈቃዶች</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ተጨማሪ ፈቃዶች</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"እገዛ እና የድምጽ ግቤት"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"የእገዛ መተግበሪያ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ከማያ ገጽ ላይ ጽሑፍ ተጠቀም"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"ረዳት መተግበሪያው የማያ ገጹን ይዘቶች እንደ ጽሑፍ እንዲደርሳባቸው ይፍቀዱ"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ቅጽበታዊ ገጽ እይታ ይጠቀሙ"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"ረዳት መተግበሪያው የማያ ገጹን ምስል እንዲደርስበት ይፍቀዱ"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"የራስ-ሙላ አገልግሎት"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ምንም"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"ተመርጧል"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ረዳቱ በእርስዎ ስርዓት ላይ በአገልግሎት ላይ ስለሚውሉ መተግበሪያዎች መረጃን ማንበብ ይችላል፣ ይህም በእርስዎ ማያ ገጽ ላይ የሚታይ ወይም በመተግበሪያዎች ውስጥ የሚደረስበት መረጃን ይጨምራል።"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ይህን መተግበሪያ የሚያምኑት መሆንዎን ያረጋግጡ&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google ራስ-ሙላ&gt;%1$s&lt;/xliff:g&gt; ምን በራስ መሞላት እንደሚችል ለማወቅ በማያ ገጽዎ ላይ ያለውን ነገር ይጠቀማል።"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"አገልግሎት አክል"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"አካባቢ"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"የቅርብ ጊዜ የአካባቢ ጥያቄዎች"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ምንም የቅርብ ጊዜ የአካባቢ ጥያቄዎች የሉም"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"የመተግበሪያ ደረጃ ፈቃዶች"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"በመቃኘት ላይ"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"የአካባቢ አገልግሎቶች"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi ቅኝት"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi-Fi ጠፍቶ ቢሆንም እንኳ በማንኛውም ጊዜ የWi-Fi አውታረ መረቦችን እንዲቃኙ ይፍቀዱ። ይህ ለምሳሌ በአካባቢ ላይ የተመሠረቱ ባሕሪያትን እና አገልግሎቶችን ለማሻሻል ጥቅም ላይ ሊውል ይችላል።"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"የብሉቱዝ ቅኝት"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ብሉቱዝ ጠፍቶ ቢሆንም እንኳ በማንኛውም ጊዜ መተግበሪያዎች እና አገልግሎቶች በአቅራቢያ ያሉ መሣሪያዎችን እንዲቃኙ ይፍቀዱ። ይህ ለምሳሌ በአካባቢ ላይ የተመሠረቱ ባሕሪያትን እና አገልግሎቶችን ለማሻሻል ጥቅም ላይ ሊውል ይችላል።"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"ሥርዓት"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"የሥርዓት ዝማኔዎች"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"የሥርዓት ዝማኔዎች"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ሥሪት"</string>
     <string name="security_patch" msgid="4794276590178386903">"የAndroid ደህነንት መጠገኛ ደረጃ"</string>
     <string name="model_info" msgid="4966408071657934452">"ሞዴል"</string>
     <string name="baseband_version" msgid="2370088062235041897">"የቤዝባንድ ሥሪት"</string>
     <string name="kernel_version" msgid="7327212934187011508">"የአውራ ከዋኝ ሥሪት"</string>
     <string name="build_number" msgid="3997326631001009102">"የግንብ ቁጥር"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"የብሉቱዝ አድራሻ"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"አይገኝም"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"ሁኔታ"</string>
     <string name="device_status" msgid="267298179806290920">"ሁኔታ"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"የቅጂ መብት"</string>
     <string name="license_title" msgid="936705938435249965">"ፈቃድ"</string>
     <string name="terms_title" msgid="5201471373602628765">"ደንቦች እና ሁኔታዎች"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"የስርዓት ድር እይታ ፈቃድ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"የሥርዓት WebView ፈቃዶች"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ልጣፎች"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"የሳተላይት ምስሎች አቅራቢዎች፦\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"የሶስተኛ ወገን ፈቃዶች"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ፈቃዶቹን መጫን ላይ ችግር አለ።"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"በመጫን ላይ…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">አሁን ገንቢ ለመሆን <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ደረጃዎች ይቀርዎታል።</item>
+      <item quantity="other">አሁን ገንቢ ለመሆን <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ደረጃዎች ይቀረዎታል።</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"አሁን ገንቢ ሆነዋል!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"አያስፈልግም፣ አስቀድሞ ገንቢ ሆነዋል።"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"የገንቢ አማራጮች"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"የዳግም ማስጀመሪያ አማራጮች"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"አውታረ መረብ፣ መተግበሪያዎች ወይም የመሣሪያ ዳግም ቅንብር"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"አውታረ መረብ ዳግም ያቀናብሩ"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ይህ የሚከተሉትን ጨምሮ ሁሉንም የአውታረ መረብ ቅንብሮች ዳግም ያስጀምራቸዋል፦"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"የሞባይል ውሂብ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ብሉቱዝ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"ሁሉንም የመኪና eSIMs ደምስስ"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ይሄ የእርስዎን የአገልግሎት ዕቅድ አይሰርዘውም።"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIMsን ማቀናበር አይቻልም"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"አውታረ መረብ ይምረጡ"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ቅንብሮችን ዳግም አስጀምር"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"ዳግም ይጀምር?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"ሁሉም አውታረ መረብ ቅንብሮች ዳግም ይጀምሩ? ይህን እርምጃ መቀልበስ አይችሉም!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ቅንብሮችን ዳግም አስጀምር"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"የአውታረ መረብ ቅንብሮች ዳግም ጀምረዋል።"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"የመተግበሪያዎች ምርጫዎችን ዳግም አቀናብር"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ይሄ ሁሉንም የእነኚህ ምርጫዎችን ዳግም ያስጀምራቸዋል፦\n\n"<li>"የተሰናከሉ መተግበሪያዎች"</li>\n<li>"የተሰናከሉ መተግበሪያ ማሳወቂያዎች"</li>\n<li>"ለእርምጃዎች ነባሪ መተግበሪያዎች"</li>\n<li>"ለመተግበሪያዎች የጀርባ ውሂብ ገደቦች"</li>\n<li>"ማንኛቸውም የፍቃድ ገደቦች"</li>\n\n"ምንም የመተግበሪያ ውሂብ አይጠፋብዎትም።"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"መተግበሪያዎችን ዳግም አስጀምር"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"የመተግበሪያ ምርጫዎች ዳግም ተቀናብረዋል"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ሁሉንም ውሂብ ደምስስ (የፋብሪካ ዳግም ማስጀመር)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ይህ የሚከተሉትን ጨምሮ ሁሉንም ውሂብ ከተሽከርካሪዎ መረጃ ስርዓት ይደመስሰዋል፦\n\n"<li>"የእርስዎ የGoogle መለያ"</li>\n<li>"የስርዓት እና የመተግበሪያ ውሂብ እና ቅንብሮች"</li>\n<li>"የወረዱ መተግበሪያዎች"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"እርስዎ በአሁን ጊዜ የሚከተለው መለያዎች ውስጥ ገብተዋል፦"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"በዚህ ተሽከርካሪ ላይ ሌሎች ተጠቃሚዎች አሉ።"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"ተሽከርካሪን ዳግም አስጀምር"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"ዳግም ይጀምር?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"ሁሉም የእርስዎ የግል መረጃ እና የወረዱ መተግበሪያዎች ይሰረዙ? ይህን እርምጃ መቀልበስ አይችሉም!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ሁሉንም አጥፋ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"በመደምሰስ ላይ"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"እባክዎ ይጠብቁ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"ቀን እና ሰዓት"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"ቀን እና ሰዓት ያቀናብሩ"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"ቀን፣ ሰዓት፣ የሰዓት ሰቅ እና ቅርጸቶችን ያቀናብሩ"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"በሰዓት ሰቅ ደርድር"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"ቀን"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"ሰዓት"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"ተጠቃሚን አክል"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"መለያ አክል"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ተጠቃሚን ሰርዝ"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"አዲስ ተጠቃሚ"</string>
-    <string name="user_guest" msgid="3465399481257448601">"እንግዳ"</string>
     <string name="user_admin" msgid="1535484812908584809">"አስተዳዳሪ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"እንደ አስተዳዳሪ በመለያ ይግቡ"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"ሁሉም የአስተዳዳሪ ፈቃዶች"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"አስተዳዳሪ አድርግ"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ተጠቃሚው ሌሎች አስተዳዳሪዎችን ጨምሮ ተጠቃሚዎችን መሰረዝ፣ እና ሥርዓቱን ወደ የፋብሪካ ዳግም ማስጀመር ይችላል።"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ይህ እርምጃ ሊቀለበስ የሚችል አይደለም።"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"አዎ፣ አስተዳዳሪ አድርግ"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"አዳዲስ ተጠቃሚዎችን ይፍጠሩ"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"የስልክ ጥሪዎችን ያድርጉ"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"በመኪና የሞባይል ውሂብ በኩል መልዕክት መላላክ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"አዳዲስ መተግበሪያዎች ይጫኑ"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"መተግበሪያዎችን ያራግፉ"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ተጠቃሚን አክል"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"አዲስ ተጠቃሚ"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"አዲስ ተጠቃሚ ይታከል?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሳቸውን ቦታ ማቀናበር አለባቸው።"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ማዘመን ይችላል።"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"የተጠቃሚ ገደብ ላይ ተደርሷል"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">እስከ <xliff:g id="COUNT">%d</xliff:g> ተጠቃሚዎች መፍጠር ይችላሉ።</item>
+      <item quantity="other">እስከ <xliff:g id="COUNT">%d</xliff:g> ተጠቃሚዎች መፍጠር ይችላሉ።</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"አዲስ ተጠቃሚን መፍጠር አልተሳካም"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ይህ ተጠቃሚ ይሰረዝ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"ሁሉም መተግበሪያዎች እና ውሂብ ይሰረዛሉ።"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ተጠቃሚን መሰረዝ አልተሳካም።"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"አሰናብት"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"እንደገና ሞክር"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"የመጨረሻው ተጠቃሚ ይሰረዝ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ለዚህ መኪና ብቻ ያለው ብቸኛውን ተጠቃሚ ከተሰረዘ በኋላ አዲስ አስተዳዳሪ ተጠቃሚ ይፈጠራል።"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ከዚህ ተጠቃሚ ጋር የተጎዳኙ ሁሉም ውሂብ፣ ቅንብሮች እና መተግበሪያዎች ይሰረዛሉ። ስርዓቱን እንደገና ማዋቀር ይኖርብዎታል።"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"አዲስ አስተዳዳሪ ይምረጡ"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"ቢያንስ አንድ አስተዳዳሪ ያስፈልገዎታል። ይህን ለመሰረዝ መጀመሪያ ምትኩን ይምረጡ።"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"አስተዳዳሪ ይምረጡ"</string>
+    <string name="user_guest" msgid="3465399481257448601">"እንግዳ"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"እንግዳ"</string>
     <string name="user_switch" msgid="6544839750534690781">"ቀይር"</string>
     <string name="current_user_name" msgid="3813671533249316823">"እርስዎ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"ስም"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"አልተዋቀረም"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"የተጠቃሚ ስም አርትዕ ያድርጉ"</string>
     <string name="users_list_title" msgid="770764290290240909">"ተጠቃሚዎች"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"ፈቃዶች ለ%1$s ተሰጥቷል"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"መለያዎች"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ተጠቃሚ"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"መለያ አክል"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ምንም መለያዎች አልታከሉም"</string>
     <string name="account_list_title" msgid="7631588514613843065">"የ<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> መለያዎች"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ውሂብን በራስ-ሰር አሳምር"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"መተግበሪያዎች ውሂብን በራስ-ሰር ያድሱ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ውሂብን ራስ-አሳምር ይብራ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ድር ላይ በመለያዎችዎ ላይ የሚያደርጓቸው ማንኛቸውም ለውጦች በራስ-ሰር ወደ ስልክዎ ይቀዳሉ።\n\nአንዳንድ መለያዎች እንዲሁም በስልክ ላይ የሚያደርጓቸውን ማንኛቸውም ለውጦች ወደ ድሩ ሊቀዷቸው ይችላሉ። የGoogle መለያ በዚህ መንገድ ነው የሚሰራው።"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ውሂብን ራስ-አሳምር ይጥፋ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ይህ ውሂብን ይቆጥባል፣ ነገር ግን የቅርብ ጊዜውን መረጃ ለመሰብሰብ እያንዳንዱን መለያ ራስዎ ማሳመር ይኖርብዎታል። እና ዝማኔዎች ሲከሰቱ ማሳወቂያዎች አይደርሰዎትም።"</string>
     <string name="account_details_title" msgid="7529571432258448573">"የመለያ መረጃ"</string>
     <string name="add_account_title" msgid="5988746086885210040">"መለያ ያክሉ"</string>
     <string name="add_an_account" msgid="1072285034300995091">"መለያ አክል"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"መለያን አስወግድ"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"መለያ ይወገድ?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ይህን መለያ ማስወገድ ሁሉንም መልዕክቶቹ፣ እውቂያዎቹ እና ሌላ ውሂቡ ከስልኩ ላይ ይሰርዛቸዋል!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ይህ ለውጥ በአስተዳዳሪዎ አይፈቀድም"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ይህ ተጠቃሚ ይወገድ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"ሁሉም መተግበሪያዎች እና ውሂብ ይሰረዛሉ።"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"ተጠቃሚውን ማስወገድ አልተሳካም።"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"እንደገና ይሞከር?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"አሰናብት"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"እንደገና ሞክር"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"አዲስ ተጠቃሚ ይታከል?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሳቸውን ቦታ ማቀናበር አለባቸው።"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ማዘመን ይችላል።"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"መለያን ማስወገድ አልተሳካም።"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"የመለያ ስምረት"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"ለ<xliff:g id="ID_1">%1$d</xliff:g> ከ<xliff:g id="ID_2">%2$d</xliff:g> ንጥሎች ስምረትን አብራ"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"ለሁሉም ንጥሎች ስምረትን አብራ"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"ለሁሉም ንጥሎች ስምረትን አጥፋ"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"አስምር ጠፍቷል"</string>
+    <string name="sync_error" msgid="6698021343089247914">"የአስምር ስህተት"</string>
+    <string name="last_synced" msgid="4745124489150101529">"ለመጨረሻ ጊዜ የሰመረው <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"አሁን በማስመር ላይ…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"አሁን ለማስመር ነካ ያድርጉ<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"አሁን አመሳስል"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"አስምር ሰርዝ"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"አስምር በአሁኑጊዜ ችግር እየገጠመው ነው። ከአፍታ በኋላ ይመለሳል።"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ደኅንነት"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ማያ ገጽ መቆለፊያ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ምንም"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"ፒን"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"የይለፍ ቃል"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"የቁልፍ አይነት ይምረጡ"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"ማያ ገጽ መቆለፊያ አማራጮች"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"የመቆለፊያ አማራጮች"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"ሥርዓተ-ጥለትዎን ያስገቡ"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"አረጋግጥ"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"በድጋሚ ሳል"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"የማያ ገጽ መቆለፊያን ያቀናብሩ"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"የእርስዎን ፒን ይምረጡ"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"የእርስዎን ሥርዓተ ጥለት ይምረጡ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"የይለፍ ቃልዎን ይምረጡ"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"የእርስዎን የይለፍ ቃል ይምረጡ"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"አሁን ያለ ማያ ገጽ መቆለፊያ"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ለደህንነት ሲባል፣ ሥርዓተ ጥለትን ያቀናብሩ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"አጽዳ"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"የተለመዱ የይለፍ ቃላት በአይቲ አስተዳዳሪዎ የታገዱ ናቸው። የተለየ የይለፍ ቃል ይሞክሩ።"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"እየጨመሩ የሚሄዱ፣ እየቀነሱ የሚሄዱ ወይም ተደጋጋሚ የአኃዞች ተከታታይ አይፈቀድም።"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"የማያ ገጽ መቆለፊያ አማራጮች"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ቀኖች በፊት"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"የሚታመን መሣሪያ አክል"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"የሚታመኑ መሣሪያዎች"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> መሣሪያዎች</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> መሣሪያዎች</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"የእርስዎ <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> በሚገናኝበት ጊዜ የእርስዎን መኪና ይከፍተዋል። የእርስዎን <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> የሆነ ሰው ከወሰደው፣ ይህን መሣሪያ ሊደርስበት ይችላል"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"ያረጋግጡ"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"የሚታመን መሣሪያን አስወግድ"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ተከናውኗል"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"የታመነ መሣሪያ ለማቀናበር አጃቢ መተግበሪያን ይጠቀሙ። አንድ ጊዜ ካቀናበሩ በኋላ፣ የእርስዎ ስልክ በተሽከርካሪው ተፈልጎ በሚገኝበት ጊዜ ላይ የእርስዎን የተጠቃሚ መገለጫ ለመክፈት እርስዎ ይችላሉ"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. በእርስዎ ስልክ ላይ አጃቢውን መተግበሪያ ያውርዱ"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. መሣሪያዎቹን ለማጣመር በእርስዎ ስልክ ላይ <xliff:g id="CAR_NAME">%1$s</xliff:g> ን ይምረጡ"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock የዚህን መሣሪያ የደህንነት ባህሪያት ፈልጎ ማግኘት አይችልም። የእርስዎን መኪና ለመጠበቅ እንዲያግዝ፣ የታመነ መሣሪያ አንድ ጊዜ በእርስዎ ቀደም ብሎ ከተከፈተ በኋላ ብቻ የእርስዎን መኪና እንደተከፈተ ማቆየት ይችላል። የእርስዎ የታመነ መሣሪያ የእርስዎ መኪና በአቅራቢያ ላይ በሚሆንበት ጊዜ ምንም እንኳ ሌላ ሰው የያዘው ቢሆንም እንደተከፈተ ሊያቆየው ይችላል።"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> እንደ የሚታመን መሣሪያ ያክሉ"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> በተሳካ ሁኔታ እንደ ታመነ መሣሪያ ታክሏል"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> መመዝገብ አልተሳካም"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"የታመነ መሣሪያን ማከል ቀጥለው የማረጋገጫ ዘዴን እንዲያክሉ ይፈልግብዎታል። የታመነ መሣሪያዎ ከእርስዎ ጋር ከሌለ መገለጫዎን ለመድረስ ማረጋገጫ ያስፈልጋል።"</string>
     <string name="forget" msgid="3971143908183848527">"እርሳ"</string>
+    <string name="connect" msgid="5861699594602380150">"አገናኝ"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ግንኙነት አቋርጥ"</string>
     <string name="delete_button" msgid="5840500432614610850">"ሰርዝ"</string>
     <string name="remove_button" msgid="6664656962868194178">"አስወግድ"</string>
     <string name="cancel" msgid="750286395700355455">"ይቅር"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ከልምምድ ሁነታ ውጣ"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ይህ የልምምድ መለያውን እና የፋብሪካ ዳግም አስጀምር ሥርዓቱን ይሰርዛል። ሁሉም የተጠቃሚ ውሂብ ይጠፋል።"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ከማሳያ ውጣ"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ማዋቀር ጨርስ"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"አሁን አልፈልግም"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"አሰናብት"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"እየነዱ ሳለ ባህሪ አይገኝም።"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"እየነዱ ሳለ ተጠቃሚን ማከል አይቻልም።"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index fe813aa..fe3227c 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"تعتيم شاشة، شاشة تعمل باللمس، بطارية"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"تعتيم الشاشة، ليل، تلوين خفيف"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"الوضع الليلي"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"الشبكة والإنترنت"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"شبكة الجوّال"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"بيانات الجوّال"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"الوصول إلى البيانات باستخدام شبكة الجوّال"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"هل تريد إيقاف بيانات الجوّال؟"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"استخدام البيانات"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"تحذير بشأن قيود البيانات"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"دورة استخدام التطبيقات للبيانات"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ضبط تحذيرات استخدام البيانات"</string>
+    <string name="data_warning" msgid="116776633806885370">"تحذيرات البيانات"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ضبط الأحد الأقصى للبيانات"</string>
+    <string name="data_limit" msgid="227338836292511425">"الحد الأقصى للبيانات"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"وضع حد لاستخدام البيانات"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ستُوقف الوحدة الأساسية لمركبتك بيانات الجوّال بعد الوصول إلى الحد الأقصى الذي وضعته.\n\nولأنّ الوحدة الأساسية تقيس حجم استخدام البيانات بطريقة معيّنة وقد يحاسبك مشغّل شبكة الجوّال بطريقة مختلفة، ننصحك بوضع حدٍ معتدلٍ."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"إعداد نقاط الدخول اللاسلكية وإدارتها"</string>
     <string name="wifi_starting" msgid="473253087503153167">"جارٍ تفعيل Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"جارٍ إيقاف Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"جارٍ تحميل قائمة Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"تم إيقاف Wi-Fi."</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"تعذّر حذف الشبكة."</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"تعذّر الاتصال بالشبكة."</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"إضافة شبكة"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"تم إيقاف Wi-Fi."</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"اتصال"</string>
     <string name="wifi_password" msgid="5565632142720292397">"كلمة المرور"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"عرض كلمة المرور"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"اسم الشبكة"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"إدخال SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"الأمان"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"قوة الإشارة"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"قوة الإشارة"</string>
     <string name="wifi_status" msgid="5688013206066543952">"الحالة"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"سرعة الربط"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"نطاق التردد"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"عنوان IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"عرض كلمة المرور"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"أدخِل اسم الشبكة."</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"أدخِل كلمة المرور."</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ضعيفة"</item>
-    <item msgid="2032262610626057081">"متوسطة"</item>
-    <item msgid="3859756017461098953">"جيدة"</item>
-    <item msgid="1521103743353335724">"ممتازة"</item>
+    <item msgid="7683058295076342057">"ضعيفة"</item>
+    <item msgid="1639222824821660744">"متوسطة"</item>
+    <item msgid="1838705897358163300">"جيدة"</item>
+    <item msgid="6067166649320533751">"ممتازة"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"بلوتوث"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"تفعيل البلوتوث"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"بلوتوث"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"تم إيقاف البلوتوث."</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d ميغابت في الثانية"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"٢٫٤ غيغاهرتز"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"٥ غيغاهرتز"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"تفاصيل الشبكة"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"عنوان MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"عنوان IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"قناع الشبكة الفرعية"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"نظام أسماء النطاقات"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"عناوين IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"البوابة"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"الإعدادات المفضّلة لشبكة Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"تفعيل شبكة Wi‑Fi تلقائيًا"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"سيتم تفعيل Wi‑Fi بالقرب من الشبكات المحفوظة العالية الجودة، مثل شبكتك المنزلية."</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"غير متاحة نظرًا لإيقاف خدمة الموقع. يُرجى تفعيل خدمة "<annotation id="link">"الموقع"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"هل تريد تفعيل ميزة البحث عن شبكات Wi‑Fi؟"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"تفعيل"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"تم تفعيل البحث عن شبكات Wi‑Fi."</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"التبديل إلى بيانات الجوال تلقائيًا"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"يمكنك استخدام بيانات الجوّال إذا تعذّر الدخول إلى الإنترنت عبر شبكة Wi‑Fi، وقد يتم فرض رسوم على استخدام البيانات."</string>
+    <string name="learn_more" msgid="8214605928933358604">"مزيد من المعلومات"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"بلوتوث"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"إدارة الاتصالات وتعيين اسم الجهاز وقابلية الاكتشاف"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"جهاز الكمبيوتر"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"سماعة الرأس"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"هاتف"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"تصوير"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"سماعة الأذن"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"جهاز إدخال طرفي"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"بلوتوث"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"الأجهزة التي تم إقرانها"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"الأجهزة المتوفرة"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ليست هناك أجهزة تم إقرانها."</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"لا تتوفر أي أجهزة."</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"الجهاز الذي تم إقرانه"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"الاسم"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"استخدام مع"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"غيِّر اسم جهاز البلوتوث."</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"جهاز بدون اسم"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"الأجهزة المقترنة"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"إقران جهاز جديد"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"سيتمّ تشغيل بلوتوث للإقران."</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"هل تريد إلغاء ربط الجهاز؟"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"سيتمّ إلغاء ربط سيارتك بالجهاز <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"عنوان بلوتوث السيارة: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"عنوان البلوتوث للجهاز: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"اسم السيارة"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"إعادة تسمية هذه السيارة"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"إعادة تسمية الجهاز"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"إعادة تسمية"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"الأجهزة المُتاحة"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"الملفات الشخصية"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"طلب إقران البلوتوث"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"الإقران والاتصال"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"بلوتوث"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"رمز إقران البلوتوث"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"يشتمل رقم التعريف الشخصي على أحرف أو رموز."</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"اكتب رمز الإقران، ثم اضغط على \"رجوع\" أو \"إدخال\"."</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"0000 أو 1234 عادة"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"طلب الإقران"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"انقر للإقران مع <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"اللغات"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"اللغات والإدخال"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"لوحة المفاتيح"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"إدارة لوحات المفاتيح"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"إخراج النص إلى كلام"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"المحرّك المُفضَّل"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"المحرّك الحالي"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"معدل سرعة الكلام"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"درجة الصوت"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"إعادة الضبط"</string>
     <string name="sound_settings" msgid="3072423952331872246">"صوت"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"مستوى صوت الرنين"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"مستوى صوت التنقل"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"الوسائط"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"تعيين مستوى الصوت للموسيقى والفيديوهات"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"المنبّه"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"نغمة رنين الهاتف"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"الصوت التلقائي للإشعارات"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"الصوت التلقائي للتنبيهات"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"التطبيقات والإشعارات"</string>
+    <string name="all_applications" msgid="7798210477486822168">"إظهار جميع التطبيقات"</string>
+    <string name="default_applications" msgid="1558183275638697087">"التطبيقات التلقائية"</string>
     <string name="applications_settings" msgid="794261395191035632">"معلومات التطبيق"</string>
+    <string name="force_stop" msgid="2153183697014720520">"فرض الإيقاف"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"هل تريد فرض إيقاف التطبيق؟"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"في حال فرض إيقاف التطبيق، قد لا يعمل بشكل صحيح."</string>
     <string name="disable_text" msgid="4358165448648990820">"إيقاف"</string>
     <string name="enable_text" msgid="1794971777861881238">"تفعيل"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"إلغاء التثبيت"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"قد يؤدي إيقاف هذا التطبيق إلى عدم عمل كل من نظام التشغيل Android وتطبيقات أخرى على النحو المنشود."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"إيقاف التطبيق"</string>
     <string name="permissions_label" msgid="2701446753515612685">"الأذونات"</string>
     <string name="application_version_label" msgid="8556889839783311649">"الإصدار: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"لم يتم منح أي أذونات."</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"لم يتم طلب أي أذونات."</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"استخدام البيانات"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"استخدام بيانات التطبيق"</string>
-    <string name="force_stop" msgid="2153183697014720520">"فرض الإيقاف"</string>
     <string name="computing_size" msgid="5791407621793083965">"جارٍ الحساب…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> إذن إضافي</item>
@@ -119,15 +170,39 @@
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> إذن إضافي</item>
       <item quantity="one">إذن واحد إضافي (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"المساعدة والإدخال الصوتي"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"تطبيق المساعد"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"استخدام نص من الشاشة"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"السماح للتطبيق المساعد بالوصول إلى محتوى الشاشة كالنص"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"استخدام لقطة الشاشة"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"السماح للتطبيق المساعد بالوصول إلى صورة للشاشة"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"خدمة الملء التلقائي"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"بدون"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"التطبيق التلقائي"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"سيتمكن المساعد من قراءة المعلومات عن التطبيقات قيد الاستخدام على نظامك، بما في ذلك المعلومات المرئية على شاشتك أو التي يمكن الوصول إليها داخل التطبيقات."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;تأكّد من أنك تثق بهذا التطبيق.&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; تستخدم البيانات المعروضة على الشاشة لتحديد ما يمكن ملؤه تلقائيًا."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"إضافة خدمة"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"الموقع الجغرافي"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"طلبات الموقع الجغرافي الأخيرة"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"لا توجد طلبات حديثة للموقع الجغرافي."</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"الأذونات على مستوى التطبيقات"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"البحث عن الموقع الجغرافي"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"خدمات الموقع الجغرافي"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"البحث عن شبكات Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"يمكنك السماح للتطبيقات والخدمات بالبحث عن الأجهزة المجاورة في أيّ وقت، حتى في حال إيقاف Wi‑Fi. ويمكن استخدام هذه البيانات مثلاً لتحسين الميزات والخدمات المستندة إلى الموقع الجغرافي."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"البحث عن بلوتوث"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"يمكنك السماح للتطبيقات والخدمات بالبحث عن الأجهزة المجاورة في أيّ وقت، حتى في حال إيقاف البلوتوث. ويمكن استخدام هذه البيانات مثلاً لتحسين الميزات والخدمات المستندة إلى الموقع الجغرافي."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"النظام"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"تحديثات النظام"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"تحديثات النظام"</string>
     <string name="firmware_version" msgid="8491753744549309333">"إصدار Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"مستوى رمز تصحيح أمان Android"</string>
     <string name="model_info" msgid="4966408071657934452">"الطراز"</string>
     <string name="baseband_version" msgid="2370088062235041897">"إصدار النطاق الأساسي"</string>
     <string name="kernel_version" msgid="7327212934187011508">"إصدار النواة"</string>
     <string name="build_number" msgid="3997326631001009102">"رقم الإصدار"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"عنوان البلوتوث"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"غير متوفرة"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"الحالة"</string>
     <string name="device_status" msgid="267298179806290920">"الحالة"</string>
@@ -144,12 +219,53 @@
     <string name="copyright_title" msgid="4220237202917417876">"حقوق الطبع والنشر"</string>
     <string name="license_title" msgid="936705938435249965">"الترخيص"</string>
     <string name="terms_title" msgid="5201471373602628765">"الأحكام والشروط"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"ترخيص WebView للنظام"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"تراخيص WebView للنظام"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"الخلفيات"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"الشركات الموفرة لصور القمر الصناعي:\n©2014 CNES / Astrium وDigitalGlobe وBluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"تراخيص الأطراف الثالثة"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"حدثت مشكلة أثناء تحميل التراخيص."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"جارٍ التحميل…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="zero">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوة.</item>
+      <item quantity="two">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى خطوتين (<xliff:g id="STEP_COUNT_1">%1$d</xliff:g>).</item>
+      <item quantity="few">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوات.</item>
+      <item quantity="many">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوة.</item>
+      <item quantity="other">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> خطوة.</item>
+      <item quantity="one">لا يفصلك الآن عن الوصول إلى مرحلة مطوّري البرامج سوى خطوة (<xliff:g id="STEP_COUNT_0">%1$d</xliff:g>).</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"لقد أصبحت الآن مطوّر برامج."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"لا حاجة لذلك، فأنت مطوّر برامج فعلاً."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"خيارات المطوّرين"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"خيارات إعادة التعيين"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"إعادة تعيين الشبكة أو التطبيقات أو الجهاز"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"إعادة ضبط الشبكة"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"سيؤدي هذا الإجراء إلى إعادة ضبط جميع إعدادات الشبكة، بما في ذلك:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"بيانات الجوّال"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"بلوتوث"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"محو بيانات جميع بطاقات eSIM للمركبة"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"لن يلغي هذا الإجراء خطة الخدمة التي تستخدمها."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"تعذُّر إعادة ضبط شرائح eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"اختيار شبكة"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"إعادة ضبط الإعدادات"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"هل تريد إعادة الضبط؟"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"هل تريد إعادة ضبط جميع إعدادات الشبكة؟ لا يمكنك التراجع عن هذا الإجراء."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"إعادة ضبط الإعدادات"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"تمت إعادة ضبط إعدادات الشبكة."</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"إعادة ضبط خيارات التطبيقات المفضّلة"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"يؤدي ذلك إلى إعادة تعيين جميع الإعدادات المفضَّلة لما يلي:\n\n"<li>"التطبيقات الموقوفة"</li>\n<li>"إشعارات التطبيقات الموقوفة"</li>\n<li>"التطبيقات التلقائية للإجراءات"</li>\n<li>"القيود على البيانات الخلفية للتطبيقات"</li>\n<li>"أيّ قيود على الأذونات"</li>\n\n"ولن تفقد أيّ بيانات للتطبيقات."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"إعادة ضبط التطبيقات"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"تم إعادة ضبط خيارات التطبيقات المفضّلة"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"محو جميع البيانات (factory reset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"سيؤدي هذا الإجراء إلى محو جميع البيانات من الوحدة الأساسية لمركبتك، بما في ذلك:\n\n"<li>"حسابك على Google"</li>\n<li>"بيانات وإعدادات النظام والتطبيقات"</li>\n<li>"التطبيقات التي تم تنزيلها"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"الحسابات التي سجَّلت الدخول إليها حاليًا:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"هناك مستخدمون آخرون موجودون على هذه المركبة."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"إعادة ضبط المركبة"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"هل تريد إعادة الضبط؟"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"هل تريد محو جميع المعلومات الشخصية والتطبيقات التي تم تنزيلها؟ لا يمكنك التراجع عن هذا الإجراء."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"محو جميع المعلومات والتطبيقات"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"جارٍ محو البيانات"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"يُرجى الانتظار..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"التاريخ والوقت"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"تعيين التاريخ والوقت"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"تعيين التاريخ والوقت والمنطقة الزمنية والتنسيقات"</string>
@@ -169,23 +285,63 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"ترتيب بحسب المنطقة الزمنية"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"التاريخ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"الوقت"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"إضافة مستخدم"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"إضافة حساب"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"حذف حساب مستخدم"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"مستخدم جديد"</string>
-    <string name="user_guest" msgid="3465399481257448601">"الضيف"</string>
     <string name="user_admin" msgid="1535484812908584809">"المشرف"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"تمّ تسجيل الدخول كمشرف."</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"جميع أذونات المشرفين"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"منح المستخدم دور المشرف"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"سيتمكن المستخدم من حذف حسابات المستخدمين، بما في ذلك حسابات المشرفين الآخرين، وإعادة ضبط النظام بحسب إعدادات المصنع."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"لا يمكن التراجع عن هذا الإجراء."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"منح المستخدم دور المشرف"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"إنشاء مستخدمين جدد"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"إجراء مكالمات هاتفية"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"المراسلة عبر بيانات جوّال السيارة"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"تثبيت تطبيقات جديدة"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"إلغاء تثبيت التطبيقات"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"إضافة مستخدم"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"مستخدم جديد"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"أتريد إضافة مستخدم جديد؟"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"عند إضافة مستخدم جديد، عليه إعداد مساحته."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"يمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"تم الوصول إلى أقصى عدد للمستخدمين"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="zero">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> مستخدم.</item>
+      <item quantity="two">يمكنك إنشاء ما يصل إلى مستخدمينِ (<xliff:g id="COUNT">%d</xliff:g>).</item>
+      <item quantity="few">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> مستخدمين.</item>
+      <item quantity="many">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> مستخدمًا.</item>
+      <item quantity="other">يمكنك إنشاء ما يصل إلى <xliff:g id="COUNT">%d</xliff:g> مستخدم.</item>
+      <item quantity="one">يمكن إنشاء مستخدم واحد فقط.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"تعذّر إنشاء مستخدم جديد."</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"هل تريد حذف هذا المستخدم؟"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"سيتم حذف جميع التطبيقات والبيانات."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"تعذّر حذف المستخدم."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"رفض"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"إعادة المحاولة"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"حذف المستخدم الأخير؟"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"سيتم إنشاء مستخدم إداري جديد بعد حذف المستخدم المتبقي الوحيد لهذه السيارة."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"سيتم حذف جميع البيانات والإعدادات والتطبيقات المرتبطة بهذا المستخدم. وستحتاج إلى إعداد النظام مرة أخرى."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"اختر مسؤولًا جديدًا."</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"أنت بحاجة إلى مدير واحد على الأقل. ولحذف هذا المدير، اختر بديلًا أولًا."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"اختر المدير"</string>
+    <string name="user_guest" msgid="3465399481257448601">"الضيف"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ضيف"</string>
     <string name="user_switch" msgid="6544839750534690781">"تبديل"</string>
     <string name="current_user_name" msgid="3813671533249316823">"أنت (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"الاسم"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"لم يتم الإعداد."</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"تعديل اسم المستخدم"</string>
     <string name="users_list_title" msgid="770764290290240909">"المستخدمون"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"تمّ منح الأذونات للمستخدم %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"الحسابات"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"المستخدم"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"إضافة حساب"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"لم تتم إضافة أي حسابات."</string>
     <string name="account_list_title" msgid="7631588514613843065">"حسابات <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"مزامنة البيانات تلقائيًا"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"السماح للتطبيقات بتحديث البيانات تلقائيًا"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"أتريد تشغيل مزامنة البيانات تلقائيًا؟"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"سيتمّ نسخ أيّ تغييرات تجريها على حساباتك على الويب إلى جهازك تلقائيًا.\n\nوقد تعمل بعض الحسابات أيضًا على نسخ التغييرات التي تجريها على الهاتف إلى الويب تلقائيًا، فهذه هي طريقة عمل \"حساب Google\"."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"أتريد إيقاف مزامنة البيانات تلقائيًا؟"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"سيؤدي ذلك إلى الحفاظ على البيانات، ولكن ستحتاج إلى مزامنة كل حساب يدويًا لجمع المعلومات الحديثة. ولن تتلقى إشعارات عند إتمام التحديثات."</string>
     <string name="account_details_title" msgid="7529571432258448573">"معلومات الحساب"</string>
     <string name="add_account_title" msgid="5988746086885210040">"إضافة حساب"</string>
     <string name="add_an_account" msgid="1072285034300995091">"إضافة حساب"</string>
@@ -193,16 +349,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"إزالة الحساب"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"هل تريد إزالة الحساب؟"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ستؤدي إزالة هذا الحساب إلى حذف جميع الرسائل وجهات الاتصال والبيانات الأخرى من الجهاز."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"لا يسمح المشرف بإجراء هذا التغيير."</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"أتريد إزالة هذا المستخدم؟"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"سيتم حذف جميع التطبيقات والبيانات."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"تعذّرت إزالة المستخدم."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"إعادة المحاولة؟"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"تجاهل"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"إعادة المحاولة"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"أتريد إضافة مستخدم جديد؟"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"عند إضافة مستخدم جديد، عليه إعداد مساحته."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"يمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"أخفق حذف الحساب."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"مزامنة الحساب"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"تمّ تفعيل المزامنة لـ <xliff:g id="ID_1">%1$d</xliff:g> من إجمالي <xliff:g id="ID_2">%2$d</xliff:g> عنصر."</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"المزامنة مفعَّلة لكل العناصر."</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"المزامنة متوقفة لكل العناصر."</string>
+    <string name="sync_disabled" msgid="393531064334628258">"المزامنة متوقفة."</string>
+    <string name="sync_error" msgid="6698021343089247914">"خطأ في المزامنة"</string>
+    <string name="last_synced" msgid="4745124489150101529">"تاريخ آخر مزامنة: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"تجري المزامنة الآن…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"انقُر للمزامنة الآن<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>."</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"المزامنة الآن"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"إلغاء المزامنة"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"تواجه المزامنة حاليًا بعض المشاكل. وسوف تكون متاحة خلال وقت قصير."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"الأمان"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"قفل الشاشة"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"بدون"</string>
@@ -210,7 +370,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"رقم التعريف الشخصي"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"كلمة المرور"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"اختيار نوع القفل"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"خيارات قفل الشاشة"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"خيارات القفل"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"أدخل النقش"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"تأكيد"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"إعادة رسم النقش"</string>
@@ -220,7 +380,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"تعيين قفل شاشة"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"اختيار رقم التعريف الشخصي"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"اختيار النّقش"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"اختيار كلمة المرور"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"اختيار كلمة المرور"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"قفل الشاشة الحالي"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"للحفاظ على الأمان، يجب تعيين نقش."</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"محو"</string>
@@ -316,7 +476,32 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"حظرَ مشرف تكنولوجيا المعلومات استخدام كلمات المرور الشائعة. جرِّب استخدام كلمة مرور مختلفة."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"لا يُسمح باستخدام الترتيب التصاعدي أو التنازلي أو المكرر للأرقام."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"خيارات قفل الشاشة"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : قبل <xliff:g id="NUM_DAYS">%3$s</xliff:g> يوم"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"إضافة جهاز موثوق به"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"الأجهزة الموثوق بها"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> جهاز</item>
+      <item quantity="two">جهازان (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> أجهزة</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> جهازًا</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> جهاز</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> جهاز</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"سيتمكّن <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> من فتح هذه السيارة عند توصيله. وإذا حصل شخص على <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> التابع لك، قد يتمكّن من الدخول إلى هذا الجهاز."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"تأكيد"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"إزالة الجهاز الموثوق به"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"تم"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"استخدِم التطبيق المصاحب لإعداد جهاز موثوق به. بعد إعداد الجهاز، ستتمكّن من فتح ملفك الشخصي للمستخدم عندما يتم رصد هاتفك بواسطة المركبة."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. تنزيل التطبيق المصاحب على هاتفك"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. اختيار <xliff:g id="CAR_NAME">%1$s</xliff:g> على هاتفك لإقران الأجهزة"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"يتعذّر على Smart Lock رصد الميزات الأمنية لهذا الجهاز. للمساعدة في حماية سيارتك، لن يتمكّن الجهاز الموثوق به من أن يُبقي سيارتك مفتوحة إلا إذا سبقَ وتم فتحها بواسطتك. ويمكن للجهاز الموثوق به أن يُبقي سيارتك مفتوحة عندما يكون قريبًا منها، حتى لو كان يحمله شخص غيرك."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"إضافة <xliff:g id="DEVICE_NAME">%1$s</xliff:g> كجهاز موثوق به"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"تم إضافة <xliff:g id="DEVICE_NAME">%1$s</xliff:g> كجهاز موثوق به."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"تعذّر تسجيل جهاز <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"سيتعيَّن عليك تحديد طريقة المصادقة بعد إضافة جهاز موثوق به. وإذا لم يكن بحوزتك جهازك الموثوق به، ستلزم المصادقة للوصول إلى ملفك الشخصي."</string>
     <string name="forget" msgid="3971143908183848527">"حذف"</string>
+    <string name="connect" msgid="5861699594602380150">"اتصال"</string>
+    <string name="disconnect" msgid="6140789953324820336">"قطع اتصال"</string>
     <string name="delete_button" msgid="5840500432614610850">"حذف"</string>
     <string name="remove_button" msgid="6664656962868194178">"إزالة"</string>
     <string name="cancel" msgid="750286395700355455">"إلغاء"</string>
@@ -326,8 +511,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"خروج من وضع العرض التوضيحي"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"سيؤدي هذا إلى حذف حساب العرض التوضيحي وإعادة الضبط بحسب بيانات المصنع على النظام. سيتم فقد جميع بيانات المستخدم."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"خروج من عرض توضيحي"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"الانتهاء من الإعداد"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ليس الآن"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"رفض"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"لا تتوفَّر الميزة أثناء القيادة."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"لا يمكن إضافة مستخدم أثناء القيادة."</string>
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
new file mode 100644
index 0000000..7e5c6f3
--- /dev/null
+++ b/res/values-as/strings.xml
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="settings_label" msgid="5147911978211079839">"ছেটিংবোৰ"</string>
+    <string name="more_settings_label" msgid="3867559443480110616">"অধিক"</string>
+    <string name="display_settings" msgid="5325515247739279185">"ডিছপ্লে’"</string>
+    <string name="brightness" msgid="2919605130898772866">"উজ্জ্বলতাৰ স্তৰ"</string>
+    <string name="auto_brightness_title" msgid="9124647862844666581">"অভিযোজিত উজ্জ্বলতা"</string>
+    <string name="auto_brightness_summary" msgid="4741887033140384352">"উপলব্ধ পোহৰ অনুযায়ী উজ্জ্বলতাৰ পৰিমাণ অপ্টিমাইজ কৰক"</string>
+    <string name="condition_night_display_title" msgid="3777509730126972675">"ৰাতিৰ লাইট অন হৈ আছে"</string>
+    <string name="keywords_display" msgid="3978416985146943922">"স্ক্ৰীণ, টাচ্চ স্ক্ৰীণ"</string>
+    <string name="keywords_display_brightness_level" msgid="3956411572536209195">"অনুজ্জ্বল স্ক্ৰীণ, টাচ্চস্ক্ৰীণ, বেটাৰি"</string>
+    <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"অনুজ্জ্বল স্ক্ৰীণ, টাচ্চস্ক্ৰীণ, বেটাৰি"</string>
+    <string name="keywords_display_night_display" msgid="2922294576679769957">"অনুজ্জ্বল স্ক্ৰীণ, ৰাতি, আভা"</string>
+    <string name="night_mode_tile_label" msgid="6603597795502131664">"নৈশ ম\'ড"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"নেটৱৰ্ক আৰু ইণ্টাৰনেট"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"ম’বাইল নেটৱৰ্ক"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"ম’বাইল ডেটা"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ম’বাইল নেটৱৰ্ক ব্যৱহাৰ কৰি ডেটা এক্সেছ কৰক"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"ম’বাইল ডেটা অফ কৰিবনে?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ডেটা ব্যৱহাৰ"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ডেটা ব্যৱহাৰৰ সকীয়নি আৰু সীমা"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"এপে ব্যৱহাৰ কৰা ডেটাৰ চক্ৰ"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ডেটা ব্যৱহাৰৰ সকীয়নি ছেট কৰক"</string>
+    <string name="data_warning" msgid="116776633806885370">"ডেটা সকীয়নি"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ডেটাৰ সীমা ছেট কৰক"</string>
+    <string name="data_limit" msgid="227338836292511425">"ডেটাৰ সীমা"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ডেটাৰ ব্যৱহাৰ সীমিত কৰি থকা হৈছে"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"আপুনি ছেট কৰা সীমাত উপনীত হোৱাৰ লগে লগে আপোনাৰ বাহনৰ হে’ড ইউনিটে ম’বাইল ডেটা অফ কৰি দিব।\n\nযিহেতু ডেটাৰ ব্যৱহাৰ আপোনাৰ হে’ড ইউনিটে গণনা কৰে যিটো আপোনাৰ বাহকৰ গণনাৰ সৈতে একে নহ’বও পাৰে, গতিকে এক ৰক্ষণশীল সীমা বন্ধাৰ কথা বিবেচনা কৰক।"</string>
+    <string name="wifi_settings" msgid="7701477685273103841">"ৱাই-ফাই"</string>
+    <string name="wifi_starting" msgid="473253087503153167">"ৱাই-ফাই অন কৰি থকা হৈছে…"</string>
+    <string name="wifi_stopping" msgid="3534173972547890148">"ৱাই-ফাই অফ কৰি থকা হৈছে…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"ৱাই-ফাইৰ তালিকা ল’ড কৰি থকা হৈছে"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"ৱাই-ফাই অক্ষম কৰা হ’ল"</string>
+    <string name="wifi_failed_forget_message" msgid="121732682699377206">"নেটৱৰ্ক পাহৰিব পৰা নগ\'ল"</string>
+    <string name="wifi_failed_connect_message" msgid="4447498225022147324">"নেটৱৰ্কৰ সৈতে সংযোগ কৰিব পৰা নগ\'ল"</string>
+    <string name="wifi_setup_add_network" msgid="3660498520389954620">"নেটৱৰ্ক যোগ কৰক"</string>
+    <string name="wifi_setup_connect" msgid="3512399573397979101">"সংযোগ কৰক"</string>
+    <string name="wifi_password" msgid="5565632142720292397">"পাছৱৰ্ড"</string>
+    <string name="wifi_show_password" msgid="8423293211933521097">"পাছৱৰ্ড দেখুৱাওক"</string>
+    <string name="wifi_ssid" msgid="488604828159458741">"নেটৱৰ্কৰ নাম"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID দিয়ক"</string>
+    <string name="wifi_security" msgid="158358046038876532">"সুৰক্ষা"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"ছিগনেলৰ ক্ষমতা"</string>
+    <string name="wifi_status" msgid="5688013206066543952">"স্থিতি"</string>
+    <string name="wifi_speed" msgid="1650692446731850781">"লিংকৰ গতি"</string>
+    <string name="wifi_frequency" msgid="8951455949682864922">"ফ্ৰিকুৱেন্সী"</string>
+    <string name="wifi_ip_address" msgid="3128140627890954061">"আইপি ঠিকনা"</string>
+    <string name="show_password" msgid="2074628020371139240">"পাছৱৰ্ড দেখুৱাওক"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"নেটৱৰ্কৰ নাম দিয়ক"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"পাছৱৰ্ড দিয়ক"</string>
+    <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
+  <string-array name="wifi_signals">
+    <item msgid="4897376984576812606">"ক্ষীণ"</item>
+    <item msgid="7683058295076342057">"বেয়া"</item>
+    <item msgid="1639222824821660744">"ঠিকে আছে"</item>
+    <item msgid="1838705897358163300">"ভাল"</item>
+    <item msgid="6067166649320533751">"বৰ ভাল"</item>
+  </string-array>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d এমবিপিএছ"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"২.৪ গিগাহাৰ্টজ"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"৫ গিগাহাৰ্টজ"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"নেটৱৰ্কৰ সবিশেষ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ঠিকনা"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ঠিকনা"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"ছাবনেট মাস্ক"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ঠিকনা"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"গে’টৱে’"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ৱাই-ফাইৰ অগ্ৰাধিকাৰ"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন কৰক"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"আপোনাৰ ঘৰৰ নেটৱৰ্কৰ দৰে ছেভ কৰি থোৱা উচ্চ গুণগত মানৰ নেটৱৰ্কৰ ওচৰ পালে ৱাই-ফাই পুনৰ অন হ\'ব"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"অৱস্থান সেৱা অফ কৰি থোৱা কাৰণে উপলব্ধ নহয়। "<annotation id="link">"অৱস্থান"</annotation>" অন কৰক।"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"ৱাই-ফাই স্কেনিঙৰ সুবিধাটো অন কৰিবনে?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"অন কৰক"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"ৱাই-ফাই স্কেনিঙৰ সুবিধাটো অন কৰা আছে"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"স্বয়ংক্ৰিয়ভাৱে ম’বাইল ডেটালৈ সলনি কৰক"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"ৱাই-ফাইত ইণ্টাৰনেট নাথাকিলে ম’বাইল ডেটা ব্যৱহাৰ কৰক। ডেটাৰ খৰচ বহন কৰিবলগীয়া হ’ব পাৰে।"</string>
+    <string name="learn_more" msgid="8214605928933358604">"অধিক জানক"</string>
+    <string name="bluetooth_settings_title" msgid="3794688574569688649">"ব্লুটুথ"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"নাম নথকা ডিভাইচ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"যোৰা লগোৱা ডিভাইচসমূহ"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"নতুন ডিভাইচ যোৰা লগাওক"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"যোৰা লগাবলৈ ব্লুটুথ অন হ’ব"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ডিভাইচৰ সংযোগ বিচ্ছিন্ন কৰিবনে?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"আপোনাৰ বাহনৰ সৈতে <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সংযোগ বিচ্ছিন্ন হ’ব।"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"বাহনৰ ব্লুটুথৰ ঠিকনা: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ডিভাইচৰ ব্লুটুথৰ ঠিকনা: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"বাহনৰ নাম"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"এই বাহনৰ নতুন নাম দিয়ক"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ডিভাইচৰ নতুন নাম দিয়ক"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"নতুন নাম দিয়ক"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"উপলব্ধ ডিভাইচসমূ্হ"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"প্ৰ’ফাইল"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
+    <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ব্লুটুথ যোৰা লগোৱাৰ অনুৰোধ"</string>
+    <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"যোৰা লগাওক আৰু সংযোগ কৰক"</string>
+    <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ব্লুটুথ যোৰ লগোৱা ক’ড"</string>
+    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"পিনত বৰ্ণ বা প্ৰতীকবোৰ থাকে"</string>
+    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"যোৰা লগোৱা ক’ডটো টাইপ কৰক আৰু তাৰ পিছত ৰিটাৰ্ণ বা এণ্টাৰ কী হেঁচক"</string>
+    <string name="bluetooth_pairing_request" msgid="4769675459526556801">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোৰা লগাবনে?"</string>
+    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ক আপোনাৰ সম্পৰ্কসূচী আৰু কলৰ ইতিহাস চাবলৈ দিয়ক"</string>
+    <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"আপুনি এই পিনটো আনটো ডিভাইচত টাইপ কৰিবলগীয়াও হ’ব পাৰে৷"</string>
+    <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"আপুনি এই পাছকীটো আনটো ডিভাইচত টাইপ কৰিবলগীয়াও হ’ব পাৰে৷"</string>
+    <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"১৬টা অংকযুক্ত হ\'ব লাগিব"</string>
+    <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"সচৰাচৰতে ০০০০ বা ১২৩৪"</string>
+    <string name="bluetooth_notif_title" msgid="8374602799367803335">"যোৰা লগোৱাৰ অনুৰোধ"</string>
+    <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ লগত যোৰা লগাবলৈ টিপক"</string>
+    <string name="language_settings" msgid="2079258598337245546">"ভাষা"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ভাষা আৰু ইনপুট"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"কীব’ৰ্ড"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"কীব’ৰ্ড পৰিচালনা কৰক"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"পাঠৰ পৰা কথনৰ আউটপুট"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"অগ্ৰাধিকাৰপ্ৰাপ্ত ইঞ্জিন"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"বৰ্তমানৰ ইঞ্জিন"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"কথা কোৱাৰ হাৰ"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"পিচ্চ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ৰিছেট কৰক"</string>
+    <string name="sound_settings" msgid="3072423952331872246">"ধ্বনি"</string>
+    <string name="ring_volume_title" msgid="3135241004980719442">"ৰিঙৰ ভলিউম"</string>
+    <string name="navi_volume_title" msgid="946292066759195165">"নেভিগেশ্বনৰ ভলিউম"</string>
+    <string name="incoming_call_volume_title" msgid="6972117872424656876">"ৰিংট’ন"</string>
+    <string name="notification_volume_title" msgid="6749411263197157876">"জাননী"</string>
+    <string name="media_volume_title" msgid="6697416686272606865">"মিডিয়া"</string>
+    <string name="media_volume_summary" msgid="2961762827637127239">"সংগীত আৰু ভিডিঅ’সমূহৰ বাবে ভলিউম ছেট কৰক"</string>
+    <string name="alarm_volume_title" msgid="840384014895796587">"এলাৰ্ম"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ফ’নৰ ৰিংট’ন"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"জাননীৰ ডিফ’ল্ট ধ্বনি"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"এলাৰ্মৰ ডিফ’ল্ট ধ্বনি"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"এপ্ আৰু জাননী"</string>
+    <string name="all_applications" msgid="7798210477486822168">"সকলো এপ্‌ দেখুৱাওক"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ডিফ’ল্ট এপ্"</string>
+    <string name="applications_settings" msgid="794261395191035632">"এপ সম্পৰ্কীয় তথ্য"</string>
+    <string name="force_stop" msgid="2153183697014720520">"বলেৰে ৰখাওক"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"বলেৰে বন্ধ কৰিবনে?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"আপুনি কোনো এপ্‌ বলেৰে বন্ধ কৰিবলৈ চেষ্টা কৰিলে ই অস্বাভাৱিক আচৰণ কৰিব পাৰে।"</string>
+    <string name="disable_text" msgid="4358165448648990820">"অক্ষম কৰক"</string>
+    <string name="enable_text" msgid="1794971777861881238">"সক্ষম কৰক"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"আনইনষ্টল কৰক"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"আপুনি যদি এই এপ্‌টো অক্ষম কৰে, তেন্তে Android আৰু অন্য এপ্‌সমূহে বিচৰাধৰণে আৰু কাম নকৰিব পাৰে।"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"এপ্‌টো অক্ষম কৰক"</string>
+    <string name="permissions_label" msgid="2701446753515612685">"অনুমতি"</string>
+    <string name="application_version_label" msgid="8556889839783311649">"সংস্কৰণ: %1$s"</string>
+    <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"কোনো অনুমতি দিয়া হোৱা নাই"</string>
+    <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"অনুমতি বিচৰা হোৱা নাই"</string>
+    <string name="data_usage_summary_title" msgid="4368024763485916986">"ডেটাৰ ব্যৱহাৰ"</string>
+    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"এপ্ ডেটাৰ ব্যৱহাৰ"</string>
+    <string name="computing_size" msgid="5791407621793083965">"গণনা কৰি থকা হৈছে…"</string>
+    <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>টা অতিৰিক্ত অনুমতি</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>টা অতিৰিক্ত অনুমতি</item>
+    </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"সহায় আৰু ধ্বনি ইনপুট"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"সহায়ক এপ্"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"স্ক্ৰীণৰ পৰা পাঠ ব্যৱহাৰ কৰক"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"স্ক্ৰীণৰ সমলসমূহ পাঠ ৰূপে চাবলৈ সহায়ক এপক অনুমতি দিয়ক"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"স্ক্ৰীণশ্বট ব্যৱহাৰ কৰক"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"সহায়ক এপ্‌টোক স্ক্ৰীণৰ কোনো ছবি এক্সেছ কৰিবলৈ অনুমতি দিয়ক"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"স্বয়ংপূৰ্তি সেৱা"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"নাই"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"বাছনিকৃত"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"এই সহায়কটোৱে আপোনাৰ ছিষ্টেমত ব্যৱহৃত হৈ থকা এপসমূহৰ বিষয়ে তথ্য পঢ়িব পাৰিব। সেই তথ্যসমূহৰ ভিতৰত আপোনাৰ স্ক্ৰীণত দেখা পোৱা বা এপে চাব পৰা তথ্যসমূহ অন্তৰ্ভুক্ত।"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;আপুনি এই এপটোক বিশ্বাস কৰাটো নিশ্চিত কৰক&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt;এ কি স্বয়ংপূৰ্তি কৰিব পাৰিব সেয়া আপোনাৰ স্ক্ৰীণত থকা সমল ব্যৱহাৰ কৰি নির্ধাৰণ কৰে।"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"সেৱা যোগ কৰক"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"অৱস্থান"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"শেহতীয়া অৱস্থানৰ অনুৰোধ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"শেহতীয়াকৈ কোনো এপে অৱস্থানৰ অনুৰোধ প্ৰেৰণ কৰা নাই"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"এপ্‌-স্তৰৰ অনুমতি"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"স্কেন কৰি থকা হৈছে…"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"অৱস্থান সেৱা"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"ৱাই-ফাই স্কেনিং"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"ব্লুটুথ অফ থকা অৱস্থাতো এপ্ আৰু সেৱাসমূহক যিকোনো সময়ত নিকটৱৰ্তী ডিভাইচবোৰ স্কেন কৰিবলৈ দিয়ক। ইয়াক অৱস্থান-নিৰ্ভৰ সুবিধা আৰু সেৱাসমূহ উন্নত কৰা আদি কাৰ্যত ব্যৱহাৰ কৰিব পাৰি।"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ব্লুটুথ স্কেনিং"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ব্লুটুথ অফ থকা অৱস্থাতো এপ্ আৰু সেৱাসমূহক যিকোনো সময়ত নিকটৱৰ্তী ডিভাইচবোৰ স্কেন কৰিবলৈ দিয়ক। ইয়াক অৱস্থান-নিৰ্ভৰ সুবিধা আৰু সেৱাসমূহ উন্নত কৰা আদি কাৰ্যত ব্যৱহাৰ কৰিব পাৰি।"</string>
+    <string name="system_setting_title" msgid="6864599341809463440">"ছিষ্টেম"</string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"ছিষ্টেম আপডে’ট"</string>
+    <string name="firmware_version" msgid="8491753744549309333">"Android সংস্কৰণ"</string>
+    <string name="security_patch" msgid="4794276590178386903">"Android সুৰক্ষা পেচ্চ স্তৰ"</string>
+    <string name="model_info" msgid="4966408071657934452">"ম\'ডেল"</string>
+    <string name="baseband_version" msgid="2370088062235041897">"বেইছবেণ্ডৰ সংস্কৰণ"</string>
+    <string name="kernel_version" msgid="7327212934187011508">"কাৰ্ণেলৰ সংস্কৰণ"</string>
+    <string name="build_number" msgid="3997326631001009102">"বিল্ড নম্বৰ"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ব্লুটুথৰ ঠিকনা"</string>
+    <string name="device_info_not_available" msgid="2095601973977376655">"উপলব্ধ নহয়"</string>
+    <string name="device_status_activity_title" msgid="4083567497305368200">"স্থিতি"</string>
+    <string name="device_status" msgid="267298179806290920">"স্থিতি"</string>
+    <string name="device_status_summary" product="tablet" msgid="600543254608862075">"বেটাৰিৰ অৱস্থা, নেটৱৰ্ক আৰু অন্যান্য তথ্য"</string>
+    <string name="device_status_summary" product="default" msgid="9130360324418117815">"ফ\'ন নম্বৰ, বেতাঁৰ সংকেত ইত্যাদি"</string>
+    <string name="about_settings" msgid="4329457966672592345">"ইয়াৰ বিষয়ে"</string>
+    <string name="about_summary" msgid="5374623866267691206">"Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
+    <string name="about_settings_summary" msgid="7975072809083281401">"আইনী তথ্য, স্থিতি, ছফটৱেৰৰ সংস্কৰণ চাওক"</string>
+    <string name="legal_information" msgid="1838443759229784762">"আইনী তথ্য"</string>
+    <string name="contributors_title" msgid="7698463793409916113">"অৱদানকাৰীসকল"</string>
+    <string name="manual" msgid="4819839169843240804">"মেনুএল"</string>
+    <string name="regulatory_labels" msgid="3165587388499646779">"নিয়মৰ লেবেলবোৰ"</string>
+    <string name="safety_and_regulatory_info" msgid="1204127697132067734">"সুৰক্ষা আৰু নিময় সম্পৰ্কীয় মেনুৱেল"</string>
+    <string name="copyright_title" msgid="4220237202917417876">"স্ৱত্ৱাধিকাৰ"</string>
+    <string name="license_title" msgid="936705938435249965">"অনুজ্ঞাপত্ৰ"</string>
+    <string name="terms_title" msgid="5201471373602628765">"নিয়ম আৰু চৰ্তাৱলী"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"ছিষ্টেম ৱেবভিউ অনুজ্ঞাপত্ৰ"</string>
+    <string name="wallpaper_attributions" msgid="9201272150014500697">"ৱালপেপাৰ"</string>
+    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"উপগ্ৰহ ছবি যোগানকাৰী:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="settings_license_activity_title" msgid="8499293744313077709">"তৃতীয় পক্ষৰ অনুজ্ঞাপত্ৰ"</string>
+    <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"অনুজ্ঞাপত্ৰসমূহ ল\'ড কৰাত সমস্যা।"</string>
+    <string name="settings_license_activity_loading" msgid="6163263123009681841">"ল’ড হৈ আছে…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">আপুনি এতিয়া এজন বিকাশকৰ্তা হোৱাৰ পৰা <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>টা পদক্ষেপ দূৰত।</item>
+      <item quantity="other">আপুনি এতিয়া এজন বিকাশকৰ্তা হোৱাৰ পৰা <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>টা পদক্ষেপ দূৰত।</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"আপুনি এতিয়া এজন বিকাশকৰ্তা!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"কোনো প্ৰয়োজন নাই, আপুনি ইতিমধ্যে এজন বিকাশকৰ্তা।"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"বিকাশকৰ্তাৰ বিকল্পসমূহ"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"বিকল্পসমূহ ৰিছেট কৰক"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"নেটৱৰ্ক, এপসমূহ বা ডিভাইচৰ ৰিছেট সম্পৰ্কীয় বিকল্প"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"নেটৱৰ্ক ৰিছেট কৰক"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"এই কাৰ্যই সকলো নেটৱৰ্কৰ ছেটিংসমূহ ৰিছেট কৰিব, য’ত অন্তৰ্ভুক্ত আছে:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"ৱাই-ফাই"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"ম’বাইল ডেটা"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ব্লুটুথ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"বাহনৰ সকলো eSIMs মচক"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"এইটোৱে আপোনাৰ সেৱাৰ আঁচনি বাতিল নকৰে।"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIMs ৰিছেট কৰিব নোৱাৰি"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"নেটৱৰ্ক বাছনি কৰক"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ছেটিংসমূহ ৰিছেট কৰক"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"ৰিছেট কৰিবনে?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"সকলো নেটৱৰ্কৰ ছেটিংসমূহ ৰিছেট কৰিবনে? আপুনি এই কাৰ্যটো আনডু কৰিব নোৱাৰিব!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ছেটিংসমূহ ৰিছেট কৰক"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"নেটৱৰ্কৰ ছেটিংসমূহ ৰিছেট কৰা হৈছে"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"এপৰ অগ্ৰাধিকাৰসমূহ ৰিছেট কৰক"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ইয়ে:\n\n"<li>"অক্ষম কৰি থোৱা এপ্"</li>\n<li>"অক্ষম কৰি থোৱা এপ্ জাননী"</li>\n<li>"কাৰ্যৰ ডিফ’ল্ট এপ্লিকেশ্বন"</li>\n<li>"এপৰ নেপথ্য ডেটা সীমাবদ্ধকৰণ"</li>\n<li>"যিকোনো অনুমতিৰ সীমাবদ্ধকৰণ"</li>"ৰ অগ্ৰাধিকাৰসমূহ ৰিছেট কৰিব\n\nআপুনি কোনো এপৰ ডেটা নেহেৰুৱায়।"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"এপসমূহ ৰিছেট কৰক"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"এপৰ অগ্ৰাধিকাৰসমূহ ৰিছেট কৰা হৈছে"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"সকলো ডেটা মচক (ফেক্টৰী ৰিছেট কৰক)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ইয়ে আপোনাৰ বাহনখনৰ হে’ড ইউনিটটোত থকা:\n\n"<li>"আপোনাৰ Google একাউণ্ট"</li>\n<li>"ছিষ্টেম আৰু এপ্‌ ডেটা আৰু ছেটিং "</li>\n<li>"ডাউনল’ড কৰা এপ্‌"</li>" আদিকে ধৰি সকলো ডেটা মচিব"</string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"আপুনি বৰ্তমান এই একাউণ্টসমূহত ছাইন ইন হৈ আছে:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"এই বাহনখনত আৰু ব্যৱহাৰকাৰী আছে।"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"বাহনখন ৰিছেট কৰক"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"ৰিছেট কৰিবনে?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"আপোনাৰ ব্যক্তিগত সকলো তথ্য আৰু ডাউনল’ড কৰা সমস্ত এপ্‌ মচিবনে? আপুনি এই কাৰ্য পিছত আনডু কৰিব নোৱাৰিব!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"সকলো মচক"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"মচি থকা হৈছে"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"অনুগ্রহ কৰি অপেক্ষা কৰক…"</string>
+    <string name="date_and_time_settings_title" msgid="4058492663544475485">"তাৰিখ আৰু সময়"</string>
+    <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"তাৰিখ আৰু সময় ছেট কৰক"</string>
+    <string name="date_and_time_settings_summary" msgid="7669856855390804666">"তাৰিখ, সময়, সময় মণ্ডল আৰু ফৰমেটসমূহ ছেট কৰক"</string>
+    <string name="date_time_auto" msgid="3570339569471779767">"স্বয়ং ছেট কৰা তাৰিখ আৰু সময়"</string>
+    <string name="date_time_auto_summary" msgid="3311706425095342759">"নেটৱৰ্কে প্ৰদান কৰা সময় ব্যৱহাৰ কৰক"</string>
+    <string name="zone_auto" msgid="3701878581920206160">"স্বয়ংক্ৰিয় সময় মণ্ডল"</string>
+    <string name="zone_auto_summary" msgid="4345856882906981864">"নেটৱৰ্কে দিয়া সময় মণ্ডল ব্যৱহাৰ কৰক"</string>
+    <string name="date_time_24hour_title" msgid="3025576547136168692">"২৪ ঘণ্টীয়া ফৰমেট"</string>
+    <string name="date_time_24hour" msgid="1137618702556486913">"২৪ ঘণ্টীয়া ফৰমেট ব্যৱহাৰ কৰক"</string>
+    <string name="date_time_set_time_title" msgid="5884883050656937853">"সময়"</string>
+    <string name="date_time_set_time" msgid="6449555153906058248">"সময় ছেট কৰক"</string>
+    <string name="date_time_set_timezone_title" msgid="3001779256157093425">"সময় মণ্ডল"</string>
+    <string name="date_time_set_timezone" msgid="4759353576185916944">"সময় মণ্ডল বাছনি কৰক"</string>
+    <string name="date_time_set_date_title" msgid="6834785820357051138">"তাৰিখ"</string>
+    <string name="date_time_set_date" msgid="2537494485643283230">"তাৰিখ ছেট কৰক"</string>
+    <string name="zone_list_menu_sort_alphabetically" msgid="7041628618528523514">"বৰ্ণ অনুসৰি ক্ৰমত সজাওক"</string>
+    <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"সময় মণ্ডল অনুসৰি সজাওক"</string>
+    <string name="date_picker_title" msgid="1533614225273770178">"তাৰিখ"</string>
+    <string name="time_picker_title" msgid="7436045944320504639">"সময়"</string>
+    <string name="user_admin" msgid="1535484812908584809">"প্ৰশাসক"</string>
+    <string name="signed_in_admin_user" msgid="1267225622818673274">"প্ৰশাসক হিচাপে ছাইন ইন হৈ আছে"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"সকলো প্ৰশাসকীয় অনুমতি"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"প্ৰশাসকৰ দায়িত্ব দিয়ক"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"এই ব্যৱহাৰকাৰীজনে অন্য প্ৰশাসককে ধৰি যিকোনো ব্যৱহাৰকাৰীকে মচিব পাৰিব আৰু লগতে ছিষ্টেমটোৰ ফেক্টৰী ৰিছেট কৰিব পাৰিব।"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"এই কাৰ্যটো ওলোটাব নোৱাৰি।"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"হয়, প্ৰশাসকৰ দায়িত্ব দিয়ক"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰক"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ফ\'ন কল কৰক"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"গাড়ীৰ ম’বাইল ডেটাৰ জৰিয়তে বার্তালাপ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"নতুন এপ্ ইনষ্টল কৰক"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"এপসমূহ আনইনষ্টল কৰক"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ব্যৱহাৰকাৰী যোগ কৰক"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"নতুন ব্যৱহাৰকাৰী"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"নতুন ব্যৱহাৰকাৰী যোগ কৰেনে?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"আপুনি যেতিয়া কোনো ব্য়ৱহাৰকাৰীক যোগ কৰে সেই ব্য়ক্তিজনে নিজৰ বাবে খালী ঠাই ছেট আপ কৰা প্ৰয়োজন।"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"যিকোনো ব্য়ৱহাৰকাৰীয়ে সকলো ব্য়ৱহাৰকাৰীৰ বাবে এপসমূহ আপডে’ট কৰিব পাৰে।"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"অধিকতম ব্য়ৱহাৰকাৰী সৃষ্টি কৰা হ’ল"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">আপুনি <xliff:g id="COUNT">%d</xliff:g> জন পৰ্যন্ত ব্যৱহাৰকাৰী সৃষ্টি কৰিব পাৰে।</item>
+      <item quantity="other">আপুনি <xliff:g id="COUNT">%d</xliff:g> জন পৰ্যন্ত ব্যৱহাৰকাৰী সৃষ্টি কৰিব পাৰে।</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"নতুন ব্য়ৱহাৰকাৰী সৃষ্টি কৰিব পৰা নগ’ল"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"এই ব্যৱহাৰকাৰীক মচেনে?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"সকলো এপ্ আৰু ডেটা মচা হ’ব।"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ব্যৱহাৰকাৰীক মচিব পৰা নগ’ল।"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"অগ্ৰাহ্য কৰক"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"পুনৰায় চেষ্টা কৰক"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"অন্তিমজন ব্যৱহাৰকাৰীক মচেনে?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"এই গাড়ীখনৰ বাবে বাকী থকা একমাত্ৰ ব্যৱহাৰকাৰীজনক মচাৰ পিছত, এজন নতুন প্ৰশাসক ব্যৱহাৰকাৰী সৃষ্টি কৰা হ’ব।"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"এই ব্যৱহাৰকাৰীৰ লগত জড়িত সকলো ডেটা, ছেটিং আৰু এপ্ মচা হ’ব। আপুনি ছিষ্টেমটো আকৌ ছেট আপ কৰিব লাগিব।"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"নতুন প্ৰশাসক বাছনি কৰক"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"আপোনাক অতি কমেও এজন প্ৰশাসক দৰকাৰ। এইজনক মচিবলৈ হ’লে প্ৰথমে আপুনি এজন বিকল্প প্ৰশাসক নিৰ্বাচন কৰিব লাগিব।"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"প্ৰশাসক বাছনি কৰক"</string>
+    <string name="user_guest" msgid="3465399481257448601">"অতিথি"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"অতিথি"</string>
+    <string name="user_switch" msgid="6544839750534690781">"ছুইচ্চ"</string>
+    <string name="current_user_name" msgid="3813671533249316823">"আপুনি (%1$s)"</string>
+    <string name="user_name_label" msgid="3210832645046206845">"নাম"</string>
+    <string name="user_summary_not_set_up" msgid="1473688119241224145">"ছেট আপ কৰা হোৱা নাই"</string>
+    <string name="edit_user_name_title" msgid="6890782937520262478">"ব্যৱহাৰকাৰীৰ নাম সম্পাদনা কৰক"</string>
+    <string name="users_list_title" msgid="770764290290240909">"ব্যৱহাৰকাৰীসকল"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$sক অনুমতি প্ৰদান কৰা হ’ল"</string>
+    <string name="accounts_settings_title" msgid="436190037084293471">"একাউণ্টসমূহ"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"একাউণ্ট যোগ কৰক"</string>
+    <string name="no_accounts_added" msgid="5148163140691096055">"কোনো একাউণ্ট যোগ কৰা হোৱা নাই"</string>
+    <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>ৰ একাউণ্ট"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ডেটা স্বয়ংক্ৰিয়ভাৱে ছিংক কৰক"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"এপক স্বয়ংক্ৰিয়ভাৱে ডেটা ৰিফ্ৰে’শ্ব কৰিবলৈ দিয়ক"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ডেটা স্বয়ং-ছিংক অন কৰিবনে?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"আপুনি ৱেবৰ যোগেৰে আপোনাৰ একাউণ্টটোত কৰা যিকোনো সালসলনি স্বয়ংক্ৰিয়ভাৱে আপোনাৰ ফ’নত প্ৰতিফলিত হ’ব।\n\nকিছুমান একাউণ্টে আপুনি ফ’নত কৰা সালসলনিসমূহো স্বয়ংক্ৰিয়ভাৱে ৱেবলৈ প্ৰতিলিপি কৰিব পাৰে। এটা Google একাউণ্টে এই ধৰণে কাম কৰে।"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ডেটা স্বয়ং-ছিংক অফ কৰিবনে?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ইয়ে ডেটা ৰাহি কৰিব, কিন্তু আপুনি শেহতীয়া তথ্য পাবলৈ নিজে নিজে প্ৰতিটো একাউণ্ট ছিংক কৰিব লাগিব। আৰু আপডে’ট আহিলে আপুনি তাৰ জাননী নাপাব।"</string>
+    <string name="account_details_title" msgid="7529571432258448573">"একাউণ্টৰ তথ্য়"</string>
+    <string name="add_account_title" msgid="5988746086885210040">"একাউণ্ট যোগ কৰক"</string>
+    <string name="add_an_account" msgid="1072285034300995091">"একাউণ্ট যোগ কৰক"</string>
+    <string name="user_cannot_add_accounts_message" msgid="6775605884544906797">"সীমিত প্ৰ\'ফাইলসমূহে একাউণ্ট যোগ কৰিব নোৱাৰে"</string>
+    <string name="remove_account_title" msgid="8840386525787836381">"একাউণ্ট আঁতৰাওক"</string>
+    <string name="really_remove_account_title" msgid="3555164432587924900">"একাউণ্ট আঁতৰাবনে?"</string>
+    <string name="really_remove_account_message" msgid="4296769280849579900">"এই একাউণ্টটো আঁতৰালে ডিভাইচৰ পৰা ইয়াৰ সকলো বাৰ্তা, সম্পৰ্কসূচী আৰু অন্য ডেটা মচা হ\'ব!"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"একাউণ্ট আঁতৰাব পৰা নগ’ল।"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"একাউণ্ট ছিংক"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>টা আইটেমৰ <xliff:g id="ID_1">%1$d</xliff:g>টাৰ বাবে ছিংক অন হৈ আছে"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"সকলো বস্তুৰ বাবে ছিংক অন হৈ আছে"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"সকলো বস্তুৰ বাবে ছিংক অফ হৈ আছে"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"ছিংক অফ কৰা আছে"</string>
+    <string name="sync_error" msgid="6698021343089247914">"ছিংকৰ আসোঁৱাহ"</string>
+    <string name="last_synced" msgid="4745124489150101529">"অন্তিমবাৰ ছিংক কৰাৰ সময় <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"এতিয়া ছিংক কৰি থকা হৈছে…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"এতিয়াই ছিংক কৰিবলৈ টিপক<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"এতিয়া ছিংক কৰক"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ছিংক বাতিল কৰক"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ছিংকে সমস্যাৰ সন্মুখীন হৈছে। ই অলপ পিছতে ঠিক হ’ব।"</string>
+    <string name="security_settings_title" msgid="6955331714774709746">"সুৰক্ষা"</string>
+    <string name="security_settings_subtitle" msgid="2244635550239273229">"স্ক্ৰীণ লক"</string>
+    <string name="security_lock_none" msgid="1054645093754839638">"নাই"</string>
+    <string name="security_lock_pattern" msgid="1174352995619563104">"আৰ্হি"</string>
+    <string name="security_lock_pin" msgid="4891899974369503200">"পিন"</string>
+    <string name="security_lock_password" msgid="4420203740048322494">"পাছৱৰ্ড"</string>
+    <string name="lock_settings_picker_title" msgid="6590330165050361632">"কোনো লকৰ প্ৰকাৰ বাছক"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"স্ক্ৰীণ লকৰ বিকল্প"</string>
+    <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"আপোনাৰ আৰ্হি দিয়ক"</string>
+    <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"নিশ্চিত কৰক"</string>
+    <string name="lockpattern_restart_button_text" msgid="9355771277617537">"আকৌ আঁকক"</string>
+    <string name="continue_button_text" msgid="5129979170426836641">"অব্যাহত ৰাখক"</string>
+    <string name="lockscreen_retry_button_text" msgid="5314212350698701242">"পুনৰ চেষ্টা কৰক"</string>
+    <string name="lockscreen_skip_button_text" msgid="3755748786396198091">"এৰি যাওক"</string>
+    <string name="set_screen_lock" msgid="5239317292691332780">"স্ক্ৰীণ ছেট কৰক"</string>
+    <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"আপোনাৰ পিন বাছনি কৰক"</string>
+    <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"আপোনাৰ আৰ্হি বাছক"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"আপোনাৰ পাছৱৰ্ড বাছনি কৰক"</string>
+    <string name="current_screen_lock" msgid="637651611145979587">"বৰ্তমান ব্যৱহাৰ হৈ থকা স্ক্ৰীণ লক"</string>
+    <string name="choose_lock_pattern_message" msgid="6242765203541309524">"সুৰক্ষাৰ বাবে কোনো আৰ্হি ছেট কৰক"</string>
+    <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"মচক"</string>
+    <string name="lockpattern_cancel_button_text" msgid="4068764595622381766">"বাতিল কৰক"</string>
+    <string name="lockpattern_pattern_confirmed" msgid="5984306638250515385">"আপোনাৰ নতুন আনলক আৰ্হি"</string>
+    <string name="lockpattern_recording_intro_header" msgid="7864149726033694408">"লক খোলাৰ আৰ্হি আঁকক"</string>
+    <string name="lockpattern_recording_inprogress" msgid="1575019990484725964">"আৰ্হি অঁকা কাৰ্য হ\'লে আঙুলিটো উঠাওক"</string>
+    <string name="lockpattern_pattern_entered" msgid="6103071005285320575">"আৰ্হি ৰেক\'ৰ্ড কৰা হ’ল"</string>
+    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"নিশ্চিত কৰিবলৈ আৰ্হিটো আকৌ আঁকক"</string>
+    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"কমেও ৪টা বিন্দু লগ লগাই আকৌ চেষ্টা কৰক।"</string>
+    <string name="lockpattern_pattern_wrong" msgid="929223969555399363">"ভুল আৰ্হি"</string>
+    <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"লক খোলাৰ আৰ্হি অঁকা উপায়"</string>
+    <string name="error_saving_lockpattern" msgid="2933512812768570130">"আৰ্হি ছেভ কৰোঁতে আঁসোৱাহ"</string>
+    <string name="okay" msgid="4589873324439764349">"ঠিক আছে"</string>
+    <string name="remove_screen_lock_title" msgid="1234382338764193387">"স্ক্ৰীণ লক আঁতৰাবনে?"</string>
+    <string name="remove_screen_lock_message" msgid="6675850371585564965">"এই কাৰ্যই সকলোকে আপোনাৰ একাউণ্টৰ এক্সেছ দিব"</string>
+    <string name="lock_settings_enter_pin" msgid="1669172111244633904">"আপোনাৰ পিন দিয়ক"</string>
+    <string name="lock_settings_enter_password" msgid="2636669926649496367">"আপোনাৰ পাছৱৰ্ড দিয়ক"</string>
+    <string name="choose_lock_pin_message" msgid="2963792070267774417">"সুৰক্ষাৰ বাবে কোনো পিন ছেট কৰক"</string>
+    <string name="confirm_your_pin_header" msgid="9096581288537156102">"আপোনাৰ পিনটো আকৌ দিয়ক"</string>
+    <string name="choose_lock_pin_hints" msgid="7362906249992020844">"পিনটোত কমেও ৪টা অংক থাকিব লাগিব"</string>
+    <string name="lockpin_invalid_pin" msgid="2149191577096327424">"অমান্য় পিন, কমেও ৪টা সংখ্য়া হ\'ব লাগিব।"</string>
+    <string name="confirm_pins_dont_match" msgid="4607110139373520720">"পিনবিলাক মিলা নাই"</string>
+    <string name="error_saving_lockpin" msgid="9011960139736000393">"পিন ছেভ কৰোঁতে আঁসোৱাহ"</string>
+    <string name="lockscreen_wrong_pin" msgid="4922465731473805306">"ভুল পিন"</string>
+    <string name="lockscreen_wrong_password" msgid="5757087577162231825">"ভুল পাছৱৰ্ড"</string>
+    <string name="choose_lock_password_message" msgid="6124341145027370784">"সুৰক্ষাৰ বাবে কোনো পাছৱৰ্ড ছেট কৰক"</string>
+    <string name="confirm_your_password_header" msgid="7052891840366724938">"আপোনাৰ পাছৱৰ্ডটো আকৌ দিয়ক"</string>
+    <string name="confirm_passwords_dont_match" msgid="7300229965206501753">"পাছৱৰ্ড মিলা নাই"</string>
+    <string name="lockpassword_clear_label" msgid="6363680971025188064">"মচক"</string>
+    <string name="lockpassword_cancel_label" msgid="5791237697404166450">"বাতিল কৰক"</string>
+    <string name="lockpassword_confirm_label" msgid="5918463281546146953">"নিশ্চিত কৰক"</string>
+    <string name="choose_lock_password_hints" msgid="3903696950202491593">"অতি কমেও ৪টা বর্ণ থাকিব লাগিব"</string>
+    <string name="lockpassword_password_too_short" msgid="6681218025001328405">"অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বৰ্ণ থাকিব লাগিব"</string>
+    <string name="lockpassword_pin_too_short" msgid="6363004004424904218">"পিনটোত অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা অংক থাকিব লাগিব"</string>
+    <string name="lockpassword_password_too_long" msgid="7530214940279491291">"<xliff:g id="NUMBER">%d</xliff:g>তকৈ কম সংখ্যক বৰ্ণ থাকিব লাগিব"</string>
+    <string name="lockpassword_pin_too_long" msgid="62957683396974404">"<xliff:g id="NUMBER">%d</xliff:g>তকৈ কম সংখ্যক অংকৰ হ\'ব লাগিব"</string>
+    <string name="lockpassword_pin_contains_non_digits" msgid="3044526271686839923">"কেৱল ০-৯ৰ ভিতৰৰ অংকহে থাকিব লাগিব।"</string>
+    <string name="lockpassword_pin_recently_used" msgid="7901918311213276207">"ডিভাইচৰ প্ৰশাসকে শেহতীয়া পিন ব্যৱহাৰ কৰিব নিদিয়ে"</string>
+    <string name="lockpassword_pin_blacklisted_by_admin" msgid="7412709707800738442">"আপোনাৰ আইটি প্ৰশাসকে উমৈহতীয়া পিনবোৰ অৱৰোধ কৰি থৈছে৷ বেলেগ পিন ব্য়ৱহাৰ কৰি চাওক৷"</string>
+    <string name="lockpassword_illegal_character" msgid="1984970060523635618">"ইয়াত অমান্য় বৰ্ণ থাকিব নোৱাৰে।"</string>
+    <string name="lockpassword_invalid_password" msgid="1690956113717418430">"অমান্য পাছৱর্ড, অতি কমেও ৪টা বর্ণ থাকিব লাগিব।"</string>
+    <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
+      <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g> টা বৰ্ণ থাকিব লাগিব</item>
+      <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g> বৰ্ণ থাকিব লাগিব</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
+      <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সৰুফলাৰ বৰ্ণ থাকিব লাগিব</item>
+      <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সৰুফলাৰ বৰ্ণ থাকিব লাগিব</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
+      <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বৰফলাৰ বৰ্ণ থাকিব লাগিব</item>
+      <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বৰফলাৰ বৰ্ণ থাকিব লাগিব</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
+      <item quantity="one">কমেও <xliff:g id="COUNT">%d</xliff:g>টা অংক থাকিব লাগিব</item>
+      <item quantity="other">কমেও <xliff:g id="COUNT">%d</xliff:g>টা অংক থাকিব লাগিব</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
+      <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বিশেষ চিহ্ন থাকিব লাগিব</item>
+      <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা বিশেষ চিহ্ন থাকিব লাগিব</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
+      <item quantity="one">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সংখ্যা বা প্ৰতীক থাকিব লাগিব</item>
+      <item quantity="other">অতি কমেও <xliff:g id="COUNT">%d</xliff:g>টা সংখ্যা বা প্ৰতীক থাকিব লাগিব</item>
+    </plurals>
+    <string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ডিভাইচৰ প্ৰশাসকে শেহতীয়া পাছৱৰ্ড ব্যৱহাৰ কৰিব নিদিয়ে"</string>
+    <string name="error_saving_password" msgid="8334882262622500658">"পাছৱৰ্ড ছেভ কৰোঁতে আঁসোৱাহ"</string>
+    <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"আইটি প্ৰশাসকে উমৈহতীয়া পাছৱৰ্ডসমূহ অৱৰোধ কৰি থৈছে। বেলেগ পাছৱৰ্ড ব্যৱাহৰ কৰি চাওক।"</string>
+    <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"সংখ্যাবোৰৰ ঊৰ্ধ্বগামী, অধোগামী বা পুনৰাবৃত্তি ক্ৰমক অনুমতি দিয়া নহয়।"</string>
+    <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"স্ক্ৰীণ লক সম্পৰ্কীয় বিকল্প"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> দিন আগত"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"বিশ্বাসী ডিভাইচ যোগ কৰক"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"বিশ্বাসী ডিভাইচ"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>টা ডিভাইচ</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>টা ডিভাইচ</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"আপোনাৰ <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g>এ সংযোগ হ\'লে এই গাড়ীখন আনলক কৰিব। আপোনাৰ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> ব্যৱহাৰ কৰা লোকসকলে এই ডিভাইচলৈ এক্সেছ পাব পাৰে"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"নিশ্চিত কৰক"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"বিশ্বাসী ডিভাইচ আঁতৰাওক"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"কৰা হ’ল"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"এটা বিশ্বাসী ডিভাইচ ছেট আপ কৰিবলৈ সহযোগী এপ্‌টো ব্যৱহাৰ কৰক। ছেট আপ কৰাৰ পিছত যেতিয়া গাড়ীখনে আপোনাৰ ফ’নটো চিনাক্ত কৰিব তেতিয়া আপুনি নিজৰ ব্যৱহাৰকাৰীৰ প্ৰ’ফাইলটো আনলক কৰিব পাৰিব"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"১. আপোনাৰ ফ’নটোত সহযোগী এপ্‌টো ডাউনল’ড কৰক"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"২. ডিভাইচকেইটা যোৰা লগাবলৈ আপোনাৰ ফ’নটোত <xliff:g id="CAR_NAME">%1$s</xliff:g> বাছনি কৰক"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"স্মাৰ্ট লকে এই ডিভাইচটোত থকা সুৰক্ষা সুবিধা চিনাক্ত কৰিব পৰা নাই। আপোনাৰ গাড়ীখন নিৰাপদে ৰাখিবৰ কাৰণে আপুনি গাড়ীখন আনলক কৰাৰ পিছতহে বিশ্বাসী ডিভাইচটোৱে গাড়ীখন আনলক কৰি ৰাখিব পাৰিব। আপোনাৰ বিশ্বাসী ডিভাইচটো যেতিয়া আপোনাৰ গাড়ীখনৰ ওচৰত থাকে তেতিয়া সেইটোৱে গাড়ীখন আনলক কৰিব ৰাখিব পাৰিব, আনকি যেতিয়া ডিভাইচটো আনে লৈ থাকে তেতিয়াও।"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ডিভাইচটো বিশ্বাসী ডিভাইচ হিচাপে যোগ কৰক"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"বিশ্বাসী ডিভাইচ হিচাপে <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ক সফলতাৰে যোগ কৰা হ’ল"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> যোৰা লগাব পৰা নগ’ল"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"আপুনি কোনো বিশ্বাসী ডিভাইচ যোগ কৰিলে তাৰ পিছত এটা বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ পদ্ধতি ছেট কৰাৰ প্ৰয়োজন হ’ব। যদি বিশ্বাসী ডিভাইচটো আপোনাৰ সৈতে নাই তেন্তে আপোনাৰ প্ৰ’ফাইলটো এক্সেছ কৰিবলৈ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ প্ৰয়োজন হ’ব।"</string>
+    <string name="forget" msgid="3971143908183848527">"পাহৰক"</string>
+    <string name="connect" msgid="5861699594602380150">"সংযোগ কৰক"</string>
+    <string name="disconnect" msgid="6140789953324820336">"সংযোগ বিচ্ছিন্ন কৰক"</string>
+    <string name="delete_button" msgid="5840500432614610850">"মচক"</string>
+    <string name="remove_button" msgid="6664656962868194178">"আঁতৰাওক"</string>
+    <string name="cancel" msgid="750286395700355455">"বাতিল কৰক"</string>
+    <string name="backspace_key" msgid="1545590866688979099">"Backspace কী"</string>
+    <string name="enter_key" msgid="2121394305541579468">"Enter কী"</string>
+    <string name="exit_retail_button_text" msgid="6093240315583384473">"ডেম\'ৰ পৰা বাহিৰ হওক"</string>
+    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ডেম\' ম\'ডৰ পৰা বাহিৰ হওক"</string>
+    <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"এই কামে ডেম\' একাউণ্টটো মচি পেলাব আৰু ছিষ্টেমটোৰ ফেক্টৰী ডেটা ৰিছেট কৰিব। সকলো ব্যৱহাৰকাৰীৰ ডেটা হেৰাব।"</string>
+    <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ডেম\'ৰ পৰা বাহিৰ হওক"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"অগ্ৰাহ্য কৰক"</string>
+    <string name="restricted_while_driving" msgid="6217369093121968299">"ড্ৰাইভিং কৰা সময়ত এই সুবিধাটো নাথাকে।"</string>
+    <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ড্ৰাইভিং কৰিথকা সময়ত ব্য়ৱহাৰকাৰী যোগ কৰিব নোৱাৰি।"</string>
+</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 62628bb..bc1aa22 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"solğun ekran, sensor ekran, batareya"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"solğun ekran, gecə, rəng"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Gecə rejimi"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Şəbəkə və internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobil şəbəkə"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobil data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Mobil şəbəkədən istifadə edərək dataya daxil olun"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobil data söndürülsün?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Data istifadəsi"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Data xəbərdarlığı və limiti"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Tətbiq datasının istifadə tsikli"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Data xəbərdarlığı ayarlayın"</string>
+    <string name="data_warning" msgid="116776633806885370">"Data xəbərdarlığı"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Data limiti ayarlayın"</string>
+    <string name="data_limit" msgid="227338836292511425">"Data limiti"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Data istifadəsinə limit qoyulması"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Ayarladığınız limitə çatdıqda, avtomobilinizin idarə paneli mobil datanı söndürəcək.\n\nData istifadəsi idarə paneli tərəfindən ölçüldüyü və operatorun hesablaması fərqli ola bildiyi üçün uyğun limit ayarlamağınız tövsiyə olunur."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Simsiz giriş nöqtələrini quraşdırın və idarə edin"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi yandırılır…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi söndürülür…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi siyahısı yüklənir"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi deaktiv edilib"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Şəbəkəni unutmaq alınmadı"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Şəbəkəyə qoşulmaq alınmadı"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Şəbəkə əlavə edin"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi deaktiv edilib"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Qoşun"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Parol"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Parolu göstərin"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Şəbəkə adı"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID daxil edin"</string>
     <string name="wifi_security" msgid="158358046038876532">"Təhlükəsizlik"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Siqnal gücü"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Siqnal gücü"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Link sürəti"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Tezlik"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP ünvanı"</string>
+    <string name="show_password" msgid="2074628020371139240">"Parolu göstərin"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Şəbəkə adını daxil edin"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Parol daxil edin"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Zəif"</item>
-    <item msgid="2032262610626057081">"Kafi"</item>
-    <item msgid="3859756017461098953">"Yaxşı"</item>
-    <item msgid="1521103743353335724">"Əla"</item>
+    <item msgid="7683058295076342057">"Zəif"</item>
+    <item msgid="1639222824821660744">"Kafi"</item>
+    <item msgid="1838705897358163300">"Yaxşı"</item>
+    <item msgid="6067166649320533751">"Əla"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth aktivləşdirilsin?"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth deaktiv edildi"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Şəbəkə təfsilatları"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ünvanı"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ünvanı"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Alt şəbəkə maskası"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ünvanları"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Şlüz"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi tərcihləri"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi\'ı avtomatik olaraq aktiv edin"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi daxili şəbəkə kimi saxlanmış keyfiyyətli şəbəkə yanında aktiv ediləcək"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Əlçatan deyil çünki məkan deaktivdir. "<annotation id="link">"Məkanı"</annotation>" aktiv edin."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi skanı aktiv edilsin?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aktiv edin"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi skanı aktiv edildi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Mobil dataya avtomatik keçin"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi internetə qoşulmayanda mobil datadan istifadə edin. Xidmət haqqı tutula bilər."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Ətraflı məlumat"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Bağlantıları idarə edin, cihaz adı və görünmə rejimini təyin edin"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Kompüter"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Qulaqlıq"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Görüntüləmə"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Qulaqlıq"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Daxiletmə periferiki"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Birləşdirilmiş cihazlar"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Əlçatan cihazlar"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Birləşdirilmiş cihaz yoxdur"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Əlçatan cihaz yoxdur"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Birləşdirilmiş cihaz"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Ad"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"İstifadə məqsədi"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth cihazının adını dəyişin"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Adsız cihaz"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Birləşdirilmiş cihazlar"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Yeni cihaz birləşdirin"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth birləşmək üçün aktiv ediləcək"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Cihaz ayrılsın?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Nəqliyyat vasitənizin <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ilə bağlantısı ayrılacaq."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Nəqliyyat vasitəsinin Bluetooth ünvanı: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Cihazın Bluetooth ünvanı: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nəqliyyat vasitəsinin adı"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Bu nəqliyyat vasitəsini yenidən adlandırın"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Cihazı yenidən adlandırın"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Yenidən adlandırın"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Əlçatan cihazlar"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profillər"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth birləşdirmə sorğusu"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"birləşdirin və əlaqə yaradın"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth birləşdirmə kodu"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN hərflər və ya simvollar ehtiva edir"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Birləşdirmə kodunu yazın, sonra Geriyə və ya Enter düyməsinə basın"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Adətən, 0000 və ya 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Birləşdirmə sorğusu"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ilə birləşdirmək üçün toxunun"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Dillər"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Dillər və daxiletmə"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatura"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Klaviaturaları idarə edin"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Mətndən-nitqə daxiletmə"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Tərcih edilən mühərrik"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Cari mühərrik"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Nitq sürəti"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tembr"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Sıfırlayın"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Səs"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Zəngin səs səviyyəsi"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Naviqasiyanın səs səviyyəsi"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Musiqi və video üçün səs səviyyəsi təyin edin"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Xəbərdarlıq siqnalı"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefon zəng səsi"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Defolt bildiriş səsi"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Defolt zəngli saat səsi"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Tətbiqlər və bildirişlər"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Bütün tətbiqləri göstərin"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Defolt tətbiqlər"</string>
     <string name="applications_settings" msgid="794261395191035632">"Tətbiq haqqında məlumat"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Məcburən dayansın"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Məcburi dayandırılsın?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Tətbiqi məcburi dayandırsanız, o, düzgün işləməyə bilər."</string>
     <string name="disable_text" msgid="4358165448648990820">"Deaktiv edin"</string>
     <string name="enable_text" msgid="1794971777861881238">"Aktiv edin"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Sistemdən silin"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Əgər bu tətbiqi deaktiv etsəniz, Android və digər tətbiqlər düzgün işlməyə bilər."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Tətbiqi deaktiv edin"</string>
     <string name="permissions_label" msgid="2701446753515612685">"İcazələr"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versiya: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"İcazə verilməyib"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"İcazə sorğusu göndərilməyib"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Data istifadəsi"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Tətbiq data istifadəsi"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Məcburən dayansın"</string>
     <string name="computing_size" msgid="5791407621793083965">"Hesablanır…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> əlavə icazə</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> əlavə icazə</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Yardım və səslə daxiletmə"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Yardım tətbiqi"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Ekrandakı mətni istifadə edin"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Yardım tətbiqinə ekran məzmunlarına mətn kimi daxil olmağa icazə verin"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Ani görüntü istifadə edin"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Yardım tətbiqinə ekrandakı şəkilə daxil olmağa icazə verin"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Avtodoldurma xidməti"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Yoxdur"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Seçilib"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asistent sisteminizdə istifadə olunan tətbiqlər haqqında məlumatı oxuya biləcək, bura ekranınızda görünən və ya tətbiqlər daxilində əlçatan olan məlumatlar da daxildir."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Bu tətbiqə etibar etdiyinizə əmin olun&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Avtodoldurma&gt;%1$s&lt;/xliff:g&gt; nəyin avtomatik doldurula biləcəyini müəyyən etmək üçün ekrandakılardan istifadə edir."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Xidmət əlavə edin"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Məkan"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Son Məkan Sorğuları"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Məkan sorğusu yoxdur"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Tətbiq səviyyəsi icazələri"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skan edilir"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Məkan Xidmətləri"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi skan edilir"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi‑Fi deaktiv olsa belə, tətbiq və xidmətlərin Wi‑Fi şəbəkələrini istənilən zaman skan etməsinə icazə verin. Məsələn, bu, məkanla bağlı xüsusiyyət və xidmətləri təkmilləşdirmək üçün istifadə edilə bilər."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth skan edilir"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Bluetooth deaktiv olsa belə, tətbiq və xidmətlərə yaxınlıqdakı cihazları istənilən zaman skan etməsinə icazə verin. Məsələn, bu, məkanla bağlı xüsusiyyət və xidmətləri təkmilləşdirmək üçün istifadə edilə bilər."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Sistem yenilənməsi"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Sistem yenilənməsi"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android versiyası"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android təhlükəsizlik gücləndirmə səviyyəsi"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband versiyası"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel versiyası"</string>
     <string name="build_number" msgid="3997326631001009102">"Versiya nömrəsi"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth ünvanı"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Əlçatan deyil"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Müəllif hüququ"</string>
     <string name="license_title" msgid="936705938435249965">"Lisenziya"</string>
     <string name="terms_title" msgid="5201471373602628765">"Şərtlər və qaydalar"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Sistem WebView Lisenziyası"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"WebGörüntü lisenziyalar sistemi"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Divar kağızları"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Peyk şəkillərini təmin edənlər:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Üçüncü tərəf lisenziyaları"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Lisenziyaların yüklənilməsində problem var."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Yüklənir…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">İndi tərtibatçı olmağınıza <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> addım qalıb.</item>
+      <item quantity="one">İndi tərtibatçı olmağınıza <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> addım qalıb.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Siz indi tərtibatçısınız!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Ehtiyac yoxdur, siz artıq tərtibatçısınız."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Tərtibatçı seçimləri"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Sıfırlama seçimləri"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Şəbəkə, tətbiqlər və ya cihaz sıfırlaması"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Şəbəkəni sıfırlayın"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Bu aşağıdakılar da daxil olmaqla bütün şəbəkə ayarlarını sıfırlayacaq:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobil məlumatlar"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Bütün nəqliyyat eSIM\'lərini silin"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Bu, xidmət planını ləğv etməyəcək."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM\'ləri sıfırlamaq mümkün deyil"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Şəbəkə seçin"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Ayarları sıfırlayın"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Sıfırlansın?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Bütün şəbəkə ayarları sıfırlansın? Bu əməliyyatı geri qaytara bilməzsiniz!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Ayarları sıfırlayın"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Şəbəkə ayarları sıfırlandı"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Tətbiq seçimlərini sıfırlayın"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Bu, aşağıdakılar üçün bütün tərcihləri sıfırlayacaq:\n\n"<li>" Deaktiv edilmiş tətbiqlər"</li>\n<li>"Deaktiv edilmiş tətbiq bildirişləri"</li>\n<li>"Əməliyyatlar üçün defolt tətbiqlər"</li>\n<li>"Tətbiqlər üçün arxa fon məlumatlarının məhdudlaşdırılması"</li>\n<li>"İstənilən icazə məhdudiyyətləri"</li>\n\n"Hər hansı tətbiq məlumatını itirməyəcəksiniz."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Tətbiqləri sıfırla"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Tətbiq seçimləri sıfırlanıb"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Bütün datanı silin (fabrika sıfırlaması)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Bu, avtomobilin əsas blokundakı bütün datanı siləcək, bura daxildir:\n\n"<li>"Google Hesabınız"</li>\n<li>"Sistem və tətbiq datası və ayarları"</li>\n<li>"Endirilmiş tətbiqlər"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Hazırda bu hesablara daxil olmusunuz:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Bu avtomobildə başqa istifadəçilər mövcuddur."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Avtomobili sıfırlayın"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Sıfırlansın?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Bütün şəxsi məlumatlarınız və endirilmiş tətbiqlər silinsin? Bu əməliyyatı geri qaytara bilməyəcəksiniz!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Hər şeyi silin"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Silinir"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Lütfən, gözləyin..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Tarix və vaxt"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Tarix və vaxtı təyin edin"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Tarix, vaxt, vaxt zonası və formatları təyin edin"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Vaxt zonasına görə sıralayın"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Tarix"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Vaxt"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"İstifadəçi əlavə edin"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Hesab əlavə edin"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"İstifadəçinin silinməsi"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Yeni istifadəçi"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Qonaq"</string>
     <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"İnzibatçı kimi daxil olunub"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Bütün admin icazələri"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Admin edin"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"İstifadəçi Adminlər daxil olmaqla istifadəçiləri silə və sistemi zavod ayarlarına qaytara biləcək."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Bu əməliyyat geri qaytarıla bilməz."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Bəli, admin edin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Yeni istifadəçilər yaradın"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefon zəngləri edin"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Maşının mobil datası ilə mesajlaşma"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Yeni tətbiqlər quraşdırın"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Tətbiqləri ləğv edin"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"İstifadəçi əlavə edin"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Yeni istifadəçi"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Yeni istifadəçi əlavə edilsin?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Yeni istifadəçi əlavə etdiyinizdə həmin şəxs öz yerini təyin etməlidir."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"İstənilən istifadəçi digər bütün istifadəçilər üçün tətbiqləri güncəlləyə bilər."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"İstifadəçi limitinə çatmısınız"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sayda istifadəçiyə qədər yarada bilərsiniz.</item>
+      <item quantity="one">Yalnız bir istifadəçi yaradıla bilər.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Yeni istifadəçi yaradılmadı"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Bu istifadəçi silinsin?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Bütün tətbiqlər və data silinəcək."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"İstifadəçi silinmədi"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Silin"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Yenidən cəhd edin"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Son istifadəçi silinsin?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Bu avtomobil üçün qalan yeganə istifadəçini sildikdən sonra yeni admin istifadəçi yaradılacaq."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Bu istifadəçi ilə əlaqələndirilmiş bütün verilənlər, ayarlar və tətbiqlər silinəcək. Sistemi yenidən quraşdırmalı olacaqsınız."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Yeni admin seçin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Ən azı bir admininiz olmalıdır. Bunu silmək üçün ilk növbədə əvəzləyici seçin."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Admin seçin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Qonaq"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Qonaq"</string>
     <string name="user_switch" msgid="6544839750534690781">"Dəyişin"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Siz (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ad"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Quraşdırılmayıb"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"İstifadəçi adını redaktə edin"</string>
     <string name="users_list_title" msgid="770764290290240909">"İstifadəçilər"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s üçün verilmiş icazələr"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Hesablar"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"İstifadəçi"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Hesab əlavə edin"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Hesab əlavə edilməyib"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> üçün hesablar"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Datanı avtomatik sinxronizasiya edin"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Tətbiqlərə datanı avtomatik yeniləmək icazəsi verin"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Data avto-sinx aktiv edilsin?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Vebdə hesabınıza etdiyiniz istənilən dəyişiklik avtomatik cihazınıza kopyalayacaq.\n\nBəzi hesablar telefonda etdiyiniz dəyişiklikləri avtomatik vebə kopyalaya bilər. Google Hesabı bu cür işləyir."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Data avto-sinx deaktiv edilsin?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Bu, data istifadəsinə qənaət edəcək, lakin Siz sonuncu məlumatları toplamaq üçün hər hesabı əl ilə sinxronlaşdırmalı olacaqsınız. Və güncəlləşmə olduqda Sizə bildiriş gəlməyəcək."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Hesab məlumatı"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Hesab əlavə edin"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Hesab əlavə edin"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Hesabı silin"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Hesab silinsin?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Bu hesabın silinməsi bütün mesajları, kontaktları və digər datanı cihazdan siləcək!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Admin bu dəyişikliyə icazə vermir"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Bu istifadəçi silinsin?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Bütün tətbiqlər və data silinəcək."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"İstifadəçini silmək mümkün olmadı."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Cəhd edilsin?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Keçin"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Yenidən cəhd edin"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Yeni istifadəçi əlavə edilsin?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Yeni istifadəçi əlavə etdiyinizdə həmin şəxs öz yerini təyin etməlidir."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"İstənilən istifadəçi digər bütün istifadəçilər üçün tətbiqləri güncəlləyə bilər."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Hesab silinmədi."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Hesab sinxronizasiyası"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinxronizasiya <xliff:g id="ID_2">%2$d</xliff:g> elementin <xliff:g id="ID_1">%1$d</xliff:g> elementi üçün aktivdir"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Bütün elementlər üçün sinxronizasiya aktivdir"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Bütün elementlər üçün sinxronizasiya deaktivdir"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinxronizasiya deaktivdir"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sinxronizasiya xətası"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Son sinxronlaşdırma <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"İndi sinxronlaşdırılır…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"İndi sinxronlaşdırmaq üçün tıklayın<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"İndi sinxronizə edin"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Sinxronizasiyanı ləğv edin"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Hazırda sinxronizasiyada problemlər var. Bir azdan düzələcək."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Təhlükəsizlik"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekran kilidi"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Yoxdur"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Parol"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Kilid növü seçin"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Ekran kilidi seçimləri"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Kilidləmə seçimləri"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Modeli daxil edin"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Təsdiq edin"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Yenidən çəkin"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ekran kilidi təyin edin"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PİN seçin"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Modelinizi seçin"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Parolunuzu seçin"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Parolunuzu seçin"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Cari ekran kilidi"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Təhlükəsizlik üçün model təyin edin"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Silin"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Ümumi parollar IT admini tərəfindən blok edilib. Fərqli parolu sınayın."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Artan, azalan və ya təkrarlanan rəqəm ardıcıllığı qadağandır."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Ekran kilidi seçimləri"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> gün əvvəl"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Güvənli cihaz əlavə edin"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Güvənli cihazlar"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> cihaz</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> cihaz</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> cihazınız qoşulduqda bu avtomobili kiliddən çıxaracaq. Kimsə <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> cihazınızı götürsə, bu cihaza daxil ola bilər"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Təsdiq"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Güvənli cihazı silin"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Hazırdır"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Etibarlı cihaz ayarlamaq üçün kompanyon tətbiq istifadə edin. Ayarlandıqdan sonra, telefonunuz avtomobil tərəfindən aşkarlandıqda istifadəçi profilinizi kiliddən çıxara biləcəksiniz"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Telefonunuza kompanyon tətbiqini endirin"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Cihazları birləşdirmək üçün telefonda <xliff:g id="CAR_NAME">%1$s</xliff:g> seçin"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock bu cihazın təhlükəsizlik xüsusiyyətlərini aşkarlaya bilmir. Telefonunuzu qorumağa kömək etmək üçün etibarlı cihaz yalnızca avtomobilin kilidini açdığınız zaman kilidi açıq vəziyyətdə saxlaya biləcək. Etibarlı cihazınız hətta başqasının əlində olarkən belə, yaxınlıqda olduqda avtomobili kilidi açıq saxlaya bilər."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazını etibarlı cihaz kimi əlavə edin"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> uğurla etibarlı cihaz kimi əlavə edildi"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> qeydiyyatı alınmadı"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Etibarlı cihaz əlavə etdikdən sonra doğrulama metodu təyin edilməlidir. Etibarlı cihazınız üzərinizdə deyilsə, profilinizə giriş üçün doğrulama tələb olunacaq."</string>
     <string name="forget" msgid="3971143908183848527">"Unudun"</string>
+    <string name="connect" msgid="5861699594602380150">"Qoşun"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Ayırın"</string>
     <string name="delete_button" msgid="5840500432614610850">"Silin"</string>
     <string name="remove_button" msgid="6664656962868194178">"Silin"</string>
     <string name="cancel" msgid="750286395700355455">"Ləğv edin"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Demo rejimdən çıxın"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Bu, demo hesabı siləcək və sistemi istehsalçı nizamlarına qaytaracaq."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Demodan çıxın"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"quraşdırmanı bitirin"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"indi yox"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"RƏDD EDİN"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Xüsusiyyət avtomobil idarə edərkən əlçatan deyil."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Avtomobil idarə edərkən istifadəçi əlavə etmək mümkün deyil."</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 07e2feb..2be4806 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"zatamniti ekran, dodirni ekran, baterija"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"zatamniti ekran, noć, nijansa"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Noćni režim"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Mreža i internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilna mreža"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilni podaci"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Koristi podatke preko mobilne mreže"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Želite li da isključite mobilne podatke?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Potrošnja podataka"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Upozorenje i ograničenja za podatke"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciklus potrošnje podataka aplikacije"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Podesite upozorenja o podacima"</string>
+    <string name="data_warning" msgid="116776633806885370">"Upozorenje na potrošnju podataka"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Podesite ograničenja za podatke"</string>
+    <string name="data_limit" msgid="227338836292511425">"Ograničenje potrošnje podataka"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ograničavanje potrošnje podataka"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna jedinica u vozilu će isključiti mobilne podatke čim dostigne ograničenje koje ste podesili.\n\nPošto potrošnju podataka meri glavna jedinica, a mobilni operater može drugačije da računa potrošnju, razmislite o tome da podesite neko uobičajeno ograničenje."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Podešavajte bežične pristupne tačke i upravljajte njima"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi se uključuje..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi se isključuje..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Učitava se Wi‑Fi lista"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi je onemogućen"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Brisanje mreže nije uspelo"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Povezivanje sa mrežom nije uspelo"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj mrežu"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi je onemogućen"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži se"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Lozinka"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Prikaži lozinku"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Naziv mreže"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Unesite SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Bezbednost"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Jačina signala"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Jačina signala"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Brzina veze"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvencija"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP adresa"</string>
+    <string name="show_password" msgid="2074628020371139240">"Prikaži lozinku"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Unesite naziv mreže"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Unesite lozinku"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Slaba"</item>
-    <item msgid="2032262610626057081">"Zadovoljavajuća"</item>
-    <item msgid="3859756017461098953">"Dobra"</item>
-    <item msgid="1521103743353335724">"Odlična"</item>
+    <item msgid="7683058295076342057">"Slaba"</item>
+    <item msgid="1639222824821660744">"Zadovoljavajuća"</item>
+    <item msgid="1838705897358163300">"Dobra"</item>
+    <item msgid="6067166649320533751">"Odlična"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Uključi Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth je onemogućen"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d MB/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalji o mreži"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC adresa"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP adresa"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska podmreže"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 adrese"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Mrežni prolaz"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Podešavanja Wi‑Fi-ja"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Automatski uključi Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi će se ponovo uključiti u blizini sačuvanih mreža visokog kvaliteta, kao što je kućna mreža"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nije dostupno jer je lokacija isključena. Uključite "<annotation id="link">"lokaciju"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Želite li da uključite Wi-Fi skeniranje?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Uključi"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi skeniranje je uključeno"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatski pređi na mobilne podatke"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Koristite mobilne podatke kada Wi‑Fi nema pristup internetu. Može da vam bude naplaćena potrošnja podataka."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Saznajte više"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Upravljajte vezama, podešavajte naziv i vidljivost uređaja"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Računar"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Slušalice"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Obrada slika"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Slušalice"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periferni uređaj za unos"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Upareni uređaji"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dostupni uređaji"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nema uparenih uređaja"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nema dostupnih uređaja"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Upareni uređaj"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Naziv"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Koristite za"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Promenite naziv Bluetooth uređaja"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Neimenovani uređaj"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Upareni uređaji"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Upari novi uređaj"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth će se uključiti radi uparivanja"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Prekidate vezu sa uređajem?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Vozilo će prekinuti vezu sa uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth adresa vozila: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth adresa uređaja: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Naziv vozila"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Preimenujte ovo vozilo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Preimenujte uređaj"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Preimenuj"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dostupni uređaji"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profili"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Zahtev za Bluetooth uparivanje"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Upari i poveži"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Kôd za uparivanje sa Bluetooth uređajem"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN sadrži slova ili simbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Unesite kôd za uparivanje, pa pritisnite Return ili Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Obično 0000 ili 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Zahtev za uparivanje"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Dodirnite da biste uparili sa uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Jezici"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Jezici i unos"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastatura"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Upravljajte tastaturama"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Izlaz za pretv. teksta u govor"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Željeni mehanizam"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Aktuelni mehanizam"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Brzina govora"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Visina glasa"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Resetuj"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Zvuk"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Jačina zvuka zvona"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Jačina zvuka za navigaciju"</string>
@@ -100,31 +140,66 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Mediji"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Podesite jačinu zvuka za muziku i video snimke"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Melodija zvona telefona"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Podrazumevani zvuk obaveštenja"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Podrazumevani zvuk alarma"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikacije i obaveštenja"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Prikaži sve aplikacije"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Podrazumevane aplikacije"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informacije o aplikaciji"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Prinudno zaustavi"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Želite li da prinudno zaustavite?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ako prinudno zaustavite aplikaciju, možda će se ponašati neočekivano."</string>
     <string name="disable_text" msgid="4358165448648990820">"Onemogući"</string>
     <string name="enable_text" msgid="1794971777861881238">"Omogući"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Deinstaliraj"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ako onemogućite ovu aplikaciju, Android i druge aplikacije možda više neće funkcionisati ispravno."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Onemogući aplikaciju"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Dozvole"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Verzija: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nijedna dozvola nije odobrena"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nijedna dozvola nije zahtevana"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Potrošnja podataka"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Potrošnja podataka aplik."</string>
-    <string name="force_stop" msgid="2153183697014720520">"Prinudno zaustavi"</string>
     <string name="computing_size" msgid="5791407621793083965">"Izračunava se..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatna dozvola</item>
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatne dozvole</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih dozvola</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoćnik i glasovni unos"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija za pomoć"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Koristi tekst sa ekrana"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Dozvolite aplikaciji za pomoć da pristupi sadržaju ekrana kao tekstu"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Koristi snimak ekrana"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Dozvolite aplikaciji za pomoć da pristupi slici ekrana"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Usluga automatskog popunjavanja"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ništa"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Izabrano"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Pomoćnik će moći da čita informacije o aplikacijama koje se koriste u sistemu, uključujući informacije vidljive na ekranu ili kojima može da se pristupa u okviru aplikacija."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Uverite se da je ova aplikacija pouzdana&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google automatsko popunjavanje&gt;%1$s&lt;/xliff:g&gt; koristi sadržaj ekrana za utvrđivanje podataka koji mogu automatski da se popune."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Dodajte uslugu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavni zahtevi za lokaciju"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nema nedavnih zahteva za lokaciju"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Dozvole na nivou aplikacija"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skeniranje"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Usluge lokacije"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi skeniranje"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Dozvolite aplikacijama i uslugama da traže Wi‑Fi mreže u bilo kom trenutku, čak i kada je Wi‑Fi isključen. Ovo može da se koristi, na primer, za poboljšanje funkcija i usluga zasnovanih na lokaciji."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth skeniranje"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Dozvolite aplikacijama i uslugama da traže uređaje u blizini u svakom trenutku, čak i kada je Bluetooth isključen. Ovo može da se koristi, na primer, za poboljšanje funkcija i usluga zasnovanih na lokaciji."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Ažuriranja sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verzija Android-a"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivo bezbednosne zakrpe za Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verzija osnovnog propusnog opsega"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verzija jezgra"</string>
     <string name="build_number" msgid="3997326631001009102">"Broj verzije"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth adresa"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nije dostupno"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -141,12 +216,50 @@
     <string name="copyright_title" msgid="4220237202917417876">"Autorska prava"</string>
     <string name="license_title" msgid="936705938435249965">"Licenca"</string>
     <string name="terms_title" msgid="5201471373602628765">"Uslovi i odredbe"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licenca za sistemski WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licence za sistemski WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Pozadine"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Dobavljači satelitskih slika:\n©2014. CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence treće strane"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema pri učitavanju licenci."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Učitava se…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Treba da obavite još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak da biste postali programer.</item>
+      <item quantity="few">Treba da obavite još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka da biste postali programer.</item>
+      <item quantity="other">Treba da obavite još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka da biste postali programer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Postali ste programer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nema potrebe, već ste programer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opcije za programere"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opcije za resetovanje"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Resetovanje mreže, aplikacija ili uređaja"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Resetuj mrežu"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ovim resetujete sva podešavanja mreže, uključujući:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi-Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobilni podaci"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Izbriši sve eSIM-ove vozila"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Time nećete otkazati tarifni paket."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Resetovanje eSIM-ova nije uspelo"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Izaberite mrežu"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Resetuj podešavanja"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Želite li da resetujete?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Želite li da resetujete sva podešavanja mreže? Ova radnja ne može da se opozove!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Resetuj podešavanja"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Podešavanja mreže su resetovana"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Resetuj podešavanja aplikacija"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Ovim će se resetovati sva podešavanja za:\n\n"<li>"Onemogućene aplikacije"</li>\n<li>"Obaveštenja o onemogućenim aplikacijama"</li>\n<li>"Podrazumevane aplikacije za radnje"</li>\n<li>"Ograničenja za pozadinske podatke za aplikacije"</li>\n<li>"Sva ograničenja za dozvole"</li>\n\n"Nećete izgubiti nikakve podatke aplikacije."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Resetuj aplikacije"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Podešavanja aplikacija su resetovana"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Obriši sve podatke"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Ovim brišete sve podatke iz interne memorije vozila, uključujući:\n\n"<li>"Google nalog"</li>\n<li>"podatke i podešavanja sistema i aplikacija"</li>\n<li>"preuzete aplikacije"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Trenutno ste prijavljeni na sledeće naloge:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"U ovom vozilu su prisutni i drugi korisnici."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Resetuj vozilo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Želite li da resetujete?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Želite li da obrišete sve lične podatke i preuzete aplikacije? Ne možete da opozovete ovu radnju!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Izbriši sve"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Briše se"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Sačekajte..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum i vreme"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Podesite datum i vreme"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Podesite datum, vreme, vremensku zonu i formate"</string>
@@ -166,23 +279,60 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sortiraj prema vremenskoj zoni"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Vreme"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodaj korisnika"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj nalog"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Izbrišite korisnika"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Novi korisnik"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Prijavljeni ste kao administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Sve dozvole za administratora"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Postavi za administratora"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Korisnik će moći da briše korisnike, uključujući ostale administratore, i da resetuje sistem na fabrička podešavanja."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ova radnja ne može da se opozove."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Da, postavi za administatora"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Napravite nove korisnike"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Pozivajte"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS preko mobilnih podataka auta"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalirajte nove aplikacije"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Deinstalirajte aplikacije"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodaj korisnika"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Novi korisnik"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Dodajete novog korisnika?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kada dodate novog korisnika, ta osoba treba da podesi svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Svaki korisnik može da ažurira aplikacije za sve ostale korisnike."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Dostignut maksimalni broj korisnika"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Možete da napravite najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+      <item quantity="few">Možete da napravite najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+      <item quantity="other">Možete da napravite najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Pravljenje novog korisnika nije uspelo"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Želite da izbrišete ovog korisnika?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Sve aplikacije i podaci će biti izbrisani."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Brisanje korisnika nije uspelo."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Odbaci"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Probaj ponovo"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Želite da izbrišete poslednjeg korisnika?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Novi administrator će se napraviti kada izbrišete jedinog preostalog korisnika za ovaj automobil."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Izbrisaće se svi podaci, podešavanja i aplikacije koji su povezani sa ovim korisnikom. Moraćete da podesite sistem ponovo."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Odaberite novog administratora"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Treba vam najmanje jedan administrator. Da biste izbrisali ovog, prvo odaberite zamenu."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Odaberite administratora"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gost"</string>
     <string name="user_switch" msgid="6544839750534690781">"Prebacite na drugog korisnika"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vi (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nije podešeno"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Izmenite ime korisnika"</string>
     <string name="users_list_title" msgid="770764290290240909">"Korisnici"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Dozvola je data korisniku %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Nalozi"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Korisnik"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj nalog"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nijedan nalog nije dodat"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Nalozi za korisnika <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatski sinhronizuj podatke"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Omogući aplikacijama da automatski osvežavaju podatke"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Uključiti autom. sinh. podataka?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Sve promene koje unesete na naloge na vebu će automatski biti kopirane na uređaj.\n\nNeki nalozi mogu i automatski da kopiraju na veb sve promene koje unesete na telefonu. Tako funkcioniše Google nalog."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Isključiti autom. sinh. podataka?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"To će se smanjiti potrošnju podataka, ali biće potrebno da ručno sinhronizujete svaki nalog da biste prikupili nedavne informacije. Nećete primati obaveštenja o ažuriranjima."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informacije o nalogu"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Dodajte nalog"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Dodajte nalog"</string>
@@ -190,16 +340,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Ukloni nalog"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Želite da uklonite nalog?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Ako uklonite ovaj nalog, izbrisaćete sve poruke, kontakte i druge podatke sa uređaja!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Administrator ne dozvoljava ovu promenu"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Uklanjate ovog korisnika?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Sve aplikacije i podaci će biti izbrisani."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Uklanjanje korisnika nije uspelo."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Želite da probate ponovo?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Odbaci"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Probaj ponovo"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Dodajete novog korisnika?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kada dodate novog korisnika, ta osoba treba da podesi svoj prostor."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Svaki korisnik može da ažurira aplikacije za sve ostale korisnike."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Uklanjanje naloga nije uspelo."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sinhronizacija naloga"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinhronizacija je uključena za određene stavke (<xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>)"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinhronizacija je uključena za sve stavke"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinhronizacija je isključena za sve stavke"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinhronizacija je ISKLJ."</string>
+    <string name="sync_error" msgid="6698021343089247914">"Greška pri sinhronizaciji"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Poslednja sinhronizacija: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinhronizacija je u toku..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Dodirnite da biste sinhronizovali odmah <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhronizuj odmah"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Otkaži sinhronizaciju"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sinhronizacija trenutno ima problema. Uskoro će se nastaviti."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Bezbednost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaključavanje ekrana"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nema"</string>
@@ -207,7 +361,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Lozinka"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Izaberite zaključavanje"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opcije zaključavanja ekrana"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opcije zaključavanja"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Unesite šablon"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Potvrdi"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Ponovo nacrtajte"</string>
@@ -217,7 +371,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Podesite zaključavanje ekrana"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Odaberite PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Odaberite šablon"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Odaberite lozinku"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Odaberite lozinku"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Trenutno zaključavanje ekrana"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Podesite šablon iz bezbednosnih razloga"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Obriši"</string>
@@ -295,18 +449,39 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IT administrator blokira česte lozinke. Izaberite drugu lozinku."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Rastući, opadajući ili ponovljeni niz cifara nije dozvoljen."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opcije zaključavanja ekrana"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: pre <xliff:g id="NUM_DAYS">%3$s</xliff:g> dan(a)"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Dodaj pouzdani uređaj"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Pouzdani uređaji"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> uređaj</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> uređaja</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uređaja</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> će otključati ovaj automobil kada se poveže. Ako vam neko uzme <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, možda će moći da pristupa ovom uređaju"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Potvrdi"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Ukloni pouzdani uređaj"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Gotovo"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Pouzdani uređaj podesite pomoću prateće aplikacije. Kada ga podesite, moći ćete da otključavate korisnički profil kada vozilo otkrije telefon"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Preuzmite prateću aplikaciju na telefonu"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Izaberite <xliff:g id="CAR_NAME">%1$s</xliff:g> na telefonu da biste uparili uređaje"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ne može da otkrije bezbednosne funkcije ovog uređaja. Da bi automobil bio zaštićen, pouzdani uređaj će omogućiti da automobil ostane otključan samo kada ga vi prethodno otključate. Pouzdani uređaj može da omogući da automobil ostane otključan kada se nalazi u blizini, čak i kada ga neko drugi drži."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Dodajte uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kao pouzdani"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Dodali ste uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kao pouzdani"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Registracija uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije uspela"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Za dodavanje pouzdanog uređaja sledeće što treba da uradite je da podesite metod potvrde identiteta. Ako nemate pouzdani uređaj sa sobom, potvrda identiteta će biti potrebna da biste pristupili profilu."</string>
     <string name="forget" msgid="3971143908183848527">"Zaboravi"</string>
+    <string name="connect" msgid="5861699594602380150">"Poveži"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Prekini vezu"</string>
     <string name="delete_button" msgid="5840500432614610850">"Izbriši"</string>
     <string name="remove_button" msgid="6664656962868194178">"Ukloni"</string>
     <string name="cancel" msgid="750286395700355455">"Otkaži"</string>
     <string name="backspace_key" msgid="1545590866688979099">"Taster za brisanje unazad"</string>
     <string name="enter_key" msgid="2121394305541579468">"Taster Enter"</string>
     <string name="exit_retail_button_text" msgid="6093240315583384473">"Napustite režim demonstr."</string>
-    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Da napustite režim dem.?"</string>
+    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Da napustite režim demonstracije"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ovim ćete izbrisati nalog za demonstracije i resetovati sistem na fabrička podešavanja. Svi podaci korisnika će biti izgubljeni."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Napusti režim demonstr."</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"završite podešavanje"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ne sada"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ODBACI"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkcija nije dostupna tokom vožnje."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Ne možete da dodate korisnika tokom vožnje."</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 40cc6c9..9069e77 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"зацемнены экран, сэнсарны экран, акумулятар"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"зацемнены экран, ноч, адценне"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Начны рэжым"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Сетка і інтэрнэт"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мабільная сетка"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мабільная перадача даных"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Доступ да даных па мабільнай сетцы"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Адключыць мабільную перадачу даных?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Выкарыстанне трафіка"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Папярэджанне і ліміт трафіка"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Цыкл выкарыстання трафіка праграм"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Папярэджваць пра ліміт трафіка"</string>
+    <string name="data_warning" msgid="116776633806885370">"Папярэджанне пра ліміт трафіка"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Задаць ліміт трафіка"</string>
+    <string name="data_limit" msgid="227338836292511425">"Ліміт трафіка"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Абмежаванне выкарыстання даных"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Пасля дасягнення вызначанага ліміту трафіка галаўная прылада аўтамабіля выключыць мабільную перадачу даных.\n\nПаколькі метады разліку выкарыстання трафіка галаўной прыладай і аператарам могуць адрознівацца, мы рэкамендуем устанавіць заніжаны ліміт."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Налада кропак доступу бесправадной сеткі і кіраванне імі"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Уключэнне Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Адключэнне Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Загружаецца спіс Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi адключаны"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Не атрымалася забыць сетку"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Не атрымалася падключыцца да сеткі"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Дадаць сетку"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi адключаны"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Падключыць"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Пароль"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Паказваць пароль"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Імя сеткі"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Увядзіце SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Бяспека"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Узровень сігналу"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Узровень сігналу"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Стан"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Хуткасць злучэння"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Частата"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-адрас"</string>
+    <string name="show_password" msgid="2074628020371139240">"Паказаць пароль"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Увядзіце назву сеткі"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Увядзіце пароль"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Слабы"</item>
-    <item msgid="2032262610626057081">"Дастатковы"</item>
-    <item msgid="3859756017461098953">"Добры"</item>
-    <item msgid="1521103743353335724">"Выдатны"</item>
+    <item msgid="7683058295076342057">"Слабы"</item>
+    <item msgid="1639222824821660744">"Дастатковы"</item>
+    <item msgid="1838705897358163300">"Добры"</item>
+    <item msgid="6067166649320533751">"Выдатны"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Уключыць Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth адключаны"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Мб/с"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 ГГц"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ГГц"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Інфармацыя пра сетку"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-адрас"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-адрас"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Маска падсеткі"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-адрасы"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Шлюз"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Параметры Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Уключаць Wi‑Fi аўтаматычна"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi уключаецца побач з захаванымі сеткамі (хатняй сеткай)"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Недаступна, бо трэба ўключыць "<annotation id="link">"Вызначэнне месцазнаходжання"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Уключыць сканіраванне Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Уключыць"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Сканіраванне Wi‑Fi уключана"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Пераключацца на мабільную перадачу даных аўтаматычна"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Выкарыстоўваць мабільную перадачу даных, калі сетка Wi-Fi страчвае доступ да інтэрнэту. Можа спаганяцца плата за выкарыстанне трафіка."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Даведацца больш"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Кіраваць падключэннямі, назвай і бачнасцю прылады"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Камп\'ютар"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Гарнітура"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Тэлефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Прылада візуалізацыі"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Навушнікі"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Перыферыйная прылада ўводу"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Спалучаныя прылады"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Даступныя прылады"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Няма спалучаных прылад"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Няма даступных прылад"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Спалучаная прылада"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Назва"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Выкарыстоўваць для"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Змяніце назву прылады Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Прылада без назвы"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Спалучаныя прылады"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Спалучыць новую прыладу"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Каб выканаць спалучэнне, будзе ўключаны Bluetooth"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Адключыць прыладу?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Ваш аўтамабіль будзе адключаны ад прылады \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Адрас Bluetooth аўтамабіля: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Адрас Bluetooth прылады: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Назва аўтамабіля"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Перайменаванне аўтамабіля"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Перайменаванне прылады"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Перайменаваць"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Даступныя прылады"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профілі"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Запыт спалучэння па Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Спалучэнне i падключэнне"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Код спалучэння па Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN-код складаецца з літар ці знакаў"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Увядзіце код спалучэння, потым націсніце кнопку \"Назад\" або \"Увод\""</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Звычайна 0000 або 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Запыт на спалучэнне"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Націсніце, каб спалучыцца з прыладай \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Мовы"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Мовы і спосаб уводу"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Клавіятура"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Кіраванне клавіятурамі"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Сінтэз маўлення"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Выбраны модуль"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Бягучы модуль"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Хуткасць маўлення"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Вышыня голасу"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Скінуць"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Гук"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Гучнасць званка"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Гучнасць навігацыі"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Мультымедыя"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Наладзіць гучнасць музыкі і відэа"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Будзільнік"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Рынгтон тэлефона"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Стандартны гук апавяшчэння"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Стандартны сігнал будзільніка"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Праграмы і апавяшчэнні"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Паказваць усе праграмы"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Стандартныя праграмы"</string>
     <string name="applications_settings" msgid="794261395191035632">"Звесткі пра праграму"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Прымусова спыніць"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Спыніць прымусова?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Прымусовае спыненне дзейнасці праграмы можа прывесці да збою."</string>
     <string name="disable_text" msgid="4358165448648990820">"Адключыць"</string>
     <string name="enable_text" msgid="1794971777861881238">"Уключыць"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Выдаліць"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Калі вы адключыце гэту праграму, іншыя праграмы могуць працаваць неналежным чынам."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Адключыць праграму"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Дазволы"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Версія: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Няма дазволаў"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Няма запытаў на дазволы"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Выкарыстанне трафіка"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Выкарыстанне трафіка"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Прымусова спыніць"</string>
     <string name="computing_size" msgid="5791407621793083965">"Вылічэнне…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дадатковы дазвол</item>
@@ -117,15 +168,39 @@
       <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> дадатковых дазволаў</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дадатковага дазволу</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Памочнік і галасавы ўвод"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Праграма-памочнік"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Выкарыстоўваць тэкст з экрана"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Дазволіць праграме-памочніку мець доступ да змесціва на экране ў выглядзе тэксту"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Выкарыстоўваць скрыншот"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Дазволіць праграме-памочніку мець доступ да відарыса на экране"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Сэрвіс аўтазапаўнення"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Няма"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Выбрана"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Памочнік атрымае доступ да інфармацыі пра праграмы, якія выкарыстоўваюцца ў вашай сістэме, у тым ліку да інфармацыі, бачнай на вашым экране ці даступнай у праграмах."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Упэўніцеся, што давяраеце гэтай праграме&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Аўтазапаўненне Google&gt;%1$s&lt;/xliff:g&gt; выкарыстоўвае тое, што знаходзіцца на вашым экране, каб вызначыць, што можна запоўніць аўтаматычна."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Дадаць службу"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Месцазнаходжанне"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Нядаўнія запыты геаданых"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Няма нядаўніх запытаў геаданых"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дазволы на ўзроўні праграм"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Сканіраванне"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Службы геалакацыі"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Пошук сетак Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Дазвольце праграмам і сэрвісам шукаць сеткі Wi‑Fi, нават калі Wi‑Fi не падключаны. Гэта можна выкарыстоўваць, напрыклад, для паляпшэння функцый і сэрвісаў, якія выкарыстоўваюць геалакацыю."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Пошук прылад Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Дазвольце праграмам і сэрвісам шукаць прылады паблізу, нават калі Bluetooth выключаны. Гэта можна выкарыстоўваць, напрыклад, для паляпшэння функцый і сэрвісаў, якія выкарыстоўваюць геалакацыю."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Сістэма"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Абнаўленне сістэмы"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Абнаўленне сістэмы"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версія Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Абнаўленне сістэмы бяспекі Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Мадэль"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Версія дыяпазону"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версія ядра"</string>
     <string name="build_number" msgid="3997326631001009102">"Нумар зборкі"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Адрас Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Недаступнае"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Стан"</string>
     <string name="device_status" msgid="267298179806290920">"Стан"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Аўтарскія правы"</string>
     <string name="license_title" msgid="936705938435249965">"Ліцэнзія"</string>
     <string name="terms_title" msgid="5201471373602628765">"Умовы выкарыстання"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Сістэмная ліцэнзія WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Сістэмныя ліцэнзіі WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Шпалеры"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Спадарожнікавыя фота:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Ліцэнзіі трэціх бакоў"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Немагчыма загрузіць ліцэнзіі."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Загрузка…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроку ад таго, каб стаць распрацоўшчыкам.</item>
+      <item quantity="few">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроках ад таго, каб стаць распрацоўшчыкам.</item>
+      <item quantity="many">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроках ад таго, каб стаць распрацоўшчыкам.</item>
+      <item quantity="other">Цяпер вы ў <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроку ад таго, каб стаць распрацоўшчыкам.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Цяпер вы распрацоўшчык!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Не трэба, вы ўжо з\'яўляецеся распрацоўшчыкам."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Параметры распрацоўшчыка"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Параметры скіду"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Скід налад сеткі, праграм ці прылады"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Скінуць налады сеткі да заводскіх"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Гэта дзеянне прывядзе да скіду ўсіх налад сеткі, уключаючы:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мабільная перадача даных"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Сцерці ўсе eSIM аўтамабіля"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Гэта не прывядзе да скасавання вашага тарыфнага плана."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Не ўдалося скінуць налады eSIM-карт"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Выберыце сетку"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Скід налад"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Скінуць?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Скінуць усе налады сеткі? Гэта дзеянне нельга адмяніць!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Скід налад"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Налады сеткі скінуты"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Скінуць налады праграм"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Будуць скінуты наступныя налады:\n\n"<li>" адключаныя праграмы;"</li>\n<li>"адключаныя апавяшчэнні праграм;"</li>\n<li>"стандартныя праграмы;"</li>\n<li>"абмежаванні на фонавую перадачу даных;"</li>\n<li>"абмежаванні дазволаў. "</li>\n\n"Даныя праграм не будуць выдалены."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Скінуць налады праграм"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Налады праграм скінуты"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Сцерці даныя (скід да заводскіх налад)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Гэта дзеянне сатрэ ўсе даныя з галаўной прылады аўтамабіля, у тым ліку:\n\n"<li>"ваш уліковы запіс Google;"</li>\n<li>"сістэмныя даныя і налады праграм;"</li>\n<li>"спампаваныя праграмы"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Цяпер вы ўвайшлі ў наступныя ўліковыя запісы:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"У гэтага аўтамабіля ёсць іншыя карыстальнікі."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Скінуць налады аўтамабіля"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Скінуць?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Сцерці ўсю вашу асабістую інфармацыю і спампаваныя праграмы? Гэта дзеянне нельга адрабіць!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Сцерці ўсе даныя"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Ідзе сціранне"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Пачакайце..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Дата і час"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Задаць дату і час"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Задаць дату, час, часавы пояс і фарматы"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Сартаваць па часавым поясе"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Дата"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Час"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Дадаць карыстальніка"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Дадаць уліковы запіс"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Выдаліць карыстальніка"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Новы карыстальнік"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Госць"</string>
     <string name="user_admin" msgid="1535484812908584809">"Адміністратар"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Вы ўвайшлі як адміністратар"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Усе дазволы адміністратара"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Прызначыць адміністратарам"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Гэты карыстальнік зможа выдаляць карыстальнікаў, у тым ліку іншых адміністратараў, і скідваць налады сістэмы да заводскіх."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Гэта дзеянне нельга адмяніць."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Так, прызначыць адміністратарам"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Ствараць новых карыстальнікаў"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Рабіць тэлефонныя выклікі"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Паведамленні праз трафік аўтамабіля"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Усталёўваць новыя праграмы"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Выдаляць праграмы"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Дадаць карыстальніка"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Новы карыстальнік"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Дадаць карыстальніка?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Калі вы дадаяце новага карыстальніка, яму трэба наладзіць свой профіль."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Кожны карыстальнік прылады можа абнаўляць праграмы для іншых уліковых запісаў."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Дасягнуты ліміт карыстальнікаў"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Можна стварыць не больш за <xliff:g id="COUNT">%d</xliff:g> карыстальніка.</item>
+      <item quantity="few">Можна стварыць не больш за <xliff:g id="COUNT">%d</xliff:g> карыстальнікі.</item>
+      <item quantity="many">Можна стварыць не больш за <xliff:g id="COUNT">%d</xliff:g> карыстальнікаў.</item>
+      <item quantity="other">Можна стварыць не больш за <xliff:g id="COUNT">%d</xliff:g> карыстальніка.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Не ўдалося стварыць новага карыстальніка"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Выдаліць карыстальніка?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Усе праграмы і даныя будуць выдалены."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Не ўдалося выдаліць карыстальніка."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Закрыць"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Паўтарыць"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Выдаліць карыстальніка?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Пасля выдалення апошняга з карыстальнікаў гэтага аўтамабіля будзе створаны новы адміністратар."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Усе даныя, налады і праграмы, звязаныя з гэтым карыстальнікам, будуць выдалены. Спатрэбіцца наладзіць сістэму паўторна."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Выберыце новага адміністратара"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Патрэбны па меншай меры адзін адміністратар. Каб выдаліць існуючага, спачатку выберыце яму замену."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Выберыце адміністратара"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Госць"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Госць"</string>
     <string name="user_switch" msgid="6544839750534690781">"Пераключыцца"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Вы (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Імя"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не наладжана"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Змяніць імя карыстальніка"</string>
     <string name="users_list_title" msgid="770764290290240909">"Карыстальнікі"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Дазволы карыстальніка %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Уліковыя запісы"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Карыстальнік"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Дадаць уліковы запіс"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Уліковыя запісы не дададзены"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Уліковыя запісы карыстальніка <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Аўтаматычна сінхранізаваць даныя"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Дазволіць праграмам абнаўляць даныя аўтаматычна"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Уключыць аўтасінхранізацыю?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Усе змяненні, унесеныя ва ўліковы запіс у інтэрнэце, аўтаматычна капіруюцца ў памяць прылады.\n\nДля некаторых уліковых запісаў усе змены, зробленыя ў тэлефоне, могуць таксама аўтаматычна капіравацца ў інтэрнэт. Уліковы запіс Google працуе такім чынам."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Адключыць аўтасінхранізацыю?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Гэта дапаможа ашчаджаць трафік. Але, каб мець свежую інфармацыю, вам давядзецца сінхранізаваць кожны ўліковы запіс уручную. І вы не будзеце атрымліваць апавяшчэнні пра абнаўленні."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Даныя аб уліковым запісе"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Дадаць уліковы запіс"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Дадаць уліковы запіс"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Выдаліць уліковы запіс"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Выдаліць уліковы запіс?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Выдаленне гэтага ўліковага запісу прывядзе да выдалення з прылады ўсіх паведамленняў, кантактаў і іншых даных!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Адміністратар не дазваляе гэту змену"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Выдаліць карыстальніка?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Усе праграмы і даныя будуць выдалены."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Не атрымалася выдаліць карыстальніка."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Паўтарыць спробу?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Адхіліць"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Паўтарыць"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Дадаць карыстальніка?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Калі вы дадаяце новага карыстальніка, яму трэба наладзіць свой профіль."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Кожны карыстальнік прылады можа абнаўляць праграмы для іншых уліковых запісаў."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Не ўдалося выдаліць уліковы запіс."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Сінхранізацыя ўліковага запісу"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Сінхранізацыя ўключана для <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g> элементаў"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Сінхранізацыя ўключана для ўсіх элементаў"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Сінхранізацыя выключана для ўсіх элементаў"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Сінхранізацыя АДКЛ."</string>
+    <string name="sync_error" msgid="6698021343089247914">"Памылка сінхранізацыі"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Апошняя сінхранізацыя: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Ідзе сінхранізацыя…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Націсніце, каб сінхранізаваць <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Сінхранізаваць"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Скасаваць сінхранізацыю"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Цяпер ёсць праблемы з сінхранізацыяй, аднак яна хутка адновіцца."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Бяспека"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Блакіроўка экрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Няма"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-код"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Пароль"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Выбар тыпу блакіроўкі"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Параметры блакіроўкі экрана"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Параметры блакіроўкі"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Увядзіце ўзор разблакіроўкі"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Пацвердзіць"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Нарысаваць нанова"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Задайце блакіроўку экрана"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Набярыце PIN-код"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Выберыце шаблон"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Набярыце пароль"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Выберыце пароль"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Бягучая блакіроўка экрана"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Задайце ўзор, каб абараніць прыладу"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Выдаліць"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IT-адміністратар блакіруе папулярныя паролі. Паспрабуйце іншы пароль."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Забаронена выкарыстоўваць паслядоўнасці з лічбаў, якія ідуць адна за адной або паўтараюцца."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Параметры блакіроўкі экрана"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> сут. таму назад"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Дадаць давераную прыладу"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Давераныя прылады"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> прылада</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> прылады</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> прылад</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> прылады</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Калі падключана, <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> зможа разблакіраваць гэты аўтамабіль. Калі <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> трапіць у рукі іншаму карыстальніку, той атрымае доступ да прылады"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Пацвердзіць"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Выдаліць давераную прыладу"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Гатова"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Для наладкі даверанай прылады выкарыстоўвайце спадарожную праграму. Калі пасля наладкі аўтамабіль выявіць тэлефон, вы зможаце разблакіраваць профіль карыстальніка"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Спампуйце спадарожную праграму на тэлефон"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Каб спалучыць прылады, выберыце на тэлефоне назву \"<xliff:g id="CAR_NAME">%1$s</xliff:g>\""</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"\"Разумная блакіроўка\" не можа вызначаць якасць бяспекі прылады. З мэтай абароны вашага аўтамабіля давераная прылада будзе трымаць ваш аўтамабіль разблакіраваным, толькі калі вы яго ўжо разблакіравалі. Давераная прылада можа трымаць аўтамабіль разблакіраваным, калі ён знаходзіцца паблізу, незалежна ад таго, хто ім кіруе."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Дадаць у якасці даверанай прыладу \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\""</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Прылада \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\" паспяхова дададзена ў якасці даверанай"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Не ўдалося зарэгістраваць прыладу \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\""</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Для дадавання даверанай прылады неабходна задаць спосаб аўтэнтыфікацыі. Ён спатрэбіцца для атрымання доступу да вашага профілю, калі давераная прылада не з вамі."</string>
     <string name="forget" msgid="3971143908183848527">"Забыць"</string>
+    <string name="connect" msgid="5861699594602380150">"Падключыцца"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Адключыцца"</string>
     <string name="delete_button" msgid="5840500432614610850">"Выдаліць"</string>
     <string name="remove_button" msgid="6664656962868194178">"Выдаліць"</string>
     <string name="cancel" msgid="750286395700355455">"Скасаваць"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Выйсці з дэма-рэжыму"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Адбудзецца скід сістэмы да заводскіх налад. Тэставы ўліковы запіс і ўсе карыстальніцкія даныя будуць выдалены."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Выйсці з дэма-рэжыму"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"завяршыць наладку"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"не зараз"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"АДХІЛІЦЬ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Функцыя недаступная, калі вы за рулём."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Нельга дадаць карыстальніка, калі аўтамабіль рухаецца."</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 606e882..fb6da0e 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"затъмняване на екрана, сензорен екран, батерия"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"затъмняване на екрана, нощ, нюансиране"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Нощен режим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Мрежа и интернет"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобилна мрежа"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилни данни"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Достъп до данните през мобилната мрежа"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Да се изключат ли мобилните данни?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Пренос на данни"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Предупреждение и лимит за данните"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Цикъл на използване на данни от прилож."</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Предупр. за данните: Задаване"</string>
+    <string name="data_warning" msgid="116776633806885370">"Предупреждение за данните"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Задаване на лимит за данните"</string>
+    <string name="data_limit" msgid="227338836292511425">"Лимит за данните"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ограничаване на преноса на данни"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Основното устройство на автомобила ви ще изключи мобилните данни, след като достигне зададения от вас лимит.\n\nТъй като преносът им се измерва от основното устройство, а операторът ви може да го отчита по различен начин, добре е да използвате умерен лимит."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Задаване и управление на безжични точки за достъп"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi се включва…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi се изключва…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Списъкът с Wi‑Fi мрежите се зарежда"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Функцията за Wi‑Fi е деактивирана"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Забравянето на мрежата не бе успешно"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Свързването с мрежата не бе успешно"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Добавяне на мрежа"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Функцията за Wi‑Fi е деактивирана"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Свързване"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Парола"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Показване на паролата"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Име на мрежата"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Въведете SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Сигурност"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Сила на сигнала"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Сила на сигнала"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Състояние"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Скорост на връзката"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Честота"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP адрес"</string>
+    <string name="show_password" msgid="2074628020371139240">"Показване на паролата"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Въведете име на мрежата"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Въведете парола"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Слаб"</item>
-    <item msgid="2032262610626057081">"Задоволителен"</item>
-    <item msgid="3859756017461098953">"Добър"</item>
-    <item msgid="1521103743353335724">"Отличен"</item>
+    <item msgid="7683058295076342057">"Слаб"</item>
+    <item msgid="1639222824821660744">"Задоволителен"</item>
+    <item msgid="1838705897358163300">"Добър"</item>
+    <item msgid="6067166649320533751">"Отличен"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Включване на Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth е деактивиран"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Мб/с"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 ГХц"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ГХц"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Подробности за мрежата"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC адрес"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP адрес"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Подмрежова маска"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 адреси"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Шлюз"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Предпочитания за Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Автоматично включване на Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi ще се включва в близост до висококач. запазени мрежи, като тази в дома ви"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Не е налице, защото местопол. е изкл. Включете "<annotation id="link">"настройката"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Да се включи ли сканирането за Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Включване"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Сканирането за Wi-Fi е включено"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Автоматично превключване към мобилни данни"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Използване на мобилни данни, когато Wi‑Fi мрежата няма достъп до интернет. Може да бъдете таксувани за пренос на данни."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Научете повече"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Управление на връзки, задаване на име и откриваемост на устройство"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Компютър"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Слушалки"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Телефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Изображения"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Слушалки"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Периферен вход"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Сдвоени устройства"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Налични устройства"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Няма сдвоени устройства"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Няма налични устройства"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Сдвоено устройство"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Име"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Използване за"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Променете името на у-вото с Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Устройство без име"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Сдвоени устройства"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Сдвояване на ново устройство"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth ще се включи с цел сдвояване"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Прекр. на връзката с у-вото?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Връзката между автомобила ви и <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ще бъде прекратена."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth адрес на автомобила: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth адрес на устройството: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Име на автомобила"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Преименуване на този автомобил"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Преименуване на устройството"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Преименуване"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Налични устройства"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Потребителски профили"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Заявка за сдвояване чрез Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Сдвояване и свързване"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Код за сдвояване с Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ПИН кодът съдържа букви или символи"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Въведете кода за сдвояване, след което натиснете „Return“ или „Enter“"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Обикновено 0000 или 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Заявка за сдвояване"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Докоснете за сдвояване с/ъс „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Езици"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Езици и въвеждане"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Клавиатура"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Управление на клавиатурите"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Синтезиран говор"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Предпочитана машина"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Текуща машина"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Скорост на говора"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Височина"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Нулиране"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Звук"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Сила на звука при звънене"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Сила на звука на навигацията"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Мултимедия"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Задаване на сила на звука за музика и видеоклипове"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Будилник"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Мелодия на телефона"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Стандартен звук за известяване"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Стандартен звук за будилника"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Приложения и известия"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Показване на всички приложения"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Приложения по подразбиране"</string>
     <string name="applications_settings" msgid="794261395191035632">"Информация за приложенията"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Принудително спиране"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Да се спре ли принудително?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ако принудително спрете приложение, то може да не функционира правилно."</string>
     <string name="disable_text" msgid="4358165448648990820">"Деактивиране"</string>
     <string name="enable_text" msgid="1794971777861881238">"Активиране"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Деинсталиране"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ако деактивирате това приложение, Android и други приложения може да спрат да работят както трябва."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Деактивиране на приложението"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Разрешения"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Версия: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Няма предоставени разрешения"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Няма заявени разрешения"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Пренос на данни"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Прилож.: Пренос на данни"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Принудително спиране"</string>
     <string name="computing_size" msgid="5791407621793083965">"Изчислява се…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> допълнителни разрешения</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> допълнително разрешение</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помощник и гласово въвеждане"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Помощно приложение"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Използване на текста от екрана"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Разрешаване на помощното приложение да осъществява достъп до текстовото съдържание на екрана"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Използване на екранна снимка"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Разрешаване на помощното приложение да осъществява достъп до екранно изображение"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Услуга за автоматично попълване"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Без"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Избрано"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Асистентът ще може да чете информацията за използваните в системата приложения, включително данните, видими на екрана или достъпни в тях."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Уверете се, че имате доверие на това приложение&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Функцията на Google за автоматично попълване&gt;%1$s&lt;/xliff:g&gt; използва това, което е на екрана ви, за да определи какво може да се попълни автоматично."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Добавяне на услуга"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Местоположение"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Скорошни заявки за местоположението"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Няма скорошни заявки за местоположението"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Разрешения на ниво приложение"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Сканиране"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Услуги за местоположение"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Сканиране за Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Разрешете на приложенията и услугите да сканират за Wi‑Fi мрежи по всяко време дори когато функцията за Wi‑Fi e изключена. Това може да послужи например за подобряване на базиращите се на местоположението функции и услуги."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Сканиране за устройства с Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Разрешете на приложенията и услугите да сканират за устройства в близост по всяко време дори когато функцията за Bluetooth e изключена. Това може да послужи например за подобряване на базиращите се на местоположението функции и услуги."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Система"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Системни актуализации"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Системни актуализации"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версия на Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ниво на корекцията на сигурността под Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Модел"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Версия на базовия диапазон"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версия на ядрото"</string>
     <string name="build_number" msgid="3997326631001009102">"Номер на версията"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Адрес на Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Не е налице"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Състояние"</string>
     <string name="device_status" msgid="267298179806290920">"Състояние"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Авторски права"</string>
     <string name="license_title" msgid="936705938435249965">"Лиценз"</string>
     <string name="terms_title" msgid="5201471373602628765">"Общи условия"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Системен лиценз за WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Системни лицензи за WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тапети"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Доставчици на сателитни изображения:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лицензи на трети страни"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Възникна проблем при зареждането на лицензите."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Зарежда се…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Вече сте на <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> стъпки от това, да бъдете програмист.</item>
+      <item quantity="one">Вече сте на <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> стъпка от това, да бъдете програмист.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Вече сте програмист!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Не е необходимо – вече сте програмист."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Опции за програмисти"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Опции за нулиране"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Нулиране на мрежата, приложенията или устройството"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Нулиране на мрежата"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Това действие ще нулира всички мрежови настройки, включително:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобилни данни"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Изтриване на всички ел. SIM карти за автомобила"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Това действие няма да анулира плана ви за услуги."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Електронните SIM карти не могат да бъдат нулирани"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Избиране на мрежа"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Нулиране на настройките"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Да се извърши ли нулиране?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Да се нулират ли всички мрежови настройки? Не можете да отмените това действие!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Нулиране на настройките"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Мрежовите настройки са нулирани"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Нулиране на предпочитанията за прилож."</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Това действие ще нулира всички предпочитания за:\n\n"<li>"деактивираните приложения;"</li>\n<li>"известията за деактивирани приложения;"</li>\n<li>"стандартните приложения за действия;"</li>\n<li>"ограниченията за данни на заден план за приложенията;"</li>\n<li>" ограниченията за всички разрешения."</li>\n\n"Няма да загубите данни от приложенията."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Нулиране на приложенията"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Предпочитанията за приложенията са нулирани"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Изтрив. на данните (възст. на фабр. настр.)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Това ще изтрие всички данни от основното устройство на автомобила ви, включително:\n\n"<li>"профила ви в Google;"</li>\n<li>"данни и настройки от системата и приложенията;"</li>\n<li>"изтеглените приложения."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Понастоящем сте влезли в следните профили:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"В този автомобил има други потребители."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Нулиране на автомобила"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Да се извърши ли нулиране?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Да се изтрият ли цялата ви лична информация и всички изтеглени приложения? Не можете да отмените това действие!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Изтриване на всичко"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Изтрива се"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Моля, изчакайте..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Дата и час"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Задаване на дата и час"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Задаване на дата, час, часова зона и формати"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Сортиране по часова зона"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Дата"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Час"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Добавяне на потребител"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Добавяне на профил"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Изтриване на потребител"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Нов потребител"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Гост"</string>
     <string name="user_admin" msgid="1535484812908584809">"Администратор"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Влезли сте като администратор"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Всички администраторски разрешения"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Задаване като администратор"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Този потребител ще може да изтрива потребители, включително и други администратори, и да възстановява фабричните настройки на системата."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Това действие не е обратимо."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Да, задаване като администратор"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Създаване на нови потребители"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Провеждане на телефонни обаждания"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS чрез моб. данни на автомобила"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Инсталиране на нови приложения"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Деинсталиране на приложения"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Добавяне на потребител"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Нов потребител"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Добавяне на нов потреб.?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Когато добавите нов потребител, той трябва да настрои работното си пространство."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Всеки потребител може да актуализира приложенията за всички останали потребители."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Достигнахте огранич. за потребители"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Можете да създадете до <xliff:g id="COUNT">%d</xliff:g> потребители.</item>
+      <item quantity="one">Може да бъде създаден само един потребител.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Неуспешно създаване на нов потребител"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Да се изтрие ли потребителят?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Всички приложения и данни ще бъдат изтрити."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Изтриването на потребителя бе неуспешно."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Отхвърляне"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Нов опит"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Изтриване на последния потребител?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"След като изтриете единствения оставащ потребител за този автомобил, ще бъде създаден нов потребител с администраторски достъп."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Всички данни, настройки и приложения, свързани с този потребител, ще бъдат изтрити. Трябва да настроите системата отново."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Избиране на нов администратор"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Трябва да посочите поне един администратор. За да изтриете този, първо изберете заместник."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Избиране на администратор"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Гост"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Гост"</string>
     <string name="user_switch" msgid="6544839750534690781">"Превключване"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Вие (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Име"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не е настроен"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Редактиране на потребит. име"</string>
     <string name="users_list_title" msgid="770764290290240909">"Потребители"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Разрешенията са дадени на %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Профили"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Потребител"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Добавяне на профил"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Няма добавени профили"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Профили за <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Автоматично синхронизиране на данните"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Позволете на приложенията да опресняват автоматично данните"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Вкл. на авт. синхрон. на данни?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Всички промени, които правите в профилите си в мрежата, ще бъдат копирани автоматично в устройството ви.\n\nНякои профили могат също да копират автоматично в мрежата извършените от вас промени в телефона. Профилът в Google работи по този начин."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Изкл. на авт. синхрон. на данни?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Това ще спести използването на данни, но ще трябва да синхронизирате ръчно всеки профил, за да събирате скорошна информация. Също така няма да получавате известия, когато има актуализации."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Информация за профила"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Добавяне на профил"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Добавяне на профил"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Премахване на профила"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Премахване на профила?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Премахването на този профил ще изтрие всички съобщения, контакти и други данни в него от устройството!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Тази промяна не е разрешена от администратора ви"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Да се премахне ли потр.?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Всички приложения и данни ще се изтрият."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Премахв. на потребителя не бе успешно."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Искате ли да опитате отново?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Отхвърляне"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Нов опит"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Добавяне на нов потреб.?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Когато добавите нов потребител, той трябва да настрои работното си пространство."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Всеки потребител може да актуализира приложенията за всички останали потребители."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Премахването на профила не бе успешно."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Синхронизиране на профила"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Синхронизирането е включено за <xliff:g id="ID_1">%1$d</xliff:g> от <xliff:g id="ID_2">%2$d</xliff:g> елемента"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Синхронизирането е включено за всички елементи"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Синхронизирането е изключено за всички елементи"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Синхронизирането е ИЗКЛ."</string>
+    <string name="sync_error" msgid="6698021343089247914">"Грешка при синхрониз."</string>
+    <string name="last_synced" msgid="4745124489150101529">"Последно синхронизиране: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Синхронизира се сега…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Докоснете, за да синхронизирате сега (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизиране сега"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Анулиране на синхронизирането"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Понастоящем има проблеми със синхронизирането. Ще се решат скоро."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Сигурност"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Заключване на екрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Без"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"ПИН код"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Парола"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Избор на типа на закл."</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Опции за заключване на екрана"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Опции за заключване"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Въведете фигурата си"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Потвърждаване"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Повторно начертаване"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Задайте опция за заключване на екрана"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Изберете ПИН кода си"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Изберете фигурата си"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Изберете паролата си"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Изберете паролата си"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Текуща опция за заключване на екрана"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"За по-голяма сигурност задайте фигура"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Изчистване"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Често срещаните пароли се блокират от системния ви администратор. Опитайте с друга парола."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Възходящите, низходящите и повтарящите се поредици от цифри не са разрешени."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Опции за заключване на екрана"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : Преди <xliff:g id="NUM_DAYS">%3$s</xliff:g> дни"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Добав. на надеждно устройство"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Надеждни устройства"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> устройства</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> устройство</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Устройството ви <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ще отключи този автомобил, когато е свързано. Ако някой вземе устройството ви <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, е възможно да осъществи достъп до него."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Потвърждаване"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Премахване на надеждното устройство"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Готово"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Използвайте придружаващото приложение, за да настроите надеждно устройство. След настройването ще можете да отключвате потребителския си профил, когато телефонът ви бъде разпознат от автомобила."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Изтеглете придружаващото приложение на телефона си."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Изберете „<xliff:g id="CAR_NAME">%1$s</xliff:g>“ на телефона си, за да сдвоите устройствата."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock не може да открие функциите за сигурност на това устройство. За да е защитен автомобилът ви, надеждното устройство ще може да го поддържа в отключено състояние само ако той вече е отключен от вас. То може да поддържа автомобила ви отключен, когато е близо до него, дори ако го държи някой друг."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Добавяне на <xliff:g id="DEVICE_NAME">%1$s</xliff:g> като надеждно устройство"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Успешно добавихте <xliff:g id="DEVICE_NAME">%1$s</xliff:g> като надеждно устройство"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Регистрацията на <xliff:g id="DEVICE_NAME">%1$s</xliff:g> не бе успешна"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"За добавянето на надеждно устройство се изисква да зададете метод на удостоверяване на следващия екран. Ако надеждното ви устройство не е у вас, удостоверяването ще се изисква за достъп до потребителския ви профил."</string>
     <string name="forget" msgid="3971143908183848527">"Забравяне"</string>
+    <string name="connect" msgid="5861699594602380150">"Свързване"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Прекрат. на връзката"</string>
     <string name="delete_button" msgid="5840500432614610850">"Изтриване"</string>
     <string name="remove_button" msgid="6664656962868194178">"Премахване"</string>
     <string name="cancel" msgid="750286395700355455">"Отказ"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Изход от демонстр. режим"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Това действие ще изтрие демонстрационния профил и ще възстанови фабричните настройки на системата. Всички потребителски данни ще бъдат изгубени."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Демонстр. режим: Изход"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"завършване на настройването"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"не сега"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ОТХВЪРЛЯНЕ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Функцията не е налице по време на шофиране."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Потребителят не може да се добави по време на шофиране."</string>
 </resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 5e73843..6d77f49 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"অনুজ্জ্বল স্ক্রিন, টাচস্ক্রিন, ব্যাটারি"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"অনুজ্জ্বল স্ক্রিন, রাত্রি, আভা"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"রাতের মোড"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"নেটওয়ার্ক এবং ইন্টারনেট"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"মোবাইল নেটওয়ার্ক"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"মোবাইল ডেটা"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"মোবাইল নেটওয়ার্ক ব্যবহার করে ডেটা অ্যাক্সেস করুন"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"মোবাইল ডেটা বন্ধ করবেন?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ডেটার ব্যবহার"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ডেটা সম্পর্কিত সতর্কতা ও সীমা"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"অ্যাপের ডেটা ব্যবহারের চক্র"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ডেটা সতর্কতা সেট করুন"</string>
+    <string name="data_warning" msgid="116776633806885370">"ডেটা সম্পর্কিত সতর্কতা"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ডেটার সীমা সেট করুন"</string>
+    <string name="data_limit" msgid="227338836292511425">"ডেটার সীমা"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ডেটার ব্যবহার সীমিত করা"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ডেটার ব্যবহার আপনার সেট করা সীমায় পৌঁছলে আপনার গাড়ির হেড ইউনিট মোবাইল ডেটা বন্ধ করে দেবে।.\n\nযেহেতু আপনার গাড়ির হেড ইউনিট আপনার ডেটা ব্যবহারের হিসাব রাখে এবং আপনার পরিষেবা প্রদানকারীর রাখা হিসাব কিছুটা আলাদা হলেও হতে পারে, তাই যাতে কম মোবাইল ডেটা খরচ হোক এমনভাবে সীমা সেট করার কথা ভাবতে পারেন।"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"ওয়াই-ফাই"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ওয়্যারলেস অ্যাক্সেস পয়েন্ট সেট-আপ ও পরিচালনা করুন"</string>
     <string name="wifi_starting" msgid="473253087503153167">"ওয়াই-ফাই চালু করা হচ্ছে..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"ওয়াই-ফাই বন্ধ করা হচ্ছে..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"ওয়াই-ফাইের তালিকা লোড করা হচ্ছে"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"ওয়াই-ফাই বন্ধ আছে"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"আগে থেকে থাকা নেটওয়ার্কের তথ্য সরানো যায়নি"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"নেটওয়ার্কে কানেক্ট করা যায়নি"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"নেটওয়ার্ক যোগ করুন"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"ওয়াই-ফাই বন্ধ আছে"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"কানেক্ট"</string>
     <string name="wifi_password" msgid="5565632142720292397">"পাসওয়ার্ড"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"পাসওয়ার্ড দেখুন"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"নেটওয়ার্কের নাম"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID লিখুন"</string>
     <string name="wifi_security" msgid="158358046038876532">"নিরাপত্তা"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"সিগন্যালের ক্ষমতা"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"সিগন্যালের ক্ষমতা"</string>
     <string name="wifi_status" msgid="5688013206066543952">"স্ট্যাটাস"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"লিঙ্কের গতি"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"পুনরাবৃত্তির হার"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"আইপি ঠিকানা"</string>
+    <string name="show_password" msgid="2074628020371139240">"পাসওয়ার্ড দেখুন"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"নেটওয়ার্কের নাম লিখুন"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"পাসওয়ার্ড লিখুন"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"খারাপ"</item>
-    <item msgid="2032262610626057081">"ঠিকঠাক"</item>
-    <item msgid="3859756017461098953">"ভাল"</item>
-    <item msgid="1521103743353335724">"খুব ভাল"</item>
+    <item msgid="7683058295076342057">"খারাপ"</item>
+    <item msgid="1639222824821660744">"ঠিকঠাক"</item>
+    <item msgid="1838705897358163300">"ভাল"</item>
+    <item msgid="6067166649320533751">"খুব ভাল"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ব্লুটুথ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ব্লুটুথ চালু করুন"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ব্লুটুথ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ব্লুটুথ বন্ধ আছে"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"২.৪ GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"৫ GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"নেটওয়ার্কের বিবরণ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC অ্যাড্রেস"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP অ্যাড্রেস"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"সাবনেট মাস্ক"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"ডিএনএস"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 অ্যাড্রেসগুলি"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"গেটওয়ে"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ওয়াই-ফাই-এর অভিরুচি"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"অটোমেটিক ওয়াই-ফাই চালু করুন"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"সেভ করা ভাল নেটওয়ার্কে এলেই ওয়াই-ফাই চলবে, হোম নেটওয়ার্ক"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"লোকেশন বন্ধ থাকার কারণে উপলভ্য নয়। "<annotation id="link">"লোকেশন"</annotation>" চালু করুন।"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"ওয়াই-ফাই স্ক্যান চালু করবেন?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"চালু করুন"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"ওয়াই-ফাই স্ক্যানিং চালু করা হয়েছে"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"নিজে থেকে মোবাইল ডেটাতে চলে যান"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"ওয়াই-ফাই-এ ইন্টারনেট অ্যাক্সেস না থাকলে মোবাইল ডেটা ব্যবহার করুন৷ ডেটা ব্যবহারের চার্জ প্রযোজ্য।"</string>
+    <string name="learn_more" msgid="8214605928933358604">"আরও জানুন"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ব্লুটুথ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"কানেকশন, সেট ডিভাইসের নাম এবং খুঁজে নেওয়া যোগ্যতা পরিচালনা করুন"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"কম্পিউটার"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"হেডসেট"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ফোন"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ইমেজিং"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"হেডফোন"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ইনপুট পেরিফেরাল"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ব্লুটুথ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"পেয়ার করা ডিভাইসগুলি"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"উপলভ্য ডিভাইসগুলি"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"কোনও ডিভাইস পেয়ার করা নেই"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"কোনও ডিভাইস উপলভ্য নেই"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"পেয়ার করা ডিভাইসগুলি"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"নাম"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"এর জন্য ব্যবহার করুন"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"ব্লুটুথ ডিভাইসের নাম পরিবর্তন করুন"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"নামবিহীন ডিভাইস"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"পেয়ার করা ডিভাইসগুলি"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"নতুন ডিভাইস পেয়ার করুন"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"পেয়ার করার জন্য ব্লুটুথ চালু হবে"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ডিভাইস ডিসকানেক্ট করতে চান?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>.ডিভাইস থেকে আপনার গাড়িটি ডিসকানেক্ট হয়ে যাবে।"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"গাড়িতে ব্যবহার হওয়া ব্লুটুথ ঠিকানা: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ডিভাইসে ব্যবহার হওয়া ব্লুটুথ ঠিকানা: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"গাড়ির নাম"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"এই গাড়িটির আবার নামকরণ করুন"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ডিভাইসের আবার নামকরণ করুন"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"আবার নামকরণ করুন"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"উপলভ্য ডিভাইস"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"প্রোফাইলগুলি"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ব্লুটুথ পেয়ার করার অনুরোধ"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"পেয়ার এবং কানেক্ট করুন"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ব্লুটুথ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ব্লুটুথ এর সাথে পেয়ার করার কোড"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"পিনে অক্ষর বা চিহ্ন রয়েছে"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"যুক্ত করার কোড লিখে রিটার্ন অথবা এন্টার টিপুন"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"সাধারণত ০০০০ বা ১২৩৪"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"পেয়ার করার অনুরোধ"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সঙ্গে পেয়ার করতে ট্যাপ করুন।"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ভাষা"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ভাষাগুলি ও ইনপুট"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"কীবোর্ড"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"কীবোর্ডগুলি ম্যানেজ করুন"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"টেক্সট টু স্পিচ আউটপুট"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"পছন্দের ইঞ্জিন"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"বর্তমান ইঞ্জিন"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"কথা বলার স্পিড"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"পিচ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"রিসেট করুন"</string>
     <string name="sound_settings" msgid="3072423952331872246">"সাউন্ড"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"রিং ভলিউম"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"ন্যাভিগেশন ভলিউম"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"মিডিয়া"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"মিউজিক এবং ভিডিওগুলির জন্য ভলিউম সেট করুন"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"অ্যালার্ম"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ফোনের রিংটোন"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ডিফল্ট বিজ্ঞপ্তির সাউন্ড"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ডিফল্ট অ্যালার্মের শব্দ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"অ্যাপ ও বিজ্ঞপ্তি"</string>
+    <string name="all_applications" msgid="7798210477486822168">"সব অ্যাপ দেখুন"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ডিফল্ট অ্যাপ"</string>
     <string name="applications_settings" msgid="794261395191035632">"অ্যাপের তথ্য"</string>
+    <string name="force_stop" msgid="2153183697014720520">"জোর করে বন্ধ করুন"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"জোর করে বন্ধ করবেন?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"আপনি একটি অ্যাপকে জোর করে বন্ধ করলে, তা সঠিক ভাবে কাজ নাও করতে পারে।"</string>
     <string name="disable_text" msgid="4358165448648990820">"বন্ধ করুন"</string>
     <string name="enable_text" msgid="1794971777861881238">"চালু করুন"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"আনইনস্টল করুন"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"আপনি এই অ্যাপটি বন্ধ করলে, Android এবং অন্যান্য অ্যাপকে যে কাজের উদ্দেশ্যে তৈরি করা হয়েছিল সেগুলি আর কাজ নাও করতে পারে।"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"অ্যাপ বন্ধ করুন"</string>
     <string name="permissions_label" msgid="2701446753515612685">"অনুমতিগুলি"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ভার্সন: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"কোনও অনুমতি দেওয়া হয় নি"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"কোনও অনুমতির অনুরোধ জানানো হয়নি"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ডেটা ব্যবহার"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"অ্যাপ ডেটার ব্যবহার"</string>
-    <string name="force_stop" msgid="2153183697014720520">"জোর করে বন্ধ করুন"</string>
     <string name="computing_size" msgid="5791407621793083965">"কম্পিউটিং..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>টি অতিরিক্ত অনুমতি</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>টি অতিরিক্ত অনুমতি</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"অ্যাসিস্ট্যান্ট এবং ভয়েস ইনপুট"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"সহায়তা অ্যাপ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"স্ক্রিন থেকে টেক্সট ব্যবহার করুন"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"সহায়তা অ্যাপটিকে স্ক্রিনের কন্টেন্টকে টেক্সট হিসেবে অ্যাক্সেস করার অনুমতি দিন"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"স্ক্রিনশট ব্যবহার করুন"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"সহায়তা অ্যাপটিকে স্ক্রিনের একটি ছবি অ্যাক্সেস করার অনুমতি দিন"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"আপনাআপনি পূরণ করার পরিষেবা"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"কোনওটিই নয়"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"বেছে নেওয়া হয়েছে"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"অ্যাসিস্ট্যান্ট আপনার স্ক্রিনে দেখা যাচ্ছে বা অ্যাপের মধ্যে থাকা অ্যাক্সেসযোগ্য তথ্য সহ, আপনার সিস্টেমে ব্যবহার হওয়া অ্যাপ সম্পর্কিত তথ্য পড়তে পারবে।"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;দেখে নিন এই অ্যাপটি বিশ্বাসযোগ্য কিনা&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google অটোফিল&gt;%1$s&lt;/xliff:g&gt; আপনার স্ক্রিনে দেখানো তথ্য ব্যবহার করে কোনও তথ্য নিজে থেকে পূরণ করা যাবে কিনা তা নির্ণয় করে।"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"পরিষেবা যোগ করুন"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"লোকেশন"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"সাম্প্রতিক লোকেশনের অনুরোধ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"কোনও সাম্প্রতিক লোকেশনের অনুরোধ নেই"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"অ্যাপ-লেবেল অনুমতি"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"স্ক্যান করা হচ্ছে"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"লোকেশন পরিষেবা"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"ওয়াই-ফাই স্ক্যানিং"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"ব্লুটুথ বন্ধ থাকলেও অ্যাপ এবং পরিষেবাগুলিকে যেকোনও সময় ওয়াই-ফাই নেটওয়ার্ক স্ক্যান করার অনুমতি দিন। এটি বিভিন্ন ক্ষেত্রে কাজে লাগতে পারে, যেমন লোকেশন-ভিত্তিক বৈশিষ্ট্য এবং পরিষেবার উন্নতির জন্য।"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ব্লুটুথ স্ক্যানিং"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ব্লুটুথ বন্ধ থাকলেও অ্যাপ এবং পরিষেবাগুলিকে যেকোনও সময় আশেপাশে থাকা অন্যান্য ডিভাইস স্ক্যান করার অনুমতি দিন। এটি বিভিন্ন ক্ষেত্রে কাজে লাগতে পারে, যেমন লোকেশন-ভিত্তিক বৈশিষ্ট্য এবং পরিষেবার উন্নতির জন্য।"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"সিস্টেম"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"সিস্টেম আপডেট"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"সিস্টেম আপডেট"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ভার্সন"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android সুরক্ষার প্যাচ লেবেল"</string>
     <string name="model_info" msgid="4966408071657934452">"মডেল"</string>
     <string name="baseband_version" msgid="2370088062235041897">"বেসব্যান্ড ভার্সন"</string>
     <string name="kernel_version" msgid="7327212934187011508">"কার্নেল ভার্সন"</string>
     <string name="build_number" msgid="3997326631001009102">"বিল্ড নম্বর"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ব্লুটুথ অ্যাড্রেস"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"উপলভ্য নয়"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"স্ট্যাটাস"</string>
     <string name="device_status" msgid="267298179806290920">"স্ট্যাটাস"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"কপিরাইট"</string>
     <string name="license_title" msgid="936705938435249965">"লাইসেন্স"</string>
     <string name="terms_title" msgid="5201471373602628765">"নিয়ম ও শর্তাবলী"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"সিস্টেম ওয়েবভিউ লাইসেন্স"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"সিস্টেম ওয়েবভিউ লাইসেন্স"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ওয়ালপেপার"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"উপগ্রহ ছবি প্রদানকারী:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"তৃতীয় পক্ষের লাইসেন্স"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"লাইসেন্সগুলি লোড হতে সমস্যা হয়েছে।"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"লোড করা হচ্ছে…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">একজন ডেভেলপার হওয়া থেকে আপনি এখন <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ধাপ দূরে রয়েছেন।</item>
+      <item quantity="other">একজন ডেভেলপার হওয়া থেকে আপনি এখন <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ধাপ দূরে রয়েছেন।</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"আপনি এখন একজন ডেভেলপার!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"কোনও প্রয়োজন নেই, আপনি ইতিমধ্যেই একজন ডেভেলপার।"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ডেভেলপারের জন্য বিকল্প"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"রিসেটের বিকল্পগুলি"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"নেটওয়ার্ক, অ্যাপ অথবা ডিভাইস রিসেট"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"নেটওয়ার্ক রিসেট করুন"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"এর ফলে সমস্ত নেটওয়ার্ক সেটিংস রিসেট করা হবে, এগুলি সহ:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"ওয়াই-ফাই"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"মোবাইল ডেটা"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ব্লুটুথ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"সব গাড়ির ই-সিম মুছে ফেলুন"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"এতে আপনার এর পরিষেবার প্ল্যান বাতিল হবে না।"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"ই-সিমগুলি রিসেট করা যাচ্ছে না"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"নেটওয়ার্ক বেছে নিন"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"সেটিংস রিসেট করুন"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"রিসেট করবেন?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"সমস্ত নেটওয়ার্ক সেটিংস রিসেট করবেন? এখনকার সেটিংস আর ফিরিয়ে আনা যাবে না!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"সেটিংস রিসেট করুন"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"নেটওয়ার্ক সেটিংস রিসেট করা হয়েছে"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"অ্যাপের অভিরুচি রিসেট করুন"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"এটি এইগুলির জন্য সব পছন্দ রিসেট করবে:\n\n"<li>" বন্ধ করা অ্যাপ"</li>\n<li>" বন্ধ করা অ্যাপের বিজ্ঞপ্তি"</li>\n<li>" অ্যাকশনের জন্য ডিফল্ট অ্যাপ্লিকেশন"</li>\n<li>" অ্যাপের জন্য ব্যাকগ্রাউন্ড ডেটার সীমাবদ্ধতা"</li>\n<li>" যেকোনও অনুমতির সীমাবদ্ধতা"</li>\n\n" আপনি কোনও অ্যাপের ডেটা হারাবেন না।"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"অ্যাপ আবার সেট করুন"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"অ্যাপের পছন্দ রিসেট করা হয়েছে"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"সমস্ত ডেটা মুছে ফেলুন (ফ্যাক্টরি রিসেট)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"এটি গাড়ির প্রধান ডিসপ্লে ইউনিট থেকে সমস্ত ডেটা মুছে ফেলবে, নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত:\n\n"<li>"আপনার Google অ্যাকাউন্ট"</li>\n<li>"সিস্টেম এবং অ্যাপের ডেটা এবং সেটিংস"</li>\n<li>"ডাউনলোড করা অ্যাপ"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"আপনি বর্তমানে নিম্নলিখিত অ্যাকাউন্টে সাইন-ইন করে আছেন:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"এই গাড়িতে অন্য ব্যবহারকারী আছেন।"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"গাড়ি রিসেট করুন"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"রিসেট করবেন?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"আপনার সমস্ত ব্যক্তিগত তথ্য এবং ডাউনলোড করা অ্যাপ মুছে দিতে চান? আপনি এই প্রক্রিয়াটি আগের অবস্থায় ফেরাতে পারবেন না!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"সবকিছু মুছে দিন"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"মোছা হচ্ছে"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"অপেক্ষা করুন..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"দিন ও তারিখ"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"তারিখ ও সময় সেট করুন"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"তারিখ, সময়, টাইম জোন ও ফর্ম্যাট সেট করুন"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"টাইম জোন অনুযায়ী সাজান"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"তারিখ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"সময়"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"ব্যবহারকারী যোগ করুন"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"অ্যাকাউন্ট যোগ করুন"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ব্যবহারকারীকে মুছুন"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"নতুন ব্যবহারকারী"</string>
-    <string name="user_guest" msgid="3465399481257448601">"অতিথি"</string>
     <string name="user_admin" msgid="1535484812908584809">"অ্যাডমিন"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"অ্যাডমিন হিসেবে সাইন-ইন করেছেন"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"সকল অ্যাডমিন অনুমতি সহকারে"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"নতুন অ্যাডমিন বেছে নিন"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ব্যবহারকারী অন্যান্য অ্যাডমিন সহ ব্যবহারকারীদের মুছে দিতে পারবে এবং ফ্যাক্টরি সিস্টেমটি রিসেট করবে।"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"এই অ্যাকশনটি আগের অবস্থায় ফেরানো যাবে না।"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"হ্যাঁ, নতুন অ্যাডমিন বেছে নিন"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"নতুন ব্যবহারকারী তৈরি করুন"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ফোন কল করে দেখুন"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"গাড়ির মোবাইল ডেটা ব্যবহার করে মেসেজিং"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"নতুন অ্যাপ ইনস্টল করে দেখুন"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"অ্যাপ আনইনস্টল করে দেখুন"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ব্যবহারকারী যোগ করুন"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"নতুন ব্যবহারকারী"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"ব্যবহারকারী যোগ করবেন?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার স্পেস সেট-আপ করে নিতে হবে৷"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"যেকোনও ব্যবহারকারী বাকি সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন।"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"আর কোনও প্রোফাইল যোগ করা যাবে না"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">আপনি <xliff:g id="COUNT">%d</xliff:g>টি প্রোফাইল তৈরি করতে পারবেন।</item>
+      <item quantity="other">আপনি <xliff:g id="COUNT">%d</xliff:g>টি প্রোফাইল তৈরি করতে পারবেন।</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"নতুন প্রোফাইল তৈরি করা যায়নি"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"এই ব্যবহারকারীর অ্যাকাউন্টটি মুছবেন?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"সব অ্যাপ ও ডেটা মুছে ফেলা হবে।"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ব্যবহারকারীকে মুছে ফেলা যায়নি।"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"খারিজ"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"আবার চেষ্টা করুন"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"শেষ ব্যবহারকারীকে মুছে দিতে চান?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"এই গাড়ির আগের ব্যবহারকারীকে মুছে ফেলার পর, নতুন অ্যাডমিন ব্যবহারকারী তৈরি করা হবে।"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"এই ব্যবহারকারীর সব ডেটা, সেটিংস, এবং অ্যাপ মুছে ফেলা হবে। আপনাকে সিস্টেম আবার সেট-আপ করতে হবে।"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"নতুন অ্যাডমিন বেছে নিন"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"আপনার একজন অ্যাডমিন প্রয়োজন। এটি মুছে ফেলতে, অন্য একটি বিকল্প বেছে নিন।"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"অ্যাডমিন বেছে নিন"</string>
+    <string name="user_guest" msgid="3465399481257448601">"অতিথি"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"অতিথি"</string>
     <string name="user_switch" msgid="6544839750534690781">"পরিবর্তন করুন"</string>
     <string name="current_user_name" msgid="3813671533249316823">"আপনি (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"নাম"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"সেট-আপ করা নেই"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ব্যবহারকারীর নাম এডিট করুন"</string>
     <string name="users_list_title" msgid="770764290290240909">"ব্যবহারকারী"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s কে অনুমতি দেওয়া হয়েছে"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"অ্যাকাউন্ট"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ব্যবহারকারী"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"অ্যাকাউন্ট যোগ করুন"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"কোনও অ্যাকাউন্ট যোগ করা হয়নি"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> এর অ্যাকাউন্ট"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ডেটা অটোমেটিক সিঙ্ক হবে"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"অ্যাপকে অটোমেটিক ডেটা রিফ্রেশ করতে দিন"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ডেটা অটোমেটিক সিঙ্ক চালু করবেন?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ওয়েবে আপনার অ্যাকাউন্টে আপনি যে পরিবর্তন করবেন সেটি অটোমেটিক আপনার ফোনে কপি করা হবে।\n\nকোনও কোনও অ্যাকাউন্ট আপনার ফোনে করা পরিবর্তনগুলি অটোমেটিক ওয়েবে কপি করতে পারবে। Google অ্যাকাউন্ট এভাবেই কাজ করে।"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ডেটা অটোমেটিক সিঙ্ক বন্ধ করবেন?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"এটি ডেটা এবং ব্যাটারির খরচ বাঁচাবে, কিন্তু আপনাকে সাম্প্রতিক তথ্য সংগ্রহ করতে ম্যানুয়ালি প্রতিটি অ্যাকাউন্ট সিঙ্ক করতে হবে। আপডেট হলে আপনি তখন বিজ্ঞপ্তি পাবেন না।"</string>
     <string name="account_details_title" msgid="7529571432258448573">"অ্যাকাউন্টের তথ্য"</string>
     <string name="add_account_title" msgid="5988746086885210040">"অ্যাকাউন্ট যোগ করুন"</string>
     <string name="add_an_account" msgid="1072285034300995091">"একটি অ্যাকাউন্ট যোগ করুন"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"অ্যাকাউন্ট সরিয়ে দিন"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"অ্যাকাউন্টটি সরাবেন?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"এই অ্যাকাউন্টটি মুছে দিলে এটির সমস্ত মেসেজ, পরিচিতি এবং অন্যান্য ডেটা ডিভাইস থেকে মুছে দেওয়া হবে!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"আপনার অ্যাডমিন এই পরিবর্তনটি করার অনুমতি দেয় না"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"এই ব্যবহারকারীকে সরাবেন?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"সব অ্যাপ ও ডেটা মুছে ফেলা হবে।"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"ব্যবহারকারীকে সরানো যায়নি।"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"আবার করবেন?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"খারিজ করুন"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"আবার চেষ্টা করুন"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"ব্যবহারকারী যোগ করবেন?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার স্পেস সেট-আপ করে নিতে হবে৷"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"যেকোনও ব্যবহারকারী বাকি সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন।"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"অ্যাকাউন্ট সরানো যায়নি।"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"অ্যাকাউন্ট সিঙ্ক"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>টির মধ্যে <xliff:g id="ID_1">%1$d</xliff:g>টি আইটেমের জন্য সিঙ্ক চালু আছে"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"সব আইটেমের জন্য সিঙ্ক চালু আছে"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"সব আইটেমের জন্য সিঙ্ক বন্ধ আছে"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"সিঙ্ক বন্ধ আছে"</string>
+    <string name="sync_error" msgid="6698021343089247914">"সিঙ্ক করার সময় সমস্যা"</string>
+    <string name="last_synced" msgid="4745124489150101529">"শেষ সিঙ্ক হয়েছে: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"এখনই সিঙ্ক করুন…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"এখনই সিঙ্ক করতে ট্যাপ করুন<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"এখন সিঙ্ক করুন"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"সিঙ্ক বাতিল করুন"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"সিঙ্কে বর্তমানে সমস্যা দেখা দিচ্ছে। এটি খুব শীঘ্রই ঠিক হয়ে যাবে।"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"নিরাপত্তা"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"স্ক্রিন লক"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"কোনওটিই নয়"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"পিন"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"পাসওয়ার্ড"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"লকের একটি ধরন বেছে নিন"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"স্ক্রিন লকের বিকল্প"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"লক করার বিকল্প"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"প্যাটার্ন আঁকুন"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"নিশ্চিত করুন"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"আবার আঁকুন"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"একটি স্ক্রিন লক সেট করুন"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"আপনার পিন বেছে নিন"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"আপনার প্যাটার্ন বেছে নিন"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"আপনার পাসওয়ার্ড বেছে নিন"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"আপনার পাসওয়ার্ড বেছে নিন"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"বর্তমান স্ক্রিন লক"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"নিরাপত্তার জন্য একটি প্যাটার্ন সেট করুন"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"সরান"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"একইধরনের পাসওয়ার্ড আপনার আইটি অ্যাডমিনের মাধ্যমে ব্লক করা হয়। অন্য একটি পাসওয়ার্ড ব্যবহার করার চেষ্টা করুন।"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ছোট থেকে বড়, বড় থেকে ছোট সংখ্যা অথবা নির্দিষ্ট কয়েকটি সংখ্যা বার বার লেখা যাবে না।"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"স্ক্রিন লকের বিকল্প"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> দিন আগে"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"বিশ্বস্ত ডিভাইস যোগ করুন"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"বিশ্বস্ত ডিভাইসগুলি"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>টি ডিভাইস</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>টি ডিভাইস</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"এই গাড়ি কানেক্ট করা থাকলে <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> এটিকে আনলক করবে কেউ আপনার <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> নিলে, তারা আপনার ডিভাইস অ্যাক্সেস করতে পারবেন।"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"কনফার্ম করুন"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"বিশ্বস্ত ডিভাইস সরান"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"হয়ে গেছে"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"কোনও বিশ্বস্ত ডিভাইস সেট-আপ করতে কম্প্যানিয়ন অ্যাপ ব্যবহার করুন। একবার সেট-আপ হয়ে গেলে, যখন গাড়ি আপনার ফোন শনাক্ত করবে তখন ব্যবহারকারী হিসেবে আপনি নিজের প্রোফাইল আনলক করতে পারবেন"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"১. আপনার ফোনে কম্প্যানিয়ন অ্যাপ ডাউনলোড করুন"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"২. ডিভাইসের সাথে যোগ করতে <xliff:g id="CAR_NAME">%1$s</xliff:g> বেছে নিন"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock এই ডিভাইসের নিরাপত্তা বিষয়ক ফিচার শনাক্ত করতে পারে না। গাড়ি রক্ষায় সাহায্য করতে, আপনার গাড়ি আনলক করে রাখলেই বিশ্বস্ত ডিভাইস শুধুমাত্র আপনার গাড়িকে আনলক করতে পারবে। আপনার গাড়ি আশেপাশে থাকার সময় এমনকি যদি এটি অন্য কারও কাছে থাকে তাহলেও বিশ্বস্ত ডিভাইস আপনার গাড়িটি আনলক করতে পারবে।"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-কে বিশ্বস্ত ডিভাইস হিসেবে যোগ করুন"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-কে বিশ্বস্ত ডিভাইস হিসেবে যোগ করা হয়েছে"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> নথিভুক্ত করা যায়নি"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"একটি বিশ্বস্ত ডিভাইস যোগ করার পর যাচাইকরণ পদ্ধতি সেট করতে হবে। যদি আপনার বিশ্বস্ত ডিভাইস হাতের কাছে না থাকে তাহলে আপনার প্রোফাইল অ্যাক্সেস করার জন্য যাচাইকরণ করা প্রয়োজন।"</string>
     <string name="forget" msgid="3971143908183848527">"ভুলে যান"</string>
+    <string name="connect" msgid="5861699594602380150">"কানেক্ট করুন"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ডিসকানেক্ট করুন"</string>
     <string name="delete_button" msgid="5840500432614610850">"মুছুন"</string>
     <string name="remove_button" msgid="6664656962868194178">"সরিয়ে দিন"</string>
     <string name="cancel" msgid="750286395700355455">"বাতিল করুন"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ডেমো মোড ছেড়ে বেরিয়ে আসুন"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"এর ফলে ডেমো অ্যাকাউন্টটি মুছে দেওয়া হবে এবং সিস্টেমের ডেটা ফ্যাক্টরি রিসেট করা হবে। ব্যবহারকারীর সমস্ত ডেটা মুছে যাবে।"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ডেমো মোড ছেড়ে যান"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"সেট-আপ শেষ করুন"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"এখনই নয়"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"খারিজ করুন"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ড্রাইভ করার সময় এই বৈশিষ্ট্য উপলভ্য নয়।"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ড্রাইভ করার সময় ব্যবহারকারীকে যোগ করতে পারবেন না।"</string>
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 5965fd3..2b62f0a 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"zatamnjenje ekrana, ekran osjetljiv na dodir, baterija"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"zatamnjenje ekrana, noć, boja"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Noćni način rada"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Mreža i internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilna mreža"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilni podaci"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Pristupi podacima putem mobilne mreže"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Isključiti prijenos podataka na mobilnoj mreži?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Prijenos podataka"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Upozorenje na podatke i limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciklus upotrebe podataka apl."</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Postavi upozorenje o podacima"</string>
+    <string name="data_warning" msgid="116776633806885370">"Upozorenje na podatke"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Postavi ograničenje za podatke"</string>
+    <string name="data_limit" msgid="227338836292511425">"Ograničenje za podatke"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ograničavanje prijenosa podataka"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna jedinica vozila će isključiti prijenos podataka na mobilnoj mreži nakon što dostigne ograničenje koje ste postavili.\n\nS obzirom na to da glavna jedinica vozila mjeri prijenos podataka te da obračun vašeg operatera može biti drugačiji, uzmite u obzir postavljanje umjerenog ograničenja."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"WiFi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Podešavanje bežičnih pristupnih tačaka i upravljanje njima"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Uključivanje WiFi-a…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Isključivanje WiFi-a…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Učitavanje liste WiFi mreža"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi mreža je onemogućena"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Zaboravljanje mreže nije uspjelo"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Povezivanje na mrežu nije uspjelo"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj mrežu"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi mreža je onemogućena"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Lozinka"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Prikaži lozinku"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Naziv mreže"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Unesite SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sigurnost"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Jačina signala"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Jačina signala"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Brzina veze"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvencija"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP adresa"</string>
+    <string name="show_password" msgid="2074628020371139240">"Prikaži lozinku"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Unesite naziv mreže"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Unesite lozinku"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Loš"</item>
-    <item msgid="2032262610626057081">"Slab"</item>
-    <item msgid="3859756017461098953">"Dobar"</item>
-    <item msgid="1521103743353335724">"Odličan"</item>
+    <item msgid="7683058295076342057">"Loš"</item>
+    <item msgid="1639222824821660744">"Slab"</item>
+    <item msgid="1838705897358163300">"Dobar"</item>
+    <item msgid="6067166649320533751">"Odličan"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Uključi Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth je onemogućen"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalji o mreži"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC adresa"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP adresa"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska podmreže"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 adrese"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Pristupnik"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Postavke za WiFi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Automatsko uključivanje WiFi veze"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"WiFi se ponovo uključuje blizu sačuvanih mreža visokog kvaliteta, poput kućne mreže"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nije dostupno jer je lokacija isključena. Uključite "<annotation id="link">"lokaciju"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Uključiti skeniranje WiFi mreže?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Uključi"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Skeniranje WiFi mreže je isključeno"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatsko prebacivanje na prijenos podataka na mobilnoj mreži"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Korištenje prijenosa podataka na mobilnoj mreži kada WiFi mreža nema pristup internetu. Mogu nastati troškovi prijenosa podataka."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Saznajte više"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Upravljajte vezama, postavite naziv uređaja i mogućnost otkrivanja"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Računar"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Slušalice"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Snimanje"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Slušalica"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Ulazni periferni uređaj"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Upareni uređaji"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dostupni uređaji"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nema uparenih uređaja"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nema dostupnih uređaja"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Upareni uređaj"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Naziv"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Koristi se za"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Promijenite naziv Bluetooth uređaja"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Neimenovani uređaj"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Upareni uređaji"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Uparivanje novog uređaja"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth će se uključiti za uparivanje"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Prekinuti vezu s uređajem?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Vaše vozilo će prekinuti vezi s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth adresa vozila: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth adresa uređaja: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Naziv vozila"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Promijena naziva vozila"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Promijena naziva uređaja"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Promijeni naziv"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dostupni uređaji"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profili"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Zahtjev za Bluetooth uparivanje"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Upari i poveži"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Kôd za Bluetooth uparivanje"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN sadrži slova ili simbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Upišite kôd za uparivanje, a zatim pritisnite Return ili Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Obično 0000 ili 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Zahtjev za uparivanje"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Dodirnite za uparivanje s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Jezici"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Jezici i unos"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastatura"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Upravljanje tastaturama"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Pretvaranje teksta u govor"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Željeni alat"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Trenutni program"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Brzina govora"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Visina"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Vrati na zadano"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Zvuk"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Jačina zvona"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Jačina zvuka navigacije"</string>
@@ -100,31 +140,66 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Mediji"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Postavite jačinu zvuka za muziku i videozapise"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Melodija zvona telefona"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Zadani zvuk obavještenja"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Zadani zvuk alarma"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikacije i obavještenja"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Prikaži sve aplikacije"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Zadane aplikacije"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informacije o aplikaciji"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Prisilno zaustavi"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Prisilno zaustaviti?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ako prisilno zaustavite aplikaciju, moguće je da će nepravilno funkcionirati."</string>
     <string name="disable_text" msgid="4358165448648990820">"Onemogući"</string>
     <string name="enable_text" msgid="1794971777861881238">"Omogući"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Deinstaliraj"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ako onemogućite ovu aplikaciju, moguće je da Android i druge aplikacije više neće funkcionirati ispravno."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Onemogući aplikaciju"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Odobrenja"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Verzija: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nema dodijeljenih odobrenja"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nema zatraženih odobrenja"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Prijenos podataka"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Prijenos podataka za apl."</string>
-    <string name="force_stop" msgid="2153183697014720520">"Prisilno zaustavi"</string>
     <string name="computing_size" msgid="5791407621793083965">"Računanje…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatno odobrenje</item>
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatna odobrenja</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih odobrenja</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoć i glasovni unos"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija za pomoć"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Korištenje teksta s ekrana"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Omogućava aplikaciji za pomoć da pristupa sadržaju na ekranu kao tekstu"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Korištenje snimke ekrana"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Omogućava aplikaciji za pomoć da pristupa slici ekrana"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Usluga automatskog popunjavanja"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nema"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Odabrano"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asistent će imati mogućnost čitanja informacija o aplikacijama koje se koriste na vašem sistemu, uključujući informacije vidljive na ekranu ili dostupne unutar aplikacija."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Vodite računa da je to pouzdana aplikacija&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Automatsko popunjavanje&gt;%1$s&lt;/xliff:g&gt; koristi sadržaj na vašem ekranu da odredi šta se može automatski popuniti."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Dodaj uslugu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavni zahtjevi za lokaciju"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nema nedavnih zahtjeva za lokaciju"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Odobrenja na nivou aplikacija"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skeniranje"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Usluge lokacije"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Skeniranje Wi‑Fi mreže"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Dozvolite aplikacijama i uslugama skeniranje WiFi mreže u svakom trenutku, čak i kada je WiFi mreža isključena. Ovim se, naprimjer, mogu poboljšati funkcije i usluge zasnovane na lokaciji."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Skeniranje Bluetootha"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Dozvolite aplikacijama i uslugama skeniranje uređaja u blizini u svakom trenutku, čak i kada je Bluetooth isključen. Ovim se, naprimjer, mogu poboljšati funkcije i usluge zasnovane na lokaciji."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Ažuriranja sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verzija Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivo sigurnosne zakrpe Androida"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verzija nemoduliranog signala"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Osnovna verzija"</string>
     <string name="build_number" msgid="3997326631001009102">"Broj međuverzije"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth adresa"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nije dostupno"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -141,12 +216,50 @@
     <string name="copyright_title" msgid="4220237202917417876">"Autorska prava"</string>
     <string name="license_title" msgid="936705938435249965">"Licenca"</string>
     <string name="terms_title" msgid="5201471373602628765">"Uslovi i odredbe"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Sistemske WebView licence"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Sistemske WebView licence"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Pozadinske slike"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Pružaoci satelitskih slika:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence trećih strana"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema s učitavanjem licenci."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Učitavanje…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak vas dijeli od toga da postanete programer.</item>
+      <item quantity="few">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vas dijele od toga da postanete programer.</item>
+      <item quantity="other">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vas dijeli od toga da postanete programer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Sada ste programer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nema potrebe, već ste programer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opcije za programere"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opcije vraćanja na zadano"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Vratite na zadano mrežu, aplikacije ili uređaj"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Vrati mrežu na zadano"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ovim će se sve postavke mreže vratiti na zadano, uključujući:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"WiFi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Prijenos podataka na mobilnoj mreži"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Potpuno izbriši sve eSIM-ove vozila."</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Ovim se neće otkazati vaš plan usluga mobilnog operatera."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Nije moguće vratiti eSIM-ove na zadano"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Odabir mreže"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Vrati postavke na zadano"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Ponovo postaviti?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Vratiti sve postavke mreže na zadano? Ovu radnju ne možete opozvati!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Vrati postavke na zadano"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Postavke mreže su vraćene na zadano"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Vrati postavke aplikacije na zadano"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Ovim će se vratiti sve postavke na zadano za:\n\n"<li>" Onemogućene aplikacije"</li>\n<li>"Obavještenja za onemogućene aplikacije"</li>\n<li>"Zadane aplikacije za radnje"</li>\n<li>" Ograničenje pozadinskih podataka za aplikacije"</li>\n<li>" Sva ograničenja za odobrenja"</li>\n\n" Nećete izgubiti podatke iz aplikacija."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Vrati aplikacije na zadano"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Postavke aplikacije su vraćene na zadano"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Potpuno izbriši sve podatke"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Na ovaj način će se izbrisati svi podaci s glavne jedinice vozila, uključujući:\n\n"<li>"vaš Google račun"</li>\n<li>"sistemske i aplikacijske podatke i postavke"</li>\n<li>"preuzete aplikacije"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Trenutno ste prijavljeni u sljedeće račune:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Drugi korisnici su prisutni u ovom vozilu."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Vrati vozilo na zadano"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vratiti na zadano?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Izbrisati sve vaše lične podatke i preuzete aplikacije? Ovu radnju ne možete poništiti!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Izbriši sve"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Brisanje u toku"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Pričekajte..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum i vrijeme"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Postavljanje datuma i vremena"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Postavi datum, vrijeme, vremensku zonu i formate"</string>
@@ -166,23 +279,60 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Poredaj po vremenskim zonama"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Vrijeme"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodaj korisnika"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj račun"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Brisanje korisnika"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Novi korisnik"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Prijavljeni ste kao administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Sva odobrenja administratora"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Postavi kao administratora"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Korisnik će moći izbrisati korisnike, uključujući druge Administratore te vratiti sistem na fabričke postavke."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ova radnja se ne može poništiti."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Da, postavi kao administratora"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Kreirajte nove korisnike"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Uspostavljajte telefonske pozive"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Poruke putem mobilnih podataka auta"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalirajte nove aplikacije"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Deinstalirajte aplikacije"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodaj korisnika"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Novi korisnik"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Dodati novog korisnika?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Svaki korisnik može ažurirati aplikacije za sve druge korisnike."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Dostignut limit za broj korisnika"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Možete kreirati najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+      <item quantity="few">Možete kreirati najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+      <item quantity="other">Možete kreirati najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Kreiranje novog korisnika nije uspjelo"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Izbrisati ovog korisnika?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Sve aplikacije i podaci će biti izbrisani."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Brisanje korisnika nije uspjelo."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Odbaci"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Pokušaj ponovo"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Brisati zadnjeg korisnika?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Nakon što izbrišete preostalog korisnika ovog automobila, kreirat će se novi korisnik administrator."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Svi podaci, postavke i aplikacije povezane s ovim korisnikom bit će izbrisani. Morat ćete ponovo postaviti sistem."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Odabir novog administratora"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Morate odabrati najmanje jednog administratora. Da izbrišete ovog, prvo odaberite zamjenskog."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Odaberite administratora"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gost"</string>
     <string name="user_switch" msgid="6544839750534690781">"Prebaci"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vi (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nije postavljen"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Izmjena korisničkog imena"</string>
     <string name="users_list_title" msgid="770764290290240909">"Korisnici"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Odobrenja za korisnika %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Računi"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Korisnik"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj račun"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nije dodan nijedan račun"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Računi za korisnika <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatsko sinhroniziranje podataka"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Omogućava aplikacijama automatsko osvježavanje podataka"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Uklj. autom. sinhron. podataka?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Promjene računa koje unesete na webu automatski će se kopirati na vaš uređaj.\n\nNeki računi također mogu automatski kopirati promjene s telefona na web. Google račun funkcionira na ovaj način."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Isklj. autom. sinhron. podataka?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Ovim će se uštedjeti na prijenosu podataka, ali ćete morati ručno sinhronizirati svaki račun da prikupite najnovije informacije. Također, nećete primati obavještenja kada se izvrše ažuriranja."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Podaci o računu"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Dodaj račun"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Dodavanje računa"</string>
@@ -190,16 +340,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Ukloni račun"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Ukloniti račun?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Uklanjanjem ovog računa izbrisat ćete sve njegove poruke, kontakte i druge podatke s uređaja!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Vaš administrator ne dozvoljava ovu promjenu"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Ukloniti ovog korisnika?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Sve aplikacije i podaci će biti izbrisani."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Uklanjanje korisnika nije uspjelo."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Pokušati ponovo?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Odbaci"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Pokušaj ponovo"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Dodati novog korisnika?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Svaki korisnik može ažurirati aplikacije za sve druge korisnike."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Uklanjanje računa nije uspjelo."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sinhronizacija računa"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinhronizacija uključena za stavke: <xliff:g id="ID_1">%1$d</xliff:g> od ukupno <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinhronizacija je uključena za sve stavke"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinhronizacija je isključena za sve stavke"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinhronizir. ISKLJUČENO"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Greška u sinhroniziranju"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Posljednje sinhroniziranje: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinhroniziranje u toku…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Dodirnite da sinhronizirate odmah<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhroniziraj sada"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Otkaži sinhroniziranje"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Trenutno se javljaju problemi sa sinhroniziranjem. Ubrzo će opet raditi."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sigurnost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaključavanje ekrana"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nema"</string>
@@ -207,7 +361,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Lozinka"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Izaberite vrstu zaklj."</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opcije zaključavanja ekrana"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opcije zaključavanja"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Unesite svoj uzorak"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Potvrdi"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Nacrtajte ponovo"</string>
@@ -217,7 +371,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Postavljanje zaključavanja ekrana"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Odabir PIN-a"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Odaberite uzorak"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Odabir lozinke"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Odabir lozinke"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Trenutni način zaključavanja ekrana"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Postavite uzorak radi sigurnosti"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Obriši"</string>
@@ -295,7 +449,29 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Vaš IT administrator je blokirao uobičajene lozinke. Probajte drugu lozinku."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Nije dozvoljen rastući, opadajući ili ponavljajući niz cifri."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opcije zaključavanja ekrana"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : prije <xliff:g id="NUM_DAYS">%3$s</xliff:g> dana"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Dodaj pouzdani uređaj"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Pouzdani uređaji"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> uređaj</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> uređaja</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uređaja</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Uređaj <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> će otključati ovaj automobil kada se poveže. Ako neko uzme <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, može pristupiti ovom uređaju"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Potvrdi"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Ukloni pouzdani uređaj"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Gotovo"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Postavite pouzdani uređaj pomoću prateće aplikacije. Nakon što ga postavite, moći ćete otključati svoj korisnički profil kada vozilo otkrije vaš telefon"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Preuzmite prateću aplikaciju na svoj telefon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Odaberite automobil <xliff:g id="CAR_NAME">%1$s</xliff:g> na telefonu da uparite uređaje"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Funkcija Smart Lock ne može prepoznati sigurnosne funkcije ovog uređaja. Kako bi zaštitio vaš automobil, pouzdani uređaj će moći održati vaš automobil otključanim samo nakon što ga vi otključate. Vaš pouzdani uređaj može zadržati vaš automobil otključanim kada je u blizini, čak i ako ga drži neko drugi."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Dodajte <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kao pouzdani uređaj"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> je uspješno dodan kao pouzdani uređaj"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Prijava uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije uspjela"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Nakon što dodate pouzdani uređaj, morate postaviti metodu autentifikacije. Autentifikacija će biti potrebna za pristup profilu u slučaju da kod sebe nemate pouzdani uređaj."</string>
     <string name="forget" msgid="3971143908183848527">"Zaboravi"</string>
+    <string name="connect" msgid="5861699594602380150">"Poveži"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Prekini vezu"</string>
     <string name="delete_button" msgid="5840500432614610850">"Izbriši"</string>
     <string name="remove_button" msgid="6664656962868194178">"Ukloni"</string>
     <string name="cancel" msgid="750286395700355455">"Otkaži"</string>
@@ -305,8 +481,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Izađite iz načina demonstr."</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ovim će se izbrisati račun za demonstraciju i vratiti sistem na fabričke postavke. Svi korisnički podaci bit će izgubljeni."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Izađite iz demonstr."</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"dovrši postavljanje"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ne sada"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ODBACI"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkcija nije dostupna tokom vožnje."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Nije moguće dodati korisnika za vrijeme vožnje."</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index c26b27e..6562fd4 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"pantalla atenuada, pantalla tàctil, bateria"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"pantalla atenuada, nit, color"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Mode nocturn"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Xarxa i Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Xarxa mòbil"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dades mòbils"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accedeix a les dades amb la xarxa mòbil"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vols desactivar les dades mòbils?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Ús de dades"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Advertiment i límit de dades"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cicle d\'ús de dades d\'aplicacions"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Defineix un advertiment de dades"</string>
+    <string name="data_warning" msgid="116776633806885370">"Advertiment de dades"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Defineix un límit de dades"</string>
+    <string name="data_limit" msgid="227338836292511425">"Límit de dades"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitació de l\'ús de dades"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Es desactivaran les dades mòbils de la unitat principal del vehicle quan s\'arribi al límit que has establert.\n\nCom que la unitat principal mesura l\'ús de dades i és possible que l\'operador de telefonia mòbil en faci un recompte diferent, et recomanem que estableixis un límit prudent."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configura i gestiona els punts d\'accés sense fil"</string>
     <string name="wifi_starting" msgid="473253087503153167">"S\'està activant la Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"S\'està desactivant la Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"S\'està carregant la llista de xarxes Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi desactivada"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"No s\'ha pogut oblidar la xarxa"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"No s\'ha pogut connectar a la xarxa"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Afegeix una xarxa"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi desactivada"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Connecta"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Contrasenya"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Mostra la contrasenya"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nom de la xarxa"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Introdueix l\'SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Seguretat"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Intensitat del senyal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Intensitat del senyal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Estat"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Velocitat d\'enllaç"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Freqüència"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Adreça IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Mostra la contrasenya"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Introdueix el nom de la xarxa"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Introdueix la contrasenya"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Feble"</item>
-    <item msgid="2032262610626057081">"Suficient"</item>
-    <item msgid="3859756017461098953">"Bona"</item>
-    <item msgid="1521103743353335724">"Excel·lent"</item>
+    <item msgid="7683058295076342057">"Feble"</item>
+    <item msgid="1639222824821660744">"Suficient"</item>
+    <item msgid="1838705897358163300">"Bona"</item>
+    <item msgid="6067166649320533751">"Excel·lent"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Activa el Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth desactivat"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalls de la xarxa"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adreça MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Adreça IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Màscara de subxarxa"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adreces IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Passarel·la"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferències de la Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Activa la Wi‑Fi automàticament"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"La Wi‑Fi es tornarà a activar automàticament prop de xarxes desades d\'alta qualitat, com la de casa teva"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"No disponible perquè la ubicació està desactivada. Activa la "<annotation id="link">"ubicació"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Vols activar la cerca de xarxes Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Activa"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"S\'ha activat la cerca de xarxes Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Canvia automàticament a dades mòbils"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Utilitza dades mòbils quan la Wi‑Fi no tingui accés a Internet. És possible que s\'apliquin càrrecs per ús de dades."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Més informació"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Gestiona les connexions, defineix el nom i la visibilitat del dispositiu"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Ordinador"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Auriculars"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telèfon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imatges"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Auricular"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Perifèric d\'entrada"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispositius vinculats"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispositius disponibles"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"No hi ha cap dispositiu vinculat"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"No hi ha cap dispositiu disponible"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispositiu vinculat"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nom"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Utilitza per a"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Canvia el nom dispositiu Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispositiu sense nom"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispositius vinculats"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Vincula un dispositiu nou"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"El Bluetooth s\'activarà per vincular"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Vols desconnectar el dispositiu?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"El vehicle es desconnectarà del dispositiu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adreça Bluetooth del vehicle: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adreça Bluetooth del dispositiu: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nom del vehicle"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Canvia el nom del vehicle"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Canvia el nom del dispositiu"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Canvia el nom"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispositius disponibles"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Perfils"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Sol·licitud de vinculació de Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Vincula i connecta"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Codi de vinculació per Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"El PIN conté lletres o símbols"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Escriu el codi de vinculació i, a continuació, prem la tecla de retorn."</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Generalment 0000 o 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Sol·licitud de vinculació"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Toca per vincular el dispositiu amb <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomes"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomes i introducció de text"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Teclat"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Gestiona els teclats"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Sortida de síntesi de veu"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motor preferit"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motor actual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Velocitat de veu"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"To"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Restableix"</string>
     <string name="sound_settings" msgid="3072423952331872246">"So"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volum del to"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volum de navegació"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Multimèdia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Defineix el volum de la música i els vídeos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarma"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"So de trucada"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"So de notificació predeterminat"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"So d\'alarma predeterminat"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplicacions i notificacions"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Mostra totes les aplicacions"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplicacions predeterminades"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informació de les aplicacions"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Força l\'aturada"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Vols forçar l\'aturada?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Si forces l\'aturada d\'una aplicació, és possible que no funcioni correctament."</string>
     <string name="disable_text" msgid="4358165448648990820">"Desactiva"</string>
     <string name="enable_text" msgid="1794971777861881238">"Activa"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstal·la"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Si desactives aquesta aplicació, és possible que Android i altres aplicacions deixin de funcionar com esperes."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Desactiva l\'aplicació"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versió: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No s\'ha concedit cap permís"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No s\'ha sol·licitat cap permís"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Ús de dades"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Ús de dades de l\'aplicació"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Força l\'aturada"</string>
     <string name="computing_size" msgid="5791407621793083965">"S\'està calculant…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos addicionals</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permís addicional</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistència i entrada de veu"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplicació d\'assistència"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Utilitza el text de la pantalla"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Permet que l\'aplicació d\'assistència accedeixi als continguts de la pantalla en forma de text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Utilitza la captura de pantalla"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Permet que l\'aplicació d\'assistència accedeixi a una imatge de la pantalla"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Servei Emplenament automàtic"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Cap"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Seleccionada"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"L\'assistent podrà llegir informació sobre les aplicacions que s\'utilitzen al teu sistema; també podrà accedir a la informació que es veu a la teva pantalla o a què accedeixes des de les aplicacions."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Assegura\'t que confies en aquesta aplicació&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Emplenament automàtic de Google&gt;%1$s&lt;/xliff:g&gt; utilitza el contingut que es mostra a la pantalla per determinar què es pot emplenar automàticament."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Afegeix un servei"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Ubicació"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Sol·licituds d\'ubicació recents"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No hi ha cap sol·licitud d\'ubicació recent"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos al nivell de l\'aplicació"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Cerca"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Serveis d\'ubicació"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Cerca de xarxes Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Permet que les aplicacions i els serveis cerquin xarxes Wi‑Fi en qualsevol moment, fins i tot quan la Wi‑Fi estigui desactivada. Aquesta opció es pot utilitzar, per exemple, per millorar les funcions i els serveis basats en la ubicació."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Cerca de dispositius Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Permet que les aplicacions i els serveis cerquin dispositius propers en qualsevol moment, fins i tot quan el Bluetooth estigui desactivat. Es pot utilitzar, per exemple, per millorar les funcions i els serveis basats en la ubicació."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Actualitzacions del sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Actualitzacions del sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versió d\'Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivell de pedaç de seguretat d\'Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versió de banda base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versió de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilació"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adreça Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"No disponible"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Estat"</string>
     <string name="device_status" msgid="267298179806290920">"Estat"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Drets d\'autor"</string>
     <string name="license_title" msgid="936705938435249965">"Llicència"</string>
     <string name="terms_title" msgid="5201471373602628765">"Termes i condicions"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Llicència de WebView del sistema"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Llicències de WebView del sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fons de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Proveïdors d\'imatges per satèl·lit:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Llicències de tercers"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"S\'ha produït un problema en carregar les llicències."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"S\'està carregant…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Ara ja només et queden <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passos per convertir-te en desenvolupador.</item>
+      <item quantity="one">Ara ja només et queda <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> pas per convertir-te en desenvolupador.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Ara ja ets desenvolupador!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"No és necessari, ja ets desenvolupador."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opcions per a desenvolupadors"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opcions de recuperació"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Restabliment de la xarxa, de les aplicacions o del dispositiu"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Restableix la xarxa"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Es restablirà tota la configuració de la xarxa, com ara les opcions següents:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Dades mòbils"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Esborra totes les eSIM del vehicle"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Aquesta acció no cancel·larà el teu pla de servei."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"No es poden restablir les eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Selecciona una xarxa"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Restableix la configuració"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Vols restablir-la?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Vols restablir tota la configuració de la xarxa? Aquesta acció no es pot desfer."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Restableix la configuració"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"S\'ha restablert la configuració de la xarxa"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Restableix les preferències d\'aplicacions"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Amb aquesta acció, es restabliran les preferències dels elements següents:\n\n"<li>"aplicacions desactivades"</li>\n<li>"notificacions d\'aplicacions desactivades"</li>\n<li>"aplicacions predeterminades per a les accions"</li>\n<li>"restriccions de dades en segon pla per a les aplicacions"</li>\n<li>"restriccions de permisos"</li>\n\n"No perdràs les dades de les aplicacions."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Restableix les aplicacions"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"S\'han restablert les preferències d\'aplicacions"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Esborra totes les dades"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Aquesta opció esborrarà totes dades de la unitat principal del vehicle, com ara:\n\n"<li>"el teu Compte de Google"</li>\n<li>"la configuració i les dades d\'aplicacions i del sistema"</li>\n<li>"les aplicacions baixades"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Actualment tens la sessió iniciada als comptes següents:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Hi ha altres usuaris al vehicle."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Restableix el vehicle"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vols restablir-lo?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Vols esborrar tota la informació personal i les aplicacions baixades? Aquesta acció no es pot desfer."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Esborra-ho tot"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"S\'està esborrant"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Espera…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data i hora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Estableix la data i l\'hora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Estableix la data, l\'hora, la zona horària i els formats"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordena per zona horària"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Hora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Afegeix un usuari"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Afegeix un compte"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Suprimeix l\'usuari"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Usuari nou"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Convidat"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrador"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Sessió iniciada com a administrador"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Tots els permisos d\'administrador"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Converteix en administrador"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"L\'usuari podrà suprimir usuaris, inclosos altres administradors, i restablir les dades de fàbrica del sistema."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Aquesta acció no es pot desfer."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Sí, converteix en administrador"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Crea usuaris"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Fes trucades"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Envia SMS amb dades mòbils del cotxe"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instal·la aplicacions noves"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Desinstal·la aplicacions"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Afegeix un usuari"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Usuari nou"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Vols afegir un usuari?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"S\'ha assolit el límit d\'usuaris"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Pots crear fins a <xliff:g id="COUNT">%d</xliff:g> usuaris.</item>
+      <item quantity="one">Només es pot crear 1 usuari.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"No s\'ha pogut crear l\'usuari"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Vols suprimir l\'usuari?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Se suprimiran totes les dades i totes les aplicacions."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"No s\'ha pogut suprimir l\'usuari."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignora"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Torna-ho a provar"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Suprimir l\'últim usuari?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Després de suprimir l\'únic usuari restant d\'aquest cotxe, es crearà un usuari administrador nou."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"S\'esborraran totes les dades, les opcions de configuració i les aplicacions associades a aquest usuari. Hauràs de tornar a configurar el sistema."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Tria un administrador nou"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Hi ha d\'haver com a mínim un administrador. Per suprimir aquest administrador, primer n\'has de triar un altre."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Tria un administrador"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Convidat"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Convidat"</string>
     <string name="user_switch" msgid="6544839750534690781">"Canvia"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Tu (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nom"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"No configurat"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edita el nom d\'usuari"</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuaris"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos concedits a %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Comptes"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Usuari"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Afegeix un compte"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"No s\'ha afegit cap compte"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Comptes de l\'usuari <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronitza les dades automàticament"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permet que les aplicacions actualitzin dades automàticament"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Activar sincronització autom.?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Els canvis que facis als comptes des del web es reflectiran automàticament al dispositiu.\n\nÉs possible que alguns comptes també reflecteixin al web els canvis que hagis fet al telèfon. Així funcionen els comptes de Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Desactivar sincronització autom.?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Et permetrà estalviar dades, però hauràs de sincronitzar cada compte manualment per obtenir la informació recent. No rebràs notificacions quan hi hagi actualitzacions."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informació del compte"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Afegeix un compte"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Afegeix un compte"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Suprimeix el compte"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Vols suprimir el compte?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"En suprimir aquest compte, se\'n suprimiran tots els missatges, els contactes i la resta de dades del dispositiu."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"L\'administrador no permet aquest canvi"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Vols suprimir l\'usuari?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Se suprimiran totes les dades i totes les aplicacions."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"No s\'ha pogut suprimir l\'usuari."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Ho vols tornar a provar?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ignora"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Torna-ho a provar"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Vols afegir un usuari?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"No s\'ha pogut suprimir el compte."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronització del compte"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"La sincronització està activada per a <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g> elements"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"La sincronització està activada per a tots els elements"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"La sincronització està desactivada per a tots els elements"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sincronització desactivada"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Error de sincronització"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Última sincronització: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"S\'està sincronitzant ara…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Toca per sincronitzar ara (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronitza ara"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel·la la sincronització"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"La sincronització té problemes. Tornarà a funcionar aviat."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguretat"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueig de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Cap"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Contrasenya"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Tria tipus de bloqueig"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opcions de bloqueig de pantalla"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opcions de bloqueig"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Introdueix el patró"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirma"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Torna a dibuixar"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Defineix un bloqueig de pantalla"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Tria un PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Tria el teu patró"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Tria una contrasenya"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Tria una contrasenya"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Bloqueig de pantalla actual"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Per seguretat, defineix un patró"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Esborra"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"L\'administrador de TI ha bloquejat les contrasenyes més comunes. Prova una altra contrasenya."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"No es permet cap seqüència de dígits ascendents, descendents ni repetits."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opcions de bloqueig de pantalla"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: fa <xliff:g id="NUM_DAYS">%3$s</xliff:g> dies"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Afegeix dispositiu de confiança"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Disp. de confiança"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dispositius</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dispositiu</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"El <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> desbloquejarà el cotxe quan estigui connectat. Si algú t\'agafa el <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, és possible que puguin accedir-hi"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirma"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Suprimeix el dispositiu de confiança"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Fet"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Fes servir l\'aplicació complementària per configurar un dispositiu de confiança. Un cop configurat, podràs desbloquejar el teu perfil d\'usuari quan el vehicle detecti el telèfon"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Baixa l\'aplicació complementària al telèfon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selecciona <xliff:g id="CAR_NAME">%1$s</xliff:g> al telèfon per vincular els dispositius"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock no pot detectar les funcions de seguretat d\'aquest dispositiu. Per protegir el cotxe, el dispositiu de confiança només podrà mantenir-lo desbloquejat si l\'has desbloquejat tu. El dispositiu de confiança pot mantenir el cotxe desbloquejat quan estigui a prop, encara que l\'agafi algú altre."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Afegeix <xliff:g id="DEVICE_NAME">%1$s</xliff:g> com a dispositiu de confiança"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"El dispositiu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> s\'ha afegit correctament com a dispositiu de confiança"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"No s\'ha pogut inscriure el dispositiu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Per afegir un dispositiu de confiança, cal que defineixis un mètode d\'autenticació a continuació. Si no tens a mà el dispositiu de confiança, caldrà que utilitzis el mètode d\'autenticació per accedir al perfil."</string>
     <string name="forget" msgid="3971143908183848527">"Oblida"</string>
+    <string name="connect" msgid="5861699594602380150">"Connecta"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Desconnecta"</string>
     <string name="delete_button" msgid="5840500432614610850">"Suprimeix"</string>
     <string name="remove_button" msgid="6664656962868194178">"Suprimeix"</string>
     <string name="cancel" msgid="750286395700355455">"Cancel·la"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Surt del mode de demostració"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Aquesta acció suprimirà el compte de demostració i es restabliran les dades de fàbrica del sistema. Es perdran totes les dades d\'usuari."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Surt de la demostració"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"finalitza la configuració"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ara no"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"IGNORA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Aquesta funció no està disponible mentre condueixes."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"No pots afegir usuaris mentre condueixes."</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index f7b6ae5..b688779 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ztlumení obrazovky, dotyková obrazovka, baterie"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ztlumení obrazovky, noc, tónování"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Noční režim"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Síť a internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilní síť"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilní data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Přistupovat k datům přes mobilní síť"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vypnout mobilní data?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Využití dat"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Limit dat a upozornění"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cyklus využití dat aplikacemi"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Nastavit upozornění na data"</string>
+    <string name="data_warning" msgid="116776633806885370">"Upozornění na data"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Nastavit limit dat"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limit dat"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Omezení spotřeby dat"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Jakmile dosáhnete stanoveného limitu dat, řídicí jednotka auta mobilní data vypne.\n\nVyužití dat je měřeno řídicí jednotkou, ale váš operátor ho může měřit jinak, doporučujeme proto nastavit konzervativní limit."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Nastavení a správa přístupových bodů bezdrátové sítě"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Zapínání Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Vypínání Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Načítání seznamu Wi-Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Síť Wi-Fi je vypnutá"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Síť se nepodařilo odstranit"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Připojení k síti se nezdařilo"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Přidat síť"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Síť Wi-Fi je vypnutá"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Připojit"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Heslo"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Zobrazit heslo"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Název sítě"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Zadejte SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Zabezpečení"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Síla signálu"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Síla signálu"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Stav"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Rychlost připojení"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvence"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP adresa"</string>
+    <string name="show_password" msgid="2074628020371139240">"Zobrazit heslo"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Zadejte název sítě"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Zadejte heslo"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"klíč_značky_přístupového_bodu"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Slabý"</item>
-    <item msgid="2032262610626057081">"Dostačující"</item>
-    <item msgid="3859756017461098953">"Dobrý"</item>
-    <item msgid="1521103743353335724">"Vynikající"</item>
+    <item msgid="7683058295076342057">"Slabý"</item>
+    <item msgid="1639222824821660744">"Dostačující"</item>
+    <item msgid="1838705897358163300">"Dobrý"</item>
+    <item msgid="6067166649320533751">"Vynikající"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Zapnout Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Rozhraní Bluetooth deaktivováno"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Podrobnosti sítě"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adresa MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP adresa"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska podsítě"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adresy IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Brána"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Předvolby Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Zapínat Wi-Fi automaticky"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"V dosahu kvalitních uložených sítí, jako je například vaše domácí síť, se Wi-Fi znovu zapne"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nedostupné, protože je vypnuto určování polohy. "<annotation id="link">"Zapnout"</annotation></string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Zapnout vyhledávání Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Zapnout"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Vyhledávání Wi‑Fi je zapnuto"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automaticky přepínat na mobilní data"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Když Wi-Fi nebude mít přístup k internetu, použije se mobilní datové připojení. Za využití dat mohou být účtovány poplatky."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Další informace"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Umožňuje spravovat připojení, nastavit název zařízení a viditelnost"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Počítač"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Náhlavní souprava"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Zobrazovací zařízení"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Sluchátka"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periferní vstupní zařízení"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Spárovaná zařízení"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dostupná zařízení"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Žádná spárovaná zařízení"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Žádná dostupná zařízení"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Spárované zařízení"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Název"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Použít pro"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Změna názvu zařízení Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Zařízení bez názvu"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Spárovaná zařízení"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Spárovat nové zařízení"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Zapne se Bluetooth za účelem spárování"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Odpojit zařízení?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Vozidlo bude odpojeno od zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adresa Bluetooth vozidla: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adresa Bluetooth zařízení: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Název vozidla"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Přejmenovat vozidlo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Přejmenovat zařízení"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Přejmenovat"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dostupná zařízení"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profily"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Požadavek na párování zařízení Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Párovat a připojit"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Párovací kód Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Kód PIN obsahuje písmena nebo symboly"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Zadejte párovací kód a poté stiskněte Return nebo Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Obvykle 0000 nebo 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Požadavek na párování"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Klepnutím spárujete se zařízením <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Jazyky"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Jazyky a zadávání"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klávesnice"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Spravovat klávesnice"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Výstup převodu textu na řeč"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Preferovaný modul"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Aktuální modul"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Rychlost řeči"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Výška"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Resetovat"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Zvuk"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Hlasitost vyzvánění"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Hlasitost navigace"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Média"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Umožňuje nastavit hlasitost hudby a videí"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Budík"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Vyzváněcí tón telefonu"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Výchozí zvuk oznámení"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Výchozí zvuk budíku"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikace a oznámení"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Zobrazit všechny aplikace"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Výchozí aplikace"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informace o aplikaci"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Vynutit ukončení"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Vynutit ukončení?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Vynucené ukončení může způsobit nepředvídatelné chování aplikace."</string>
     <string name="disable_text" msgid="4358165448648990820">"Zakázat"</string>
     <string name="enable_text" msgid="1794971777861881238">"Povolit"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Odinstalovat"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Pokud tuto aplikaci deaktivujete, systém Android a ostatní aplikace nemusejí fungovat správně."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Deaktivovat aplikaci"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Oprávnění"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Verze: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nebyla udělena žádná oprávnění"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nevyžaduje žádná oprávnění"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Využití dat"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Využití dat aplikací"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Vynutit ukončení"</string>
     <string name="computing_size" msgid="5791407621793083965">"Probíhá výpočet…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> další oprávnění</item>
@@ -117,15 +168,39 @@
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dalších oprávnění</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> další oprávnění</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistence a hlasový vstup"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Asistenční aplikace"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Použití textu z obrazovky"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Asistenční aplikace bude mít přístup k obsahu obrazovky v textové podobě"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Použití snímku obrazovky"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Asistenční aplikace bude mít přístup k obrazu na obrazovce"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Služba automatického vyplňování"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Žádné"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Vybráno"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asistent bude moci číst informace o aplikacích používaných v systému, včetně údajů viditelných na obrazovce a přístupných v rámci aplikací."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Zkontrolujte, zda se jedná o důvěryhodnou aplikaci&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Automatické doplňování Google&gt;%1$s&lt;/xliff:g&gt; určuje na základě obsahu obrazovky, co lze automaticky vyplnit."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Přidat službu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Poloha"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedávné žádosti o určení polohy"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Žádné nedávné žádosti o určení polohy"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Oprávnění na úrovni aplikace"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Vyhledávání"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Služby určování polohy"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Vyhledávání Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Povolit aplikacím a službám vyhledávat sítě Wi‑Fi, i když je připojení k sítím Wi‑Fi vypnuté. Tuto funkci lze využít například ke zlepšení funkcí a služeb založených na poloze."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Vyhledávání Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Povolit aplikacím a službám vyhledávat zařízení v okolí kdykoliv, i když je rozhraní Bluetooth vypnuté. Tuto funkci lze využít například ke zlepšení funkcí a služeb založených na poloze."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Systém"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Aktualizace systému"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizace systému"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verze systému Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Úroveň opravy zabezpečení Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verze základního pásma"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verze jádra"</string>
     <string name="build_number" msgid="3997326631001009102">"Číslo sestavení"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adresa Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Není k dispozici"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Stav"</string>
     <string name="device_status" msgid="267298179806290920">"Stav"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Autorská práva"</string>
     <string name="license_title" msgid="936705938435249965">"Licence"</string>
     <string name="terms_title" msgid="5201471373602628765">"Smluvní podmínky"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Systémová licence WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Systémové licence WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Tapety"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Poskytovatelé satelitních snímků:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence třetích stran"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Při načítání licencí došlo k chybě."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Načítání…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="few">Jste <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
+      <item quantity="many">Jste <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
+      <item quantity="other">Jste <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
+      <item quantity="one">Jste <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> klepnutí od toho, abyste se stali vývojářem.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Voilà! Stal se z vás vývojář."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Není potřeba, už jste vývojář."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Pro vývojáře"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Možnosti resetu"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Resetování sítě, aplikací nebo zařízení"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Resetovat síť"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Budou resetovány všechny sítě, včetně těchto:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobilní data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Vymazat všechny eSIM karty ve vozidle"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Váš tarif nebude zrušen."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM karty nelze resetovat"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Vyberte síť"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Resetovat nastavení"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Resetovat?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Chcete resetovat všechna nastavení sítí? Tuto akci nelze vrátit zpět."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Resetovat nastavení"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Nastavení sítí bylo resetováno"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Resetovat předvolby aplikací"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Touto akcí obnovíte všechna nastavení pro:\n\n"<li>"deaktivované aplikace,"</li>\n<li>"deaktivovaná oznámení aplikací,"</li>\n<li>"výchozí aplikace k provádění akcí,"</li>\n<li>"omezení dat na pozadí pro aplikace,"</li>\n<li>"omezení oprávnění."</li>\n\n"O žádná data aplikací nepřijdete."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Resetovat aplikace"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Předvolby aplikací byly resetovány"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Vymazat data (tovární reset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Touto akcí vymažete všechna data z řídicí jednotky vozidla, včetně těchto:\n\n"<li>"váš účet Google,"</li>\n<li>"data a nastavení systému a aplikací,"</li>\n<li>"stažené aplikace."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Jste přihlášeni k následujícím účtům:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"V tomto vozidle jsou další uživatelé."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Resetovat vozidlo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Resetovat?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Chcete vymazat všechny osobní údaje a stažené aplikace? Tuto akci nelze vrátit zpět."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Vymazat vše"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Mazání"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Prosím čekejte..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum a čas"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Nastavení data a času"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Umožňuje nastavit datum, čas, časové pásmo a formát"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Seřadit podle časového pásma"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Čas"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Přidat uživatele"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Přidat účet"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Smazání uživatele"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nový uživatel"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Host"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrátor"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Jste přihlášeni jako administrátor"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Všechna oprávnění administrátora"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Nastavit jako administrátora"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Uživatel bude moci mazat ostatní uživatele (včetně administrátorů) a resetovat systém do továrního nastavení."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Tuto akci nelze vrátit zpět."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ano, nastavit jako administrátora"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Vytvoření nových uživatelů"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefonování"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS přes mobilní data auta"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalace nových aplikací"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Odinstalace aplikací"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Přidat uživatele"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nový uživatel"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Přidat nového uživatele?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Každý nově přidaný uživatel si musí nastavit vlastní prostor."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Každý uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Bylo dosaženo limitu uživatelů"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="few">Lze vytvořit až <xliff:g id="COUNT">%d</xliff:g> uživatele.</item>
+      <item quantity="many">Lze vytvořit až <xliff:g id="COUNT">%d</xliff:g> uživatele.</item>
+      <item quantity="other">Lze vytvořit až <xliff:g id="COUNT">%d</xliff:g> uživatelů.</item>
+      <item quantity="one">Lze vytvořit jen jednoho uživatele.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Nového uživatele se nepodařilo vytvořit"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Smazat tohoto uživatele?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Budou smazány všechny aplikace a data."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Uživatele se nepodařilo smazat."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Zavřít"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Zkusit znovu"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Smazat posledního uživatele?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Po smazání posledního uživatele auta bude vytvořen nový uživatel-administrátor."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Budou smazána všechna data, nastavení a aplikace tohoto uživatele. Systém bude nutné nastavit znovu."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Vyberte nového administrátora"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Potřebujete minimálně jednoho administrátora. Chcete-li tohoto administrátora smazat, nejprve vyberte náhradního."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Vyberte administrátora"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Host"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Host"</string>
     <string name="user_switch" msgid="6544839750534690781">"Přepnout"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vy (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Jméno"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Není nastaveno"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Upravení uživatelského jména"</string>
     <string name="users_list_title" msgid="770764290290240909">"Uživatelé"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Oprávnění uživatele %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Účty"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Uživatel"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Přidat účet"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nebyly přidány žádné účty"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Účty uživatele <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automaticky synchronizovat data"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Nechat aplikace automaticky aktualizovat data"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Zapnout aut. synchronizaci dat?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Změny, které v rámci svých účtů provedete na webu, se automaticky zkopírují do telefonu.\n\nNěkteré účty také automaticky zkopírují změny provedené v telefonu na web. Tímto způsobem funguje například účet Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Vypnout automatickou synchronizaci dat?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Toto nastavení šetří data. Nejnovější informace ale bude třeba získávat pomocí ruční synchronizace každého účtu. Kromě toho nebudete dostávat oznámení o aktualizacích."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informace o účtu"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Přidat účet"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Přidání účtu"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Odstranit účet"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Odstranit účet?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Odebráním účtu smažete ze zařízení také všechny jeho zprávy, kontakty a další data."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Administrátor tuto změnu zakázal"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Odstranit uživatele?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Budou smazány všechny aplikace a data."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Uživatele se nepodařilo odstranit."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Zkusit znovu?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Zavřít"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Zkusit znovu"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Přidat nového uživatele?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Každý nově přidaný uživatel si musí nastavit vlastní prostor."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Každý uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Účet se nepodařilo odstranit."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Synchronizace účtů"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synchronizace je zapnuta u <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g> položek"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synchronizace je zapnuta u všech položek"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synchronizace je vypnuta u všech položek"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synchronizace je VYPNUTA"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Chyba synchronizace"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Poslední synchronizace <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synchronizace..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Klepnutím synchronizujete (poslední synchronizace proběhla <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchronizovat"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Zrušit synchronizaci"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Nastaly potíže se synchronizací. Služba bude brzy obnovena."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Zabezpečení"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zámek obrazovky"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Žádný zámek"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Heslo"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Zvolte typ zámku"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Možnosti zámku obrazovky"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Možnosti zámku"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Zadejte gesto"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Potvrdit"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Nakreslit znovu"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Nastavení zámku obrazovky"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Zvolte kód PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Vyberte gesto"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Zvolte heslo"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Zvolte heslo"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Aktuální zámek obrazovky"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Z bezpečnostních důvodů nastavte gesto"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Vymazat"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Obvyklá hesla jsou blokována administrátorem IT. Použijte jiné heslo."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Posloupnost rostoucích, klesajících nebo opakujících se číslic není povolena."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Možnosti zámku obrazovky"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : před <xliff:g id="NUM_DAYS">%3$s</xliff:g> dny"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Přidat důvěryhodné zařízení"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Důvěryhodná zařízení"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> zařízení</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> zařízení</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> zařízení</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> zařízení</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Když zařízení <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> připojíte, odemkne tohle auto. Pokud vám zařízení <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> někdo vezme, bude mít přístup k tomuto zařízení."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Potvrdit"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Odstranit důvěryhodné zařízení"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Hotovo"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Nastavte důvěryhodné zařízení pomocí doprovodné aplikace. Jakmile bude nastaveno, budete moci odemknout profil uživatele, když vozidlo rozpozná váš telefon"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Stáhněte si do telefonu doprovodnou aplikaci"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. V telefonu vyberte <xliff:g id="CAR_NAME">%1$s</xliff:g> a zařízení spárujte"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Funkci Smart Lock se nepodařilo rozpoznat bezpečnostní prvky tohoto zařízení. Z důvodu ochrany vašeho auta bude důvěryhodné zařízení moci udržovat auto odemknuté až poté, co jej odemknete. Pokud je důvěryhodné zařízení poblíž, může vaše auto udržet odemknuté i v případě, že jej drží někdo jiný."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Přidat <xliff:g id="DEVICE_NAME">%1$s</xliff:g> jako důvěryhodné zařízení"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bylo úspěšně přidáno jako důvěryhodné"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Registrace zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g> se nezdařila"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Když přidáte důvěryhodné zařízení, bude nutné následně nastavit metodu ověření. Pokud důvěryhodné zařízení nemáte u sebe, před zobrazení profilu bude nutné provést ověření."</string>
     <string name="forget" msgid="3971143908183848527">"Odstranit"</string>
+    <string name="connect" msgid="5861699594602380150">"Připojit"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Odpojit"</string>
     <string name="delete_button" msgid="5840500432614610850">"Smazat"</string>
     <string name="remove_button" msgid="6664656962868194178">"Odstranit"</string>
     <string name="cancel" msgid="750286395700355455">"Zrušit"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Ukončení ukázkového režimu"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ukázkový účet bude smazán a systém se resetuje do továrního nastavení. Všechna uživatelská data budou ztracena."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Ukončit ukázku"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"dokončit nastavení"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"teď ne"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ZAVŘÍT"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkce při řízení není dostupná."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Při řízení nelze přidat uživatele."</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 0329f40..599415a 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -29,101 +28,177 @@
     <string name="keywords_display_brightness_level" msgid="3956411572536209195">"nedton skærm, touchskærm, batteri"</string>
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"nedton skærm, touchskærm, batteri"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"nedton skærm, nat, farvetone"</string>
-    <string name="night_mode_tile_label" msgid="6603597795502131664">"Natfunktion"</string>
+    <string name="night_mode_tile_label" msgid="6603597795502131664">"Nattilstand"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Netværk og internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilnetværk"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobildata"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Brug data via mobilnetværk"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vil du deaktivere mobildata?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Dataforbrug"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Advarsel om dataforbrug og datagrænse"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cyklus for appdataforbrug"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Angiv advarsel om dataforbrug"</string>
+    <string name="data_warning" msgid="116776633806885370">"Advarsel om dataforbrug"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Angiv datagrænse"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datagrænse"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Grænse for dataforbrug"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Dit køretøjs hovedenhed deaktiverer mobildata, når den angivne grænse er nået.\n\nEftersom dataforbruget måles af hovedenheden, og dit mobilselskab muligvis beregner forbrug på en anden måde, kan du overveje at angive en lav grænse."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Konfigurer og administrer trådløse adgangspunkter"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Aktiverer Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Deaktiverer Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Indlæser Wi‑Fi-liste"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi er deaktiveret"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Netværket kunne ikke glemmes"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Der kunne ikke oprettes forbindelse til netværket"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Tilføj netværk"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi er deaktiveret"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Forbind"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Adgangskode"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Vis adgangskode"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Netværksnavn"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Angiv SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sikkerhed"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signalstyrke"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signalstyrke"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Linkhastighed"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvens"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-adresse"</string>
+    <string name="show_password" msgid="2074628020371139240">"Vis adgangskode"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Angiv netværksnavn"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Angiv adgangskode"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Dårligt"</item>
-    <item msgid="2032262610626057081">"Rimeligt"</item>
-    <item msgid="3859756017461098953">"Godt"</item>
-    <item msgid="1521103743353335724">"Fremragende"</item>
+    <item msgid="7683058295076342057">"Dårlig"</item>
+    <item msgid="1639222824821660744">"Rimelig"</item>
+    <item msgid="1838705897358163300">"God"</item>
+    <item msgid="6067166649320533751">"Fremragende"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Aktivér Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth er deaktiveret"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Netværksoplysninger"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-adresse"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-adresse"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Undernetmaske"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-adresser"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi-præferencer"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Aktivér Wi-Fi automatisk"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi aktiveres igen ved et netværk af høj kvalitet, f.eks. dit hjemmenetværk"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Ikke muligt, da placering er deaktiveret. Aktivér "<annotation id="link">"placering"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Vil du aktivere Wi‑Fi-scanning?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aktivér"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi-scanning blev aktiveret"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Skift automatisk til mobildata"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Brug mobildata, når du ikke har internetadgang via Wi-Fi. Du skal muligvis betale for dataforbrug."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Få flere oplysninger"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Administrer forbindelser, angiv enhedens navn og synlighed"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Billeder"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Høretelefoner"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Eksterne inputenheder"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Parrede enheder"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Tilgængelige enheder"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Der er ingen parrede enheder"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Der er ingen tilgængelige enheder"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Parret enhed"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Navn"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Brug til"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Skift navn for Bluetooth-enheden"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Enhed uden navn"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Parrede enheder"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Par en ny enhed"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth aktiveres for at oprette forbindelse"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Afbryd forbindelse til enhed?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Dit køretøj afbryder forbindelsen til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Køretøjets Bluetooth-adresse: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Enhedens Bluetooth-adresse: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Navn på køretøj"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Omdøb dette køretøj"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Omdøb enheden"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Omdøb"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Tilgængelige enheder"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiler"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Anmodning om Bluetooth-parring"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Tilknyt og forbind"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-parringskode"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Pinkoden indeholder bogstaver eller symboler"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Angiv parringskoden, og tryk på Enter"</string>
     <string name="bluetooth_pairing_request" msgid="4769675459526556801">"Vil du parre med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
-    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"Giv <xliff:g id="DEVICE_NAME">%1$s</xliff:g> adgang til dine kontaktpersoner og din opkaldshistorik"</string>
+    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"Giv <xliff:g id="DEVICE_NAME">%1$s</xliff:g> adgang til dine kontakter og din opkaldshistorik"</string>
     <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"Du skal muligvis også indtaste denne pinkode på den anden enhed."</string>
     <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"Du skal muligvis også indtaste denne adgangsnøgle på den anden enhed."</string>
     <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"Skal bestå af 16 cifre"</string>
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Normalt 0000 eller 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Anmodning om parring"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tryk for at parre med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Sprog"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Sprog og indtastning"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastatur"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Administrer tastaturer"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Oplæsning"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Foretrukken maskine"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Nuværende maskine"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Talehastighed"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Toneleje"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Nulstil"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Lyd"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Lydstyrke for ringetone"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigationslydstyrke"</string>
     <string name="incoming_call_volume_title" msgid="6972117872424656876">"Ringetone"</string>
-    <string name="notification_volume_title" msgid="6749411263197157876">"Underretning"</string>
+    <string name="notification_volume_title" msgid="6749411263197157876">"Notifikation"</string>
     <string name="media_volume_title" msgid="6697416686272606865">"Medier"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Angiv lydstyrke for musik og videoer"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ringetone ved opkald"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Standardlyd for notifikationer"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Standardlyd for alarmer"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps og notifikationer"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Vis alle apps"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Standardapps"</string>
     <string name="applications_settings" msgid="794261395191035632">"Appinfo"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Tving til at standse"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Vil du tvinge appen til at standse?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Hvis du tvinger en app til at standse, kan det medføre, at den ikke fungerer korrekt."</string>
     <string name="disable_text" msgid="4358165448648990820">"Deaktiver"</string>
     <string name="enable_text" msgid="1794971777861881238">"Aktivér"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Afinstaller"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Hvis du deaktiverer denne app, kan det medføre, at Android-apps og andre apps ikke fungerer korrekt."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Deaktiver appen"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Tilladelser"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Der er ikke givet nogen tilladelser"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Der er ikke anmodet om nogen tilladelser"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Dataforbrug"</string>
-    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Appens dataforbrug"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Tving til at standse"</string>
+    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Dataforbrug fra apps"</string>
     <string name="computing_size" msgid="5791407621793083965">"Beregner…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ekstra tilladelse</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ekstra tilladelser</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistance og indtaling"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assistanceapp"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Brug tekst fra skærmen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Giv assistanceappen adgang til skærmens indhold som tekst"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Brug screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Giv assistanceappen adgang til et billede af skærmen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"AutoFyld-tjenesten"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ingen"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Valgt"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistenten kan læse oplysninger om, hvilke apps der bruges i dit system, herunder oplysninger, der er synlige på din skærm eller tilgængelige i dine apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Sørg for, at du har tillid til denne app&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; anvender indholdet af din skærm til at fastslå, hvad der kan udfyldes automatisk."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Tilføj tjeneste"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Placering"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Seneste placeringsanmodninger"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Der er ingen seneste placeringsanmodninger"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Tilladelser på appniveau"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Scanning"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Placeringstjenester"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi-scanning"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Tillad, at apps og tjenester til enhver tid kan søge efter Wi-Fi-netværk, også selvom Wi-Fi er deaktiveret. Dette kan f.eks. bruges til at forbedre stedbaserede funktioner og tjenester."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-scanning"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Tillad, at apps og tjenester til enhver tid kan søge efter enheder i nærheden, også selvom Bluetooth er deaktiveret. Dette kan f.eks. bruges til at forbedre stedbaserede funktioner og tjenester."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Systemopdateringer"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Systemopdateringer"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Seneste sikkerhedsopdatering i Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basebandversion"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernesystem"</string>
     <string name="build_number" msgid="3997326631001009102">"Buildnummer"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-adresse"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ikke tilgængelig"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Ophavsret"</string>
     <string name="license_title" msgid="936705938435249965">"Licens"</string>
     <string name="terms_title" msgid="5201471373602628765">"Vilkår og betingelser"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licens til webvisning"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"System WebView-licenser"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Baggrunde"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Leverandører af satellitbilleder:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Tredjepartslicenser"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Der er problemer med at indlæse licenserne."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Indlæser…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Du er nu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skridt fra at være udvikler.</item>
+      <item quantity="other">Du er nu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skridt fra at være udvikler.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Nu er du udvikler."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Det behøver du ikke. Du er allerede udvikler."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Indstillinger for udviklere"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Nulstil valg"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Nulstilling af netværk, apps eller enhed"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Nulstil netværk"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Denne handling nulstiller alle netværksindstillingerne, bl.a.:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobildata"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Nulstil alle eSIM-kort til køretøjer"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Dette medfører ikke, at din serviceaftale annulleres."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM-kort kan ikke nulstilles"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Vælg netværk"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Nulstil indstillinger"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Vil du nulstille?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Vil du nulstille alle netværksindstillingerne? Du kan ikke fortryde denne handling."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Nulstil indstillinger"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Netværksindstillingerne er blevet nulstillet"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Nulstil app-præferencer"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Dette vil nulstille alle præferencer for:\n\n "<li>"Deaktiverede apps"</li>\n" "<li>"Deaktiverede appnotifikationer"</li>\n" "<li>"Standardapps til handlinger"</li>\n" "<li>"Begrænsning af baggrundsdata for apps"</li>\n<li>" "</li>"Eventuelle begrænsede tilladelser\n\n Du vil ikke miste nogen appdata."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Nulstil apps"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"App-præferencerne er blevet nulstillet"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Ryd alle data (nulstil)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Denne handling sletter alle data fra dit køretøjs hovedenhed. bl.a.:\n\n"<li>"Din Google-konto"</li>\n<li>"Data og indstillinger for system og apps "</li>\n<li>"Downloadede apps"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Du er i øjeblikket logget ind på følgende konti:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Der er andre brugere på dette køretøj."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Nulstil køretøj"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vil du nulstille?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Vil du slette alle dine personlige oplysninger og downloadede apps? Du kan ikke fortryde denne handling."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Slet alt"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Sletter"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Vent et øjeblik..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Dato og klokkeslæt"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Angiv dato og klokkeslæt"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Angiv dato, klokkeslæt, tidszone og formater"</string>
@@ -165,40 +277,80 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sortér efter tidszone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Dato"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Klokkeslæt"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Tilføj bruger"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Tilføj konto"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Slet bruger"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Ny bruger"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gæst"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Logget ind som administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Alle administratortilladelser"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Tildel administratorrettigheder"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Brugeren vil kunne slette brugere, heriblandt andre administratorer, og gendanne systemets fabriksindstillinger."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Denne handling kan ikke fortrydes."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ja, tildel administratorrettigheder"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Opret nye brugere"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Foretag telefonopkald"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Sms-beskeder via bilens mobildata"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Installer nye apps"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Afinstaller apps"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Tilføj bruger"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Ny bruger"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Tilføj ny bruger?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Når du tilføjer en ny bruger, skal vedkommende konfigurere sit område."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Alle brugere kan opdatere apps for alle andre brugere."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Grænsen for brugere er nået"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Der kan kun oprettes <xliff:g id="COUNT">%d</xliff:g> bruger.</item>
+      <item quantity="other">Der kan kun oprettes <xliff:g id="COUNT">%d</xliff:g> brugere.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Der kunne ikke oprettes en ny bruger"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Vil du slette brugeren?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Alle apps og data slettes."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Brugeren kunne ikke slettes."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Luk"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Prøv igen"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Vil du slette den sidste bruger?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Når den sidste tilbageværende bruger er slettet for denne bil, oprettes en ny administrator."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Alle data, indstillinger og apps, der er knyttet til denne bruger, slettes. Du skal konfigurere systemet igen."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Vælg en ny administrator"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Der skal være mindst én administrator. Hvis du vil slette denne, skal du først vælge en anden."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Vælg en administrator"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gæst"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gæst"</string>
     <string name="user_switch" msgid="6544839750534690781">"Skift"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Dig (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Navn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ikke konfigureret"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Rediger brugernavn"</string>
     <string name="users_list_title" msgid="770764290290240909">"Brugere"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Tilladelser er givet til %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Konti"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Bruger"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Tilføj konto"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Der er ikke tilføjet nogen konti"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Konti for <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Synkroniser data automatisk"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Giv apps tilladelse til at opdatere data automatisk"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Aktivér automatisk datasynk.?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Alle ændringer, som du foretager på dine konti på nettet, kopieres automatisk til din enhed.\n\nDer vil muligvis også være nogle konti, hvor de ændringer, du foretager på telefonen, automatisk kopieres til internettet. Sådan fungerer en Google-konto."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Deaktiver automatisk datasynk.?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Dette vil reducere dataforbruget, men du skal til gengæld synkronisere hver konto manuelt for at hente de nyeste oplysninger. Du vil heller ikke modtage notifikationer om nye opdateringer."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Kontooplysninger"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Tilføj konto"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Tilføj en konto"</string>
     <string name="user_cannot_add_accounts_message" msgid="6775605884544906797">"Begrænsede profiler kan ikke tilføje konti"</string>
     <string name="remove_account_title" msgid="8840386525787836381">"Fjern konto"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Vil du fjerne kontoen?"</string>
-    <string name="really_remove_account_message" msgid="4296769280849579900">"Hvis du fjerner denne konto, slettes alle tilknyttede beskeder, kontaktpersoner og andre data fra enheden."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Din administrator har ikke givet tilladelse til at foretage denne ændring"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Vil du fjerne brugeren?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Alle apps og data slettes."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Brugeren kunne ikke fjernes."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Vil du prøve igen?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Afvis"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Prøv igen"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Tilføj ny bruger?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Når du tilføjer en ny bruger, skal vedkommende konfigurere sit område."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Alle brugere kan opdatere apps for alle andre brugere."</string>
+    <string name="really_remove_account_message" msgid="4296769280849579900">"Hvis du fjerner denne konto, slettes alle tilknyttede beskeder, kontakter og andre data fra enheden."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Kontoen kunne ikke fjernes."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Kontosynkronisering"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synkronisering er aktiveret for <xliff:g id="ID_1">%1$d</xliff:g> ud af <xliff:g id="ID_2">%2$d</xliff:g> elementer"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synkronisering er aktiveret for alle elementer"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synkronisering er deaktiveret for alle elementer"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synkronisering er slået FRA"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Synkroniseringsfejl"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Sidst synkroniseret <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synkroniserer nu…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tryk for at synkronisere nu <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkroniser nu"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annuller synkronisering"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Der er problemer med synkroniseringen i øjeblikket. Den er snart tilbage."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sikkerhed"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skærmlås"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ingen"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Pinkode"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Adgangskode"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Vælg en låsetype"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Valgmuligheder for skærmlås"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Valgmuligheder for låsning"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Angiv dit mønster"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Bekræft"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Tegn igen"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Konfigurer en skærmlås"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Vælg din pinkode"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Vælg dit mønster"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Vælg din adgangskode"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Vælg din adgangskode"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Aktuel skærmlås"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Angiv et mønster af sikkerhedshensyn"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Ryd"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Brug af almindelige adgangskoder er blokeret af din it-administrator. Prøv en anden adgangskode."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Stigende eller faldende talsekvens og gentagne tal er ikke tilladt."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Valgmuligheder for skærmlås"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : For <xliff:g id="NUM_DAYS">%3$s</xliff:g> dage siden"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Tilføj godkendt enhed"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Godkendte enheder"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> enhed</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> enheder</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Din <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> låser bilen op, når der er forbindelse til enheden. Hvis en anden person tager din <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, kan vedkommende muligvis få adgang til denne enhed"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Bekræft"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Fjern godkendt enhed"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Luk"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Brug den medfølgende app til at konfigurere en godkendt enhed. Når du har konfigureret enheden, kan du låse din brugerprofil op, når køretøjet registrerer din telefon."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Download den medfølgende app på din telefon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Vælg <xliff:g id="CAR_NAME">%1$s</xliff:g> på telefonen for at parre enhederne"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock kan ikke registrere sikkerhedsfunktionerne på enheden. Af hensyn til beskyttelsen af din bil kan en godkendt enhed kun holde din bil ulåst, hvis du allerede har låst den op. Din godkendte enhed kan holde din bil ulåst, når den er i nærheden, også selvom den holdes af en anden."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Tilføj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> som godkendt enhed"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> er nu tilføjet som en godkendt enhed"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Tilmeldingen af <xliff:g id="DEVICE_NAME">%1$s</xliff:g> mislykkedes"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Hvis du vil tilføje en godkendt enhed, skal du først angive en godkendelsesmetode. Hvis du ikke har din godkendte enhed med dig, kræves der godkendelse, før du kan få adgang til din profil."</string>
     <string name="forget" msgid="3971143908183848527">"Glem"</string>
+    <string name="connect" msgid="5861699594602380150">"Opret forbindelse"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Afbryd forbindelse"</string>
     <string name="delete_button" msgid="5840500432614610850">"Slet"</string>
     <string name="remove_button" msgid="6664656962868194178">"Fjern"</string>
     <string name="cancel" msgid="750286395700355455">"Annuller"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Luk demotilstand"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Denne handling sletter demokontoen og gendanner systemets fabriksdata. Du mister alle brugerdata."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Luk demotilstand"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"afslut konfiguration"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ikke nu"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"AFVIS"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funktionen er ikke tilgængelig under kørsel."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Du kan ikke tilføje brugere under kørsel."</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 3ce1ab3..e48913e 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -22,7 +21,7 @@
     <string name="more_settings_label" msgid="3867559443480110616">"Mehr"</string>
     <string name="display_settings" msgid="5325515247739279185">"Display"</string>
     <string name="brightness" msgid="2919605130898772866">"Helligkeit"</string>
-    <string name="auto_brightness_title" msgid="9124647862844666581">"Adaptive Helligkeit"</string>
+    <string name="auto_brightness_title" msgid="9124647862844666581">"Automatische Helligkeit"</string>
     <string name="auto_brightness_summary" msgid="4741887033140384352">"Helligkeit an Lichtverhältnisse anpassen"</string>
     <string name="condition_night_display_title" msgid="3777509730126972675">"Nachtlicht ist eingeschaltet"</string>
     <string name="keywords_display" msgid="3978416985146943922">"bildschirm, display, touchscreen"</string>
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"display dimmen, bildschirm dimmen, touchscreen, akku"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"display dimmen, bildschirm dimmen, nacht, tönung"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nachtmodus"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Netzwerk &amp; Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilfunknetz"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile Daten"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Datenzugriff über Mobilfunknetz"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobile Daten deaktivieren?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Datennutzung"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Datenwarnung &amp; Datenlimit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Datennutzungszyklus der App"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Datenwarnung festlegen"</string>
+    <string name="data_warning" msgid="116776633806885370">"Datenwarnung"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Datenlimit festlegen"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datenlimit"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Datennutzung begrenzen"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Die Haupteinheit deines Fahrzeugs deaktiviert mobile Daten, sobald das von dir festgelegte Limit erreicht wurde.\n\nDa die Datennutzung von der Haupteinheit gemessen wird und dein Mobilfunkanbieter sie möglicherweise anders berechnet, solltest du von einem eher etwas niedrigeren Limit ausgehen."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"WLAN"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"WLAN-Zugangspunkte festlegen &amp; verwalten"</string>
     <string name="wifi_starting" msgid="473253087503153167">"WLAN wird aktiviert…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"WLAN wird deaktiviert…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"WLAN-Liste wird geladen"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"WLAN deaktiviert"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Netzwerk konnte nicht entfernt werden"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Netzwerkverbindung konnte nicht hergestellt werden"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"WLAN hinzufügen"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"WLAN deaktiviert"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Verbinden"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Passwort"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Passwort anzeigen"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Netzwerkname"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID eingeben"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sicherheit"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signalstärke"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signalstärke"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Verbindungsgeschwindigkeit"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequenz"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-Adresse"</string>
+    <string name="show_password" msgid="2074628020371139240">"Passwort anzeigen"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Netzwerkname eingeben"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Passwort eingeben"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Schwach"</item>
-    <item msgid="2032262610626057081">"Ausreichend"</item>
-    <item msgid="3859756017461098953">"Gut"</item>
-    <item msgid="1521103743353335724">"Sehr gut"</item>
+    <item msgid="7683058295076342057">"Schwach"</item>
+    <item msgid="1639222824821660744">"Ausreichend"</item>
+    <item msgid="1838705897358163300">"Gut"</item>
+    <item msgid="6067166649320533751">"Sehr gut"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth aktivieren"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth deaktiviert"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbit/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Netzwerkdetails"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-Adresse"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-Adresse"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnetzmaske"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-Adressen"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"WLAN-Einstellungen"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"WLAN automatisch aktivieren"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"WLAN wird in der Nähe von leistungsstarken gespeicherten Netzwerken wie deinem Heimnetzwerk automatisch aktiviert"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nicht verfügbar. Du musst erst "<annotation id="link">"Standort"</annotation>" aktivieren."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"WLAN-Suche aktivieren?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aktivieren"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"WLAN-Suche aktiviert"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatisch zur mobilen Datennutzung wechseln"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wenn Internetzugriff über WLAN nicht möglich ist, mobile Daten verwenden. Es können Gebühren für die Datennutzung anfallen."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Weitere Informationen"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Verbindungen, Gerätename &amp; Sichtbarkeit verwalten"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Smartphone"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Bildverarbeitung"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Kopfhörer"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Eingabeperipherie"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Gekoppelte Geräte"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Verfügbare Geräte"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Keine gekoppelten Geräte"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Keine verfügbaren Geräte"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Gekoppeltes Gerät"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Name"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Nutzen für"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Name des Bluetooth-Geräts ändern"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Unbenanntes Gerät"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Gekoppelte Geräte"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Neues Gerät koppeln"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth wird aktiviert, um das Koppeln zu ermöglichen"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Geräteverbindung trennen?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Die Verbindung deines Fahrzeugs mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wird getrennt."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth-Adresse des Fahrzeugs: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth-Adresse des Geräts: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Name des Fahrzeugs"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Dieses Fahrzeug umbenennen"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Gerät umbenennen"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Umbenennen"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Verfügbare Geräte"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profile"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Anfrage zur Bluetooth-Kopplung"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Koppeln &amp; verbinden"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-Kopplungscode"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN enthält Buchstaben oder Symbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Gib den Kopplungscode ein und tippe dann auf die Eingabetaste"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"In der Regel 0000 oder 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Kopplungsanfrage"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Zum Koppeln mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> tippen."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Sprachen"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Sprachen &amp; Eingabe"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastatur"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Tastaturen verwalten"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Sprachausgabe"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Bevorzugtes Modul"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Aktuelles Modul"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Sprechgeschwindigkeit"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Stimmlage"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Zurücksetzen"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Ton"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Klingeltonlautstärke"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Lautstärke für Navigation"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Medien"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Lautstärke für Musik und Videos festlegen"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Wecker"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Klingelton"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Standard-Benachrichtigungston"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Standard-Weckton"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps &amp; Benachrichtigungen"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Alle Apps anzeigen"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Standard-Apps"</string>
     <string name="applications_settings" msgid="794261395191035632">"App-Info"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Beenden erzwingen"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Beenden erzwingen?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Das Beenden der App zu erzwingen kann zu unerwünschtem Verhalten führen."</string>
     <string name="disable_text" msgid="4358165448648990820">"Deaktivieren"</string>
     <string name="enable_text" msgid="1794971777861881238">"Aktivieren"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Deinstallieren"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Bei Deaktivierung dieser App funktionieren Android und andere Apps möglicherweise nicht mehr ordnungsgemäß."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"App deaktivieren"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Berechtigungen"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Keine Berechtigungen gewährt"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Keine Berechtigungen angefordert"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Datennutzung"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Datennutzung durch Apps"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Beenden erzwingen"</string>
     <string name="computing_size" msgid="5791407621793083965">"Berechnung läuft…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"> zusätzliche Berechtigungen</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> zusätzliche Berechtigung</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistent &amp; Spracheingabe"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assistent-App"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Text auf Bildschirm verwenden"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Der Assistent-App den Zugriff auf den Bildschirminhalt als Text gestatten"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Screenshot verwenden"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Der Assistent-App den Zugriff auf eine Momentaufnahme deines Bildschirminhalts (Screenshot) gestatten"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"AutoFill-Dienst"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Keine"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Ausgewählt"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Der Assistent kann Informationen zu Apps abrufen, die du auf deinem System verwendest, einschließlich Informationen, die auf deinem Bildschirm angezeigt werden oder die in Apps zugänglich sind."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Sorge dafür, dass dieser App vertraut wird.&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google AutoFill&gt;%1$s&lt;/xliff:g&gt; entscheidet dann anhand der Inhalte auf dem Display, welche Informationen automatisch ausgefüllt werden können."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Dienst hinzufügen"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Standort"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Letzte Standortanfragen"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Keine letzten Standortanfragen"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Berechtigungen auf App-Ebene"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Suche"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Standortdienste"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"WLAN-Suche"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Apps und Dienste dürfen immer nach WLANs suchen, auch wenn die WLAN-Funktion deaktiviert ist. Dadurch können beispielsweise standortbasierte Funktionen und Dienste verbessert werden."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-Suche"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Apps und Dienste dürfen immer nach Geräten in der Nähe suchen, auch wenn Bluetooth deaktiviert ist. Dadurch können beispielsweise standortbasierte Funktionen und Dienste verbessert werden."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Systemupdates"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Systemupdates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-Version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Stand der Sicherheitsupdates"</string>
     <string name="model_info" msgid="4966408071657934452">"Modell"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-Version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-Version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build-Nummer"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-Adresse"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nicht verfügbar"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Urheberrecht"</string>
     <string name="license_title" msgid="936705938435249965">"Lizenz"</string>
     <string name="terms_title" msgid="5201471373602628765">"Nutzungsbedingungen"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"System-WebView-Lizenz"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"System-WebView-Lizenzen"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Hintergründe"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellitenbilder bereitgestellt von:\n© 2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Drittlizenzen"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Beim Laden der Lizenzen ist ein Problem aufgetreten."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Wird geladen…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Nur noch <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> Schritte und du bist Entwickler.</item>
+      <item quantity="one">Nur noch <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> Schritt und bist du Entwickler.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Du bist jetzt Entwickler!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Okay, du bist bereits Entwickler."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Entwickleroptionen"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Optionen zum Zurücksetzen"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Netzwerk, Apps oder Gerät zurücksetzen"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Netzwerk zurücksetzen"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Hierdurch werden alle Netzwerkeinstellungen zurückgesetzt, einschließlich:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"WLAN"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobile Daten"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Alle eSIMs des Fahrzeugs löschen"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Dein Mobilfunkvertrag wird dadurch nicht gekündigt."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIMs können nicht zurückgesetzt werden"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Netzwerk auswählen"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Einstellungen zurücksetzen"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Zurücksetzen?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Alle Netzwerkeinstellungen zurücksetzen? Diese Aktion kann nicht rückgängig gemacht werden."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Einstellungen zurücksetzen"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Die Netzwerkeinstellungen wurden zurückgesetzt"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"App-Einstellungen zurücksetzen"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Hierdurch werden alle Einstellungen zurückgesetzt für:\n\n"<li>"Deaktivierte Apps"</li>\n<li>"Benachrichtigungen zu deaktivierten Apps"</li>\n<li>"Standardanwendungen für Aktionen"</li>\n<li>"Einschränkungen der Hintergrunddaten für Apps"</li>\n<li>"Jegliche Zugriffsbeschränkungen"</li>\n\n"Alle App-Daten bleiben erhalten."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Apps zurücksetzen"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"App-Einstellungen wurden zurückgesetzt"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Alle Daten löschen (Werkseinstellungen)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Hierdurch werden alle Daten von der Haupteinheit deines Fahrzeugs gelöscht, u. a.:\n\n"<li>"Dein Google-Konto"</li>\n<li>"System- und App-Daten sowie entsprechende Einstellungen"</li>\n<li>"Heruntergeladene Apps"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Du bist derzeit in folgenden Konten angemeldet:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Auf der Haupteinheit dieses Fahrzeugs sind andere Nutzer vorhanden."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Fahrzeug zurücksetzen"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Zurücksetzen?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Alle personenbezogenen Daten und heruntergeladenen Apps löschen? Diese Aktion kann nicht rückgängig gemacht werden!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Alles löschen"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Wird gelöscht"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Bitte warten…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum &amp; Uhrzeit"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Datum und Uhrzeit festlegen"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Datum, Uhrzeit, Zeitzone &amp; Formate festlegen"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Nach Zeitzone sortieren"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Uhrzeit"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Nutzer hinzufügen"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Konto hinzufügen"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Nutzer löschen"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Neuer Nutzer"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gast"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Als Administrator angemeldet"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Alle Administrator-Berechtigungen"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Als Administrator festlegen"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Der Nutzer kann dann andere Nutzer einschließlich anderer Administratoren löschen und das System auf die Werkseinstellungen zurücksetzen."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Diese Aktion lässt sich nicht rückgängig machen."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ja, als Administrator festlegen"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Neue Nutzer erstellen"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Anrufe tätigen"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS über mobile Daten des Autos senden und empfangen"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Neue Apps installieren"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Apps deinstallieren"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Nutzer hinzufügen"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Neuer Nutzer"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Neuen Nutzer hinzufügen?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Wenn du einen neuen Nutzer hinzufügst, muss dieser seinen Bereich einrichten."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Jeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Nutzerlimit erreicht"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Du kannst bis zu <xliff:g id="COUNT">%d</xliff:g> Nutzer erstellen.</item>
+      <item quantity="one">Es kann nur ein Nutzer erstellt werden.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Nutzer konnte nicht erstellt werden"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Diesen Nutzer löschen?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Sämtliche Apps und Daten werden gelöscht."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Der Nutzer konnte nicht gelöscht werden."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Schließen"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Noch einmal versuchen"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Letzten Nutzer löschen?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Nachdem du den letzten Nutzer für dieses Auto gelöscht hast, wird ein neuer Administrator erstellt."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Sämtliche Daten, Einstellungen und Apps, die mit diesem Nutzer zugeordnet sind, werden gelöscht. Du musst das System dann neu einrichten."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Neuen Administrator auswählen"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Du benötigst mindestens einen Administrator. Damit diesen Administrator löschen kannst, musst du zuerst einen Ersatz auswählen."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Administrator auswählen"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gast"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gast"</string>
     <string name="user_switch" msgid="6544839750534690781">"Wechseln"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Du (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nicht eingerichtet"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Nutzername bearbeiten"</string>
     <string name="users_list_title" msgid="770764290290240909">"Nutzer"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Berechtigungen für %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Konten"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Nutzer"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Konto hinzufügen"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Keine Konten hinzugefügt"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Konten für <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Daten automatisch synchronisieren"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Apps die automatische Aktualisierung von Daten erlauben"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Automatische Synchronisierung aktivieren?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Änderungen, die du im Web an deinen Konten vornimmst, werden automatisch auf deinen Gerät übernommen.\n\nBREAK_0BREAK_1Für einige Konten werden eventuell auch Änderungen, die du auf deinem Telefon vornimmst, im Web übernommen. Das ist die übliche Synchronisierungsfunktion eines Google-Kontos."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Automatische Synchronisierung deaktivieren?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"So reduzierst du den Datenverbrauch, musst jedoch jedes einzelne Konto manuell synchronisieren, um neue Informationen abzurufen. Außerdem erhältst du keine Benachrichtigung über Updates mehr."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Kontoinformationen"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Konto hinzufügen"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Konto hinzufügen"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Konto entfernen"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Konto entfernen?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Durch das Entfernen dieses Kontos werden alle zugehörigen Nachrichten, Kontakte und andere Daten vom Gerät gelöscht!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Dein Administrator lässt diese Änderung nicht zu"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Diesen Nutzer entfernen?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Sämtliche Apps und Daten werden gelöscht."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Entfernen von Nutzer fehlgeschlagen."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Wiederholen?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Schließen"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Wiederholen"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Neuen Nutzer hinzufügen?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Wenn du einen neuen Nutzer hinzufügst, muss dieser seinen Bereich einrichten."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Jeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Das Konto konnte nicht entfernt werden."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Kontosynchronisierung"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synchronisierung für <xliff:g id="ID_1">%1$d</xliff:g> von <xliff:g id="ID_2">%2$d</xliff:g> Elementen aktiviert"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synchronisierung für alle Elemente aktiviert"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synchronisierung für alle Elemente deaktiviert"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synchronisierung: AUS"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Synchronisierungsfehler"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Zuletzt synchronisiert: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Wird synchronisiert…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tippen, um jetzt zu synchronisieren (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Jetzt synchronisieren"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Synchronisierung abbrechen"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Bei der Synchronisierung treten momentan Probleme auf. Sie wird bald fortgesetzt."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sicherheit"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Displaysperre"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Keine"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Passwort"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Art der Sperre auswählen"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Optionen für die Displaysperre"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Sperroptionen"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Muster eingeben"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Bestätigen"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Neu zeichnen"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Displaysperre einrichten"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN wählen"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Muster wählen"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Passwort ändern"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Passwort festlegen"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Aktuelle Displaysperre"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Richte zur Sicherheit ein Muster ein"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Löschen"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Dein IT-Administrator hat die Verwendung allzu häufiger Passwörter blockiert. Versuch es mit einem anderen Passwort."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Aufsteigende, absteigende oder sich wiederholende Ziffernfolgen sind unzulässig."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Optionen für die Displaysperre"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: vor <xliff:g id="NUM_DAYS">%3$s</xliff:g> Tagen"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Vertrauenswürdiges Gerät hinzufügen"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Vertrauenswürdige Geräte"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> Geräte</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> Gerät</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> entsperrt dieses Auto, wenn eine Verbindung besteht. Wenn dein <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> in die Hände einer anderen Person gelangt, kann diese möglicherweise auf das Gerät zugreifen"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Bestätigen"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Vertrauenswürdiges Gerät entfernen"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Fertig"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Verwende die Companion App, um ein vertrauenswürdiges Gerät einzurichten. Danach kannst du dein Nutzerprofil entsperren, wenn dein Smartphone vom Fahrzeug erkannt wird"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Lade die Companion App auf dein Smartphone herunter"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2 Wähle auf deinem Smartphone \"<xliff:g id="CAR_NAME">%1$s</xliff:g>\" aus, um die Geräte zu koppeln"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock erkennt die Sicherheitsfunktionen dieses Geräts nicht. Zum Schutz deines Autos kann das vertrauenswürdige Gerät nur dann dafür sorgen, dass dein Auto entsperrt bleibt, wenn du es vorher entsperrt hast. Mit dem vertrauenswürdigen Gerät bleibt dein Auto entsperrt, solange sich das Gerät in der Nähe befindet, und zwar auch dann, wenn eine andere Person es in der Hand hält."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> als vertrauenswürdig einstufen"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> wurde als vertrauenswürdiges Gerät hinzugefügt"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Anmeldung von <xliff:g id="DEVICE_NAME">%1$s</xliff:g> fehlgeschlagen"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Wenn du ein vertrauenswürdiges Gerät hinzufügst, musst du danach eine Authentifizierungsmethode festlegen. Diese wird benötigt, um auf dein Konto zuzugreifen, wenn du dein vertrauenswürdiges Gerät nicht dabei hast."</string>
     <string name="forget" msgid="3971143908183848527">"Entfernen"</string>
+    <string name="connect" msgid="5861699594602380150">"Verbinden"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Trennen"</string>
     <string name="delete_button" msgid="5840500432614610850">"Löschen"</string>
     <string name="remove_button" msgid="6664656962868194178">"Entfernen"</string>
     <string name="cancel" msgid="750286395700355455">"Abbrechen"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Demomodus beenden"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Dadurch wird das Demokonto gelöscht und das System auf die Werkseinstellungen zurückgesetzt. Dabei gehen alle Nutzerdaten verloren."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Demo beenden"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"Einrichtung abschließen"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"jetzt nicht"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"SCHLIEẞEN"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funktion während der Fahrt nicht verfügbar."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Während der Fahrt kann kein Nutzer hinzugefügt werden."</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 93238c1..2197bba 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"μείωση φωτεινότητας οθόνης, οθόνη αφής, μπαταρία"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"μείωση φωτεινότητας οθόνης, νυχτερινή λειτουργία, απόχρωση"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Νυχτερινή λειτουργία"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Δίκτυο και διαδίκτυο"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Δίκτυο κινητής τηλεφωνίας"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Δεδομένα κινητής τηλεφωνίας"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Πρόσβαση σε δεδομένα μέσω δικτύου κινητής τηλεφ."</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Απενεργοποίηση δεδομένων κινητής τηλεφωνίας;"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Χρήση δεδομένων"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Προειδοποίηση και όριο δεδομένων"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Κύκλος χρήσης δεδομένων εφαρμογής"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Ορισμός προειδοπ. δεδομένων"</string>
+    <string name="data_warning" msgid="116776633806885370">"Προειδοποίηση δεδομένων"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Ορισμός ορίου δεδομένων"</string>
+    <string name="data_limit" msgid="227338836292511425">"Όριο δεδομένων"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Περιορισμός χρήσης δεδομένων"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Η κεντρική μονάδα του οχήματός σας θα απενεργοποιήσει τα δεδομένα κινητής τηλεφωνίας μόλις συμπληρωθεί το καθορισμένο όριο.\n\nΕπειδή η χρήση δεδομένων μετράται από την κεντρική μονάδα σας και ενδέχεται η εταιρεία κινητής τηλεφωνίας να την υπολογίζει με διαφορετικό τρόπο, σκεφτείτε το ενδεχόμενο να ορίσετε ένα συντηρητικό όριο."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Ορισμός και διαχείριση ασύρματων σημείων πρόσβασης"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Ενεργοποίηση Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Απενεργοποίηση Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Γίνεται φόρτωση της λίστας Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Το Wi‑Fi είναι απενεργοποιημένο"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Αποτυχία κατάργησης δικτύου από τη μνήμη"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Αποτυχία σύνδεσης στο δίκτυο"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Προσθήκη δικτύου"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Το Wi‑Fi είναι απενεργοποιημένο"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Σύνδεση"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Κωδικός πρόσβασης"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Εμφάνιση κωδικού πρόσβασης"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Όνομα δικτύου"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Εισαγάγετε το SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Ασφάλεια"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Ισχύ σήματος"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Ισχύς σήματος"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Κατάσταση"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Ταχύτητα σύνδεσης"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Συχνότητα"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Διεύθυνση IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Εμφάνιση κωδικού πρόσβασης"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Εισαγωγή ονόματος δικτύου"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Εισαγωγή κωδικού πρόσβασης"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Κακό"</item>
-    <item msgid="2032262610626057081">"Επαρκές"</item>
-    <item msgid="3859756017461098953">"Καλό"</item>
-    <item msgid="1521103743353335724">"Εξαιρετικό"</item>
+    <item msgid="7683058295076342057">"Κακό"</item>
+    <item msgid="1639222824821660744">"Επαρκές"</item>
+    <item msgid="1838705897358163300">"Καλό"</item>
+    <item msgid="6067166649320533751">"Εξαιρετικό"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Ενεργοποίηση Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Το Bluetooth απενεργοποιήθηκε"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Λεπτομέρειες δικτύου"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Διεύθυνση MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Διεύθυνση IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Μάσκα υποδικτύου"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Διευθύνσεις IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Πύλη"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Προτιμήσεις Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Αυτόματη ενεργοποίηση Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Το Wi‑Fi θα ενεργ. ξανά κοντά σε αποθ. δίκτυα υψηλής ποιότ. όπως το οικιακό δίκτυο"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Μη διαθέσ. επειδή η τοποθ. είναι απεν. Ενεργ. την "<annotation id="link">"τοποθεσία"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Ενεργοποίηση σάρωσης Wi‑Fi;"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Ενεργοποίηση"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Ενεργοποιήθηκε η σάρωση Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Αυτόματη εναλλαγή σε δεδομένα κινητής τηλεφωνίας"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Χρησιμοποιήστε δεδομένα κινητής τηλεφωνίας όταν το Wi‑Fi δεν έχει πρόσβαση στο διαδίκτυο. Μπορεί να ισχύουν χρεώσεις χρήσης δεδομένων."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Μάθετε περισσότερα"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Διαχείριση συνδέσεων, ορισμός ονόματος συσκευής και δυνατότητα ανακάλυψης"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Υπολογιστής"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Ακουστικά"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Τηλέφωνο"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Συσκευή απεικόνισης"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Ακουστικά"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Περιφερειακό εισόδου"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Συσκευές σε σύζευξη"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Διαθέσιμες συσκευές"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Δεν υπάρχουν συσκευές σε σύζευξη"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Δεν υπάρχουν διαθέσιμες συσκευές"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Συσκευή σε σύζευξη"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Όνομα"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Χρήση για"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Αλλαγή ονόματος συσκευής Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Ανώνυμη συσκευή"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Συσκευές σε σύζευξη"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Σύζευξη νέας συσκευής"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Το Bluetooth θα ενεργοποιηθεί για σύζευξη"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Αποσύνδεση συσκευής;"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Το όχημά σας θα αποσυνδεθεί από τη συσκευή <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Διεύθυνση Bluetooth οχήματος: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Διεύθυνση Bluetooth συσκευής: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"\'Όνομα οχήματος"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Μετονομασία αυτού του οχήματος"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Μετονομασία συσκευής"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Μετονομασία"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Διαθέσιμες συσκευές"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Προφίλ"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Αίτημα σύζευξης Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Σύζευξη και σύνδεση"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Κωδικός σύζευξης Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Το PIN περιέχει γράμματα ή σύμβολα"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Πληκτρολογήστε τον κωδικό σύζευξης και, στη συνέχεια, πατήστε Επιστροφή ή Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Συνήθως 0000 ή 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Αίτημα σύζευξης"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Πατήστε για σύζευξη με τη συσκευή <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Γλώσσες"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Γλώσσες και είσοδος"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Πληκτρολόγιο"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Διαχείριση πληκτρολογίων"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Έξοδος κειμένου σε ομιλία"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Προτιμώμενη μηχανή"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Τρέχουσα μηχανή"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Ταχύτητα ομιλίας"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Τόνος"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Επαναφορά"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Ήχος"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Ένταση ήχου κουδουνίσματος"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Ένταση ήχου πλοήγησης"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Πολυμέσα"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Ορισμός έντασης ήχου για μουσική και βίντεο"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Ξυπνητήρι"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ήχος κλήσης τηλεφώνου"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Προεπιλεγμ. ήχος ειδοποίησης"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Προεπιλεγμ. ήχος ξυπνητηριού"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Εφαρμογές και ειδοποιήσεις"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Εμφάνιση όλων των εφαρμογών"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Προεπιλεγμένες εφαρμογές"</string>
     <string name="applications_settings" msgid="794261395191035632">"Πληροφορίες εφαρμογής"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Αναγκαστική διακοπή"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Αναγκαστική διακοπή;"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Εάν επιβάλετε τη διακοπή μιας εφαρμογής, ενδέχεται να μην λειτουργήσει σωστά."</string>
     <string name="disable_text" msgid="4358165448648990820">"Απενεργοποίηση"</string>
     <string name="enable_text" msgid="1794971777861881238">"Ενεργοποίηση"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Απεγκατάσταση"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Εάν απενεργοποιήσετε αυτήν την εφαρμογή, η λειτουργία του Android και άλλων εφαρμογών ενδέχεται να μην είναι η αναμενόμενη."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Απενεργοποίηση εφαρμογής"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Δικαιώματα"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Έκδοση: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Δεν έχουν εκχωρηθεί δικαιώματα"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Δεν ζητήθηκαν δικαιώματα"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Χρήση δεδομένων"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Χρήση δεδομένων εφαρμογών"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Αναγκαστική διακοπή"</string>
     <string name="computing_size" msgid="5791407621793083965">"Υπολογισμός…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> επιπλέον δικαιώματα</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> επιπλέον δικαίωμα</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Βοήθεια και φωνητικές εντολές"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Εφαρμογή υποβοήθειας"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Χρήση κειμένου από την οθόνη"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Να επιτρέπεται στην εφαρμογή υποβοήθειας να έχει πρόσβαση στο περιεχόμενο της οθόνης όπως το κείμενο."</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Χρήση στιγμιότυπου οθόνης"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Να επιτρέπεται στην εφαρμογή υποβοήθειας να έχει πρόσβαση σε μια εικόνα στην οθόνη"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Υπηρεσία αυτόματης συμπλήρωσης"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Καμία"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Επιλέχτηκε"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Ο Βοηθός θα μπορεί να διαβάσει πληροφορίες σχετικά με τις εφαρμογές που χρησιμοποιούνται στο σύστημά σας, συμπεριλαμβανομένων πληροφοριών που είναι ορατές στην οθόνη σας ή διαθέσιμες εντός των εφαρμογών."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Βεβαιωθείτε ότι εμπιστεύεστε αυτήν την εφαρμογή&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; χρησιμοποιεί το περιεχόμενο της οθόνης σας για να διαπιστώσει τι μπορεί να συμπληρωθεί αυτόματα."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Προσθήκη υπηρεσίας"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Τοποθεσία"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Πρόσφατα αιτήματα τοποθεσίας"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Δεν υπάρχουν πρόσφατα αιτήματα τοποθεσίας"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Άδειες επιπέδου εφαρμογής"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Σάρωση"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Υπηρεσίες τοποθεσίας"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Σάρωση Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Επιτρέψτε σε εφαρμογές και υπηρεσίες να εκτελούν σάρωση για δίκτυα Wi‑Fi, ακόμα και όταν το Wi‑Fi είναι ανενεργό. Η σάρωση μπορεί να χρησιμοποιηθεί, για παράδειγμα, για τη βελτίωση λειτουργιών και υπηρεσιών που εκτελούνται βάσει τοποθεσίας."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Σάρωση Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Επιτρέψτε σε εφαρμογές/υπηρεσίες να κάνουν σάρωση για κοντινές συσκευές, ακόμα και όταν το Bluetooth είναι ανενεργό. Η σάρωση μπορεί να χρησιμοποιηθεί, για παράδειγμα, για τη βελτίωση λειτουργιών/υπηρεσιών που εκτελούνται βάσει τοποθεσίας."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Σύστημα"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Ενημερώσεις συστήματος"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Ενημερώσεις συστήματος"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Έκδοση Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Επίπεδο ενημέρωσης κώδικα ασφαλείας Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Μοντέλο"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Έκδοση βασικού φάσματος"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Έκδοση Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Αριθμός έκδοσης"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Διεύθυνση Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Μη διαθέσιμο"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Κατάσταση"</string>
     <string name="device_status" msgid="267298179806290920">"Κατάσταση"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Πνευματικά δικαιώματα"</string>
     <string name="license_title" msgid="936705938435249965">"Άδεια"</string>
     <string name="terms_title" msgid="5201471373602628765">"Όροι και προϋποθέσεις"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Άδεια WebView συστήματος"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Άδειες συστήμ. Προβολής στον ιστό"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ταπετσαρίες"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Πηγές δορυφορικών εικόνων:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Άδειες τρίτου μέρους"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Παρουσιάστηκε κάποιο πρόβλημα κατά τη φόρτωση των αδειών."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Φόρτωση…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Απομένουν <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> βήματα για να γίνετε προγραμματιστής.</item>
+      <item quantity="one">Απομένει <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> βήμα για να γίνετε προγραμματιστής.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Είστε πλέον προγραμματιστής!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Δεν χρειάζεται, είστε ήδη προγραμματιστής."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Επιλογές για προγραμματιστές"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Επαναφορά επιλογών"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Επαναφορά δικτύου, εφαρμογών ή συσκευής"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Επαναφορά δικτύου"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Με αυτήν την ενέργεια, θα γίνει επαναφορά όλων των ρυθμίσεων δικτύου, συμπεριλαμβανομένων των εξής:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Δεδομένα κινητής τηλεφωνίας"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Διαγραφή όλων των eSIM του οχήματος"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Με αυτήν την ενέργεια, δεν θα ακυρωθεί το πρόγραμμα υπηρεσίας σας."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Δεν είναι δυνατή η επαναφορά eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Επιλογή δικτύου"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Επαναφορά ρυθμίσεων"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Να γίνει επαναφορά;"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Να γίνει επαναφορά όλων των ρυθμίσεων δικτύου; Δεν είναι δυνατή η αναίρεση αυτής της ενέργειας!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Επαναφορά ρυθμίσεων"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Έγινε επαναφορά των ρυθμίσεων δικτύου"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Επαναφορά προτιμήσεων εφαρμογών"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Με αυτήν την ενέργεια, θα γίνει επαναφορά όλων των προτιμήσεων για:\n\n"<li>"Απενεργοποιημένες εφαρμογές"</li>\n<li>"Απενεργοποιημένες ειδοποιήσεις εφαρμογών"</li>\n<li>"Προεπιλεγμένες εφαρμογές για ενέργειες"</li>\n<li>"Περιορισμούς δεδομένων παρασκηνίου για εφαρμογές"</li>\n<li>"Τυχόν περιορισμούς αδειών"</li>\n\n"Δεν θα χάσετε τυχόν δεδομένα εφαρμογών."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Επαναφορά εφαρμογών"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Έγινε επαναφορά των προτιμήσεων των εφαρμογών"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Διαγραφή δεδομένων (Επαν. εργοστ. ρυθμ.)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Αυτή η ενέργεια θα διαγράψει όλα τα δεδομένα από την κεντρική μονάδα του οχήματος, συμπεριλαμβανομένων:\n\n"<li>"Του Λογαριασμού σας Google"</li>\n<li>"Των δεδομένων και των ρυθμίσεων του συστήματος και των εφαρμογών"</li>\n<li>"Των εφαρμογών που έχετε κατεβάσει"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Αυτήν τη στιγμή είστε συνδεδεμένοι στους παρακάτω λογαριασμούς:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Υπάρχουν άλλοι χρήστες σε αυτό το όχημα."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Επαναφορά οχήματος"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Να γίνει επαναφορά;"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Να διαγραφούν όλα τα προσωπικά σας στοιχεία και οι εφαρμογές που έχετε κατεβάσει; Δεν είναι δυνατή η αναίρεση αυτής της ενέργειας!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Διαγραφή όλων"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Διαγραφή"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Περιμένετε…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Ημερομηνία και ώρα"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Ορισμός ημερομηνίας και ώρας"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Ορισμός ημερομηνίας, ώρας, ζώνης ώρας και μορφές"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ταξινόμηση ανά ζώνη ώρας"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Ημερομηνία"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Ώρα"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Προσθήκη χρήστη"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Προσθήκη λογαριασμού"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Διαγραφή χρήστη"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Νέος χρήστης"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Επισκέπτης"</string>
     <string name="user_admin" msgid="1535484812908584809">"Διαχειριστής"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Συνδεδεμένος ως διαχειριστής"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Όλα τα δικαιώματα διαχειριστή"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Να γίνει διαχειριστής"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Ο χρήστης θα μπορεί να διαγράφει χρήστες, συμπεριλαμβανομένων άλλων διαχειριστών, και να επαναφέρει τις εργοστασιακές ρυθμίσεις του συστήματος."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Αυτή η ενέργεια δεν είναι αναστρέψιμη."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ναι, να γίνει διαχειριστής"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Δημιουργία νέων χρηστών"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Τηλεφωνικές κλήσεις"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Αντ. μηνυμάτων μέσω δεδ. κιν. τηλ. αυτοκ."</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Εγκατάσταση νέων εφαρμογών"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Απεγκαταστήστε εφαρμογές"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Προσθήκη χρήστη"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Νέος χρήστης"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Προσθήκη νέου χρήστη;"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Οποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Συμπληρώθηκε το όριο χρηστών"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Μπορείτε να δημιουργήσετε έως <xliff:g id="COUNT">%d</xliff:g> χρήστες.</item>
+      <item quantity="one">Είναι δυνατή η δημιουργία μόνο ενός χρήστη.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Η δημιουργία νέου χρήστη απέτυχε"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Να διαγραφεί ο χρήστης;"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Όλες οι εφαρμογές και τα δεδομένα θα διαγραφούν."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Η διαγραφή χρήστη απέτυχε."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Παράβλεψη"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Επανάληψη"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Διαγρ. τελευταίου χρήστη;"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Αφού διαγράψετε τον μοναδικό χρήστη που έχει απομείνει για αυτό το αυτοκίνητο, θα δημιουργηθεί ένας νέος διαχειριστής."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Όλα τα δεδομένα, οι ρυθμίσεις και οι εφαρμογές που είναι συσχετισμένες με αυτόν τον χρήστη θα διαγραφούν. Θα πρέπει να ρυθμίσετε ξανά το σύστημα."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Επιλογή νέου διαχειριστή"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Θα πρέπει να υπάρχει τουλάχιστον ένας διαχειριστής. Για να διαγράψετε αυτόν τον διαχειριστή, πρώτα επιλέξτε έναν αντικαταστάτη."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Επιλογή διαχειριστή"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Επισκέπτης"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Επισκέπτης"</string>
     <string name="user_switch" msgid="6544839750534690781">"Εναλλαγή"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Εσείς (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Όνομα"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Δεν έχει ρυθμιστεί"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Επεξεργασία ονόματος χρήστη"</string>
     <string name="users_list_title" msgid="770764290290240909">"Χρήστες"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Δικαιώματα που δόθηκαν σε %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Λογαριασμοί"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Χρήστης"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Προσθήκη λογαριασμού"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Δεν έχουν προστεθεί λογαριασμοί"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Λογαριασμοί για <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Αυτόματος συγχρονισμός δεδομένων"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Επιτρέπει στις εφαρμογές να ανανεώνουν δεδομένα αυτόματα"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Ενεργοπ. αυτόμ. συγχρ. δεδομ.;"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Θα γίνεται αυτόματη αντιγραφή τυχόν αλλαγών που πραγματοποιείτε στους λογαριασμούς σας στον ιστό στη συσκευή σας.\n\nΣε ορισμένους λογαριασμούς ενδέχεται να γίνεται αυτόματη αντιγραφή τυχόν αλλαγών που πραγματοποιείτε στο τηλέφωνό σας στον ιστό. Ένας Λογαριασμός Google λειτουργεί με αυτόν τον τρόπο."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Απενέργ. αυτ/του συγχρονισμού;"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Με αυτόν τον τρόπο θα εξοικονομήσετε δεδομένα, αλλά θα πρέπει να συγχρονίσετε κάθε λογαριασμό με μη αυτόματο τρόπο για να συλλέξετε πρόσφατες πληροφορίες. Δεν θα λαμβάνετε ειδοποιήσεις κατά τη διάρκεια των ενημερώσεων."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Πληροφορίες λογαριασμού"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Προσθήκη λογαριασμού"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Προσθέστε έναν λογαριασμό"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Κατάργηση λογαριασμού"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Κατάργηση λογαριασμού;"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Η κατάργηση αυτού του λογαριασμού θα έχει σαν αποτέλεσμα τη διαγραφή όλων των μηνυμάτων, των επαφών και άλλων δεδομένων του από τη συσκευή!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Αυτή η αλλαγή δεν επιτρέπεται από τον διαχειριστή σας"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Κατάργηση χρήστη;"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Όλες οι εφαρμογές και τα δεδομένα θα διαγραφούν."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Αποτυχία κατάργησης χρήστη."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Επανάληψη;"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Παράβλεψη"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Επανάληψη"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Προσθήκη νέου χρήστη;"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Οποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Η κατάργηση του λογαριασμού απέτυχε."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Συγχρονισμός λογαριασμού"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Ο συγχρονισμός είναι ενεργοποιημένος για <xliff:g id="ID_1">%1$d</xliff:g> από <xliff:g id="ID_2">%2$d</xliff:g> στοιχεία"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Ο συγχρονισμός είναι ενεργοποιημένος για όλα τα στοιχεία"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Ο συγχρονισμός είναι απενεργοποιημένος για όλα τα στοιχεία"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Συγχρονισμός ανενεργός"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Σφάλμα συγχρονισμού"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Τελευταίος συγχρονισμός <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Συγχρονισμός τώρα…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Πατήστε για να κάνετε συγχρονισμό τώρα<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Συγχρονισμός τώρα"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Ακύρωση συγχρονισμού"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Ο συγχρονισμός αντιμετωπίζει προβλήματα αυτή τη στιγμή. Θα είναι διαθέσιμος ξανά σε λίγο."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Ασφάλεια"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Κλείδωμα οθόνης"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Κανένα"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Αριθμός PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Κωδικός πρόσβασης"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Επιλογή τύπου κλειδώμ."</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Επιλογές κλειδώματος οθόνης"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Επιλογές κλειδώματος"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Εισαγάγετε το μοτίβο σας"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Επιβεβαίωση"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Επανάληψη σχεδίασης"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ορισμός κλειδώματος οθόνης"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Επιλέξτε αριθμό PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Επιλέξτε το μοτίβο σας"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Επιλέξτε κωδικό πρόσβασης"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Επιλέξτε τον κωδικό πρόσβασής σας"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Τρέχουσα οθόνη κλειδώματος"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Για λόγους ασφαλείας, ορίστε ένα μοτίβο"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Διαγραφή"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Οι συνηθισμένοι κωδικοί πρόσβασης αποκλείονται από τον διαχειριστή IT. Δοκιμάστε να χρησιμοποιήσετε διαφορετικό κωδικό πρόσβασης."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Δεν επιτρέπεται η αύξουσα, φθίνουσα ή επαναλαμβανόμενη ακολουθία ψηφίων."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Επιλογές κλειδώματος οθόνης"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ημέρες πριν"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Προσθήκη αξιόπιστης συσκευής"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Αξιόπιστες συσκευές"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> συσκευές</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> συσκευή</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Το <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> θα ξεκλειδώσει αυτό το αυτοκίνητο όταν συνδεθεί. Εάν κάποιος αποκτήσει το <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> σας, θα μπορεί να αποκτήσει πρόσβαση σε αυτήν τη συσκευή"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Επιβεβαίωση"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Κατάργηση αξιόπιστης συσκευής"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Τέλος"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Χρησιμοποιήστε τη συνοδευτική εφαρμογή για να ρυθμίσετε μια αξιόπιστη συσκευή. Μετά τη ρύθμιση, θα μπορείτε να ξεκλειδώνετε το προφίλ χρήστη σας όταν το τηλέφωνό σας εντοπίζεται από το όχημα"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Κατεβάστε τη συνοδευτική εφαρμογή στο τηλέφωνό σας"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Επιλέξτε το αυτοκίνητο <xliff:g id="CAR_NAME">%1$s</xliff:g> στο τηλέφωνό σας για να κάνετε σύζευξη των συσκευών"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Το Smart Lock δεν μπορεί να εντοπίσει λειτουργίες ασφαλείας σε αυτήν τη συσκευή. Για την προστασία του αυτοκινήτου σας, η αξιόπιστη συσκευή θα μπορεί να κρατήσει ξεκλείδωτο το αυτοκίνητό σας μόνο όταν το έχετε ήδη ξεκλειδώσει εσείς. Η αξιόπιστη συσκευή σας μπορεί να κρατήσει ξεκλείδωτο το αυτοκίνητό σας όταν βρίσκεται σε κοντινή απόσταση από αυτό, ακόμη και αν την κρατάει κάποιο άλλο άτομο."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Προσθήκη της συσκευής <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ως αξιόπιστης συσκευής"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Η συσκευή <xliff:g id="DEVICE_NAME">%1$s</xliff:g> προστέθηκε με επιτυχία ως έμπιστη συσκευή"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Η εγγραφή της συσκευής <xliff:g id="DEVICE_NAME">%1$s</xliff:g> απέτυχε"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Η προσθήκη αξιόπιστης συσκευής απαιτεί να ορίσετε στη συνέχεια μια μέθοδο ελέγχου ταυτότητας. Εάν δεν έχετε μαζί σας την αξιόπιστη συσκευή σας, θα ζητηθεί έλεγχος ταυτότητας για την πρόσβαση στο προφίλ σας."</string>
     <string name="forget" msgid="3971143908183848527">"Διαγραφή από μνήμη"</string>
+    <string name="connect" msgid="5861699594602380150">"Σύνδεση"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Αποσύνδεση"</string>
     <string name="delete_button" msgid="5840500432614610850">"Διαγραφή"</string>
     <string name="remove_button" msgid="6664656962868194178">"Κατάργηση"</string>
     <string name="cancel" msgid="750286395700355455">"Ακύρωση"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Έξοδος από λειτ. επίδειξης"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Με αυτόν τον τρόπο, ο λογαριασμός επίδειξης θα χαθεί και θα γίνει επαναφορά των εργοστασιακών δεδομένων συστήματος. Όλα τα δεδομένα χρήστη θα χαθούν."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Έξοδος από επίδειξη"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ολοκλήρωση ρύθμισης"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"όχι τώρα"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ΠΑΡΑΒΛΕΨΗ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Η λειτουργία δεν διατίθεται κατά τη διάρκεια της οδήγησης."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Δεν είναι δυνατή η προσθήκη χρήστη κατά την οδήγηση."</string>
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index db58240..ad3a983 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"dim screen, touchscreen, battery"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"dim screen, night, tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Network &amp; internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
+    <string name="data_warning" msgid="116776633806885370">"Data warning"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
+    <string name="data_limit" msgid="227338836292511425">"Data limit"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limiting data usage"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Set up &amp; manage wireless access points"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Turning Wi‑Fi on…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Turning off Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Loading Wi‑Fi list"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi disabled"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Failed to forget network"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Failed to connect to network"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi disabled"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Password"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Network name"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Enter the SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Security"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signal strength"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signal strength"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Link speed"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequency"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP Address"</string>
+    <string name="show_password" msgid="2074628020371139240">"Show password"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Enter network name"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Enter password"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Poor"</item>
-    <item msgid="2032262610626057081">"Fair"</item>
-    <item msgid="3859756017461098953">"Good"</item>
-    <item msgid="1521103743353335724">"Excellent"</item>
+    <item msgid="7683058295076342057">"Poor"</item>
+    <item msgid="1639222824821660744">"Fair"</item>
+    <item msgid="1838705897358163300">"Good"</item>
+    <item msgid="6067166649320533751">"Excellent"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Turn on Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth disabled"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Network details"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC address"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP address"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 addresses"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi preferences"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Turn on Wi‑Fi automatically"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi will turn back on near high‑quality saved networks, such as your home network"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Unavailable because location is turned off. Turn on "<annotation id="link">"location"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Turn on Wi‑Fi scanning?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Turn on"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi scanning turned on"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Switch to mobile data automatically"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Use mobile data when Wi‑Fi has no Internet access. Data usage charges may apply."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Learn more"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Manage connections, set device name &amp; discoverability"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Phone"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imaging"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Headphone"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Input Peripheral"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Paired devices"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Available devices"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"No paired devices"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"No available devices"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Paired device"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Name"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Use for"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Change the name of the Bluetooth device"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Unnamed device"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Paired devices"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Pair new device"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth will turn on to pair"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Disconnect device?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Your vehicle will disconnect from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Vehicle\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Device\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Vehicle name"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Rename this vehicle"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Rename device"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Rename"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Available devices"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiles"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth pairing request"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Pair &amp; connect"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth pairing code"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN contains letters or symbols"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Type the pairing code then press Return or Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Usually 0000 or 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Pairing request"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tap to pair with <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages &amp; input"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Preferred engine"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Current engine"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Speech Rate"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Pitch"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Reset"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Sound"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Ring volume"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigation volume"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Set volume for music and videos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Phone ringtone"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Default notification sound"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Default alarm sound"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps &amp; notifications"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Show all apps"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Default apps"</string>
     <string name="applications_settings" msgid="794261395191035632">"App info"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
     <string name="disable_text" msgid="4358165448648990820">"Disable"</string>
     <string name="enable_text" msgid="1794971777861881238">"Enable"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"If you disable this app, Android and other apps may no longer function as intended."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Disable app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
     <string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist &amp; voice input"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Use text from screen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Allow the assist app to access the screen contents as text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Use screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Allow the assist app to access an image of the screen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Auto-fill service"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"None"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Selected"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"The assistant will be able to read information about apps that are in use on your system, including information visible on your screen or accessible within the apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Make sure that you trust this app&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Auto-fill&gt;%1$s&lt;/xliff:g&gt; uses what\'s on your screen to determine what can be auto-filled."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Add service"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent Location Requests"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Scanning"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi scanning"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Allow apps and services to scan for Wi‑Fi networks at any time, even when Wi‑Fi is off. This can be used, for example, to improve location-based features and services."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth scanning"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Allow apps and services to scan for nearby devices at any time, even when Bluetooth is off. This can be used, for example, to improve location-based features and services."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"System updates"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build number"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth address"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Not available"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licence"</string>
     <string name="terms_title" msgid="5201471373602628765">"Terms and conditions"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"System WebView Licence"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
+      <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Reset options"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Network, apps or device reset"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Reset network"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"This will reset all network settings, including:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobile data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Erase all vehicle eSIMs"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"This will not cancel your service plan."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Can’t reset eSIMs"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Select network"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Reset settings"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Reset?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Reset all network settings? You can\'t undo this action!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Reset settings"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Network settings have been reset"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Reset app preferences"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"This will reset all preferences for:\n\n"<li>"Disabled apps"</li>\n<li>"Disabled app notifications"</li>\n<li>"Default applications for actions"</li>\n<li>"Background data restrictions for apps"</li>\n<li>"Any permission restrictions"</li>\n\n"You will not lose any app data."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Reset apps"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"App preferences have been reset"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Erase all data (factory reset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"This will erase all data from your vehicle’s head unit, including:\n\n"<li>"Your Google Account"</li>\n<li>"System and app data and settings"</li>\n<li>"Downloaded apps"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"You are currently signed in to the following accounts:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"There are other users present on this vehicle."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Reset vehicle"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Reset?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Erase all your personal information and downloaded apps? You can\'t undo this action!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Erase everything"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Erasing"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Please wait..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Date &amp; time"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Set date and time"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Set date, time, time zone, &amp; formats"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sort by time zone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Date"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Time"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Add user"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Add account"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Delete user"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"New user"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Guest"</string>
     <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Signed in as admin"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"All admin permissions"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Make admin"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"The user will be able to delete users, including other admins, and factory reset the system."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"This action is not reversible."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Yes, make admin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Create new users"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Make phone calls"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Messaging via car\'s mobile data"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Install new apps"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Uninstall apps"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Add user"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"New user"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Add new user?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Any user can update apps for all other users."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"User limit reached"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> users.</item>
+      <item quantity="one">Only one user can be created.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Failed to create a new user"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Delete this user?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"All apps and data will be deleted."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Failed to delete user."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Delete last user?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"After deleting the only remaining user for this car, a new admin user will be created."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"All data, settings and apps associated with this user will be deleted. You\'ll need to set up the system again."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Choose new admin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"You need at least one admin. To delete this one, choose a replacement first."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Choose admin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Guest"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Guest"</string>
     <string name="user_switch" msgid="6544839750534690781">"Switch"</string>
     <string name="current_user_name" msgid="3813671533249316823">"You (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
     <string name="users_list_title" msgid="770764290290240909">"Users"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Accounts"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"User"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Add account"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"No accounts added"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Accounts for <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatically sync data"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Let apps refresh data automatically"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Turn auto-sync data on?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Any changes that you make to your accounts on the web will be automatically copied to your device.\n\nSome accounts may also automatically copy any changes that you make on the phone to the web. A Google Account works this way."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Turn auto-sync data off?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"This will conserve data, but you’ll need to sync each account manually to collect recent information. And you won’t receive notifications when updates occur."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Account info"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Add account"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Add an account."</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Remove account"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Remove account?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Removing this account will delete all of its messages, contacts and other data from the device!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"This change isn\'t allowed by your admin"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Remove this user?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"All apps and data will be deleted."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Failed to remove user."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Try again?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Dismiss"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Retry"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Add new user?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"When you add a new user, that person needs to set up their space."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Any user can update apps for all other users."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Failed to remove account."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Account sync"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sync on for <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g> items"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sync on for all items"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sync off for all items"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sync is OFF"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sync error"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Last synced <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Syncing now…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tap to sync now<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Password"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Choose a lock type"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Screen lock options"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Lock options"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Enter your pattern"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirm"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redraw"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Set a screen lock"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Choose your PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Choose your pattern"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Choose your passowrd"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Choose your password"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Current screen lock"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"For security, set a pattern"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Clear"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Common passwords are blocked by your IT admin. Try a different password."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Ascending, descending or repeated sequence of digits isn\'t allowed."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Screen lock options"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> days ago"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Add trusted device"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Trusted devices"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> devices</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> device</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Your <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> will unlock this car when it\'s connected. If someone takes your <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, they may be able to access this device"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirm"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Remove trusted device"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Done"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Use the companion app to set up a trusted device. Once set up, you will be able to unlock your user profile when your phone is detected by the vehicle"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Download the companion app on your phone"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Select <xliff:g id="CAR_NAME">%1$s</xliff:g> on your phone to pair the devices"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock can\'t detect security features of this device. To help protect your car, trusted device will only be able to keep your car unlocked once it\'s already unlocked by you. Your trusted device can keep your car unlocked when it\'s nearby, even if someone else is holding it."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Add <xliff:g id="DEVICE_NAME">%1$s</xliff:g> as a trusted device"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> successfully added as a trusted device"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> enrolment failed"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Adding a trusted device requires you to set an authentication method next. If you do not have your trusted device with you, authentication will be required to access your profile."</string>
     <string name="forget" msgid="3971143908183848527">"Forget"</string>
+    <string name="connect" msgid="5861699594602380150">"Connect"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Disconnect"</string>
     <string name="delete_button" msgid="5840500432614610850">"Delete"</string>
     <string name="remove_button" msgid="6664656962868194178">"Remove"</string>
     <string name="cancel" msgid="750286395700355455">"Cancel"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Exit demo mode"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"This will delete the demo account and factory data reset the system. All user data will be lost."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Exit Demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"finish setup"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"not now"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"DISMISS"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Feature not available while driving."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Can\'t add user while driving."</string>
 </resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..ad3a983
--- /dev/null
+++ b/res/values-en-rCA/strings.xml
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="settings_label" msgid="5147911978211079839">"Settings"</string>
+    <string name="more_settings_label" msgid="3867559443480110616">"More"</string>
+    <string name="display_settings" msgid="5325515247739279185">"Display"</string>
+    <string name="brightness" msgid="2919605130898772866">"Brightness level"</string>
+    <string name="auto_brightness_title" msgid="9124647862844666581">"Adaptive brightness"</string>
+    <string name="auto_brightness_summary" msgid="4741887033140384352">"Optimise brightness level for available light"</string>
+    <string name="condition_night_display_title" msgid="3777509730126972675">"Night Light is on"</string>
+    <string name="keywords_display" msgid="3978416985146943922">"screen, touchscreen"</string>
+    <string name="keywords_display_brightness_level" msgid="3956411572536209195">"dim screen, touchscreen, battery"</string>
+    <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"dim screen, touchscreen, battery"</string>
+    <string name="keywords_display_night_display" msgid="2922294576679769957">"dim screen, night, tint"</string>
+    <string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Network &amp; internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
+    <string name="data_warning" msgid="116776633806885370">"Data warning"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
+    <string name="data_limit" msgid="227338836292511425">"Data limit"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limiting data usage"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
+    <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
+    <string name="wifi_starting" msgid="473253087503153167">"Turning Wi‑Fi on…"</string>
+    <string name="wifi_stopping" msgid="3534173972547890148">"Turning off Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Loading Wi‑Fi list"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi disabled"</string>
+    <string name="wifi_failed_forget_message" msgid="121732682699377206">"Failed to forget network"</string>
+    <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Failed to connect to network"</string>
+    <string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
+    <string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
+    <string name="wifi_password" msgid="5565632142720292397">"Password"</string>
+    <string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
+    <string name="wifi_ssid" msgid="488604828159458741">"Network name"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Enter the SSID"</string>
+    <string name="wifi_security" msgid="158358046038876532">"Security"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signal strength"</string>
+    <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
+    <string name="wifi_speed" msgid="1650692446731850781">"Link speed"</string>
+    <string name="wifi_frequency" msgid="8951455949682864922">"Frequency"</string>
+    <string name="wifi_ip_address" msgid="3128140627890954061">"IP Address"</string>
+    <string name="show_password" msgid="2074628020371139240">"Show password"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Enter network name"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Enter password"</string>
+    <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
+  <string-array name="wifi_signals">
+    <item msgid="4897376984576812606">"Poor"</item>
+    <item msgid="7683058295076342057">"Poor"</item>
+    <item msgid="1639222824821660744">"Fair"</item>
+    <item msgid="1838705897358163300">"Good"</item>
+    <item msgid="6067166649320533751">"Excellent"</item>
+  </string-array>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Network details"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC address"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP address"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 addresses"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi preferences"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Turn on Wi‑Fi automatically"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi will turn back on near high‑quality saved networks, such as your home network"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Unavailable because location is turned off. Turn on "<annotation id="link">"location"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Turn on Wi‑Fi scanning?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Turn on"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi scanning turned on"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Switch to mobile data automatically"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Use mobile data when Wi‑Fi has no Internet access. Data usage charges may apply."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Learn more"</string>
+    <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Unnamed device"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Paired devices"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Pair new device"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth will turn on to pair"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Disconnect device?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Your vehicle will disconnect from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Vehicle\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Device\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Vehicle name"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Rename this vehicle"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Rename device"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Rename"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Available devices"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiles"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
+    <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth pairing request"</string>
+    <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Pair &amp; connect"</string>
+    <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth pairing code"</string>
+    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN contains letters or symbols"</string>
+    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Type the pairing code then press Return or Enter"</string>
+    <string name="bluetooth_pairing_request" msgid="4769675459526556801">"Pair with <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
+    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"Allow <xliff:g id="DEVICE_NAME">%1$s</xliff:g> to access your contacts and call history"</string>
+    <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"You may also need to type this PIN on the other device."</string>
+    <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"You may also need to type this passkey on the other device."</string>
+    <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"Must be 16 digits"</string>
+    <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Usually 0000 or 1234"</string>
+    <string name="bluetooth_notif_title" msgid="8374602799367803335">"Pairing request"</string>
+    <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tap to pair with <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages &amp; input"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Preferred engine"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Current engine"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Speech Rate"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Pitch"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Reset"</string>
+    <string name="sound_settings" msgid="3072423952331872246">"Sound"</string>
+    <string name="ring_volume_title" msgid="3135241004980719442">"Ring volume"</string>
+    <string name="navi_volume_title" msgid="946292066759195165">"Navigation volume"</string>
+    <string name="incoming_call_volume_title" msgid="6972117872424656876">"Ring tone"</string>
+    <string name="notification_volume_title" msgid="6749411263197157876">"Notification"</string>
+    <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
+    <string name="media_volume_summary" msgid="2961762827637127239">"Set volume for music and videos"</string>
+    <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Phone ringtone"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Default notification sound"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Default alarm sound"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps &amp; notifications"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Show all apps"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Default apps"</string>
+    <string name="applications_settings" msgid="794261395191035632">"App info"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
+    <string name="disable_text" msgid="4358165448648990820">"Disable"</string>
+    <string name="enable_text" msgid="1794971777861881238">"Enable"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"If you disable this app, Android and other apps may no longer function as intended."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Disable app"</string>
+    <string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
+    <string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
+    <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
+    <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
+    <string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
+    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
+    <string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
+    <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
+    </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist &amp; voice input"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Use text from screen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Allow the assist app to access the screen contents as text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Use screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Allow the assist app to access an image of the screen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Auto-fill service"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"None"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Selected"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"The assistant will be able to read information about apps that are in use on your system, including information visible on your screen or accessible within the apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Make sure that you trust this app&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Auto-fill&gt;%1$s&lt;/xliff:g&gt; uses what\'s on your screen to determine what can be auto-filled."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Add service"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent Location Requests"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Scanning"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi scanning"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Allow apps and services to scan for Wi‑Fi networks at any time, even when Wi‑Fi is off. This can be used, for example, to improve location-based features and services."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth scanning"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Allow apps and services to scan for nearby devices at any time, even when Bluetooth is off. This can be used, for example, to improve location-based features and services."</string>
+    <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
+    <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
+    <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
+    <string name="model_info" msgid="4966408071657934452">"Model"</string>
+    <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
+    <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
+    <string name="build_number" msgid="3997326631001009102">"Build number"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth address"</string>
+    <string name="device_info_not_available" msgid="2095601973977376655">"Not available"</string>
+    <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
+    <string name="device_status" msgid="267298179806290920">"Status"</string>
+    <string name="device_status_summary" product="tablet" msgid="600543254608862075">"Status of the battery, network and other information"</string>
+    <string name="device_status_summary" product="default" msgid="9130360324418117815">"Phone number, signal, etc."</string>
+    <string name="about_settings" msgid="4329457966672592345">"About"</string>
+    <string name="about_summary" msgid="5374623866267691206">"Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
+    <string name="about_settings_summary" msgid="7975072809083281401">"View legal info, status, software version"</string>
+    <string name="legal_information" msgid="1838443759229784762">"Legal information"</string>
+    <string name="contributors_title" msgid="7698463793409916113">"Contributors"</string>
+    <string name="manual" msgid="4819839169843240804">"Manual"</string>
+    <string name="regulatory_labels" msgid="3165587388499646779">"Regulatory labels"</string>
+    <string name="safety_and_regulatory_info" msgid="1204127697132067734">"Safety &amp; regulatory manual"</string>
+    <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
+    <string name="license_title" msgid="936705938435249965">"Licence"</string>
+    <string name="terms_title" msgid="5201471373602628765">"Terms and conditions"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
+    <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
+    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
+    <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
+    <string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
+      <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Reset options"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Network, apps or device reset"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Reset network"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"This will reset all network settings, including:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobile data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Erase all vehicle eSIMs"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"This will not cancel your service plan."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Can’t reset eSIMs"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Select network"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Reset settings"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Reset?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Reset all network settings? You can\'t undo this action!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Reset settings"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Network settings have been reset"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Reset app preferences"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"This will reset all preferences for:\n\n"<li>"Disabled apps"</li>\n<li>"Disabled app notifications"</li>\n<li>"Default applications for actions"</li>\n<li>"Background data restrictions for apps"</li>\n<li>"Any permission restrictions"</li>\n\n"You will not lose any app data."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Reset apps"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"App preferences have been reset"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Erase all data (factory reset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"This will erase all data from your vehicle’s head unit, including:\n\n"<li>"Your Google Account"</li>\n<li>"System and app data and settings"</li>\n<li>"Downloaded apps"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"You are currently signed in to the following accounts:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"There are other users present on this vehicle."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Reset vehicle"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Reset?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Erase all your personal information and downloaded apps? You can\'t undo this action!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Erase everything"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Erasing"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Please wait..."</string>
+    <string name="date_and_time_settings_title" msgid="4058492663544475485">"Date &amp; time"</string>
+    <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Set date and time"</string>
+    <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Set date, time, time zone, &amp; formats"</string>
+    <string name="date_time_auto" msgid="3570339569471779767">"Automatic date &amp; time"</string>
+    <string name="date_time_auto_summary" msgid="3311706425095342759">"Use network-provided time"</string>
+    <string name="zone_auto" msgid="3701878581920206160">"Automatic time zone"</string>
+    <string name="zone_auto_summary" msgid="4345856882906981864">"Use network-provided time zone"</string>
+    <string name="date_time_24hour_title" msgid="3025576547136168692">"24‑hour format"</string>
+    <string name="date_time_24hour" msgid="1137618702556486913">"Use 24-hour format"</string>
+    <string name="date_time_set_time_title" msgid="5884883050656937853">"Time"</string>
+    <string name="date_time_set_time" msgid="6449555153906058248">"Set time"</string>
+    <string name="date_time_set_timezone_title" msgid="3001779256157093425">"Time zone"</string>
+    <string name="date_time_set_timezone" msgid="4759353576185916944">"Select time zone"</string>
+    <string name="date_time_set_date_title" msgid="6834785820357051138">"Date"</string>
+    <string name="date_time_set_date" msgid="2537494485643283230">"Set date"</string>
+    <string name="zone_list_menu_sort_alphabetically" msgid="7041628618528523514">"Sort alphabetically"</string>
+    <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sort by time zone"</string>
+    <string name="date_picker_title" msgid="1533614225273770178">"Date"</string>
+    <string name="time_picker_title" msgid="7436045944320504639">"Time"</string>
+    <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
+    <string name="signed_in_admin_user" msgid="1267225622818673274">"Signed in as admin"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"All admin permissions"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Make admin"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"The user will be able to delete users, including other admins, and factory reset the system."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"This action is not reversible."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Yes, make admin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Create new users"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Make phone calls"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Messaging via car\'s mobile data"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Install new apps"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Uninstall apps"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Add user"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"New user"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Add new user?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Any user can update apps for all other users."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"User limit reached"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> users.</item>
+      <item quantity="one">Only one user can be created.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Failed to create a new user"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Delete this user?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"All apps and data will be deleted."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Failed to delete user."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Delete last user?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"After deleting the only remaining user for this car, a new admin user will be created."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"All data, settings and apps associated with this user will be deleted. You\'ll need to set up the system again."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Choose new admin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"You need at least one admin. To delete this one, choose a replacement first."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Choose admin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Guest"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Guest"</string>
+    <string name="user_switch" msgid="6544839750534690781">"Switch"</string>
+    <string name="current_user_name" msgid="3813671533249316823">"You (%1$s)"</string>
+    <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
+    <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
+    <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
+    <string name="users_list_title" msgid="770764290290240909">"Users"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
+    <string name="accounts_settings_title" msgid="436190037084293471">"Accounts"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Add account"</string>
+    <string name="no_accounts_added" msgid="5148163140691096055">"No accounts added"</string>
+    <string name="account_list_title" msgid="7631588514613843065">"Accounts for <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatically sync data"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Let apps refresh data automatically"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Turn auto-sync data on?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Any changes that you make to your accounts on the web will be automatically copied to your device.\n\nSome accounts may also automatically copy any changes that you make on the phone to the web. A Google Account works this way."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Turn auto-sync data off?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"This will conserve data, but you’ll need to sync each account manually to collect recent information. And you won’t receive notifications when updates occur."</string>
+    <string name="account_details_title" msgid="7529571432258448573">"Account info"</string>
+    <string name="add_account_title" msgid="5988746086885210040">"Add account"</string>
+    <string name="add_an_account" msgid="1072285034300995091">"Add an account."</string>
+    <string name="user_cannot_add_accounts_message" msgid="6775605884544906797">"Restricted profiles cannot add accounts"</string>
+    <string name="remove_account_title" msgid="8840386525787836381">"Remove account"</string>
+    <string name="really_remove_account_title" msgid="3555164432587924900">"Remove account?"</string>
+    <string name="really_remove_account_message" msgid="4296769280849579900">"Removing this account will delete all of its messages, contacts and other data from the device!"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Failed to remove account."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Account sync"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sync on for <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g> items"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sync on for all items"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sync off for all items"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sync is OFF"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sync error"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Last synced <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Syncing now…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tap to sync now<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
+    <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
+    <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
+    <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
+    <string name="security_lock_pattern" msgid="1174352995619563104">"Pattern"</string>
+    <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
+    <string name="security_lock_password" msgid="4420203740048322494">"Password"</string>
+    <string name="lock_settings_picker_title" msgid="6590330165050361632">"Choose a lock type"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Lock options"</string>
+    <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Enter your pattern"</string>
+    <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirm"</string>
+    <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redraw"</string>
+    <string name="continue_button_text" msgid="5129979170426836641">"Continue"</string>
+    <string name="lockscreen_retry_button_text" msgid="5314212350698701242">"Retry"</string>
+    <string name="lockscreen_skip_button_text" msgid="3755748786396198091">"Skip"</string>
+    <string name="set_screen_lock" msgid="5239317292691332780">"Set a screen lock"</string>
+    <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Choose your PIN"</string>
+    <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Choose your pattern"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Choose your password"</string>
+    <string name="current_screen_lock" msgid="637651611145979587">"Current screen lock"</string>
+    <string name="choose_lock_pattern_message" msgid="6242765203541309524">"For security, set a pattern"</string>
+    <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Clear"</string>
+    <string name="lockpattern_cancel_button_text" msgid="4068764595622381766">"Cancel"</string>
+    <string name="lockpattern_pattern_confirmed" msgid="5984306638250515385">"Your new unlock pattern"</string>
+    <string name="lockpattern_recording_intro_header" msgid="7864149726033694408">"Draw an unlock pattern"</string>
+    <string name="lockpattern_recording_inprogress" msgid="1575019990484725964">"Release finger when you\'ve finished"</string>
+    <string name="lockpattern_pattern_entered" msgid="6103071005285320575">"Pattern recorded"</string>
+    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"Draw pattern again to confirm"</string>
+    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"Connect at least four dots. Try again."</string>
+    <string name="lockpattern_pattern_wrong" msgid="929223969555399363">"Wrong pattern"</string>
+    <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"How to draw an unlock pattern"</string>
+    <string name="error_saving_lockpattern" msgid="2933512812768570130">"Error saving pattern"</string>
+    <string name="okay" msgid="4589873324439764349">"OK"</string>
+    <string name="remove_screen_lock_title" msgid="1234382338764193387">"Remove screen lock?"</string>
+    <string name="remove_screen_lock_message" msgid="6675850371585564965">"This will allow anyone to access your account"</string>
+    <string name="lock_settings_enter_pin" msgid="1669172111244633904">"Enter your PIN"</string>
+    <string name="lock_settings_enter_password" msgid="2636669926649496367">"Enter your password"</string>
+    <string name="choose_lock_pin_message" msgid="2963792070267774417">"For security, set a PIN"</string>
+    <string name="confirm_your_pin_header" msgid="9096581288537156102">"Re-enter your PIN"</string>
+    <string name="choose_lock_pin_hints" msgid="7362906249992020844">"PIN must be at least 4 digits"</string>
+    <string name="lockpin_invalid_pin" msgid="2149191577096327424">"PIN invalid. Must be at least 4 digits."</string>
+    <string name="confirm_pins_dont_match" msgid="4607110139373520720">"PINs don\'t match"</string>
+    <string name="error_saving_lockpin" msgid="9011960139736000393">"Error saving PIN"</string>
+    <string name="lockscreen_wrong_pin" msgid="4922465731473805306">"Wrong PIN"</string>
+    <string name="lockscreen_wrong_password" msgid="5757087577162231825">"Wrong password"</string>
+    <string name="choose_lock_password_message" msgid="6124341145027370784">"For security, set a password"</string>
+    <string name="confirm_your_password_header" msgid="7052891840366724938">"Re-enter your password"</string>
+    <string name="confirm_passwords_dont_match" msgid="7300229965206501753">"Passwords don\'t match"</string>
+    <string name="lockpassword_clear_label" msgid="6363680971025188064">"Clear"</string>
+    <string name="lockpassword_cancel_label" msgid="5791237697404166450">"Cancel"</string>
+    <string name="lockpassword_confirm_label" msgid="5918463281546146953">"Confirm"</string>
+    <string name="choose_lock_password_hints" msgid="3903696950202491593">"Must be at least four characters"</string>
+    <string name="lockpassword_password_too_short" msgid="6681218025001328405">"Must be at least <xliff:g id="COUNT">%d</xliff:g> characters"</string>
+    <string name="lockpassword_pin_too_short" msgid="6363004004424904218">"PIN must be at least <xliff:g id="COUNT">%d</xliff:g> digits"</string>
+    <string name="lockpassword_password_too_long" msgid="7530214940279491291">"Must be fewer than <xliff:g id="NUMBER">%d</xliff:g> characters"</string>
+    <string name="lockpassword_pin_too_long" msgid="62957683396974404">"Must be fewer than <xliff:g id="NUMBER">%d</xliff:g> digits"</string>
+    <string name="lockpassword_pin_contains_non_digits" msgid="3044526271686839923">"Must contain only digits 0-9."</string>
+    <string name="lockpassword_pin_recently_used" msgid="7901918311213276207">"Device admin doesn\'t allow using a recent PIN"</string>
+    <string name="lockpassword_pin_blacklisted_by_admin" msgid="7412709707800738442">"Common PINs are blocked by your IT admin. Try a different PIN."</string>
+    <string name="lockpassword_illegal_character" msgid="1984970060523635618">"This can\'t include an invalid character."</string>
+    <string name="lockpassword_invalid_password" msgid="1690956113717418430">"Password invalid. Must be at least four characters."</string>
+    <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
+      <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> letters</item>
+      <item quantity="one">Must contain at least one letter</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
+      <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> lowercase letters</item>
+      <item quantity="one">Must contain at least one lowercase letter</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
+      <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> uppercase letters</item>
+      <item quantity="one">Must contain at least 1 uppercase letter</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
+      <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> numerical digits</item>
+      <item quantity="one">Must contain at least 1 numerical digit</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
+      <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> special symbols</item>
+      <item quantity="one">Must contain at least 1 special symbol</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
+      <item quantity="other">Must contain at least <xliff:g id="COUNT">%d</xliff:g> non-letter characters</item>
+      <item quantity="one">Must contain at least 1 non-letter character</item>
+    </plurals>
+    <string name="lockpassword_password_recently_used" msgid="8255729487108602924">"Device admin doesn\'t allow using a recent password"</string>
+    <string name="error_saving_password" msgid="8334882262622500658">"Error saving password"</string>
+    <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Common passwords are blocked by your IT admin. Try a different password."</string>
+    <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Ascending, descending or repeated sequence of digits isn\'t allowed."</string>
+    <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Screen lock options"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> days ago"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Add trusted device"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Trusted devices"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> devices</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> device</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Your <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> will unlock this car when it\'s connected. If someone takes your <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, they may be able to access this device"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirm"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Remove trusted device"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Done"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Use the companion app to set up a trusted device. Once set up, you will be able to unlock your user profile when your phone is detected by the vehicle"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Download the companion app on your phone"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Select <xliff:g id="CAR_NAME">%1$s</xliff:g> on your phone to pair the devices"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock can\'t detect security features of this device. To help protect your car, trusted device will only be able to keep your car unlocked once it\'s already unlocked by you. Your trusted device can keep your car unlocked when it\'s nearby, even if someone else is holding it."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Add <xliff:g id="DEVICE_NAME">%1$s</xliff:g> as a trusted device"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> successfully added as a trusted device"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> enrolment failed"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Adding a trusted device requires you to set an authentication method next. If you do not have your trusted device with you, authentication will be required to access your profile."</string>
+    <string name="forget" msgid="3971143908183848527">"Forget"</string>
+    <string name="connect" msgid="5861699594602380150">"Connect"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Disconnect"</string>
+    <string name="delete_button" msgid="5840500432614610850">"Delete"</string>
+    <string name="remove_button" msgid="6664656962868194178">"Remove"</string>
+    <string name="cancel" msgid="750286395700355455">"Cancel"</string>
+    <string name="backspace_key" msgid="1545590866688979099">"Backspace key"</string>
+    <string name="enter_key" msgid="2121394305541579468">"Enter key"</string>
+    <string name="exit_retail_button_text" msgid="6093240315583384473">"Exit Demo"</string>
+    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Exit demo mode"</string>
+    <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"This will delete the demo account and factory data reset the system. All user data will be lost."</string>
+    <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Exit Demo"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"DISMISS"</string>
+    <string name="restricted_while_driving" msgid="6217369093121968299">"Feature not available while driving."</string>
+    <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Can\'t add user while driving."</string>
+</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index db58240..ad3a983 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"dim screen, touchscreen, battery"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"dim screen, night, tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Network &amp; internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
+    <string name="data_warning" msgid="116776633806885370">"Data warning"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
+    <string name="data_limit" msgid="227338836292511425">"Data limit"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limiting data usage"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Set up &amp; manage wireless access points"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Turning Wi‑Fi on…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Turning off Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Loading Wi‑Fi list"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi disabled"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Failed to forget network"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Failed to connect to network"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi disabled"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Password"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Network name"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Enter the SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Security"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signal strength"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signal strength"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Link speed"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequency"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP Address"</string>
+    <string name="show_password" msgid="2074628020371139240">"Show password"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Enter network name"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Enter password"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Poor"</item>
-    <item msgid="2032262610626057081">"Fair"</item>
-    <item msgid="3859756017461098953">"Good"</item>
-    <item msgid="1521103743353335724">"Excellent"</item>
+    <item msgid="7683058295076342057">"Poor"</item>
+    <item msgid="1639222824821660744">"Fair"</item>
+    <item msgid="1838705897358163300">"Good"</item>
+    <item msgid="6067166649320533751">"Excellent"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Turn on Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth disabled"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Network details"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC address"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP address"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 addresses"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi preferences"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Turn on Wi‑Fi automatically"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi will turn back on near high‑quality saved networks, such as your home network"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Unavailable because location is turned off. Turn on "<annotation id="link">"location"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Turn on Wi‑Fi scanning?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Turn on"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi scanning turned on"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Switch to mobile data automatically"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Use mobile data when Wi‑Fi has no Internet access. Data usage charges may apply."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Learn more"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Manage connections, set device name &amp; discoverability"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Phone"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imaging"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Headphone"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Input Peripheral"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Paired devices"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Available devices"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"No paired devices"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"No available devices"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Paired device"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Name"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Use for"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Change the name of the Bluetooth device"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Unnamed device"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Paired devices"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Pair new device"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth will turn on to pair"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Disconnect device?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Your vehicle will disconnect from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Vehicle\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Device\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Vehicle name"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Rename this vehicle"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Rename device"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Rename"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Available devices"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiles"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth pairing request"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Pair &amp; connect"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth pairing code"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN contains letters or symbols"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Type the pairing code then press Return or Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Usually 0000 or 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Pairing request"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tap to pair with <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages &amp; input"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Preferred engine"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Current engine"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Speech Rate"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Pitch"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Reset"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Sound"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Ring volume"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigation volume"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Set volume for music and videos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Phone ringtone"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Default notification sound"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Default alarm sound"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps &amp; notifications"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Show all apps"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Default apps"</string>
     <string name="applications_settings" msgid="794261395191035632">"App info"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
     <string name="disable_text" msgid="4358165448648990820">"Disable"</string>
     <string name="enable_text" msgid="1794971777861881238">"Enable"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"If you disable this app, Android and other apps may no longer function as intended."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Disable app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
     <string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist &amp; voice input"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Use text from screen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Allow the assist app to access the screen contents as text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Use screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Allow the assist app to access an image of the screen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Auto-fill service"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"None"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Selected"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"The assistant will be able to read information about apps that are in use on your system, including information visible on your screen or accessible within the apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Make sure that you trust this app&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Auto-fill&gt;%1$s&lt;/xliff:g&gt; uses what\'s on your screen to determine what can be auto-filled."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Add service"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent Location Requests"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Scanning"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi scanning"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Allow apps and services to scan for Wi‑Fi networks at any time, even when Wi‑Fi is off. This can be used, for example, to improve location-based features and services."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth scanning"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Allow apps and services to scan for nearby devices at any time, even when Bluetooth is off. This can be used, for example, to improve location-based features and services."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"System updates"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build number"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth address"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Not available"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licence"</string>
     <string name="terms_title" msgid="5201471373602628765">"Terms and conditions"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"System WebView Licence"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
+      <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Reset options"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Network, apps or device reset"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Reset network"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"This will reset all network settings, including:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobile data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Erase all vehicle eSIMs"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"This will not cancel your service plan."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Can’t reset eSIMs"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Select network"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Reset settings"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Reset?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Reset all network settings? You can\'t undo this action!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Reset settings"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Network settings have been reset"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Reset app preferences"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"This will reset all preferences for:\n\n"<li>"Disabled apps"</li>\n<li>"Disabled app notifications"</li>\n<li>"Default applications for actions"</li>\n<li>"Background data restrictions for apps"</li>\n<li>"Any permission restrictions"</li>\n\n"You will not lose any app data."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Reset apps"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"App preferences have been reset"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Erase all data (factory reset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"This will erase all data from your vehicle’s head unit, including:\n\n"<li>"Your Google Account"</li>\n<li>"System and app data and settings"</li>\n<li>"Downloaded apps"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"You are currently signed in to the following accounts:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"There are other users present on this vehicle."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Reset vehicle"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Reset?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Erase all your personal information and downloaded apps? You can\'t undo this action!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Erase everything"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Erasing"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Please wait..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Date &amp; time"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Set date and time"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Set date, time, time zone, &amp; formats"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sort by time zone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Date"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Time"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Add user"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Add account"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Delete user"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"New user"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Guest"</string>
     <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Signed in as admin"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"All admin permissions"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Make admin"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"The user will be able to delete users, including other admins, and factory reset the system."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"This action is not reversible."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Yes, make admin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Create new users"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Make phone calls"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Messaging via car\'s mobile data"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Install new apps"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Uninstall apps"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Add user"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"New user"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Add new user?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Any user can update apps for all other users."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"User limit reached"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> users.</item>
+      <item quantity="one">Only one user can be created.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Failed to create a new user"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Delete this user?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"All apps and data will be deleted."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Failed to delete user."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Delete last user?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"After deleting the only remaining user for this car, a new admin user will be created."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"All data, settings and apps associated with this user will be deleted. You\'ll need to set up the system again."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Choose new admin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"You need at least one admin. To delete this one, choose a replacement first."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Choose admin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Guest"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Guest"</string>
     <string name="user_switch" msgid="6544839750534690781">"Switch"</string>
     <string name="current_user_name" msgid="3813671533249316823">"You (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
     <string name="users_list_title" msgid="770764290290240909">"Users"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Accounts"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"User"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Add account"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"No accounts added"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Accounts for <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatically sync data"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Let apps refresh data automatically"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Turn auto-sync data on?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Any changes that you make to your accounts on the web will be automatically copied to your device.\n\nSome accounts may also automatically copy any changes that you make on the phone to the web. A Google Account works this way."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Turn auto-sync data off?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"This will conserve data, but you’ll need to sync each account manually to collect recent information. And you won’t receive notifications when updates occur."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Account info"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Add account"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Add an account."</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Remove account"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Remove account?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Removing this account will delete all of its messages, contacts and other data from the device!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"This change isn\'t allowed by your admin"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Remove this user?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"All apps and data will be deleted."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Failed to remove user."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Try again?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Dismiss"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Retry"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Add new user?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"When you add a new user, that person needs to set up their space."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Any user can update apps for all other users."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Failed to remove account."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Account sync"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sync on for <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g> items"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sync on for all items"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sync off for all items"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sync is OFF"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sync error"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Last synced <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Syncing now…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tap to sync now<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Password"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Choose a lock type"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Screen lock options"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Lock options"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Enter your pattern"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirm"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redraw"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Set a screen lock"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Choose your PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Choose your pattern"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Choose your passowrd"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Choose your password"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Current screen lock"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"For security, set a pattern"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Clear"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Common passwords are blocked by your IT admin. Try a different password."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Ascending, descending or repeated sequence of digits isn\'t allowed."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Screen lock options"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> days ago"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Add trusted device"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Trusted devices"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> devices</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> device</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Your <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> will unlock this car when it\'s connected. If someone takes your <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, they may be able to access this device"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirm"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Remove trusted device"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Done"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Use the companion app to set up a trusted device. Once set up, you will be able to unlock your user profile when your phone is detected by the vehicle"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Download the companion app on your phone"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Select <xliff:g id="CAR_NAME">%1$s</xliff:g> on your phone to pair the devices"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock can\'t detect security features of this device. To help protect your car, trusted device will only be able to keep your car unlocked once it\'s already unlocked by you. Your trusted device can keep your car unlocked when it\'s nearby, even if someone else is holding it."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Add <xliff:g id="DEVICE_NAME">%1$s</xliff:g> as a trusted device"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> successfully added as a trusted device"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> enrolment failed"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Adding a trusted device requires you to set an authentication method next. If you do not have your trusted device with you, authentication will be required to access your profile."</string>
     <string name="forget" msgid="3971143908183848527">"Forget"</string>
+    <string name="connect" msgid="5861699594602380150">"Connect"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Disconnect"</string>
     <string name="delete_button" msgid="5840500432614610850">"Delete"</string>
     <string name="remove_button" msgid="6664656962868194178">"Remove"</string>
     <string name="cancel" msgid="750286395700355455">"Cancel"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Exit demo mode"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"This will delete the demo account and factory data reset the system. All user data will be lost."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Exit Demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"finish setup"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"not now"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"DISMISS"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Feature not available while driving."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Can\'t add user while driving."</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index db58240..ad3a983 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"dim screen, touchscreen, battery"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"dim screen, night, tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Network &amp; internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Access data using mobile network"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Turn off mobile data?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Data usage"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Data warning limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"App data usage cycle"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Set data warning"</string>
+    <string name="data_warning" msgid="116776633806885370">"Data warning"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Set data limit"</string>
+    <string name="data_limit" msgid="227338836292511425">"Data limit"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limiting data usage"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Your vehicle’s head unit will turn off mobile data once it reaches the limit that you set.\n\nSince data usage is measured by the head unit, and your operator may account for usage differently, consider setting a conservative limit."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Set up &amp; manage wireless access points"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Turning Wi‑Fi on…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Turning off Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Loading Wi‑Fi list"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi disabled"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Failed to forget network"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Failed to connect to network"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Add network"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi disabled"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Password"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Show password"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Network name"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Enter the SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Security"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signal strength"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signal strength"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Link speed"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequency"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP Address"</string>
+    <string name="show_password" msgid="2074628020371139240">"Show password"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Enter network name"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Enter password"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Poor"</item>
-    <item msgid="2032262610626057081">"Fair"</item>
-    <item msgid="3859756017461098953">"Good"</item>
-    <item msgid="1521103743353335724">"Excellent"</item>
+    <item msgid="7683058295076342057">"Poor"</item>
+    <item msgid="1639222824821660744">"Fair"</item>
+    <item msgid="1838705897358163300">"Good"</item>
+    <item msgid="6067166649320533751">"Excellent"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Turn on Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth disabled"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Network details"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC address"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP address"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 addresses"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi preferences"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Turn on Wi‑Fi automatically"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi will turn back on near high‑quality saved networks, such as your home network"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Unavailable because location is turned off. Turn on "<annotation id="link">"location"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Turn on Wi‑Fi scanning?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Turn on"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi scanning turned on"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Switch to mobile data automatically"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Use mobile data when Wi‑Fi has no Internet access. Data usage charges may apply."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Learn more"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Manage connections, set device name &amp; discoverability"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Phone"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imaging"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Headphone"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Input Peripheral"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Paired devices"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Available devices"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"No paired devices"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"No available devices"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Paired device"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Name"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Use for"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Change the name of the Bluetooth device"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Unnamed device"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Paired devices"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Pair new device"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth will turn on to pair"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Disconnect device?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Your vehicle will disconnect from <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Vehicle\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Device\'s Bluetooth address: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Vehicle name"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Rename this vehicle"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Rename device"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Rename"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Available devices"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiles"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth pairing request"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Pair &amp; connect"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth pairing code"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN contains letters or symbols"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Type the pairing code then press Return or Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Usually 0000 or 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Pairing request"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tap to pair with <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Languages"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Languages &amp; input"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Manage keyboards"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Text to speech output"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Preferred engine"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Current engine"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Speech Rate"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Pitch"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Reset"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Sound"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Ring volume"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigation volume"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Set volume for music and videos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Phone ringtone"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Default notification sound"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Default alarm sound"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps &amp; notifications"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Show all apps"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Default apps"</string>
     <string name="applications_settings" msgid="794261395191035632">"App info"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Force stop?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"If you force-stop an app, it may misbehave."</string>
     <string name="disable_text" msgid="4358165448648990820">"Disable"</string>
     <string name="enable_text" msgid="1794971777861881238">"Enable"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Uninstall"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"If you disable this app, Android and other apps may no longer function as intended."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Disable app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permission"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No permissions granted"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No permissions requested"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Data usage"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"App data usage"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Force stop"</string>
     <string name="computing_size" msgid="5791407621793083965">"Computing…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> additional permissions</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> additional permission</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist &amp; voice input"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Use text from screen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Allow the assist app to access the screen contents as text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Use screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Allow the assist app to access an image of the screen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Auto-fill service"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"None"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Selected"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"The assistant will be able to read information about apps that are in use on your system, including information visible on your screen or accessible within the apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Make sure that you trust this app&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Auto-fill&gt;%1$s&lt;/xliff:g&gt; uses what\'s on your screen to determine what can be auto-filled."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Add service"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Location"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recent Location Requests"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No recent location requests"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"App-level permissions"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Scanning"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Location Services"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi scanning"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Allow apps and services to scan for Wi‑Fi networks at any time, even when Wi‑Fi is off. This can be used, for example, to improve location-based features and services."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth scanning"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Allow apps and services to scan for nearby devices at any time, even when Bluetooth is off. This can be used, for example, to improve location-based features and services."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"System updates"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"System updates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android security patch level"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband version"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Build number"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth address"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Not available"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licence"</string>
     <string name="terms_title" msgid="5201471373602628765">"Terms and conditions"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"System WebView Licence"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"System WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite imagery providers:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Third-party licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"There is a problem loading the licences."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Loading…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
+      <item quantity="one">You are now <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> step away from being a developer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"You are now a developer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"No need, you are already a developer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Developer options"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Reset options"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Network, apps or device reset"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Reset network"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"This will reset all network settings, including:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobile data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Erase all vehicle eSIMs"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"This will not cancel your service plan."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Can’t reset eSIMs"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Select network"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Reset settings"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Reset?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Reset all network settings? You can\'t undo this action!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Reset settings"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Network settings have been reset"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Reset app preferences"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"This will reset all preferences for:\n\n"<li>"Disabled apps"</li>\n<li>"Disabled app notifications"</li>\n<li>"Default applications for actions"</li>\n<li>"Background data restrictions for apps"</li>\n<li>"Any permission restrictions"</li>\n\n"You will not lose any app data."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Reset apps"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"App preferences have been reset"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Erase all data (factory reset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"This will erase all data from your vehicle’s head unit, including:\n\n"<li>"Your Google Account"</li>\n<li>"System and app data and settings"</li>\n<li>"Downloaded apps"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"You are currently signed in to the following accounts:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"There are other users present on this vehicle."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Reset vehicle"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Reset?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Erase all your personal information and downloaded apps? You can\'t undo this action!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Erase everything"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Erasing"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Please wait..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Date &amp; time"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Set date and time"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Set date, time, time zone, &amp; formats"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sort by time zone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Date"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Time"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Add user"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Add account"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Delete user"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"New user"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Guest"</string>
     <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Signed in as admin"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"All admin permissions"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Make admin"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"The user will be able to delete users, including other admins, and factory reset the system."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"This action is not reversible."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Yes, make admin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Create new users"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Make phone calls"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Messaging via car\'s mobile data"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Install new apps"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Uninstall apps"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Add user"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"New user"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Add new user?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"When you add a new user, that person needs to set up their space."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Any user can update apps for all other users."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"User limit reached"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">You can create up to <xliff:g id="COUNT">%d</xliff:g> users.</item>
+      <item quantity="one">Only one user can be created.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Failed to create a new user"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Delete this user?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"All apps and data will be deleted."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Failed to delete user."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Dismiss"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Retry"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Delete last user?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"After deleting the only remaining user for this car, a new admin user will be created."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"All data, settings and apps associated with this user will be deleted. You\'ll need to set up the system again."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Choose new admin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"You need at least one admin. To delete this one, choose a replacement first."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Choose admin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Guest"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Guest"</string>
     <string name="user_switch" msgid="6544839750534690781">"Switch"</string>
     <string name="current_user_name" msgid="3813671533249316823">"You (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Name"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Not set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit user name"</string>
     <string name="users_list_title" msgid="770764290290240909">"Users"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permissions granted to %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Accounts"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"User"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Add account"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"No accounts added"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Accounts for <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatically sync data"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Let apps refresh data automatically"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Turn auto-sync data on?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Any changes that you make to your accounts on the web will be automatically copied to your device.\n\nSome accounts may also automatically copy any changes that you make on the phone to the web. A Google Account works this way."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Turn auto-sync data off?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"This will conserve data, but you’ll need to sync each account manually to collect recent information. And you won’t receive notifications when updates occur."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Account info"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Add account"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Add an account."</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Remove account"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Remove account?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Removing this account will delete all of its messages, contacts and other data from the device!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"This change isn\'t allowed by your admin"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Remove this user?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"All apps and data will be deleted."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Failed to remove user."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Try again?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Dismiss"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Retry"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Add new user?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"When you add a new user, that person needs to set up their space."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Any user can update apps for all other users."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Failed to remove account."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Account sync"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sync on for <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g> items"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sync on for all items"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sync off for all items"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sync is OFF"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sync error"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Last synced <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Syncing now…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tap to sync now<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sync now"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancel sync"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sync is currently experiencing problems. It will be back shortly."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Security"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Screen lock"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"None"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Password"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Choose a lock type"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Screen lock options"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Lock options"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Enter your pattern"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirm"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redraw"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Set a screen lock"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Choose your PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Choose your pattern"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Choose your passowrd"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Choose your password"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Current screen lock"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"For security, set a pattern"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Clear"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Common passwords are blocked by your IT admin. Try a different password."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Ascending, descending or repeated sequence of digits isn\'t allowed."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Screen lock options"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> days ago"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Add trusted device"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Trusted devices"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> devices</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> device</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Your <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> will unlock this car when it\'s connected. If someone takes your <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, they may be able to access this device"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirm"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Remove trusted device"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Done"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Use the companion app to set up a trusted device. Once set up, you will be able to unlock your user profile when your phone is detected by the vehicle"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Download the companion app on your phone"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Select <xliff:g id="CAR_NAME">%1$s</xliff:g> on your phone to pair the devices"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock can\'t detect security features of this device. To help protect your car, trusted device will only be able to keep your car unlocked once it\'s already unlocked by you. Your trusted device can keep your car unlocked when it\'s nearby, even if someone else is holding it."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Add <xliff:g id="DEVICE_NAME">%1$s</xliff:g> as a trusted device"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> successfully added as a trusted device"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> enrolment failed"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Adding a trusted device requires you to set an authentication method next. If you do not have your trusted device with you, authentication will be required to access your profile."</string>
     <string name="forget" msgid="3971143908183848527">"Forget"</string>
+    <string name="connect" msgid="5861699594602380150">"Connect"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Disconnect"</string>
     <string name="delete_button" msgid="5840500432614610850">"Delete"</string>
     <string name="remove_button" msgid="6664656962868194178">"Remove"</string>
     <string name="cancel" msgid="750286395700355455">"Cancel"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Exit demo mode"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"This will delete the demo account and factory data reset the system. All user data will be lost."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Exit Demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"finish setup"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"not now"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"DISMISS"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Feature not available while driving."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Can\'t add user while driving."</string>
 </resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..2b696a6
--- /dev/null
+++ b/res/values-en-rXC/strings.xml
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="settings_label" msgid="5147911978211079839">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎Settings‎‏‎‎‏‎"</string>
+    <string name="more_settings_label" msgid="3867559443480110616">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎More‎‏‎‎‏‎"</string>
+    <string name="display_settings" msgid="5325515247739279185">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎Display‎‏‎‎‏‎"</string>
+    <string name="brightness" msgid="2919605130898772866">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎Brightness level‎‏‎‎‏‎"</string>
+    <string name="auto_brightness_title" msgid="9124647862844666581">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‎Adaptive brightness‎‏‎‎‏‎"</string>
+    <string name="auto_brightness_summary" msgid="4741887033140384352">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎‎‎Optimize brightness level for available light‎‏‎‎‏‎"</string>
+    <string name="condition_night_display_title" msgid="3777509730126972675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‏‎Night Light is on‎‏‎‎‏‎"</string>
+    <string name="keywords_display" msgid="3978416985146943922">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎screen, touchscreen‎‏‎‎‏‎"</string>
+    <string name="keywords_display_brightness_level" msgid="3956411572536209195">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‎dim screen, touchscreen, battery‎‏‎‎‏‎"</string>
+    <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎dim screen, touchscreen, battery‎‏‎‎‏‎"</string>
+    <string name="keywords_display_night_display" msgid="2922294576679769957">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‏‏‏‎‏‏‎‎‏‎‏‎dim screen, night, tint‎‏‎‎‏‎"</string>
+    <string name="night_mode_tile_label" msgid="6603597795502131664">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‎Night mode‎‏‎‎‏‎"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‎‎Network &amp; internet‎‏‎‎‏‎"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎Mobile network‎‏‎‎‏‎"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‏‎Mobile data‎‏‎‎‏‎"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎Access data using mobile network‎‏‎‎‏‎"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎Turn off mobile data?‎‏‎‎‏‎"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎Data usage‎‏‎‎‏‎"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‎Data warning &amp; limit‎‏‎‎‏‎"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎App data usage cycle‎‏‎‎‏‎"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎Set data warning‎‏‎‎‏‎"</string>
+    <string name="data_warning" msgid="116776633806885370">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎Data warning‎‏‎‎‏‎"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎Set data limit‎‏‎‎‏‎"</string>
+    <string name="data_limit" msgid="227338836292511425">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎Data limit‎‏‎‎‏‎"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎Limiting data usage‎‏‎‎‏‎"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‎Your vehicle’s head unit will turn off mobile data once it reaches the limit you set.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Since data usage is measured by the head unit, and your carrier may account for usage differently, consider setting a conservative limit.‎‏‎‎‏‎"</string>
+    <string name="wifi_settings" msgid="7701477685273103841">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎Wi‑Fi‎‏‎‎‏‎"</string>
+    <string name="wifi_starting" msgid="473253087503153167">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‎Turning Wi‑Fi on…‎‏‎‎‏‎"</string>
+    <string name="wifi_stopping" msgid="3534173972547890148">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‎Turning off Wi‑Fi…‎‏‎‎‏‎"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎Loading Wi‑Fi list‎‏‎‎‏‎"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‎‎Wi‑Fi disabled‎‏‎‎‏‎"</string>
+    <string name="wifi_failed_forget_message" msgid="121732682699377206">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎Failed to forget network‎‏‎‎‏‎"</string>
+    <string name="wifi_failed_connect_message" msgid="4447498225022147324">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‏‎‎‎Failed to connect to network‎‏‎‎‏‎"</string>
+    <string name="wifi_setup_add_network" msgid="3660498520389954620">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎Add network‎‏‎‎‏‎"</string>
+    <string name="wifi_setup_connect" msgid="3512399573397979101">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎Connect‎‏‎‎‏‎"</string>
+    <string name="wifi_password" msgid="5565632142720292397">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎Password‎‏‎‎‏‎"</string>
+    <string name="wifi_show_password" msgid="8423293211933521097">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎Show password‎‏‎‎‏‎"</string>
+    <string name="wifi_ssid" msgid="488604828159458741">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎Network name‎‏‎‎‏‎"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎Enter the SSID‎‏‎‎‏‎"</string>
+    <string name="wifi_security" msgid="158358046038876532">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎Security‎‏‎‎‏‎"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎‏‎Signal strength‎‏‎‎‏‎"</string>
+    <string name="wifi_status" msgid="5688013206066543952">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎Status‎‏‎‎‏‎"</string>
+    <string name="wifi_speed" msgid="1650692446731850781">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎Link speed‎‏‎‎‏‎"</string>
+    <string name="wifi_frequency" msgid="8951455949682864922">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‎Frequency‎‏‎‎‏‎"</string>
+    <string name="wifi_ip_address" msgid="3128140627890954061">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎IP address‎‏‎‎‏‎"</string>
+    <string name="show_password" msgid="2074628020371139240">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎Show password‎‏‎‎‏‎"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎Enter network name‎‏‎‎‏‎"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‎Enter password‎‏‎‎‏‎"</string>
+    <string name="access_point_tag_key" msgid="1517143378973053337">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‎access_point_tag_key‎‏‎‎‏‎"</string>
+  <string-array name="wifi_signals">
+    <item msgid="4897376984576812606">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎Poor‎‏‎‎‏‎"</item>
+    <item msgid="7683058295076342057">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‎Poor‎‏‎‎‏‎"</item>
+    <item msgid="1639222824821660744">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‎‎Fair‎‏‎‎‏‎"</item>
+    <item msgid="1838705897358163300">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎Good‎‏‎‎‏‎"</item>
+    <item msgid="6067166649320533751">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎Excellent‎‏‎‎‏‎"</item>
+  </string-array>
+    <string name="link_speed" msgid="7868861844075624445">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎%1$d Mbps‎‏‎‎‏‎"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎2.4 GHz‎‏‎‎‏‎"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‎‎‎‎5 GHz‎‏‎‎‏‎"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‎Network details‎‏‎‎‏‎"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‎MAC address‎‏‎‎‏‎"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎IP address‎‏‎‎‏‎"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‎Subnet mask‎‏‎‎‏‎"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‎DNS‎‏‎‎‏‎"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎IPv6 addresses‎‏‎‎‏‎"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‏‎Gateway‎‏‎‎‏‎"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎Wi‑Fi preferences‎‏‎‎‏‎"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎Turn on Wi‑Fi automatically‎‏‎‎‏‎"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‏‎‏‏‎‎Wi‑Fi will turn back on near high‑quality saved networks, like your home network‎‏‎‎‏‎"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‏‏‎Unavailable because location is turned off. Turn on ‎‏‎‎‏‏‎"<annotation id="link">"‎‏‎‎‏‏‏‎location‎‏‎‎‏‏‎"</annotation>"‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎Turn on Wi‑Fi scanning?‎‏‎‎‏‎"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‏‎‎Turn on‎‏‎‎‏‎"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎‎‏‎Wi‑Fi scanning turned on‎‏‎‎‏‎"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‎‎Switch to mobile data automatically‎‏‎‎‏‎"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‎‎Use mobile data when Wi‑Fi has no internet access. Data usage charges may apply.‎‏‎‎‏‎"</string>
+    <string name="learn_more" msgid="8214605928933358604">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎Learn more‎‏‎‎‏‎"</string>
+    <string name="bluetooth_settings_title" msgid="3794688574569688649">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‎‏‎‎‏‎Bluetooth‎‏‎‎‏‎"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎Unnamed device‎‏‎‎‏‎"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎Paired devices‎‏‎‎‏‎"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎Pair new device‎‏‎‎‏‎"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎Bluetooth will turn on to pair‎‏‎‎‏‎"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎Disconnect device?‎‏‎‎‏‎"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎Your vehicle will disconnect from ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‏‎Vehicle\'s Bluetooth address: ‎‏‎‎‏‏‎<xliff:g id="ADDRESS">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‎Device\'s Bluetooth address: ‎‏‎‎‏‏‎<xliff:g id="ADDRESS">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎Vehicle name‎‏‎‎‏‎"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎Rename this vehicle‎‏‎‎‏‎"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎Rename device‎‏‎‎‏‎"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‎‏‏‏‏‎Rename‎‏‎‎‏‎"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎Available devices‎‏‎‎‏‎"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎Profiles‎‏‎‎‏‎"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
+    <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎Bluetooth pairing request‎‏‎‎‏‎"</string>
+    <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‏‏‎‎Pair &amp; connect‎‏‎‎‏‎"</string>
+    <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‏‎‏‎Bluetooth pairing code‎‏‎‎‏‎"</string>
+    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎PIN contains letters or symbols‎‏‎‎‏‎"</string>
+    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‏‎Type the pairing code then press Return or Enter‎‏‎‎‏‎"</string>
+    <string name="bluetooth_pairing_request" msgid="4769675459526556801">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎Pair with ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎?‎‏‎‎‏‎"</string>
+    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‏‏‎‎Allow ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ to access your contacts and call history‎‏‎‎‏‎"</string>
+    <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎You may also need to type this PIN on the other device.‎‏‎‎‏‎"</string>
+    <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‎You may also need to type this passkey on the other device.‎‏‎‎‏‎"</string>
+    <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎Must be 16 digits‎‏‎‎‏‎"</string>
+    <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‏‏‏‎Usually 0000 or 1234‎‏‎‎‏‎"</string>
+    <string name="bluetooth_notif_title" msgid="8374602799367803335">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎Pairing request‎‏‎‎‏‎"</string>
+    <string name="bluetooth_notif_message" msgid="1060821000510108726">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‎‎Tap to pair with ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎.‎‏‎‎‏‎"</string>
+    <string name="language_settings" msgid="2079258598337245546">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎Languages‎‏‎‎‏‎"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‎Languages &amp; input‎‏‎‎‏‎"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎Keyboard‎‏‎‎‏‎"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‎Manage keyboards‎‏‎‎‏‎"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎Text-to-speech output‎‏‎‎‏‎"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎Preferred engine‎‏‎‎‏‎"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‏‎‏‎Current engine‎‏‎‎‏‎"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎Speech Rate‎‏‎‎‏‎"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‏‏‎Pitch‎‏‎‎‏‎"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‏‎Reset‎‏‎‎‏‎"</string>
+    <string name="sound_settings" msgid="3072423952331872246">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎Sound‎‏‎‎‏‎"</string>
+    <string name="ring_volume_title" msgid="3135241004980719442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‎‏‎‎Ring volume‎‏‎‎‏‎"</string>
+    <string name="navi_volume_title" msgid="946292066759195165">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎Navigation volume‎‏‎‎‏‎"</string>
+    <string name="incoming_call_volume_title" msgid="6972117872424656876">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎Ringtone‎‏‎‎‏‎"</string>
+    <string name="notification_volume_title" msgid="6749411263197157876">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‎Notification‎‏‎‎‏‎"</string>
+    <string name="media_volume_title" msgid="6697416686272606865">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‎Media‎‏‎‎‏‎"</string>
+    <string name="media_volume_summary" msgid="2961762827637127239">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎Set volume for music and videos‎‏‎‎‏‎"</string>
+    <string name="alarm_volume_title" msgid="840384014895796587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎Alarm‎‏‎‎‏‎"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎Phone ringtone‎‏‎‎‏‎"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎Default notification sound‎‏‎‎‏‎"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎Default alarm sound‎‏‎‎‏‎"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎Apps &amp; notifications‎‏‎‎‏‎"</string>
+    <string name="all_applications" msgid="7798210477486822168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎Show all apps‎‏‎‎‏‎"</string>
+    <string name="default_applications" msgid="1558183275638697087">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎Default apps‎‏‎‎‏‎"</string>
+    <string name="applications_settings" msgid="794261395191035632">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎App info‎‏‎‎‏‎"</string>
+    <string name="force_stop" msgid="2153183697014720520">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‎‎‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎Force stop‎‏‎‎‏‎"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‎Force stop?‎‏‎‎‏‎"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‏‎‏‏‏‎If you force stop an app, it may misbehave.‎‏‎‎‏‎"</string>
+    <string name="disable_text" msgid="4358165448648990820">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‏‎‎‎Disable‎‏‎‎‏‎"</string>
+    <string name="enable_text" msgid="1794971777861881238">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎Enable‎‏‎‎‏‎"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎Uninstall‎‏‎‎‏‎"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‎‎‏‎If you disable this app, Android and other apps may no longer function as intended.‎‏‎‎‏‎"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎Disable app‎‏‎‎‏‎"</string>
+    <string name="permissions_label" msgid="2701446753515612685">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‎‏‎Permissions‎‏‎‎‏‎"</string>
+    <string name="application_version_label" msgid="8556889839783311649">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎Version: %1$s‎‏‎‎‏‎"</string>
+    <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎No permissions granted‎‏‎‎‏‎"</string>
+    <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‎No permissions requested‎‏‎‎‏‎"</string>
+    <string name="data_usage_summary_title" msgid="4368024763485916986">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎Data usage‎‏‎‎‏‎"</string>
+    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎App data usage‎‏‎‎‏‎"</string>
+    <string name="computing_size" msgid="5791407621793083965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‏‎‏‎Computing…‎‏‎‎‏‎"</string>
+    <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ additional permissions‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ additional permission‎‏‎‎‏‎</item>
+    </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎Assist &amp; voice input‎‏‎‎‏‎"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎Assist app‎‏‎‎‏‎"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‎Use text from screen‎‏‎‎‏‎"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎Allow the assist app to access the screen contents as text‎‏‎‎‏‎"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎Use screenshot‎‏‎‎‏‎"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎Allow the assist app to access an image of the screen‎‏‎‎‏‎"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎Autofill service‎‏‎‎‏‎"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‎None‎‏‎‎‏‎"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎Selected‎‏‎‎‏‎"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎The assistant will be able to read information about apps in use on your system, including information visible on your screen or accessible within the apps.‎‏‎‎‏‎"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎‎&lt;b&gt;Make sure you trust this app&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; uses what\'s on your screen to determine what can be autofilled.‎‏‎‎‏‎"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎Add service‎‏‎‎‏‎"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‎Location‎‏‎‎‏‎"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎Recent Location Requests‎‏‎‎‏‎"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎No recent location requests‎‏‎‎‏‎"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎App-level permissions‎‏‎‎‏‎"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎Scanning‎‏‎‎‏‎"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎Location Services‎‏‎‎‏‎"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎Wi‑Fi scanning‎‏‎‎‏‎"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‎Allow apps and services to scan for Wi‑Fi networks at any time, even when Wi‑Fi is off. This can be used, for example, to improve location-based features and services.‎‏‎‎‏‎"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‏‎‏‏‎Bluetooth scanning‎‏‎‎‏‎"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‎‎Allow apps and services to scan for nearby devices at any time, even when Bluetooth is off. This can be used, for example, to improve location-based features and services.‎‏‎‎‏‎"</string>
+    <string name="system_setting_title" msgid="6864599341809463440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‎System‎‏‎‎‏‎"</string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎System updates‎‏‎‎‏‎"</string>
+    <string name="firmware_version" msgid="8491753744549309333">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‏‎‏‎Android version‎‏‎‎‏‎"</string>
+    <string name="security_patch" msgid="4794276590178386903">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎Android security patch level‎‏‎‎‏‎"</string>
+    <string name="model_info" msgid="4966408071657934452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎Model‎‏‎‎‏‎"</string>
+    <string name="baseband_version" msgid="2370088062235041897">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎Baseband version‎‏‎‎‏‎"</string>
+    <string name="kernel_version" msgid="7327212934187011508">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‎‎Kernel version‎‏‎‎‏‎"</string>
+    <string name="build_number" msgid="3997326631001009102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‎‎‎‎‎‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‎Build number‎‏‎‎‏‎"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‎Bluetooth address‎‏‎‎‏‎"</string>
+    <string name="device_info_not_available" msgid="2095601973977376655">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‏‏‎Not available‎‏‎‎‏‎"</string>
+    <string name="device_status_activity_title" msgid="4083567497305368200">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎Status‎‏‎‎‏‎"</string>
+    <string name="device_status" msgid="267298179806290920">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎Status‎‏‎‎‏‎"</string>
+    <string name="device_status_summary" product="tablet" msgid="600543254608862075">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎Status of the battery, network, and other information‎‏‎‎‏‎"</string>
+    <string name="device_status_summary" product="default" msgid="9130360324418117815">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎Phone number, signal, etc.‎‏‎‎‏‎"</string>
+    <string name="about_settings" msgid="4329457966672592345">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎About‎‏‎‎‏‎"</string>
+    <string name="about_summary" msgid="5374623866267691206">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎Android ‎‏‎‎‏‏‎<xliff:g id="VERSION">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="about_settings_summary" msgid="7975072809083281401">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎View legal info, status, software version‎‏‎‎‏‎"</string>
+    <string name="legal_information" msgid="1838443759229784762">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‏‎‏‎‎Legal information‎‏‎‎‏‎"</string>
+    <string name="contributors_title" msgid="7698463793409916113">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎Contributors‎‏‎‎‏‎"</string>
+    <string name="manual" msgid="4819839169843240804">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‎Manual‎‏‎‎‏‎"</string>
+    <string name="regulatory_labels" msgid="3165587388499646779">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎Regulatory labels‎‏‎‎‏‎"</string>
+    <string name="safety_and_regulatory_info" msgid="1204127697132067734">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‏‎‎Safety &amp; regulatory manual‎‏‎‎‏‎"</string>
+    <string name="copyright_title" msgid="4220237202917417876">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‎‎Copyright‎‏‎‎‏‎"</string>
+    <string name="license_title" msgid="936705938435249965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎License‎‏‎‎‏‎"</string>
+    <string name="terms_title" msgid="5201471373602628765">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‎Terms and conditions‎‏‎‎‏‎"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎System WebView licenses‎‏‎‎‏‎"</string>
+    <string name="wallpaper_attributions" msgid="9201272150014500697">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎Wallpapers‎‏‎‎‏‎"</string>
+    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‏‎Satellite imagery providers:‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎©2014 CNES / Astrium, DigitalGlobe, Bluesky‎‏‎‎‏‎"</string>
+    <string name="settings_license_activity_title" msgid="8499293744313077709">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎Third-party licenses‎‏‎‎‏‎"</string>
+    <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎There is a problem loading the licenses.‎‏‎‎‏‎"</string>
+    <string name="settings_license_activity_loading" msgid="6163263123009681841">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎Loading…‎‏‎‎‏‎"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎You are now ‎‏‎‎‏‏‎<xliff:g id="STEP_COUNT_1">%1$d</xliff:g>‎‏‎‎‏‏‏‎ steps away from being a developer.‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‎You are now ‎‏‎‎‏‏‎<xliff:g id="STEP_COUNT_0">%1$d</xliff:g>‎‏‎‎‏‏‏‎ step away from being a developer.‎‏‎‎‏‎</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎You are now a developer!‎‏‎‎‏‎"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎No need, you are already a developer.‎‏‎‎‏‎"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎Developer options‎‏‎‎‏‎"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‏‏‎‎‎Reset options‎‏‎‎‏‎"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‏‎‏‎Network, apps, or device reset‎‏‎‎‏‎"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‎Reset network‎‏‎‎‏‎"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎This will reset all network settings, including:‎‏‎‎‏‎"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Wi‑Fi‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Mobile data‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Bluetooth‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎Erase all vehicle eSIMs‎‏‎‎‏‎"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎This will not cancel your service plan.‎‏‎‎‏‎"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‎Can’t reset eSIMs‎‏‎‎‏‎"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎Select network‎‏‎‎‏‎"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎Reset settings‎‏‎‎‏‎"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‎Reset?‎‏‎‎‏‎"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎Reset all network settings? You can’t undo this action!‎‏‎‎‏‎"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎‎‏‏‎Reset settings‎‏‎‎‏‎"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‏‎Network settings have been reset‎‏‎‎‏‎"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‎‎Reset app preferences‎‏‎‎‏‎"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‎‏‎‏‎This will reset all preferences for:‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Disabled apps‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Disabled app notifications‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Default applications for actions‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Background data restrictions for apps‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Any permission restrictions‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎You will not lose any app data.‎‏‎‎‏‎"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎Reset apps‎‏‎‎‏‎"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎‎App preferences have been reset‎‏‎‎‏‎"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎Erase all data (factory reset)‎‏‎‎‏‎"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎This will erase all data from your vehicle’s head unit, including:‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Your Google account‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎System and app data and settings‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎"<li>"‎‏‎‎‏‏‏‎Downloaded apps‎‏‎‎‏‏‎"</li>"‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎You are currently signed into the following accounts:‎‏‎‎‏‎"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎There are other users present on this vehicle.‎‏‎‎‏‎"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎Reset vehicle‎‏‎‎‏‎"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎Reset?‎‏‎‎‏‎"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‏‎‎Erase all your personal information and downloaded apps? You can’t undo this action!‎‏‎‎‏‎"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‎Erase everything‎‏‎‎‏‎"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎Erasing‎‏‎‎‏‎"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‎Please wait...‎‏‎‎‏‎"</string>
+    <string name="date_and_time_settings_title" msgid="4058492663544475485">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‏‎Date &amp; time‎‏‎‎‏‎"</string>
+    <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎Set date and time‎‏‎‎‏‎"</string>
+    <string name="date_and_time_settings_summary" msgid="7669856855390804666">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‏‎‎Set date, time, time zone, &amp; formats‎‏‎‎‏‎"</string>
+    <string name="date_time_auto" msgid="3570339569471779767">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎Automatic date &amp; time‎‏‎‎‏‎"</string>
+    <string name="date_time_auto_summary" msgid="3311706425095342759">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‎Use network-provided time‎‏‎‎‏‎"</string>
+    <string name="zone_auto" msgid="3701878581920206160">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎‎‎Automatic time zone‎‏‎‎‏‎"</string>
+    <string name="zone_auto_summary" msgid="4345856882906981864">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎Use network-provided time zone‎‏‎‎‏‎"</string>
+    <string name="date_time_24hour_title" msgid="3025576547136168692">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎24‑hour format‎‏‎‎‏‎"</string>
+    <string name="date_time_24hour" msgid="1137618702556486913">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎Use 24-hour format‎‏‎‎‏‎"</string>
+    <string name="date_time_set_time_title" msgid="5884883050656937853">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎Time‎‏‎‎‏‎"</string>
+    <string name="date_time_set_time" msgid="6449555153906058248">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‎‏‎‎‎‎Set time‎‏‎‎‏‎"</string>
+    <string name="date_time_set_timezone_title" msgid="3001779256157093425">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎Time zone‎‏‎‎‏‎"</string>
+    <string name="date_time_set_timezone" msgid="4759353576185916944">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‎Select time zone‎‏‎‎‏‎"</string>
+    <string name="date_time_set_date_title" msgid="6834785820357051138">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎Date‎‏‎‎‏‎"</string>
+    <string name="date_time_set_date" msgid="2537494485643283230">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‏‎‎Set date‎‏‎‎‏‎"</string>
+    <string name="zone_list_menu_sort_alphabetically" msgid="7041628618528523514">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‎‏‎‎Sort alphabetically‎‏‎‎‏‎"</string>
+    <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎‎‎Sort by time zone‎‏‎‎‏‎"</string>
+    <string name="date_picker_title" msgid="1533614225273770178">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎Date‎‏‎‎‏‎"</string>
+    <string name="time_picker_title" msgid="7436045944320504639">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‎Time‎‏‎‎‏‎"</string>
+    <string name="user_admin" msgid="1535484812908584809">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎Admin‎‏‎‎‏‎"</string>
+    <string name="signed_in_admin_user" msgid="1267225622818673274">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎Signed in as admin‎‏‎‎‏‎"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎‏‎All admin permissions‎‏‎‎‏‎"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎Make Admin‎‏‎‎‏‎"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‎The user will be able to delete users, including other Admins, and factory reset the system.‎‏‎‎‏‎"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‏‎‏‎This action is not reversible.‎‏‎‎‏‎"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‎‎‏‎‎Yes, make admin‎‏‎‎‏‎"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎Create new users‎‏‎‎‏‎"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎Make phone calls‎‏‎‎‏‎"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎Messaging via car\'s mobile data‎‏‎‎‏‎"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎Install new apps‎‏‎‎‏‎"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‏‎Uninstall apps‎‏‎‎‏‎"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎Add user‎‏‎‎‏‎"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎New user‎‏‎‎‏‎"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‎Add new user?‎‏‎‎‏‎"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‏‎‎When you add a new user, that person needs to set up their space.‎‏‎‎‏‎"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎Any user can update apps for all other users.‎‏‎‎‏‎"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‏‏‎‎User limit reached‎‏‎‎‏‎"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎You can create up to ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ users.‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‎Only one user can be created.‎‏‎‎‏‎</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‎‎Failed to create a new user‎‏‎‎‏‎"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎Delete this user?‎‏‎‎‏‎"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎All apps and data will be deleted.‎‏‎‎‏‎"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‏‎Failed to delete user.‎‏‎‎‏‎"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‏‎Dismiss‎‏‎‎‏‎"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎Retry‎‏‎‎‏‎"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‎Delete last user?‎‏‎‎‏‎"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎After deleting the only remaining user for this car, a new admin user will be created.‎‏‎‎‏‎"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎All data, settings, and apps associated with this user will be deleted. You\'ll need to set up the system again.‎‏‎‎‏‎"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‎Choose new admin‎‏‎‎‏‎"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‎You need at least one admin. To delete this one, first choose a replacement.‎‏‎‎‏‎"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎Choose admin‎‏‎‎‏‎"</string>
+    <string name="user_guest" msgid="3465399481257448601">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎Guest‎‏‎‎‏‎"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‎‏‎Guest‎‏‎‎‏‎"</string>
+    <string name="user_switch" msgid="6544839750534690781">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎Switch‎‏‎‎‏‎"</string>
+    <string name="current_user_name" msgid="3813671533249316823">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎You (%1$s)‎‏‎‎‏‎"</string>
+    <string name="user_name_label" msgid="3210832645046206845">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎Name‎‏‎‎‏‎"</string>
+    <string name="user_summary_not_set_up" msgid="1473688119241224145">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎Not set up‎‏‎‎‏‎"</string>
+    <string name="edit_user_name_title" msgid="6890782937520262478">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‏‏‎‎Edit user name‎‏‎‎‏‎"</string>
+    <string name="users_list_title" msgid="770764290290240909">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎Users‎‏‎‎‏‎"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎Permissions granted to %1$s‎‏‎‎‏‎"</string>
+    <string name="accounts_settings_title" msgid="436190037084293471">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎Accounts‎‏‎‎‏‎"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‎Add account‎‏‎‎‏‎"</string>
+    <string name="no_accounts_added" msgid="5148163140691096055">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‎No accounts added‎‏‎‎‏‎"</string>
+    <string name="account_list_title" msgid="7631588514613843065">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎Accounts for ‎‏‎‎‏‏‎<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‎‎‎Automatically sync data‎‏‎‎‏‎"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎Let apps refresh data automatically‎‏‎‎‏‎"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎Turn auto-sync data on?‎‏‎‎‏‎"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎Any changes you make to your accounts on the web will be automatically copied to your device.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Some accounts may also automatically copy any changes you make on the phone to the web. A Google Account works this way.‎‏‎‎‏‎"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎Turn auto-sync data off?‎‏‎‎‏‎"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‏‏‎This will conserve data, but you’ll need to sync each account manually to collect recent information. And you won’t receive notifications when updates occur.‎‏‎‎‏‎"</string>
+    <string name="account_details_title" msgid="7529571432258448573">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎Account info‎‏‎‎‏‎"</string>
+    <string name="add_account_title" msgid="5988746086885210040">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎Add account‎‏‎‎‏‎"</string>
+    <string name="add_an_account" msgid="1072285034300995091">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎Add an account‎‏‎‎‏‎"</string>
+    <string name="user_cannot_add_accounts_message" msgid="6775605884544906797">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎Restricted profiles cannot add accounts‎‏‎‎‏‎"</string>
+    <string name="remove_account_title" msgid="8840386525787836381">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎Remove account‎‏‎‎‏‎"</string>
+    <string name="really_remove_account_title" msgid="3555164432587924900">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎Remove account?‎‏‎‎‏‎"</string>
+    <string name="really_remove_account_message" msgid="4296769280849579900">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‎‏‎‏‎‏‎‎‏‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎Removing this account will delete all of its messages, contacts, and other data from the device!‎‏‎‎‏‎"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎Failed to remove account.‎‏‎‎‏‎"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎Account sync‎‏‎‎‏‎"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‎Sync on for ‎‏‎‎‏‏‎<xliff:g id="ID_1">%1$d</xliff:g>‎‏‎‎‏‏‏‎ of ‎‏‎‎‏‏‎<xliff:g id="ID_2">%2$d</xliff:g>‎‏‎‎‏‏‏‎ items‎‏‎‎‏‎"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎Sync on for all items‎‏‎‎‏‎"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‏‎‎Sync off for all items‎‏‎‎‏‎"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎Sync is OFF‎‏‎‎‏‎"</string>
+    <string name="sync_error" msgid="6698021343089247914">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎Sync error‎‏‎‎‏‎"</string>
+    <string name="last_synced" msgid="4745124489150101529">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‎Last synced ‎‏‎‎‏‏‎<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎Syncing now…‎‏‎‎‏‎"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎Tap to sync now‎‏‎‎‏‏‎<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‎‎‏‏‎Sync now‎‏‎‎‏‎"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎Cancel sync‎‏‎‎‏‎"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎Sync is currently experiencing problems. It will be back shortly.‎‏‎‎‏‎"</string>
+    <string name="security_settings_title" msgid="6955331714774709746">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‎Security‎‏‎‎‏‎"</string>
+    <string name="security_settings_subtitle" msgid="2244635550239273229">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‏‎Screen lock‎‏‎‎‏‎"</string>
+    <string name="security_lock_none" msgid="1054645093754839638">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‏‎‎None‎‏‎‎‏‎"</string>
+    <string name="security_lock_pattern" msgid="1174352995619563104">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎Pattern‎‏‎‎‏‎"</string>
+    <string name="security_lock_pin" msgid="4891899974369503200">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‎‎PIN‎‏‎‎‏‎"</string>
+    <string name="security_lock_password" msgid="4420203740048322494">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‎Password‎‏‎‎‏‎"</string>
+    <string name="lock_settings_picker_title" msgid="6590330165050361632">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎Choose a lock type‎‏‎‎‏‎"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‏‎Lock options‎‏‎‎‏‎"</string>
+    <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‏‎‎‎‎Enter your pattern‎‏‎‎‏‎"</string>
+    <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‎Confirm‎‏‎‎‏‎"</string>
+    <string name="lockpattern_restart_button_text" msgid="9355771277617537">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎Redraw‎‏‎‎‏‎"</string>
+    <string name="continue_button_text" msgid="5129979170426836641">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‎‏‎Continue‎‏‎‎‏‎"</string>
+    <string name="lockscreen_retry_button_text" msgid="5314212350698701242">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎Retry‎‏‎‎‏‎"</string>
+    <string name="lockscreen_skip_button_text" msgid="3755748786396198091">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‏‎Skip‎‏‎‎‏‎"</string>
+    <string name="set_screen_lock" msgid="5239317292691332780">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎Set a screen lock‎‏‎‎‏‎"</string>
+    <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‎‎Choose your PIN‎‏‎‎‏‎"</string>
+    <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‎‎Choose your pattern‎‏‎‎‏‎"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎Choose your password‎‏‎‎‏‎"</string>
+    <string name="current_screen_lock" msgid="637651611145979587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‎‎‎‎‏‏‎Current screen lock‎‏‎‎‏‎"</string>
+    <string name="choose_lock_pattern_message" msgid="6242765203541309524">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‎For security, set a pattern‎‏‎‎‏‎"</string>
+    <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‎Clear‎‏‎‎‏‎"</string>
+    <string name="lockpattern_cancel_button_text" msgid="4068764595622381766">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‏‏‎‎Cancel‎‏‎‎‏‎"</string>
+    <string name="lockpattern_pattern_confirmed" msgid="5984306638250515385">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎Your new unlock pattern‎‏‎‎‏‎"</string>
+    <string name="lockpattern_recording_intro_header" msgid="7864149726033694408">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‏‏‎‎‏‎‎‎‎Draw an unlock pattern‎‏‎‎‏‎"</string>
+    <string name="lockpattern_recording_inprogress" msgid="1575019990484725964">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‏‏‏‏‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‎‏‏‎‎‎Release finger when done‎‏‎‎‏‎"</string>
+    <string name="lockpattern_pattern_entered" msgid="6103071005285320575">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎Pattern recorded‎‏‎‎‏‎"</string>
+    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎‏‏‏‏‎‎Draw pattern again to confirm‎‏‎‎‏‎"</string>
+    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‎Connect at least 4 dots. Try again.‎‏‎‎‏‎"</string>
+    <string name="lockpattern_pattern_wrong" msgid="929223969555399363">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎Wrong pattern‎‏‎‎‏‎"</string>
+    <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎How to draw an unlock pattern‎‏‎‎‏‎"</string>
+    <string name="error_saving_lockpattern" msgid="2933512812768570130">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‎‎Error saving pattern‎‏‎‎‏‎"</string>
+    <string name="okay" msgid="4589873324439764349">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‎OK‎‏‎‎‏‎"</string>
+    <string name="remove_screen_lock_title" msgid="1234382338764193387">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎Remove screen lock?‎‏‎‎‏‎"</string>
+    <string name="remove_screen_lock_message" msgid="6675850371585564965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‎‏‎This will allow anyone to access your account‎‏‎‎‏‎"</string>
+    <string name="lock_settings_enter_pin" msgid="1669172111244633904">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‎‎‎‎Enter your PIN‎‏‎‎‏‎"</string>
+    <string name="lock_settings_enter_password" msgid="2636669926649496367">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‎Enter your password‎‏‎‎‏‎"</string>
+    <string name="choose_lock_pin_message" msgid="2963792070267774417">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‎‏‎For security, set a PIN‎‏‎‎‏‎"</string>
+    <string name="confirm_your_pin_header" msgid="9096581288537156102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎Re-enter your PIN‎‏‎‎‏‎"</string>
+    <string name="choose_lock_pin_hints" msgid="7362906249992020844">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‎‏‎‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‎‎PIN must be at least 4 digits‎‏‎‎‏‎"</string>
+    <string name="lockpin_invalid_pin" msgid="2149191577096327424">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‎‎‎‎‎Pin invalid, must be at least 4 digits.‎‏‎‎‏‎"</string>
+    <string name="confirm_pins_dont_match" msgid="4607110139373520720">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‎PINs don\'t match‎‏‎‎‏‎"</string>
+    <string name="error_saving_lockpin" msgid="9011960139736000393">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎Error saving PIN‎‏‎‎‏‎"</string>
+    <string name="lockscreen_wrong_pin" msgid="4922465731473805306">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎Wrong PIN‎‏‎‎‏‎"</string>
+    <string name="lockscreen_wrong_password" msgid="5757087577162231825">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‎Wrong password‎‏‎‎‏‎"</string>
+    <string name="choose_lock_password_message" msgid="6124341145027370784">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎For security, set a password‎‏‎‎‏‎"</string>
+    <string name="confirm_your_password_header" msgid="7052891840366724938">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‎‏‎‏‎‎Re-enter your password‎‏‎‎‏‎"</string>
+    <string name="confirm_passwords_dont_match" msgid="7300229965206501753">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‎Passwords don\'t match‎‏‎‎‏‎"</string>
+    <string name="lockpassword_clear_label" msgid="6363680971025188064">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎Clear‎‏‎‎‏‎"</string>
+    <string name="lockpassword_cancel_label" msgid="5791237697404166450">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‎‎Cancel‎‏‎‎‏‎"</string>
+    <string name="lockpassword_confirm_label" msgid="5918463281546146953">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‎‎‏‎Confirm‎‏‎‎‏‎"</string>
+    <string name="choose_lock_password_hints" msgid="3903696950202491593">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‎‏‎Must be at least 4 characters‎‏‎‎‏‎"</string>
+    <string name="lockpassword_password_too_short" msgid="6681218025001328405">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‎‏‎Must be at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ characters‎‏‎‎‏‎"</string>
+    <string name="lockpassword_pin_too_short" msgid="6363004004424904218">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎‎‎‏‏‎‏‎‎PIN must be at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ digits‎‏‎‎‏‎"</string>
+    <string name="lockpassword_password_too_long" msgid="7530214940279491291">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‎‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎Must be fewer than ‎‏‎‎‏‏‎<xliff:g id="NUMBER">%d</xliff:g>‎‏‎‎‏‏‏‎ characters‎‏‎‎‏‎"</string>
+    <string name="lockpassword_pin_too_long" msgid="62957683396974404">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎Must be fewer than ‎‏‎‎‏‏‎<xliff:g id="NUMBER">%d</xliff:g>‎‏‎‎‏‏‏‎ digits‎‏‎‎‏‎"</string>
+    <string name="lockpassword_pin_contains_non_digits" msgid="3044526271686839923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‏‏‎Must contain only digits 0-9.‎‏‎‎‏‎"</string>
+    <string name="lockpassword_pin_recently_used" msgid="7901918311213276207">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‎Device admin doesn\'t allow using a recent PIN‎‏‎‎‏‎"</string>
+    <string name="lockpassword_pin_blacklisted_by_admin" msgid="7412709707800738442">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‏‎‎Common PINs are blocked by your IT admin. Try a different PIN.‎‏‎‎‏‎"</string>
+    <string name="lockpassword_illegal_character" msgid="1984970060523635618">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎This can\'t include an invalid character.‎‏‎‎‏‎"</string>
+    <string name="lockpassword_invalid_password" msgid="1690956113717418430">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎Password invalid, must be at least 4 characters.‎‏‎‎‏‎"</string>
+    <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‎Must contain at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ letters‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‎Must contain at least 1 letter‎‏‎‎‏‎</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‏‎Must contain at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ lowercase letters‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‎‏‎Must contain at least 1 lowercase letter‎‏‎‎‏‎</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎Must contain at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ uppercase letters‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎Must contain at least 1 uppercase letter‎‏‎‎‏‎</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎Must contain at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ numerical digits‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‏‏‎‎Must contain at least 1 numerical digit‎‏‎‎‏‎</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎Must contain at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ special symbols‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎Must contain at least 1 special symbol‎‏‎‎‏‎</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎Must contain at least ‎‏‎‎‏‏‎<xliff:g id="COUNT">%d</xliff:g>‎‏‎‎‏‏‏‎ non-letter characters‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‎‎‎Must contain at least 1 non-letter character‎‏‎‎‏‎</item>
+    </plurals>
+    <string name="lockpassword_password_recently_used" msgid="8255729487108602924">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎Device admin doesn\'t allow using a recent password‎‏‎‎‏‎"</string>
+    <string name="error_saving_password" msgid="8334882262622500658">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‏‏‎‎‏‎‎Error saving password‎‏‎‎‏‎"</string>
+    <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎Common passwords are blocked by your IT admin. Try a different password.‎‏‎‎‏‎"</string>
+    <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎Ascending, descending, or repeated sequence of digits isn\'t allowed.‎‏‎‎‏‎"</string>
+    <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎Screen lock options‎‏‎‎‏‎"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="FINGERPRINT">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="DATE">%2$s</xliff:g>‎‏‎‎‏‏‏‎ : ‎‏‎‎‏‏‎<xliff:g id="NUM_DAYS">%3$s</xliff:g>‎‏‎‎‏‏‏‎ days ago‎‏‎‎‏‎"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‏‏‏‏‏‎‎‎‎Add trusted device‎‏‎‎‏‎"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎Trusted devices‎‏‎‎‏‎"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_1">%d</xliff:g>‎‏‎‎‏‏‏‎ devices‎‏‎‎‏‎</item>
+      <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎<xliff:g id="COUNT_0">%d</xliff:g>‎‏‎‎‏‏‏‎ device‎‏‎‎‏‎</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎Your ‎‏‎‎‏‏‎<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ will unlock this car when it\'s connected. If someone takes your ‎‏‎‎‏‏‎<xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>‎‏‎‎‏‏‏‎, they may be able to access this device‎‏‎‎‏‎"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎Confirm‎‏‎‎‏‎"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‏‏‏‏‏‎‎‎Remove trusted device‎‏‎‎‏‎"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎Done‎‏‎‎‏‎"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎Use the companion app to set up a trusted device. Once set up, you will be able to unlock your user profile when your phone is detected by the vehicle‎‏‎‎‏‎"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‎‎‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‏‎1. Download the companion app on your phone‎‏‎‎‏‎"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎2. Select ‎‏‎‎‏‏‎<xliff:g id="CAR_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ on your phone to pair the devices‎‏‎‎‏‎"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‎Smart Lock can\'t detect security features of this device. To help protect your car, trusted device will only be able to keep your car unlocked once it\'s already unlocked by you. Your trusted device can keep your car unlocked when it\'s nearby, even if someone else is holding it.‎‏‎‎‏‎"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‏‎‏‏‎Add ‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ as a trusted device‎‏‎‎‏‎"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ successfully added as a trusted device‎‏‎‎‏‎"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="DEVICE_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ enrollment failed‎‏‎‎‏‎"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‎Adding a trusted device requires you to set an authentication method next. If you do not have your trusted device with you, authentication will be required to access your profile.‎‏‎‎‏‎"</string>
+    <string name="forget" msgid="3971143908183848527">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎Forget‎‏‎‎‏‎"</string>
+    <string name="connect" msgid="5861699594602380150">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‎Connect‎‏‎‎‏‎"</string>
+    <string name="disconnect" msgid="6140789953324820336">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎Disconnect‎‏‎‎‏‎"</string>
+    <string name="delete_button" msgid="5840500432614610850">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‎Delete‎‏‎‎‏‎"</string>
+    <string name="remove_button" msgid="6664656962868194178">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎Remove‎‏‎‎‏‎"</string>
+    <string name="cancel" msgid="750286395700355455">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‏‏‎Cancel‎‏‎‎‏‎"</string>
+    <string name="backspace_key" msgid="1545590866688979099">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‏‎‎‏‏‎‏‏‎Backspace key‎‏‎‎‏‎"</string>
+    <string name="enter_key" msgid="2121394305541579468">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‎‎‎Enter key‎‏‎‎‏‎"</string>
+    <string name="exit_retail_button_text" msgid="6093240315583384473">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎‏‎Exit Demo‎‏‎‎‏‎"</string>
+    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎Exit demo mode‎‏‎‎‏‎"</string>
+    <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‏‎This will delete the demo account and factory data reset the system. All user data will be lost.‎‏‎‎‏‎"</string>
+    <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‏‎Exit Demo‎‏‎‎‏‎"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎DISMISS‎‏‎‎‏‎"</string>
+    <string name="restricted_while_driving" msgid="6217369093121968299">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎Feature not available while driving.‎‏‎‎‏‎"</string>
+    <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎Can\'t add user while driving.‎‏‎‎‏‎"</string>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b5f87e3..132041d 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"atenuar pantalla, pantalla táctil, batería"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"atenuar pantalla, noche, tono"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modo nocturno"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Internet y red"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Red móvil"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datos móviles"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acceder a los datos mediante la red móvil"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"¿Desactivar los datos móviles?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Uso de datos"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Advertencia de límite de datos"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de datos de las apps"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Config. advertencia de datos"</string>
+    <string name="data_warning" msgid="116776633806885370">"Advertencia de datos"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Establecer límite de datos"</string>
+    <string name="data_limit" msgid="227338836292511425">"Límite de datos"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitar el uso de datos"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"La unidad principal del vehículo desactivará los datos móviles cuando llegue al límite que establezcas.\n\nComo es posible que la unidad principal y tu proveedor midan el uso de datos de manera distinta, te recomendamos establecer un límite prudente."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configurar y administrar puntos de acceso inalámbricos"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Activando Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Desactivando Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Cargando lista de Wi-Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi inhabilitado"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Se produjo un error al olvidar la red"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Se produjo un error al establecer conexión con la red"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Agregar red"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi inhabilitado"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Contraseña"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Mostrar contraseña"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nombre de la red"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Ingresa el SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Seguridad"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Intensidad de la señal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Intensidad de la señal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Estado"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Velocidad del vínculo"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frecuencia"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Dirección IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Mostrar contraseña"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Ingresa el nombre de la red"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Ingresa la contraseña"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Baja"</item>
-    <item msgid="2032262610626057081">"Aceptable"</item>
-    <item msgid="3859756017461098953">"Buena"</item>
-    <item msgid="1521103743353335724">"Excelente"</item>
+    <item msgid="7683058295076342057">"Baja"</item>
+    <item msgid="1639222824821660744">"Aceptable"</item>
+    <item msgid="1838705897358163300">"Buena"</item>
+    <item msgid="6067166649320533751">"Excelente"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Activar Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth inhabilitado"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalles de la red"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Dirección MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Dirección IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Máscara de subred"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Direcciones IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Puerta de enlace"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferencias de Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Activar Wi-Fi automáticamente"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi se reactivará automáticamente cerca de redes guardadas"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"No disponible porque la ubicación está desactivada. "<annotation id="link">"Actívala"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"¿Quieres activar la búsqueda de redes Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Activar"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Se activó la búsqueda de redes Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Cambiar a datos móviles automáticamente"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Si la conexión Wi-Fi no puede acceder a Internet, usa los datos móviles. Es posible que se apliquen cargos por el uso de datos."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Más información"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Administrar conexiones, y establecer nombre y visibilidad del dispositivo"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computadora"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Auriculares"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Teléfono"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imágenes"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Audífonos"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periférico de entrada"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispositivos sincronizados"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispositivos disponibles"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"No hay dispositivos sincronizados"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"No hay dispositivos disponibles"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispositivo sincronizado"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nombre"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Usar para"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Renombra el dispositivo Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispositivo sin nombre"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispositivos sincronizados"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Sincronizar dispositivo nuevo"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Se activará el Bluetooth para iniciar la sincronización"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"¿Desconectar dispositivo?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"El vehículo se desconectará de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Dirección Bluetooth del vehículo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Dirección Bluetooth del dispositivo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nombre del vehículo"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Cambiar nombre del vehículo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Cambiar nombre del dispositivo"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Cambiar nombre"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispositivos disponibles"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Perfiles"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Solicitud de sincronización mediante Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Vincular y conectar"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Código de sincronización mediante Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"El PIN contiene letras o símbolos"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Ingresa el código de sincronización y, luego, presiona Intro"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Por lo general, 0000 o 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Sincronizando solicitud"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Presiona para sincronizar con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas y entradas"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Administrar teclados"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Salida de texto a voz"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motor preferido"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motor actual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Velocidad de voz"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tono"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Restablecer"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Sonido"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volumen de tono"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volumen de navegación"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Multimedia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Establecer volumen para la música y los videos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarma"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Tono del teléfono"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Sonido de notificación predet."</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Sonido de alarma predeterm."</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps y notificaciones"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Mostrar todas las apps"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Apps predeterminadas"</string>
     <string name="applications_settings" msgid="794261395191035632">"Información de apps"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forzar detención"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"¿Deseas forzar la detención?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Si fuerzas la detención de una app, es posible que no funcione correctamente."</string>
     <string name="disable_text" msgid="4358165448648990820">"Inhabilitar"</string>
     <string name="enable_text" msgid="1794971777861881238">"Habilitar"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Si inhabilitas esta app, es posible que Android y otras apps ya no funcionen correctamente."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Inhabilitar app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versión: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No se otorgaron permisos"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No se solicitaron permisos"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de datos"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de datos de la app"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forzar detención"</string>
     <string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos adicionales</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permiso adicional</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistencia y entrada de voz"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplicación de asistencia"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Utilizar el texto de la pantalla"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Permitir que la aplicación de asistencia acceda al contenido de la pantalla como texto"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Utilizar la captura de pantalla"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Permitir que la aplicación de asistencia acceda a una imagen de la pantalla"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Servicio autocompletar"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ninguna"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Seleccionada"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"El Asistente podrá leer información sobre las apps en uso en el sistema, incluida la información visible en la pantalla o accesible en las apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Asegúrate de que esta app sea confiable&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; y de que use el contenido de la pantalla para determinar qué se puede autocompletar."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Agregar servicio"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Ubicación"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitudes de ubicación recientes"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"No hay solicitudes de ubicación recientes"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos en las apps"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Búsqueda"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Servicios de ubicación"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Búsqueda de redes Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Permite que las apps y los servicios busquen redes Wi-Fi en cualquier momento, aunque la conexión Wi-Fi esté desactivada. Puede usarse, por ejemplo, para mejorar las funciones y los servicios basados en la ubicación."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Búsqueda de dispositivos Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Permite que apps y servicios busquen dispositivos cercanos en cualquier momento, aunque la conexión Bluetooth esté desactivada. Puede usarse, por ejemplo, para mejorar las funciones y los servicios basados en la ubicación."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Actualizaciones del sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizaciones del sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versión de Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Parche de seguridad de Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versión de banda base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versión de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilación"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Dirección de Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"No disponible"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Estado"</string>
     <string name="device_status" msgid="267298179806290920">"Estado"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licencia"</string>
     <string name="terms_title" msgid="5201471373602628765">"Términos y condiciones"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licencia de WebView del sistema"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licencias de WebView del sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fondos de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Proveedores de imágenes satelitales:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencias de terceros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Se produjo un error al cargar las licencias."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Cargando…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Ahora estás a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos de convertirte en desarrollador.</item>
+      <item quantity="one">Ahora estás a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso de convertirte en desarrollador.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"¡Ya eres desarrollador!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"No es necesario, ya eres desarrollador."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opciones para desarrolladores"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opciones de restablecimiento"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Restablecer red, apps o dispositivo"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Restablecer red"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Esta acción restablecerá todas las opciones de configuración de red, incluidas las siguientes:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Datos móviles"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Borrar todas las eSIM del vehículo"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Esta acción no cancelará tu plan de servicio."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"No se pueden restablecer las eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Seleccionar red"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Restablecer configuración"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"¿Restablecer configuración?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"¿Quieres restablecer la configuración de red? No podrás deshacer esta acción."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Restablecer configuración"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Se restableció la configuración de red"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Restablecer preferencias de apps"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Se restablecerán todas las preferencias de lo sigueinte:\n\n"<li>"Apps inhabilitadas"</li>\n<li>"Notificaciones de apps inhabilitadas"</li>\n<li>"Apps predeterminadas para realizar acciones"</li>\n<li>"Restricciones de datos en segundo plano para apps"</li>\n<li>"Restricciones de permisos"</li>\n\n"No perderás los datos de las apps."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Restablecer apps"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Se restablecieron las preferencias de las apps"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Borrar todos los datos (restablecer)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Esta acción borrará todos los datos de la unidad principal del vehículo, entre lo que se incluye:\n\n"<li>"Tu Cuenta de Google"</li>\n<li>"La configuración y los datos de las apps y el sistema"</li>\n<li>"Las apps descargadas"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Accediste a las siguientes cuentas:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Hay otros usuarios presentes en este vehículo."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Restablecer vehículo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"¿Restablecer?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"¿Deseas borrar toda tu información personal y las apps descargadas? No podrás deshacer esta acción."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Borrar todo"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Borrando"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Espera un momento…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Fecha y hora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Establecer fecha y hora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Establecer fecha, hora, zona horaria y formatos"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordenar por zona horaria"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Fecha"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Hora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Agregar usuario"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Agregar cuenta"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Borrar usuario"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Usuario nuevo"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Invitado"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrador"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Accediste como administrador"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Todos los permisos de administrador"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Convertir en administrador"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"El usuario podrá borrar usuarios, incluidos otros administradores, y restablecer el sistema a la configuración de fábrica."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Esta acción no se puede deshacer."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Sí, convertir en administrador"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Crear nuevos usuarios"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Hacer llamadas telefónicas"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mensajes por datos móviles del auto"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalar nuevas apps"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Desinstalar apps"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Agregar usuario"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Usuario nuevo"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"¿Agregar un usuario?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Cuando agregues un nuevo usuario, esa persona deberá configurar su espacio."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Cualquier usuario podrá actualizar las apps de otras personas."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Alcanzaste el límite de usuarios"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Puedes crear hasta <xliff:g id="COUNT">%d</xliff:g> usuarios.</item>
+      <item quantity="one">Solo se puede crear un usuario.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"No se pudo crear el usuario nuevo"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"¿Borrar este usuario?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Se borrarán todas las apps y los datos."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"No se pudo borrar el usuario"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Descartar"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Reintentar"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"¿Borrar último usuario?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Una vez que borres el último usuario del auto, se creará un nuevo usuario administrador."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Se borrarán todos los datos, las apps y la configuración que asociaste con este usuario. Deberás volver a configurar el sistema."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Elige un nuevo administrador"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Necesitas al menos un administrador. Debes elegir un reemplazo para poder borrar el actual."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Elegir administrador"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Invitado"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Invitado"</string>
     <string name="user_switch" msgid="6544839750534690781">"Cambiar"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Tú (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nombre"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"No configurado"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar el nombre de usuario"</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuarios"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos otorgados a %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Cuentas"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Usuario"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Agregar cuenta"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"No se agregó ninguna cuenta"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Cuentas de <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizar datos automáticamente"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permitir que las apps actualicen datos automáticamente"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"¿Activar sinc. automática?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Los cambios que realices en tus cuentas en la Web se copiarán automáticamente al dispositivo.\n\nAlgunas cuentas también podrían copiar automáticamente los cambios que hagas en el teléfono a la Web. Las Cuentas de Google funcionan de esa manera."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"¿Desactivar sinc. automática?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Esta acción conservará los datos, pero deberás sincronizar cada cuenta de forma manual para recopilar la información reciente. Además, no recibirás notificaciones cuando se realicen actualizaciones."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Información de la cuenta"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Agregar cuenta"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Agregar cuenta"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Quitar cuenta"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"¿Quitar la cuenta?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Si quitas esta cuenta, se borrarán todos sus mensajes, contactos y otros datos del dispositivo."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Tu administrador no permite este cambio"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"¿Quitar este usuario?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Se borrarán todas las apps y los datos."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"No se pudo quitar el usuario"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"¿Reintentar?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Descartar"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Reintentar"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"¿Agregar un usuario?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Cuando agregues un nuevo usuario, esa persona deberá configurar su espacio."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Cualquier usuario podrá actualizar las apps de otras personas."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"No se pudo borrar la cuenta"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronización de la cuenta"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sincronización activada para <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g> elementos"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sincronización activada para todos los elementos"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sincronización desactivada para todos los elementos"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sincronización desactivada"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Error de sincronización"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Última sincronización: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sincronizando…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Presiona para sincronizar ahora<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar ahora"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronización"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"En este momento la sincronización experimenta problemas. Volverá en breve."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguridad"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueo de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ninguno"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Contraseña"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Selecciona un bloqueo"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opciones de bloqueo de pantalla"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opciones de bloqueo"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Ingresa tu patrón"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmar"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Volver a dibujar"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Establece un bloqueo de pantalla"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Elige un PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Elige un patrón"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Elige una contraseña"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Elige una contraseña"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Bloqueo de pantalla actual"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Por seguridad, establece un patrón"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Borrar"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Tu administrador de TI bloquea las contraseñas comunes. Prueba con otra."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"No se permiten secuencias de dígitos ascendentes, descendentes ni repetidas."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opciones de bloqueo de pantalla"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> (hace <xliff:g id="NUM_DAYS">%3$s</xliff:g> días)"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Agregar disp. de confianza"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Disp. de confianza"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dispositivos</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dispositivo</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Tu <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> desbloqueará este vehículo cuando esté conectado. Si otra persona toma tu <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, es posible que pueda acceder a este dispositivo"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmar"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Quitar dispositivo de confianza"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Listo"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Usa la aplicación complementaria para configurar un dispositivo de confianza. Una vez que lo hagas, podrás desbloquear tu perfil de usuario cuando el vehículo detecte tu teléfono."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Descarga la aplicación complementaria en el teléfono."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selecciona <xliff:g id="CAR_NAME">%1$s</xliff:g> en el teléfono para sincronizar los dispositivos."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock no puede detectar las funciones de seguridad de este dispositivo. Para ayudarte a proteger tu auto, dispositivos de confianza solo podrá mantener el auto desbloqueado una vez que tú lo desbloquees. Tu dispositivo de confianza puede mantener el auto desbloqueado cuando se encuentra cerca, incluso si alguien más lo tiene."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Agregar <xliff:g id="DEVICE_NAME">%1$s</xliff:g> como dispositivo de confianza"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Se agregó correctamente <xliff:g id="DEVICE_NAME">%1$s</xliff:g> como dispositivo de confianza"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Se ha producido un error al registrar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Después de agregar un dispositivo de confianza, deberás establecer un método de autenticación. Ese método te permitirá acceder a tu perfil cuando no lleves contigo el dispositivo de confianza."</string>
     <string name="forget" msgid="3971143908183848527">"Olvidar"</string>
+    <string name="connect" msgid="5861699594602380150">"Conectar"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Desconectar"</string>
     <string name="delete_button" msgid="5840500432614610850">"Borrar"</string>
     <string name="remove_button" msgid="6664656962868194178">"Quitar"</string>
     <string name="cancel" msgid="750286395700355455">"Cancelar"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Salir del modo de demostración"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Esta acción borrará la cuenta de demostración y restablecerá el sistema a la configuración de fábrica. Se perderán todos los datos del usuario."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Salir de la demostración"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"terminar de configurar"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ahora no"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"DESCARTAR"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Esta función no está disponible mientras conduces."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"No puedes agregar usuarios mientras conduces."</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 937cda0..855c3ff 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"atenuar pantalla, pantalla táctil, batería"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"atenuar pantalla, nocturno, tono"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modo nocturno"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Redes e Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Red móvil"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datos móviles"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acceder a los datos con la red móvil"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"¿Desactivar los datos móviles?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Uso de datos"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Límite y advertencia de datos"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de datos de aplicaciones"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Definir advertencia de datos"</string>
+    <string name="data_warning" msgid="116776633806885370">"Advertencia de datos"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Establecer límite de datos"</string>
+    <string name="data_limit" msgid="227338836292511425">"Límite de datos"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitando uso de datos"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"La unidad principal de tu vehículo desactivará los datos móviles cuando se alcance el límite establecido.\n\nSe tiene en cuenta el uso de datos medido por la unidad principal, aunque tu operador podría registrarlo de forma diferente. Por tanto, debes ser prudente al establecer un límite."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configurar y administrar puntos de acceso inalámbricos"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Activando Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Desactivando Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Cargando lista de redes Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi inhabilitado"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"No se ha podido olvidar la red"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"No se ha podido conectar a la red"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Añadir red"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi inhabilitado"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Contraseña"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Mostrar contraseña"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nombre de red"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Introduce el SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Seguridad"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Intensidad de la señal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Intensidad de la señal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Estado"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Velocidad de enlace"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frecuencia"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Dirección IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Mostrar contraseña"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Introduce un nombre de red"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Introduce la contraseña"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Mala"</item>
-    <item msgid="2032262610626057081">"Aceptable"</item>
-    <item msgid="3859756017461098953">"Buena"</item>
-    <item msgid="1521103743353335724">"Excelente"</item>
+    <item msgid="7683058295076342057">"Mala"</item>
+    <item msgid="1639222824821660744">"Aceptable"</item>
+    <item msgid="1838705897358163300">"Buena"</item>
+    <item msgid="6067166649320533751">"Excelente"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Activar Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth inhabilitado"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalles de la red"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Dirección MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Dirección IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Máscara de subred"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Direcciones IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Pasarela"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferencias de Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Activar Wi‑Fi automáticamente"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi se activará cerca de redes alta calidad guardadas (p. ej., la de casa)"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"No disponible porque ubicación no está activada. "<annotation id="link">"Actívala"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"¿Quieres activar la búsqueda de redes Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Activar"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Se ha activado la búsqueda de redes Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Cambiar a datos móviles automáticamente"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Utiliza la conexión de datos móviles cuando no haya acceso a Internet a través de la red Wi‑Fi. Podrían aplicarse cargos por el uso de datos."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Más información"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Administrar conexiones, establecer el nombre del dispositivo y la visibilidad"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Ordenador"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Auriculares con micrófono"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Teléfono"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Escáner"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Auriculares"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periférico de entrada"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispositivos vinculados"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispositivos disponibles"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"No hay dispositivos vinculados"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"No hay dispositivos disponibles"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispositivo vinculado"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nombre"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Usar para"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Cambiar nombre de dispositivo Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispositivo sin nombre"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispositivos vinculados"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Vincular nuevo dispositivo"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"El Bluetooth se activará para vincular el dispositivo"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"¿Desconectar dispositivo?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Tu vehículo se desconectará de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Dirección de Bluetooth del vehículo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Dirección de Bluetooth del dispositivo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nombre del vehículo"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Cambiar nombre de este vehículo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Cambiar nombre del dispositivo"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Cambiar nombre"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispositivos disponibles"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Perfiles"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Solicitud de vinculación de Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Sincronizar y conectar"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Código de vinculación por Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"El PIN contiene letras o símbolos"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Escribe el código de vinculación y, a continuación, pulsa Intro"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Normalmente: 0000 o 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Solicitud de vinculación"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Toca para vincular con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e introducción de texto"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Gestionar teclados"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Síntesis de voz"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motor preferido"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motor actual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Velocidad de la voz"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tono"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Restablecer"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Sonido"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volumen del tono"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volumen de navegación"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Multimedia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Establecer volumen para música y vídeos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarma"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Tono de llamada del teléfono"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Sonido notificación predeterm."</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Sonido alarma predeterminado"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplicaciones y notificaciones"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Mostrar todas las aplicaciones"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplicaciones predeterminadas"</string>
     <string name="applications_settings" msgid="794261395191035632">"Información de la aplicación"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forzar detención"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"¿Quieres forzar la detención?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Si se fuerza la detención una aplicación, es posible que no funcione correctamente."</string>
     <string name="disable_text" msgid="4358165448648990820">"Inhabilitar"</string>
     <string name="enable_text" msgid="1794971777861881238">"Habilitar"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Si inhabilitas esta aplicación, es posible que Android y otras aplicaciones no funcionen correctamente."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Inhabilitar aplicación"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versión: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"No se han concedido permisos"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"No se han solicitado permisos"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de datos"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de datos de la app"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forzar detención"</string>
     <string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos adicionales</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permiso adicional</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistencia y entrada de voz"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplicación de asistencia"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Usar texto de la pantalla"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Permitir que la aplicación de asistencia acceda a los contenidos de la pantalla (como texto)"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Usar captura de pantalla"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Permitir que la aplicación de asistencia acceda a una imagen de la pantalla"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Servicio Autocompletar"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ninguna"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Seleccionada"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"El asistente podrá consultar información sobre las aplicaciones en uso del sistema, como la que aparezca en pantalla o a la que se pueda acceder a través de las aplicaciones."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Asegúrate de que confías en esta aplicación&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Autocompletar de Google&gt;%1$s&lt;/xliff:g&gt; utiliza el contenido que se muestra en la pantalla para determinar el texto que se puede autocompletar."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Añadir servicio"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Ubicación"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitudes de ubicación recientes"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ninguna solicitud de ubicación reciente"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos de las aplicaciones"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Búsqueda"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Servicios de ubicación"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Búsqueda de redes Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Permite que las aplicaciones y los servicios busquen redes Wi‑Fi en cualquier momento aunque la conexión Wi‑Fi esté desactivada. Se utiliza, por ejemplo, para mejorar los servicios y funciones basados en la ubicación."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Búsqueda de dispositivos Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Permite que las aplicaciones y los servicios busquen dispositivos cercanos en cualquier momento aunque la conexión Bluetooth esté desactivada. Se utiliza, por ejemplo, para mejorar los servicios y funciones basados en la ubicación."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Actualizaciones del sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizaciones del sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versión de Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivel del parche de seguridad de Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versión de banda base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versión de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilación"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Dirección de Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"No disponible"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Estado"</string>
     <string name="device_status" msgid="267298179806290920">"Estado"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licencia"</string>
     <string name="terms_title" msgid="5201471373602628765">"Términos y condiciones"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licencia de WebView del sistema"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licencias de WebView del sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fondos de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Proveedores de imágenes de satélite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencias de terceros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"No se han podido cargar las licencias."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Cargando…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Solo te quedan <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos para habilitar las opciones para desarrolladores.</item>
+      <item quantity="one">Solo te queda <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso para habilitar las opciones para desarrolladores.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"¡Ya están activadas las opciones para desarrolladores!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Las opciones para desarrolladores ya están activadas."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opciones para desarrolladores"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opciones de recuperación"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Restablecer dispositivo, aplicaciones y red"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Restablecer red"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Se restablecerán todos los ajustes de red, incluidas las siguientes opciones:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Datos móviles"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Borrar todas las eSIM del vehículo"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"No se cancelará tu plan de servicios."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"No se puede recuperar el estado de las tarjetas eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Seleccionar red"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Restablecer ajustes"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"¿Restablecer?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"¿Quieres restablecer todos los ajustes de red? Esta acción no se puede deshacer."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Restablecer ajustes"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Se han restablecido los ajustes de red"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Restablecer preferencias de aplicaciones"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Se restablecerán todas las preferencias de:\n\n"<li>"Aplicaciones desactivadas"</li>\n<li>"Notificaciones de aplicaciones desactivadas"</li>\n<li>"Aplicaciones para acciones predeterminadas"</li>\n<li>"Restricciones de datos en segundo plano de aplicaciones"</li>\n<li>"Restricciones de permisos"</li>\n\n"No se perderán los datos de las aplicaciones."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Restablecer aplicaciones"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Se han restablecido las preferencias de las aplicaciones"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Borrar todos los datos (restablecer)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Se borrarán todos los datos de la unidad principal de tu vehículo, como:\n\n"<li>"Tu cuenta de Google"</li>\n<li>"Los ajustes y datos de aplicaciones y del sistema"</li>\n<li>"Las aplicaciones descargadas"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Has iniciado sesión en estas cuentas:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Hay otros usuarios presentes en este vehículo."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Restablecer vehículo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"¿Restablecer?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"¿Quieres borrar toda tu información personal y todas las aplicaciones descargadas? Esta acción no se puede deshacer."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Borrar todo"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Borrando"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Espera..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Fecha y hora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Establecer fecha y hora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Establecer fecha, hora, zona horaria y formatos"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordenar por zona horaria"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Fecha"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Hora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Añadir usuario"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Añadir cuenta"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Eliminar usuario"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nuevo usuario"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Invitado"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrador"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Sesión iniciada como administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Todos los permisos de administrador"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Convertir en administrador"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"El usuario podrá eliminar usuarios, incluidos otros administradores, y restablecer el sistema al estado de fábrica."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Esta acción no se puede deshacer."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Sí, convertir en administrador"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Crear usuarios"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Hacer llamadas"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mensajes por datos móviles de coche"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalar aplicaciones nuevas"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Desinstalar aplicaciones"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Añadir usuario"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nuevo usuario"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"¿Añadir nuevo usuario?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Al añadir un nuevo usuario, este debe configurar su espacio."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Has alcanzado el límite de usuarios"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Puedes crear hasta <xliff:g id="COUNT">%d</xliff:g> usuarios.</item>
+      <item quantity="one">Solo se puede crear un usuario.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"No se ha podido crear el usuario"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"¿Eliminar este usuario?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Se eliminarán los datos y las aplicaciones."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"No se ha podido eliminar al usuario."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Cerrar"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Reintentar"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"¿Eliminar último usuario?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Después de eliminar el único usuario que queda de este coche, se creará un nuevo administrador."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Se eliminarán las aplicaciones, los datos y los ajustes asociados a este usuario, y tendrás que volver a configurar el sistema."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Elegir nuevo administrador"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Necesitas al menos un administrador. Para eliminar este, primero debes elegir otro."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Elegir administrador"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Invitado"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Invitado"</string>
     <string name="user_switch" msgid="6544839750534690781">"Cambiar"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Tú (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nombre"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Sin configurar"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Cambiar el nombre de usuario"</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuarios"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos concedidos a %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Cuentas"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Usuario"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Añadir cuenta"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"No se ha añadido ninguna cuenta"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Cuentas de <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizar datos automáticamente"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permitir que las apps actualicen los datos automáticamente"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"¿Activar sincronización autom.?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Los cambios que hagas en tus cuentas en la Web se reflejarán automáticamente en el dispositivo.\n\nAlgunas cuentas como, por ejemplo, las cuentas de Google, también reflejarán en la Web los cambios que hagas en el teléfono. A continuación, puedes ver cómo funciona  una cuenta de Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"¿Desactivar sincronización aut.?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Esto te permitirá ahorrar datos, pero tendrás que sincronizar cada cuenta de forma manual para obtener información reciente y no recibirás notificaciones cuando haya actualizaciones."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Información de la cuenta"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Añadir cuenta"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Añadir una cuenta"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Quitar cuenta"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"¿Quitar la cuenta?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Si quitas esta cuenta, se eliminarán todos sus mensajes, contactos y otros datos del dispositivo."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"El administrador no permite realizar este cambio"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"¿Quitar este usuario?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Se eliminarán los datos y las aplicaciones."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"No se ha podido quitar el usuario."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"¿Reintentar?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ignorar"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Reintentar"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"¿Añadir nuevo usuario?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Al añadir un nuevo usuario, este debe configurar su espacio."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"No se ha podido eliminar la cuenta."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronización"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Elementos con la sincronización activada: <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sincronización activada para todos los elementos"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sincronización desactivada para todos los elementos"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sincronización desactivada"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Error de sincronización"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Última sincronización: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sincronizando…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Toca para sincronizar ahora (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronización"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"No se puede sincronizar el dispositivo en este momento. Se restablecerá en breve."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguridad"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueo de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ninguno"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Contraseña"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Elegir tipo de bloqueo"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opciones de bloqueo de pantalla"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opciones de bloqueo"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Introduce tu patrón"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmar"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Crear un patrón nuevo"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Definir un bloqueo de pantalla"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Elige un PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Elige un patrón"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Elige una contraseña"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Elige tu contraseña"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Bloqueo de pantalla actual"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Por seguridad, establece un patrón"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Borrar"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"El administrador de TI bloquea las contraseñas comunes. Prueba a utilizar otra contraseña."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"No se permite utilizar una secuencia ascendente, descendente ni repetida de dígitos."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opciones de bloqueo de pantalla"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : hace <xliff:g id="NUM_DAYS">%3$s</xliff:g> días"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Añadir dispositivo de confianza"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Dispositivos de confianza"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dispositivos</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dispositivo</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Tu <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> desbloqueará este coche cuando esté conectado. Si alguien coge tu <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, es posible que pueda acceder a este dispositivo"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmar"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Quitar dispositivo de confianza"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Listo"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Usa la aplicación complementaria para configurar un dispositivo de confianza. Una vez que lo hagas, podrás desbloquear tu perfil de usuario cuando el vehículo detecte el teléfono."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Descarga la aplicación complementaria en el teléfono"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selecciona <xliff:g id="CAR_NAME">%1$s</xliff:g> en el teléfono para vincular los dispositivos"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock no puede detectar las funciones de seguridad de este dispositivo. Para proteger el coche, el dispositivo de confianza solo podrá mantenerlo desbloqueado una vez que lo hayas desbloqueado tú. El dispositivo de confianza puede mantener el coche desbloqueado si está cerca, aunque lo esté sujetado otra persona."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Añadir <xliff:g id="DEVICE_NAME">%1$s</xliff:g> como dispositivo de confianza"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> se ha añadido correctamente como dispositivo de confianza"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> no se ha podido registrar"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Para añadir un dispositivo de confianza, debes definir un método de autenticación. Si no tienes el dispositivo de confianza a mano, tendrás que realizar el proceso de autenticación para acceder a tu perfil."</string>
     <string name="forget" msgid="3971143908183848527">"Olvidar"</string>
+    <string name="connect" msgid="5861699594602380150">"Conectar"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Desconectar"</string>
     <string name="delete_button" msgid="5840500432614610850">"Eliminar"</string>
     <string name="remove_button" msgid="6664656962868194178">"Quitar"</string>
     <string name="cancel" msgid="750286395700355455">"Cancelar"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Salir del modo demostración"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Se eliminará la cuenta de demostración y se recuperarán los ajustes de fábrica del sistema. Se perderán todos los datos de usuario."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Salir de demostración"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"finalizar configuración"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ahora no"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"CERRAR"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Esta función no está disponible mientras conduces."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"No puedes añadir usuarios mientras conduces."</string>
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 00d4b77..f83a74b 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ekraani hämardamine, puuteekraan, aku"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ekraani hämardamine, öö, toon"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Öörežiim"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Võrk ja Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobiilsidevõrk"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiilne andmeside"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Andmesideühendus mobiilsidevõrgu abil"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Kas lülitada mobiilne andmeside välja?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Andmekasutus"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Andmekasutuse hoiatus ja piirang"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Rakenduse andmekasutuse tsükkel"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Määra andmekasutuse hoiatus"</string>
+    <string name="data_warning" msgid="116776633806885370">"Andmekasutuse hoiatus"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Määra andmekasutuse piirang"</string>
+    <string name="data_limit" msgid="227338836292511425">"Andmekasutuse piirang"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Andmekasutuse piiramine"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Kui määratud limiit on täis, lülitab sõiduki keskseade mobiilse andmeside välja.\n\nKuna andmekasutust mõõdab keskseade ja teie operaator võib kasutust teisiti arvestada, võiksite määrata konservatiivse limiidi."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"WiFi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Juhtmeta pääsupunktide seadistamine ja haldamine"</string>
     <string name="wifi_starting" msgid="473253087503153167">"WiFi sisselülitamine …"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"WiFi väljalülitamine …"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"WiFi-võrkude loendi laadimine"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"WiFi on keelatud"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Võrgu unustamine ebaõnnestus"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Võrguühenduse loomine ebaõnnestus"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Lisa võrk"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"WiFi on keelatud"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Ühenda"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Parool"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Kuva parool"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Võrgu nimi"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Sisestage SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Turvalisus"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signaali tugevus"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signaali tugevus"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Olek"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Lingi kiirus"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Sagedus"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-aadress"</string>
+    <string name="show_password" msgid="2074628020371139240">"Kuva parool"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Sisestage võrgu nimi"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Sisestage parool"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Kehv"</item>
-    <item msgid="2032262610626057081">"Rahuldav"</item>
-    <item msgid="3859756017461098953">"Hea"</item>
-    <item msgid="1521103743353335724">"Suurepärane"</item>
+    <item msgid="7683058295076342057">"Kehv"</item>
+    <item msgid="1639222824821660744">"Rahuldav"</item>
+    <item msgid="1838705897358163300">"Hea"</item>
+    <item msgid="6067166649320533751">"Suurepärane"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Lülita Bluetooth sisse"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth on keelatud"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbit/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Võrgu üksikasjad"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-aadress"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-aadress"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Alamvõrgu mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-aadressid"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Lüüs"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"WiFi-eelistused"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Lülita WiFi automaatselt sisse"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"WiFi lül. sisse kval. salv. võrkude, nt koduvõrgu läheduses"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Pole saadaval: asukoht on v. lülitatud. Lül. "<annotation id="link">"asukoht"</annotation>" sisse."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Kas lülitada WiFi-võrkude otsimine sisse?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Lülita sisse"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"WiFi-võrkude otsimine on sisse lülitatud"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Lülita automaatselt mobiilsele andmesidele"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Kui WiFi-l puudub Internetile juurdepääs, kasutatakse mobiilset andmesidet. Rakenduda võivad andmekasutustasud."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Lisateave"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Halda ühendusi, määra seadme nimi ja leitavus"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Arvuti"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Peakomplekt"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Pildindus"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Kõrvaklapid"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Sisestatud välisseade"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Seotud seadmed"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Saadaolevad seadmed"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Seotud seadmeid pole"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Saadaolevaid seadmeid pole"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Seotud seade"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nimi"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Kasutus:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Muutke Bluetoothi seadme nime"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Nimetu seade"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Seotud seadmed"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Uue seadme sidumine"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth lülitatakse sidumiseks sisse"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Kas katkestada seadme ühendus?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Teie sõiduk katkestab ühenduse seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Sõiduki Bluetoothi aadress: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Seadme Bluetoothi aadress: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Sõiduki nimi"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Sõiduki ümbernimetamine"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Seadme ümbernimetamine"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Muuda nime"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Saadaolevad seadmed"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiilid"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetoothi sidumistaotlus"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Seo ja ühenda"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetoothi sidumiskood"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN-kood sisaldab tähti või sümboleid"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Sisestage sidumiskood ja vajutage seejärel sisestusklahvi"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Tavaliselt 0000 või 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Sidumistaotlus"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Puudutage seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g> sidumiseks."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Keeled"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Keeled ja sisend"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatuur"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Klaviatuuride haldamine"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Kõnesünteesi väljund"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Eelistatud mootor"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Praegune mootor"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Kõne kiirus"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Helikõrgus"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Lähtesta"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Heli"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Helina helitugevus"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigatsiooni helitugevus"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Meedia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Määra muusika ja videote helitugevus"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefonihelin"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Märguande vaikeheli"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Alarmi vaikeheli"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Rakendused ja märguanded"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Kuva kõik rakendused"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Vaikerakendused"</string>
     <string name="applications_settings" msgid="794261395191035632">"Rakenduse teave"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Sundpeata"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Kas sundpeatada?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Kui sundpeatate rakenduse, võib see valesti käituda."</string>
     <string name="disable_text" msgid="4358165448648990820">"Keela"</string>
     <string name="enable_text" msgid="1794971777861881238">"Luba"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstalli"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Selle rakenduse keelamisel ei pruugi Android ja muud rakendused enam ootuspäraselt töötada."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Keela rakendus"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Load"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versioon: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Lube ei antud"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Lube ei taotletud"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Andmekasutus"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Rakenduste andmekasutus"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Sundpeata"</string>
     <string name="computing_size" msgid="5791407621793083965">"Arvutamine …"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> täiendavat luba</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> täiendav luba</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Abirakendus ja häälsisend"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Abirakendus"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Ekraanil oleva teksti kasutamine"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Abirakendusele lubatakse ekraani sisule juurdepääs tekstina"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Ekraanipildi kasutamine"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Abirakendusele lubatakse juurdepääs ekraanipildile"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Automaattäite teenus"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Puudub"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Valitud"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistent saab teie süsteemis kasutatavate rakenduste kohta teavet (sh teie ekraanil kuvatud või rakendustes juurdepääsetavat teavet) lugeda."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Veenduge, et rakendus oleks usaldusväärne&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google\'i automaatne täitmine&gt;%1$s&lt;/xliff:g&gt; kasutab automaatse täitmise sisestuse määramiseks ekraanil kuvatut."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Lisa teenus"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Asukoht"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Hiljutised asukohapäringud"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ühtegi hiljutist asukohapäringut pole"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Rakendusetasemel load"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skannimine"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Asukohateenused"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"WiFi-võrkude otsimine"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Lubage rakendustel ja teenustel alati otsida WiFi-võrke isegi siis, kui WiFi on väljas. Seda saab kasutada näiteks asukohapõhiste funktsioonide ja teenuste täiustamiseks."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetoothi otsimine"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Lubage rakendustel ja teenustel alati otsida läheduses olevaid seadmeid isegi siis, kui Bluetooth on väljas. Seda saab kasutada näiteks asukohapõhiste funktsioonide ja teenuste täiustamiseks."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Süsteem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Süsteemivärskendused"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Süsteemivärskendused"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Androidi versioon"</string>
     <string name="security_patch" msgid="4794276590178386903">"Androidi turvapaiga tase"</string>
     <string name="model_info" msgid="4966408071657934452">"Mudel"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Põhiribaversioon"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Tuuma versioon"</string>
     <string name="build_number" msgid="3997326631001009102">"Järgunumber"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetoothi aadress"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Pole saadaval"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Olek"</string>
     <string name="device_status" msgid="267298179806290920">"Olek"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Autoriõigus"</string>
     <string name="license_title" msgid="936705938435249965">"Litsents"</string>
     <string name="terms_title" msgid="5201471373602628765">"Nõuded ja tingimused"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Süsteemi WebView\' litsents"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Süsteemi WebView\' litsentsid"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Taustapildid"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satelliidipiltide pakkujad:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Kolmanda osapoole litsentsid"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Litsentside laadimisega on probleem."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Laadimine …"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> toimingut veel ja olete arendaja.</item>
+      <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> toiming veel ja olete arendaja.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Olete nüüd arendaja!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Ei ole vaja, olete juba arendaja."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Arendaja valikud"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Valikute lähtestamine"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Võrgu, rakenduste või seadme lähtestamine"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Võrgu taastamine"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"See lähtestab kõik võrguseaded, sh järgmised:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"WiFi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobiilne andmeside"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Sõiduki kõigi eSIM-kaartide tühjendamine"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"See ei tühista teie teenusepaketti."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM-e ei saa lähtestada"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Võrgu valimine"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Lähtesta seaded"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Kas soovite lähtestada?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Kas lähtestada kõik võrguseaded? Seda toimingut ei saa tagasi võtta."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Lähtesta seaded"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Võrguseaded on lähtestatud"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Lähtesta rakenduse eelistused"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"See lähtestab kõik järgmised eelistused.\n\n"<li>"Keelatud rakendused"</li>\n<li>"Keelatud rakenduste märguanded"</li>\n<li>"Toimingute vaikerakendused"</li>\n<li>"Rakenduste taustaandmete piirangud"</li>\n<li>"Mis tahes lubade piirangud"</li>\n\n"Rakenduste andmed säilivad."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Lähtesta rakendused"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Rakenduse eelistused on lähtestatud"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Kustuta kõik andmed (tehases. lähtest.)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"See kustutab teie sõiduki keskseadmest kõik andmed, sh:\n\n"<li>"teie Google\'i konto;"</li>\n<li>"süsteemi ja rakenduste andmed ning seaded;"</li>\n<li>"allalaaditud rakendused."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Olete praegu sisse logitud järgmistele kontodele:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Selles sõidukis on teisi kasutajaid."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Lähtesta seade"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Kas soovite lähtestada?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Kas kustutada kõik teie isiklikud andmed ja allalaaditud rakendused? Seda toimingut ei saa tagasi võtta."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Kustuta kõik"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Kustutamine"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Oodake …"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Kuupäev ja kellaaeg"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Kuupäeva ja kellaaja määramine"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Määra kuupäev, kellaaeg, ajavöönd ja vormingud"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sordi ajavööndi järgi"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Kuupäev"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Aeg"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Kasutaja lisamine"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Lisa konto"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Kasutaja kustutamine"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Uus kasutaja"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Külaline"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administraator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Sisse logitud administraatorina"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Kõik administraatoriload"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Määra administraatoriks"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Kasutaja saab kustutada teisi kasutajaid, sh administraatoreid, ja lähtestada süsteemi tehaseseadetele."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Seda toimingut ei saa tagasi võtta."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Jah, määra administraatoriks"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Uute kasutajate loomine"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefonikõnede tegemine"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Sõnumside auto mob. andmeside kaudu"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Uute rakenduste installimine"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Rakenduste desinstallimine"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Kasutaja lisamine"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Uus kasutaja"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Kas lisada uus kasutaja?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Iga kasutaja saab rakendusi värskendada kõigi teiste kasutajate jaoks."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Kasutajate limiit on täis"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Luua saab kuni <xliff:g id="COUNT">%d</xliff:g> kasutajat.</item>
+      <item quantity="one">Luua saab ainult ühe kasutaja.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Uue kasutaja loomine ebaõnnestus"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Kas kustutada kasutaja?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Kõik rakendused ja andmed kustutatakse."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Kasutaja kustutamine ebaõnnestus."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Loobu"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Proovi uuesti"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Kas kustutada viimane kasutaja?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Pärast selle auto viimase allesjäänud kasutaja kustutamist luuakse uus administratiivkasutaja."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Kõik selle kasutajaga seotud andmed, seaded ja rakendused kustutatakse. Peate süsteemi uuesti seadistama."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Valige uus administraator"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Vajate vähemalt ühte administraatorit. Selle kustutamiseks valige mõni teine administraator."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Valige administraator"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Külaline"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Külaline"</string>
     <string name="user_switch" msgid="6544839750534690781">"Lüliti"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Teie (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nimi"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Pole seadistatud"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Kasutajanime muutmine"</string>
     <string name="users_list_title" msgid="770764290290240909">"Kasutajad"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Kasutajale %1$s antud load"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Kontod"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Kasutaja"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Lisa konto"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Kontosid pole lisatud"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Kasutaja <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> kontod"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sünkrooni andmed automaatselt"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Luba rakendustel andmeid automaatselt värskendada"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Kas lülitan sünkroonimise sisse?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Veebis kontodel tehtud muudatused kopeeritakse automaatselt teie tahvelarvutisse.\n\nMõned kontod võivad ka kõik tahvelarvutis tehtud muudatused automaatselt veebi kopeerida. Ka Google\'i konto töötab sel moel."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Kas lülitan sünkroonimise välja?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"See säästab andmemahtu, ent teil tuleb uusima teabe hankimiseks iga kontot käsitsi sünkroonida. Samuti ei saa te värskenduste korral märguandeid."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Konto teave"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Konto lisamine"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Konto lisamine"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Eemalda konto"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Kas eemaldada konto?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Selle konto eemaldamisel kustutatakse kõik seal olevad sõnumid, kontaktid ja muud seadmes olevad andmed."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Administraator on selle muudatuse keelanud"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Kas eemaldada kasutaja?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Kõik rakendused ja andmed kustutatakse."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Kasutaja eemaldamine ebaõnnestus."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Kas soovite veel proovida?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Loobu"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Proovi uuesti"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Kas lisada uus kasutaja?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Iga kasutaja saab rakendusi värskendada kõigi teiste kasutajate jaoks."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Konto eemaldamine ebaõnnestus."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Konto sünkroonimine"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sünkroonimine on sisse lülitatud <xliff:g id="ID_1">%1$d</xliff:g> üksuse jaoks <xliff:g id="ID_2">%2$d</xliff:g>-st"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sünkroonimine on kõigi üksuste jaoks sisse lülitatud"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sünkroonimine on kõigi üksuste jaoks välja lülitatud"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sünkroonimine on VÄLJAS"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sünkroonimise viga"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Viimati sünkroonitud: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sünkroonimine …"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Puudutage nüüd sünkroonimiseks<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sünkrooni kohe"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Tühista sünkroonimine"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sünkroonimisega on praegu probleeme. See on varsti tagasi."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Turvalisus"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekraanilukk"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Puudub"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-kood"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Parool"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Luku tüübi valimine"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Ekraaniluku valikud"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Luku valikud"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Sisestage muster"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Kinnita"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Joonista uuesti"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ekraaniluku seadistamine"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Valige PIN-kood"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Mustri valimine"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Valige parool"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Valige parool"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Praegune ekraanilukk"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Turvalisuse huvides määrake muster"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Kustuta"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IT-administraator on levinud paroolid blokeerinud. Proovige muud parooli."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Kasvavad, kahanevad või korduvad numbrijadad on keelatud."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Ekraaniluku valikud"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> päeva tagasi"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Lisa usaldusväärne seade"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Usaldusv. seadmed"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> seadet</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> seade</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Teie <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> avab selle auto, kui need on omavahel ühendatud. Kui keegi võtab teie telefoni <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, on tal võimalik sellele seadmele juurde pääseda"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Kinnita"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Eemalda usaldusväärne seade"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Valmis"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Kasutage usaldusväärse seadme seadistamiseks kaasrakendust. Kui see on seadistatud, on teil võimalik avada oma kasutajaprofiil, kui sõiduk tuvastab teie telefoni"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Laadige oma telefonis alla kaasrakendus."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Tehke seadmete sidumiseks oma telefonis valik <xliff:g id="CAR_NAME">%1$s</xliff:g>."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ei suuda tuvastada selle seadme turvafunktsioone. Teie auto kaitsmiseks saab usaldusväärne seade teie auto avatuna hoida vaid siis, kui olete ise lukustuse tühistanud. Teie usaldusväärne seade võib hoida teie auto avatuna, kui see on läheduses, isegi kui see on kellegi teise käes."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> lisamine usaldusväärse seadmena"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> lisamine usaldusväärse seadmena õnnestus"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g> registreerimine ebaõnnestus"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Usaldusväärse seadme lisamiseks peate hiljem määrama autentimismeetodi. Kui usaldusväärne seade pole teie käes, nõutakse teie profiilile juurdepääsemiseks autentimist."</string>
     <string name="forget" msgid="3971143908183848527">"Unusta"</string>
+    <string name="connect" msgid="5861699594602380150">"Ühenda"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Katkesta  ühendus"</string>
     <string name="delete_button" msgid="5840500432614610850">"Kustuta"</string>
     <string name="remove_button" msgid="6664656962868194178">"Eemalda"</string>
     <string name="cancel" msgid="750286395700355455">"Tühista"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Demorežiimist väljumine"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"See kustutab demokonto ja lähtestab süsteemi tehaseandmetele. Kõik kasutajaandmed lähevad kaotsi."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Välju demorežimist"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"vii seadistus lõpule"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"mitte praegu"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"LOOBU"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funktsioon pole sõidu ajal saadaval."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Sõidu ajal ei saa kasutajat lisada."</string>
 </resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 32f2ffb..7a71909 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ilundu pantaila, ukipen-pantaila, bateria"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"pantaila iluna, gaua, tonalitatea"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Gau modua"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Sareak eta Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Sare mugikorra"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datu-konexioa"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Atzitu datuak datu-konexioaren bidez"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Datu-konexioa desaktibatu nahi duzu?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Datuen erabilera"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Datuen erabileraren abisua eta muga"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Aplikazioen datuen erabilera-zikloa"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Ezarri datuen erabileraren abisua"</string>
+    <string name="data_warning" msgid="116776633806885370">"Datuen erabileraren abisua"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Ezarri datuen muga"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datuen muga"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Datuen erabilera mugatzea"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Ibilgailua ezarri duzun datuen mugara heltzen denean, ibilgailuaren gailu nagusiak datu-konexioa desaktibatuko du.\n\nIbilgailuaren gailu nagusiak datuen erabilera neurtzen du, baina baliteke operadoreak erabilera hori beste era batera neurtzea. Horregatik, muga zuhurra ezartzea gomendatzen dugu."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Konfiguratu eta kudeatu hari gabeko sarbide-puntuak"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi konexioa aktibatzen…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi konexioa desaktibatzen…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi sareen zerrenda kargatzen"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Desgaituta dago Wi‑Fi konexioa"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Ezin izan da ahaztu sarea"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Ezin izan da konektatu sarera"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Gehitu sarea"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Desgaituta dago Wi‑Fi konexioa"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Konektatu"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Pasahitza"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Erakutsi pasahitza"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Sarearen izena"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Idatzi SSIDa"</string>
     <string name="wifi_security" msgid="158358046038876532">"Segurtasuna"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Seinalearen indarra"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Seinalearen indarra"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Egoera"</string>
-    <string name="wifi_speed" msgid="1650692446731850781">"Esteken abiadura"</string>
+    <string name="wifi_speed" msgid="1650692446731850781">"Lotura-abiadura"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Maiztasuna"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP helbidea"</string>
+    <string name="show_password" msgid="2074628020371139240">"Erakutsi pasahitza"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Idatzi sarearen izena"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Idatzi pasahitza"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Txarra"</item>
-    <item msgid="2032262610626057081">"Hala-holakoa"</item>
-    <item msgid="3859756017461098953">"Ona"</item>
-    <item msgid="1521103743353335724">"Bikaina"</item>
+    <item msgid="7683058295076342057">"Txarra"</item>
+    <item msgid="1639222824821660744">"Hala-holakoa"</item>
+    <item msgid="1838705897358163300">"Ona"</item>
+    <item msgid="6067166649320533751">"Bikaina"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth konexioa"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Aktibatu Bluetooth konexioa"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth konexioa"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth konexioa desgaituta dago"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Sarearen xehetasunak"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC helbidea"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP helbidea"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Azpisarearen maskara"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 helbideak"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Atebidea"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi hobespenak"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Aktibatu Wi-Fi konexioa automatikoki"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Gordetako kalitate handiko sare batetik (adibidez, etxeko saretik) gertu zaudenean aktibatuko da berriro Wi‑Fi konexioa"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Ez dago erabilgarri kokapena desaktibatuta dagoelako. Aktibatu "<annotation id="link">"kokapena"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi-Fi sareak bilatzeko aukera aktibatu nahi al duzu?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aktibatu"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Aktibatu da Wi‑Fi sareak bilatzeko aukera"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Aldatu datu-konexiora automatikoki"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi bidez ezin denean, erabili datu-konexioa Internetera konektatzeko. Agian datuen erabilera ordaindu beharko duzu."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Lortu informazio gehiago"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth konexioa"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Kudeatu konexioak, eta ezarri gailuaren izena eta ikusgaitasuna"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Ordenagailua"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Entzungailua"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefonoa"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Irudietarako gailua"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Aurikularra"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Idazteko gailua"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth konexioa"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Parekatutako gailuak"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Gailu erabilgarriak"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Ez dago parekatutako gailurik"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Ez dago gailu erabilgarririk"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Parekatutako gailua"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Izena"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Erabilera"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Aldatu Bluetooth gailuaren izena"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Izenik gabeko gailua"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Parekatutako gailuak"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Parekatu beste gailu batekin"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth konexioa aktibatuko da parekatu ahal izateko"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Gailua deskonektatu nahi duzu?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailutik deskonektatuko da ibilgailua."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Ibilgailuaren Bluetooth helbidea: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Gailuaren Bluetooth helbidea: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Ibilgailuaren izena"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Aldatu ibilgailuaren izena"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Aldatu gailuaren izena"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Aldatu izena"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Gailu erabilgarriak"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profilak"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth bidez parekatzeko eskaera"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Parekatu eta konektatu"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth konexioa"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth parekatze-kodea"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN kodeak hizkiak edo ikurrak ditu"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Idatzi parekatze-kodea eta sakatu Itzuli edo Sartu"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Normalean 0000 edo 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Parekatzeko eskaera"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Sakatu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailuarekin parekatzeko."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Hizkuntzak"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Hizkuntzak eta idazketa"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Teklatua"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Kudeatu teklatuak"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Testua ahots bihurtzeko eginbidearen emaitza"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motor hobetsia"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Uneko motorra"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Hizketaren abiadura"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tonua"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Berrezarri"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Soinua"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Tonuaren bolumena"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Nabigazio-bolumena"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Multimedia-edukia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Ezarri musikaren eta bideoen bolumena"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarma"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefonoaren tonua"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Jakinarazpenen soinu lehenetsia"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Alarmen soinu lehenetsia"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikazioak eta jakinarazpenak"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Erakutsi aplikazio guztiak"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplikazio lehenetsiak"</string>
     <string name="applications_settings" msgid="794261395191035632">"Aplikazioaren informazioa"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Behartu gelditzera"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Gelditzera behartu nahi duzu?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Aplikazioak gelditzera behartzen badituzu, baliteke behar bezala ez funtzionatzea."</string>
     <string name="disable_text" msgid="4358165448648990820">"Desgaitu"</string>
     <string name="enable_text" msgid="1794971777861881238">"Gaitu"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstalatu"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Aplikazioa desgaitzen baduzu, baliteke Android-ek eta beste aplikazio batzuek behar bezala ez funtzionatzea."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Desgaitu aplikazioa"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Baimenak"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Bertsioa: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ez du baimenik"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ez du eskatu baimenik"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Datuen erabilera"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Aplikazioen datuen erabilera"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Behartu gelditzera"</string>
     <string name="computing_size" msgid="5791407621793083965">"Kalkulatzen…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> baimen gehigarri</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> baimen gehigarri</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Laguntza eta ahozko idazketa"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Laguntza-aplikazioa"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Erabili pantailako testua"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Eman pantailako edukia testu gisa atzitzeko baimena laguntza-aplikazioari"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Erabili pantaila-argazkia"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Eman pantailako irudia atzitzeko baimena laguntza-aplikazioari"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Betetze automatikoaren zerbitzua"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Bat ere ez"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Hautatuta"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Zure sistemak darabiltzan aplikazioei buruzko informazioa irakurri ahal izango du laguntzaileak, besteak beste, pantailan ikusgai duzun edo aplikazioetatik atzi daitekeen informazioa."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Ziurtatu aplikazioa fidagarria dela&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google-ren betetze automatikoak&gt;%1$s&lt;/xliff:g&gt; pantailan dagoena erabiltzen du automatikoki bete daitekeena zehazteko."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Gehitu zerbitzua"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Kokapena"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Azken kokapen-eskaerak"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ez da egin kokapen-eskaerarik azkenaldian"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Aplikazio-mailako baimenak"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Bilaketa"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Kokapen-zerbitzuak"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi sareak bilatzea"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Baimendu aplikazioei eta zerbitzuei Wi-Fi sareak edozein unetan bilatzea, baita Wi‑Fi konexioa desaktibatuta dagoenean ere. Kokapenean oinarritutako eginbideak eta zerbitzuak hobetzeko erabil daiteke hori, besteak beste."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth gailuak bilatzea"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Baimendu aplikazioei eta zerbitzuei inguruko gailuak edozein unetan bilatzea, baita Bluetooth konexioa desaktibatuta dagoenean ere. Kokapenean oinarritutako eginbideak eta zerbitzuak hobetzeko erabil daiteke hori, besteak beste."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Sistemaren eguneratzeak"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Sistemaren eguneratzeak"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android bertsioa"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android segurtasun-adabakiaren maila"</string>
     <string name="model_info" msgid="4966408071657934452">"Modeloa"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Oinarri-bandaren bertsioa"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel bertsioa"</string>
     <string name="build_number" msgid="3997326631001009102">"Konpilazio-zenbakia"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth helbidea"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ez dago erabilgarri"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Egoera"</string>
     <string name="device_status" msgid="267298179806290920">"Egoera"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyrighta"</string>
     <string name="license_title" msgid="936705938435249965">"Lizentzia"</string>
     <string name="terms_title" msgid="5201471373602628765">"Zehaztapenak eta baldintzak"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Sistemaren WebView lizentzia"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Sistemaren WebView lizentziak"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Horma-paperak"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satelite-irudien hornitzaileak:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Hirugarrenen lizentziak"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Arazo bat gertatu da lizentziak kargatzean."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Kargatzen…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> urrats falta zaizkizu garatzaile izateko.</item>
+      <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> urrats falta zaizu garatzaile izateko.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Garatzailea zara!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Ez dago zertan, dagoeneko zara garatzaile."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Garatzaileentzako aukerak"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Berrezartzeko aukerak"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Sarea, aplikazioak edo gailua berrezartzea"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Berrezarri sarea"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Sareko ezarpen guztiak berrezarriko dira; besteak beste:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi konexioa"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Datu-konexioa"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth konexioa"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Ezabatu ibilgailuaren eSIM txarteletako eduki guztia"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Ez da utziko bertan behera daukazun zerbitzu-plana."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Ezin dira berrezarri eSIM txartelak"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Hautatu sarea"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Berrezarri ezarpenak"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Berrezarri egin nahi dituzu?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Sareko ezarpen guztiak berrezarri nahi dituzu? Ezin da desegin ekintza hori."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Berrezarri ezarpenak"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Berrezarri dira sareko ezarpenak"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Berrezarri aplikazioen hobespenak"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Hauen hobespen guztiak berrezarriko dira:\n\n"<li>"desgaitutako aplikazioak,"</li>\n<li>"desgaitutako aplikazio-jakinarazpenak,"</li>\n<li>"ekintza jakinetarako aplikazio lehenetsiak,"</li>\n<li>"aplikazioen atzeko planoko datuen murriztapenak eta"</li>\n<li>"baimen-murriztapenak."</li>\n\n"Ez dituzu galduko aplikazioen datuak."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Berrezarri aplikazioak"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Berrezarri dira aplikazioen hobespenak"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Ezabatu datuak (berrezarri jatorrizkoak)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Ibilgailuaren gailu nagusiko datu guztiak ezabatuko dira, honako hauek barne:\n\n"<li>"Google kontua,"</li>\n<li>"sistemaren eta aplikazioen datuak eta ezarpenak,"</li>\n<li>"deskargatutako aplikazioak."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Kontu hauetan hasi duzu saioa:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Beste erabiltzaile batzuk daude ibilgailu honetan."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Berrezarri ibilgailua"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Berrezarri egin nahi dituzu?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Informazio pertsonal guztia eta deskargatutako aplikazioak ezabatu nahi dituzu? Ekintza hori ezin da desegin."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Ezabatu eduki guztia"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Eduki guztia ezabatzen"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Itxaron, mesedez…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data eta ordua"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Ezarri data eta ordua"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Ezarri data, ordua, ordu-zona eta formatuak"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordenatu ordu-zonaren arabera"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Ordua"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Gehitu erabiltzailea"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Gehitu kontua"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Ezabatu erabiltzailea"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Erabiltzaile berria"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gonbidatua"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administratzailea"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Administratzaile gisa hasi da saioa"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Administratzaile-baimen guztiak"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Egin administratzaile"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Erabiltzaile horrek beste erabiltzaileak ezabatu ahal izango ditu (beste administratzaileak barne), eta sistemako jatorrizko datuak berrezarri."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ekintza hau ezingo da desegin."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Bai, egin administratzaile"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Erabiltzaile berriak sortu"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefono-deiak egin"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Autoko datu-konexioa mezuetarako"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Aplikazio berriak instalatu"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Aplikazioak desinstalatu"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Gehitu erabiltzailea"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Erabiltzaile berria"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Beste erabiltzaile bat gehitu?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Erabiltzaile bat gehitzen duzunean, bere eremua konfiguratu beharko du."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Edozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Erabiltzaile-mugara iritsi zara"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Gehienez, <xliff:g id="COUNT">%d</xliff:g> erabiltzaile sor ditzakezu.</item>
+      <item quantity="one">Erabiltzaile bakarra sor dezakezu.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Ezin izan da sortu erabiltzailea"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Erabiltzaile hau ezabatu?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Aplikazio eta datu guztiak ezabatuko dira."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Ezin izan da ezabatu erabiltzailea."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Baztertu"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Saiatu berriro"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Azken erabiltzailea ezabatu?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Auto honetako azken erabiltzailea ezabatu ondoren, beste administratzaile bat sortuko da."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Erabiltzaile honekin erlazionatutako datu, ezarpen eta aplikazio guztiak ezabatu egingo dira. Berriro konfiguratu beharko duzu sistema."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Aukeratu beste administratzaile bat"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Gutxienez administratzaile bat behar duzu. Honako hau ezabatzeko, aukeratu ordezko bat."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Aukeratu administratzailea"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gonbidatua"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gonbidatua"</string>
     <string name="user_switch" msgid="6544839750534690781">"Aldatu"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Zu (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Izena"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Konfiguratu gabe"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editatu erabiltzaile-izena"</string>
     <string name="users_list_title" msgid="770764290290240909">"Erabiltzaileak"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s erabiltzailearen baimenak"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Kontuak"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Erabiltzailea"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Gehitu kontua"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Ez da gehitu konturik"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> erabiltzailearen kontuak"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sinkronizatu datuak automatikoki"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Utzi aplikazioei datuak automatikoki freskatzen"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Sinkronizazio automatikoa aktibatu nahi duzu?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Kontuei sarean egiten dizkiezun aldaketa guztiak automatikoki kopiatuko dira gailuan.\n\nHorrez gain, baliteke kontu batzuek sarean kopiatzea telefonoan egiten dituzun aldaketak. Google kontuek horrela funtzionatzen dute."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Sinkronizazio automatikoa desaktibatu nahi duzu?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Datuak aurrezten lagunduko dizu, baina kontu bakoitza eskuz sinkronizatu beharko duzu informazio berriena biltzeko. Gainera, ez duzu jasoko berritasunen jakinarazpenik."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Kontuaren informazioa"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Gehitu kontua"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Gehitu kontu bat"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Kendu kontua"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Kontua kendu nahi duzu?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Kontua kentzen baduzu, bertako mezu, kontaktu eta bestelako datu guztiak ezabatuko dira gailutik."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Administratzaileak ez du eman aldaketa egiteko baimena"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Erabiltzaile hau kendu?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Aplikazio eta datu guztiak ezabatuko dira."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Ezin izan da kendu erabiltzailea."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Berriro saiatu?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Baztertu"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Saiatu berriro"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Beste erabiltzaile bat gehitu?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Erabiltzaile bat gehitzen duzunean, bere eremua konfiguratu beharko du."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Edozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Ezin izan da kendu kontua."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Kontuaren sinkronizazioa"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g> elementuk aktibatuta dute sinkronizazioa"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Elementu guztiek aktibatuta dute sinkronizazioa"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Elementu guztiek desaktibatuta dute sinkronizazioa"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinkroniz. DESAKTIBATUTA"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sinkronizazio-errorea"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Azken sinkronizazioa: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinkronizatzen…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Sakatu sinkronizatzeko (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkronizatu"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Utzi sinkronizazioa"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronizazioak arazoak ditu. Laster egongo da berriro erabilgarri."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Segurtasuna"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Pantailaren blokeoa"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Bat ere ez"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN kodea"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Pasahitza"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Aukeratu blokeo mota"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Pantaila blokeatzeko aukerak"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Blokeatzeko aukerak"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Marraztu eredua"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Berretsi"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Marraztu berriro"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ezarri pantailaren blokeo bat"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Aukeratu PIN kodea"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Aukeratu eredu bat"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Aukeratu pasahitza"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Aukeratu pasahitza"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Uneko pantailaren blokeoa"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Babestuta egoteko, ezarri eredu bat"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Garbitu"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IKT administratzaileak blokeatu egiten ditu asmatzen errazak diren pasahitzak. Erabili beste pasahitz bat."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Ezin da erabili goranzko, beheranzko edo errepikatutako digitu-sekuentziarik."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Pantaila blokeatzeko aukerak"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: duela <xliff:g id="NUM_DAYS">%3$s</xliff:g> egun"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Gehitu gailu fidagarria"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Gailu fidagarriak"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> gailu</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> gailu</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> gailuak autoa desblokeatuko du konektatzen denean. Beste norbaitek <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> autoa hartzen badu, agian gailua atzitu ahal izango du."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Berretsi"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Kendu gailu fidagarria"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Eginda"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Erabili aplikazio osagarria gailu fidagarri bat konfiguratzeko. Konfiguratu ondoren, erabiltzaile-profila desblokeatu ahalko duzu ibilgailuak zure telefonoa hautematen duenean"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Deskargatu aplikazio osagarria telefonoan"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Gailuak parekatzeko, hautatu <xliff:g id="CAR_NAME">%1$s</xliff:g> telefonoan"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock eginbideak ezin ditu hauteman gailu honen segurtasun-eginbideak. Autoa babesteko, zeuk desblokeatzen baduzu bakarrik mantendu ahal izango du gailu fidagarriak autoa desblokeatuta. Gailu fidagarria gai da autoa desblokeatuta mantentzeko elkarrengandik hurbil daudenean, baita gailua darabilena zeu ez bazara ere."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Gehitu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailu fidagarri gisa"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> gehitu da gailu fidagarri gisa"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailuaren harpidetzeak huts egin du"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Gailu fidagarri bat gehitzen baduzu, autentifikazio-metodo bat ezartzea izango da hurrengo urratsa. Ez badaukazu gailu fidagarririk gertu, sistemak autentifikatzeko eskatuko dizu profila atzitzen duzunean."</string>
     <string name="forget" msgid="3971143908183848527">"Ahaztu"</string>
+    <string name="connect" msgid="5861699594602380150">"Konektatu"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Deskonektatu"</string>
     <string name="delete_button" msgid="5840500432614610850">"Ezabatu"</string>
     <string name="remove_button" msgid="6664656962868194178">"Kendu"</string>
     <string name="cancel" msgid="750286395700355455">"Utzi"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Irten demo modutik"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Demo kontua ezabatuko da eta sistemaren jatorrizko datuak berrezarriko dira. Erabiltzaile-datu guztiak galdu egingo dira."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Irten demo modutik"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"amaitu konfiguratzen"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"orain ez"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"BAZTERTU"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Eginbide hau ezin da erabili gidatu bitartean."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Gidatu bitartean ezin da gehitu erabiltzailerik."</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index c9d726c..f1cef7a 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"صفحه کم‌نور، صفحه لمسی، باتری"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"صفحه کم‌نور، شب، سایه‌رنگ"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"حالت شب"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"شبکه و اینترنت"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"شبکه تلفن همراه"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"داده تلفن همراه"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"دسترسی به داده‌ها با استفاده از شبکه تلفن همراه"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"داده تلفن همراه خاموش شود؟"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"مصرف داده"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"محدودیت و هشدار داده"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"دوره مصرف داده برنامه"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"تنظیم هشدار داده"</string>
+    <string name="data_warning" msgid="116776633806885370">"هشدار داده"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"تنظیم محدودیت داده"</string>
+    <string name="data_limit" msgid="227338836292511425">"محدودیت داده"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"محدود کردن مصرف داده"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"وقتی داده تلفن همراهتان به محدودیتی که تنظیم کرده‌اید برسد، سیستم صوتی خودروی شما خاموش خواهد شد.\n\nاز آنجایی‌که سیستم صوتی شما مصرف داد‌ه را محاسبه می‌کند و ممکن است شرکت مخابراتی‌تان مصرف داده را به روش دیگری محاسبه کند، سعی کنید محدودیت محافظه‌کارانه‌ای تنظیم کنید."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"تنظیم و مدیریت نقاط دسترسی بی‌سیم"</string>
     <string name="wifi_starting" msgid="473253087503153167">"روشن کردن Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"خاموش کردن Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"درحال بارگیری فهرست Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi غیرفعال شد"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"شبکه فراموش نشد"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"اتصال به شبکه برقرار نشد"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"افزودن شبکه"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi غیرفعال شد"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"اتصال"</string>
     <string name="wifi_password" msgid="5565632142720292397">"گذرواژه"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"نمایش گذرواژه"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"نام شبکه"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID را وارد کنید"</string>
     <string name="wifi_security" msgid="158358046038876532">"امنیت"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"قدرت سیگنال"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"قدرت سیگنال"</string>
     <string name="wifi_status" msgid="5688013206066543952">"وضعیت"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"سرعت پیوند"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"فرکانس"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"نشانی IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"نمایش گذرواژه"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"نام شبکه را وارد کنید"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"گذرواژه را وارد کنید"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ضعیف"</item>
-    <item msgid="2032262610626057081">"متوسط"</item>
-    <item msgid="3859756017461098953">"خوب"</item>
-    <item msgid="1521103743353335724">"عالی"</item>
+    <item msgid="7683058295076342057">"ضعیف"</item>
+    <item msgid="1639222824821660744">"متوسط"</item>
+    <item msgid="1838705897358163300">"خوب"</item>
+    <item msgid="6067166649320533751">"عالی"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"بلوتوث"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"روشن کردن بلوتوث"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"بلوتوث"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"بلوتوث غیرفعال است"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d مگابیت در ثانیه"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"۲٫۴ گیگاهرتز"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"۵ گیگاهرتز"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"جزئیات شبکه"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"نشانی MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"نشانی IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"پوشش زیرشبکه"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"نشانی‌های IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"دروازه"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"اولویت‌های Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"روشن شدن خودکار Wi-Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi درنزدیکی شبکه‌های با کیفیت بالای ذخیره‌شده (ازجمله شبکه خانه‌تان) دوباره روشن می‌شود"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"در دسترس نیست چون «مکان» خاموش است. "<annotation id="link">"مکان"</annotation>" را روشن کنید."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"اسکن کردن Wi‑Fi روشن شود؟"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"روشن کردن"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"اسکن کردن Wi-Fi روشن شد"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"تغییر وضعیت خودکار به داده تلفن همراه"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"وقتی Wi-Fi به اینترنت دسترسی ندارد، از داده تلفن همراه استفاده شود. ممکن است هزینه مصرف داده اعمال شود."</string>
+    <string name="learn_more" msgid="8214605928933358604">"بیشتر بدانید"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"بلوتوث"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"مدیریت اتصال‌ها، تنظیم نام دستگاه و قابلیت شناسایی"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"رایانه"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"هدست"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"تلفن"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"تصویربرداری"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"هدفون"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ورودی محیطی"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"بلوتوث"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"دستگاه‌های مرتبط‌شده"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"دستگاه‌های در دسترس"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"دستگاه مرتبطی وجود ندارد"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"دستگاهی در دسترس نیست"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"دستگاه مرتبط‌شده"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"نام"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"استفاده برای"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"نام دستگاه بلوتوث را تغییر دهید"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"دستگاه بی‌نام"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"دستگاه‌های مرتبط‌شده"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"مرتبط‌ کردن دستگاه جدید"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"بلوتوث برای مرتبط شدن روشن خواهد شد"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ارتباط دستگاه قطع شود؟"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"ارتباط خودرو از <xliff:g id="DEVICE_NAME">%1$s</xliff:g> قطع می‌شود."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"نشانی بلوتوث خودرو: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"نشانی بلوتوث دستگاه: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"نام خودرو"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"تغییر نام این خودرو"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"تغییر نام دستگاه"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"تغییر نام"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"دستگاه‌های دردسترس"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"نمایه‌ها"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"درخواست مرتبط‌سازی بلوتوث"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"مرتبط‌ کردن و اتصال"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"بلوتوث"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"کد مرتبط‌سازی بلوتوث"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"پین شامل حروف یا نماد است"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"کد مرتبط‌سازی را وارد کنید سپس بازگشت یا Enter را فشار دهید"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"معمولا ۰۰۰۰ یا ۱۲۳۴"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"درخواست مرتبط‌سازی"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"برای مرتبط‌سازی با <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ضربه بزنید."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"زبان‌ها"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"زبان‌ها و ورودی"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"صفحه‌کلید"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"مدیریت صفحه‌کلیدها"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"خروجی تبدیل نوشتار به گفتار"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"موتور ترجیحی"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"موتور کنونی"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"سرعت گفتار"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"زیر و بمی صدا"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"بازنشانی"</string>
     <string name="sound_settings" msgid="3072423952331872246">"صدا"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"بلندی صدای زنگ"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"میزان صدای مسیریابی"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"رسانه"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"تنظیم میزان صدا برای موسیقی و ویدیو"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"هشدار"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"آهنگ زنگ تلفن"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"صدای اعلان پیش‌فرض"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"صدای زنگ پیش‌فرض"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"برنامه‌ها و اعلان‌ها"</string>
+    <string name="all_applications" msgid="7798210477486822168">"نمایش همه برنامه‌ها"</string>
+    <string name="default_applications" msgid="1558183275638697087">"برنامه‌های پیش‌فرض"</string>
     <string name="applications_settings" msgid="794261395191035632">"اطلاعات برنامه"</string>
+    <string name="force_stop" msgid="2153183697014720520">"توقف اجباری"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"توقف اجباری؟"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"توقف اجباری یک برنامه ممکن است باعث عملکرد نادرست آن شود."</string>
     <string name="disable_text" msgid="4358165448648990820">"غیرفعال کردن"</string>
     <string name="enable_text" msgid="1794971777861881238">"فعال کردن"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"حذف نصب"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"اگر این برنامه را غیرفعال کنید، ممکن است Android و سایر برنامه‌ها دیگر عملکرد موردانتظار را نداشته باشند."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"غیرفعال کردن برنامه"</string>
     <string name="permissions_label" msgid="2701446753515612685">"مجوزها"</string>
     <string name="application_version_label" msgid="8556889839783311649">"نسخه: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"اجازه‌ای داده نشده"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"اجازه‌ای درخواست نشده"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"مصرف داده"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"مصرف داده برنامه"</string>
-    <string name="force_stop" msgid="2153183697014720520">"توقف اجباری"</string>
     <string name="computing_size" msgid="5791407621793083965">"درحال محاسبه..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> مجوز دیگر</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> مجوز دیگر</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"همیار و ورودی گفتاری"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"برنامه همیار"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"استفاده از نوشتار صفحه"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"اجازه به برنامه همیار برای دسترسی به محتوای صفحه به‌عنوان نوشتار"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"استفاده از عکس صفحه‌نمایش"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"اجازه به برنامه همیار برای دسترسی به تصویری از صفحه"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"سرویس تکمیل خودکار"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"هیچ‌کدام"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"انتخاب‌شده"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"دستیار می‌تواند اطلاعات مربوط به برنامه‌های در حال استفاده در سیستم شما را بخواند، ازجمله اطلاعاتی که در صفحه‌نمایش شما قابل مشاهده است یا در برنامه‌ها قابل دسترسی است."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;مطمئن شوید به این برنامه اطمینان دارید&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=تکمیل خودکار Google‏&gt;%1$s&lt;/xliff:g&gt; برای تعیین مواردی که می‌توانند به‌طور خودکار تکمیل شوند، از آنچه روی صفحه‌نمایش شما است استفاده می‌کند."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"افزودن سرویس"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"مکان"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"درخواست‌های اخیر مکان"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"درخواست مکان جدیدی وجود ندارد"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"مجوزهای سطح برنامه"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"اسکن کردن"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"خدمات مکان"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"اسکن کردن Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"به برنامه‌ها و سرویس‌ها اجازه دهید درهر زمانی (حتی وقتی Wi‑Fi خاموش است) شبکه‌های Wi‑Fi را اسکن کنند. برای مثال این مورد مي‌تواند برای بهبود ویژگی‌ها و سرویس‌های مکان‌مبنا استفاده شود."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"اسکن کردن بلوتوث"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"به برنامه‌ها و سرویس‌ها اجازه دهید درهر زمانی (حتی وقتی «بلوتوث» خاموش است) دستگاه‌های اطراف را اسکن کنند. برای مثال این مورد مي‌تواند برای بهبود ویژگی‌ها و سرویس‌های مکان‌مبنا استفاده شود."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"سیستم"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"به‌روزرسانی‌های سیستم"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"به‌روزرسانی‌های سیستم"</string>
     <string name="firmware_version" msgid="8491753744549309333">"نسخه Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"سطح وصله امنیتی Android"</string>
     <string name="model_info" msgid="4966408071657934452">"مدل"</string>
     <string name="baseband_version" msgid="2370088062235041897">"نسخه باند پایه"</string>
     <string name="kernel_version" msgid="7327212934187011508">"نسخهٔ اصلی"</string>
     <string name="build_number" msgid="3997326631001009102">"شمارهٔ ساخت"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"نشانی بلوتوث"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"در دسترس نیست"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"وضعیت"</string>
     <string name="device_status" msgid="267298179806290920">"وضعیت"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"حق نسخه‌برداری"</string>
     <string name="license_title" msgid="936705938435249965">"مجوز"</string>
     <string name="terms_title" msgid="5201471373602628765">"شرایط و مقررات"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"مجوز وب‌نمای سیستم"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"مجوزهای «وب‌نمای» سیستم"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"کاغذدیواری"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ارائه‌دهندگان تصویر ماهواره‌ای:\n©2014 CNES / Astrium،‏ DigitalGlobe،‏ Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"مجوزهای شخص ثالث"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"مشکلی در بارگیری مجوزها وجود دارد."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"درحال بار کردن…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">اکنون <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> قدم تا برنامه‌نویس شدن فاصله دارید.</item>
+      <item quantity="other">اکنون <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> قدم تا برنامه‌نویس شدن فاصله دارید.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"شما اکنون یک برنامه‌نویس هستید!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"نیازی نیست، شما اکنون برنامه‌نویس هستید."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"گزینه‌های تولیدکننده"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"بازنشانی گزینه‌ها"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"شبکه، برنامه‌ها یا بازنشانی دستگاه"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"بازنشانی شبکه"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"با این کار همه تنظیمات شبکه بازنشانی می‌شود، ازجمله:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"داده تلفن همراه"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"بلوتوث"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"پاک کردن همه سیم‌کارت‌های داخلی خودرو"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"با این کار طرح سرویستان لغو نمی‌شود."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"نمی‌توان سیم‌کارت‌های داخلی را بازنشانی کرد"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"انتخاب شبکه"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"بازنشانی تنظیمات"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"بازنشانی شود؟"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"همه تنظیمات شبکه بازنشانی شود؟ امکان واگرد این کار وجود ندارد!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"بازنشانی تنظیمات"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"تنظیمات شبکه بازنشانی شد"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"بازنشانی تنظیمات برگزیده برنامه"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"با این کار همه اولویت‌های مربوط به موارد زیر بازنشانی می‌شود:\n\n"<li>"برنامه‌های غیرفعال‌شده"</li>\n<li>"اعلان‌های برنامه غیرفعال‌شده"</li>\n<li>"برنامه‌های پیش‌فرض برای عملکردها"</li>\n<li>"محدودیت‌های داده پس‌زمینه برای برنامه‌ها"</li>\n<li>"هرگونه محدودیت مجوز"</li>\n\n"هیچ داده برنامه‌ای را از دست نخواهید داد."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"بازنشانی برنامه‌ها"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"تنظیمات برگزیده برنامه بازنشانی شده است"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"پاک کردن همه داده‌ها (بازنشانی کارخانه‌ای)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"با این کار، همه داده‌های سیستم صوتی خودرو، ازجمله موارد زیر پاک می‌شود:\n\n"<li>"حساب Google شما"</li>\n<li>"تنظیمات و داده‌های برنامه و سیستم"</li>\n<li>"برنامه‌های بارگیری‌شده"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"شما درحال‌حاضر به حساب های زیر وارد شده‌اید:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"کاربرانی دیگری هم در این خودرو حضور دارند."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"بازنشانی خودرو"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"بازنشانی شود؟"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"همه اطلاعات شخصی و برنامه‌های بارگیری‌شده پاک شود؟ این کار قابل‌واگرد نیست!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"پاک کردن همه موارد"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"درحال پاک‌سازی"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"لطفاً صبر کنید..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"تاریخ و زمان"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"تنظیم تاریخ و زمان"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"تنظیم تاریخ، ساعت، منطقه زمانی و قالب‌ها"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"به ترتیب منطقه زمانی"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"تاریخ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"زمان"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"افزودن کاربر"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"افزودن حساب"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"حذف کاربر"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"کاربر جدید"</string>
-    <string name="user_guest" msgid="3465399481257448601">"مهمان"</string>
     <string name="user_admin" msgid="1535484812908584809">"سرپرست"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"به‌عنوان سرپرست به سیستم وارد شدید"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"همه مجوزهای سرپرست"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"انتخاب به‌عنوان سرپرست"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"این کاربر می‌تواند کاربران (ازجمله سرپرستان دیگر) را حذف کند و سیستم را بازنشانی کارخانه‌ای کند."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"این اقدام برگشت‌پذیر نیست."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"بله، سرپرست شود"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"ایجاد کاربران جدید"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"برقراری تماس‌های تلفنی"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"پیام‌رسانی با داده تلفن همراه خودرو"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"نصب برنامه‌های جدید"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"حذف نصب برنامه‌ها"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"افزودن کاربر"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"کاربر جدید"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"کاربر جدیدی اضافه می‌کنید؟"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"وقتی کاربر جدیدی اضافه می‌کنید آن فرد باید فضای خودش را تنظیم کند."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"هر کاربری می‌تواند برنامه‌ها را برای همه کاربران دیگر به‌روزرسانی کند."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"به حداکثر کاربر مجاز رسیده است"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">می‌توانید تا <xliff:g id="COUNT">%d</xliff:g> کاربر ایجاد کنید.</item>
+      <item quantity="other">می‌توانید تا <xliff:g id="COUNT">%d</xliff:g> کاربر ایجاد کنید.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"کاربر جدید ایجاد نشد"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"این کاربر حذف شود؟"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"همه برنامه‌ها و داده‌ها حذف خواهد شد."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"کاربر حذف نشد."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"نپذیرفتن"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"امتحان مجدد"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"آخرین کاربر حذف شود؟"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"بعد از حذف تنها کاربر باقی‌ماندهٔ این خودرو، کاربرِ سرپرست جدیدی ایجاد خواهد شد."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"همه داده‌ها، تنظیمات، و برنامه‌های مرتبط با این کاربر حذف می‌شود. باید سیستم را دوباره راه‌‌اندازی کنید."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"انتخاب سرپرست جدید"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"حداقل یک سرپرست لازم دارید. برای حذف این سرپرست، ابتدا جایگزینی انتخاب کنید."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"انتخاب سرپرست"</string>
+    <string name="user_guest" msgid="3465399481257448601">"مهمان"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"مهمان"</string>
     <string name="user_switch" msgid="6544839750534690781">"جابه‌جایی"</string>
     <string name="current_user_name" msgid="3813671533249316823">"شما (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"نام"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"تنظیم نشده"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ویرایش نام کاربر"</string>
     <string name="users_list_title" msgid="770764290290240909">"کاربران"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"مجوزها به %1$s داده شد"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"حساب‌ها"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"کاربر"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"افزودن حساب"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"حسابی اضافه نشده است"</string>
     <string name="account_list_title" msgid="7631588514613843065">"حساب‌های <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"همگام‌سازی خودکار داده‌ها"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"اجازه دادن به برنامه‌ها برای بازخوانی خودکار داده‌ها"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"همگام‌سازی خودکار داده روشن شود؟"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"هر تغییری که در حساب‌هایتان در وب بدهید، به‌طور خودکار در دستگاهتان کپی می‌شود.\n\nبرخی حساب‌ها هم ممکن است به‌طور خودکار هر تغییری را که در تلفنتان می‌دهید در وب کپی کنند. حساب Google به‌این‌صورت کار می‌کند."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"همگام‌سازی خودکار داده خاموش شود؟"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"با این کار از داده‌ها محافظت می‌شود، اما برای جمع‌آوری اطلاعات اخیر باید همه حساب‌ها را به‌طور دستی همگام‌سازی کنید. درصورت به‌روزرسانی نیز اعلان دریافت نمی‌کنید."</string>
     <string name="account_details_title" msgid="7529571432258448573">"اطلاعات حساب"</string>
     <string name="add_account_title" msgid="5988746086885210040">"افزودن حساب"</string>
     <string name="add_an_account" msgid="1072285034300995091">"افزودن حساب"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"حذف حساب"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"حساب برداشته شود؟"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"با پاک کردن این حساب، همه پیام‌ها، مخاطبین و داده‌های دیگر از دستگاه حذف خواهد شد!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"سرپرست سیستم شما این تغییر را مجاز نمی‌داند"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"این کاربر حذف شود؟"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"همه برنامه‌ها و اطلاعات حذف خواهند شد."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"کاربر حذف نشد."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"امتحان مجدد؟"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"نپذیرفتن"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"امتحان مجدد"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"کاربر جدیدی اضافه می‌کنید؟"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"وقتی کاربر جدیدی اضافه می‌کنید آن فرد باید فضای خودش را تنظیم کند."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"هر کاربری می‌تواند برنامه‌ها را برای همه کاربران دیگر به‌روزرسانی کند."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"حساب برداشته نشد."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"همگام‌سازی حساب"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"همگام‌سازی <xliff:g id="ID_1">%1$d</xliff:g> مورد از <xliff:g id="ID_2">%2$d</xliff:g> مورد روشن است"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"همگام‌سازی همه موارد روشن است"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"همگام‌سازی همه موارد خاموش است"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"همگام‌سازی خاموش است"</string>
+    <string name="sync_error" msgid="6698021343089247914">"خطای همگام‌سازی"</string>
+    <string name="last_synced" msgid="4745124489150101529">"تاریخ آخرین همگام‌سازی: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"در حال همگام‌سازی…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"برای اینکه اکنون همگام‌سازی کنید، ضربه بزنید<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"اکنون همگام‌سازی شود"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"لغو همگام‌سازی"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"همگام‌سازی درحال حاضر با مشکلی روبرو است. به‌زودی درست خواهد شد."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"امنیت"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"قفل صفحه"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"هیچ‌کدام"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"پین"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"گذرواژه"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"انتخاب نوع قفل"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"گزینه‌های قفل صفحه"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"گزینه‌های قفل"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"الگویتان را وارد کنید"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"تأیید"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"کشیدن مجدد"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"تنظیم قفل صفحه"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"پین خودتان را انتخاب کنید"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"انتخاب الگو"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"گذرواژه‌تان را انتخاب کنید"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"انتخاب گذرواژه"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"قفل صفحه فعلی"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"برای حفظ امنیت، الگو تنظیم کنید"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"پاک کردن"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"گذرواژه‌های رایج توسط سرپرست فناوری اطلاعات شما مسدود شده‌اند. گذرواژه متفاوتی را امتحان کنید."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ترتیب صعودی، نزولی یا تکراری ارقام مجاز نیست."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"گزینه‌های قفل صفحه"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> روز پیش"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"افزودن دستگاه مطمئن"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"دستگاه‌های مطمئن"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> دستگاه</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دستگاه</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> شما وقتی متصل شود، قفل این خودرو را باز می‌کند. اگر کسی <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> شما را بردارد، ممکن است بتواند به این دستگاه دسترسی پیدا کند"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"تأیید"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"حذف دستگاه مطمئن"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"تمام"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"از برنامه همراه برای راه‌اندازی دستگاه مطمئن استفاده کنید. زمانی‌که تنظیم انجام شد، درصورت شناسایی تلفن توسط وسیله نقلیه، می‌توانید قفل نمایه کاربری‌تان را باز کنید."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"۱. برنامه همراه را در تلفنتان بارگیری کنید"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"۲. برای مرتبط‌سازی دستگاه‌ها، <xliff:g id="CAR_NAME">%1$s</xliff:g> را در تلفنتان انتخاب کنید"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock نمی‌تواند ویژگی‌های امنیتی این دستگاه را شناسایی کند. برای کمک به محافظت از خودرو، دستگاه مطمئن تنها زمانی که از قبل قفل تلفنتان را باز کرده باشید می‌تواند قفل آن را باز نگه‌دارد. دستگاه مطمئن شما می‌تواند هنگامی‌که خودرویتان در اطراف است قفل آن را باز نگه‌دارد، حتی اگر تلفن در دست شخص دیگری باشد."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"افزودن <xliff:g id="DEVICE_NAME">%1$s</xliff:g> به‌عنوان دستگاه مطمئن"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> باموفقیت به‌عنوان دستگاه مطمئن اضافه شد"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"ثبت‌نام <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ناموفق بود"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"افزودن دستگاه مطمئن مستلزم تنظیم روش احراز هویت در مرحله بعد است. اگر دستگاه مطمئن‌تان را با خود حمل نمی‌کنید، برای دسترسی به نمایه‌تان باید احراز هویت کنید."</string>
     <string name="forget" msgid="3971143908183848527">"فراموش کردن"</string>
+    <string name="connect" msgid="5861699594602380150">"اتصال"</string>
+    <string name="disconnect" msgid="6140789953324820336">"قطع اتصال"</string>
     <string name="delete_button" msgid="5840500432614610850">"حذف"</string>
     <string name="remove_button" msgid="6664656962868194178">"حذف"</string>
     <string name="cancel" msgid="750286395700355455">"لغو"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"خروج از حالت نمایشی"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"با این کار حساب نمایشی حذف و سیستم به داده‌های کارخانه بازنشانی می‌شود. همه داده‌های کاربر از بین می‌روند."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"خروج از حالت نمایشی"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"اتمام راه‌اندازی"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"الان نه"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"رد کردن"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"هنگام رانندگی، این ویژگی در دسترس نیست."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"نمی‌توان هنگام رانندگی، کاربر اضافه کرد."</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index bc6b733..ae4cfbe 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"näytön himmennys, kosketusnäyttö, akku"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"näytön himmennys, yö, sävytys"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Yötila"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Verkko ja internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobiiliverkko"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiilidata"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Käytä mobiiliverkon dataa"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Poistetaanko mobiilidata käytöstä?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Datan käyttö"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Datavaroitus ja käyttöraja"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Sovellustietojen käyttösykli"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Aseta datankäyttövaroitus"</string>
+    <string name="data_warning" msgid="116776633806885370">"Datavaroitus"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Aseta dataraja"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datankäyttöraja"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Datan käytön rajoittaminen"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Pääyksikkö poistaa mobiilidatan käytöstä, kun asetettu raja saavutetaan.\n\nPääyksikkö mittaa tiedonsiirron. Operaattorisi voi kuitenkin käyttää eri mittaustapaa, joten suosittelemme määrittämään rajan todellista ylärajaa tiukemmaksi."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Ota käyttöön ja hallinnoi langattomia yhteyspisteitä."</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi-yhteyttä otetaan käyttöön…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Poistetaan Wi-Fi-yhteyttä käytöstä…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Ladataan Wi‑Fi-luetteloa"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi ei käytössä"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Verkon unohtaminen epäonnistui."</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Verkkoyhteyden muodostaminen epäonnistui."</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Lisää verkko"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi ei käytössä"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Yhdistä"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Salasana"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Näytä salasana"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Verkon nimi"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Anna SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Suojaus"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signaalin vahvuus"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signaalin vahvuus"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Tila"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Yhteyden nopeus"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Taajuus"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-osoite"</string>
+    <string name="show_password" msgid="2074628020371139240">"Näytä salasana"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Lisää verkon nimi"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Syötä salasana"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Heikko"</item>
-    <item msgid="2032262610626057081">"Kohtalainen"</item>
-    <item msgid="3859756017461098953">"Hyvä"</item>
-    <item msgid="1521103743353335724">"Erinomainen"</item>
+    <item msgid="7683058295076342057">"Heikko"</item>
+    <item msgid="1639222824821660744">"Kohtalainen"</item>
+    <item msgid="1838705897358163300">"Hyvä"</item>
+    <item msgid="6067166649320533751">"Erinomainen"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Ota Bluetooth käyttöön"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth pois käytöstä"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbit/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Verkon tiedot"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-osoite"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-osoite"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Aliverkon maski"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-osoitteet"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Yhdyskäytävä"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi-Fi-asetukset"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Ota Wi-Fi käyttöön automaattisesti"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi otetaan käyttöön kotiverkon tai muun laadukkaan tallennetun verkon lähellä"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Ei saatavilla, koska sijaintia ei käytetä. Käytä "<annotation id="link">"sijaintia"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Otetaanko Wi-Fi-haku käyttöön?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Ota käyttöön"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi-Fi-haku on käytössä"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Vaihda mobiilidataan automaattisesti"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Vaihda mobiilidataan, jos Wi-Fi-yhteyttä ei voi muodostaa. Datan käytöstä voi aiheutua maksuja."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Lue lisää"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Hallinnoi yhteyksiä, määritä laitteen nimi ja tunnistettavuus"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Tietokone"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Kuulokemikrofoni"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Puhelin"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Kuvannuslaite"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Kuulokkeet"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Syöttölisälaite"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Laiteparit"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Saatavilla olevat laitteet"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Ei laitepareja"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Ei laitteita saatavilla"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Laitepari"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nimi"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Käyttö:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Vaihda Bluetooth-laitteen nimi"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Nimetön laite"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Laiteparit"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Muodosta laitepari uuden laitteen kanssa"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth käynnistetään parinmuodostusta varten"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Katkaistaanko laitteen yhteys?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Ajoneuvo ja <xliff:g id="DEVICE_NAME">%1$s</xliff:g> erotetaan."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Ajoneuvon Bluetooth-osoite: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Laitteen Bluetooth-osoite: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Ajoneuvon nimi"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Nimeä ajoneuvo uudelleen"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Nimeä laite uudelleen"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Nimeä uudelleen"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Saatavilla olevat laitteet"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiilit"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth-laiteparipyyntö"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Muodosta laitepari ja yhdistä"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-laiteparikoodi"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN-koodi sisältää kirjaimia tai symboleja"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Kirjoita yhdistämiskoodi ja valitse sitten Return tai Enter."</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Yleensä 0000 tai 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Laiteparipyyntö"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Napauta muodostaaksesi laiteparin: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Kielet"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Kielet ja syöttötapa"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Näppäimistö"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Ylläpidä näppäimistöjä"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Tekstistä puheeksi ‑toisto"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Ensisijainen moottori"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Nykyinen moottori"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Puheen nopeus"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Äänenkorkeus"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Nollaa"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Ääni"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Soittoäänen voimakkuus"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigoinnin äänenvoimakkuus"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Aseta musiikin ja videoiden äänenvoimakkuus"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Hälytys"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Puhelimen soittoääni"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Ilmoituksen oletusääni"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Herätyksen oletusääni"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Sovellukset ja ilmoitukset"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Näytä kaikki sovellukset"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Oletussovellukset"</string>
     <string name="applications_settings" msgid="794261395191035632">"Sovellustiedot"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Pakota sulkeutumaan"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Pakotetaanko lopetus?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Jos pakotat sovelluksen pysähtymään, se ei välttämättä enää toimi oikein."</string>
     <string name="disable_text" msgid="4358165448648990820">"Poista käytöstä"</string>
     <string name="enable_text" msgid="1794971777861881238">"Käytä"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Poista"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Jos poistat sovelluksen käytöstä, Android ja muut sovellukset eivät välttämättä enää toimi oikein."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Poista sovellus käytöstä"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Käyttöoikeudet"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versio: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Käyttöoikeuksia ei ole myönnetty."</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Käyttöoikeuksia ei ole pyydetty."</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Datan käyttö"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Sovelluksen datan käyttö"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Pakota sulkeutumaan"</string>
     <string name="computing_size" msgid="5791407621793083965">"Lasketaan…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> lisäkäyttölupaa</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> lisäkäyttölupa</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistant ja äänisyöte"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Avustajasovellus"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Käytä näytön tekstiä"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Salli avustajasovelluksen käsitellä näytön sisältöä tekstinä"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Käytä kuvakaappausta"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Salli avustajasovelluksen käsitellä näytön kuvaa"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Automaattinen täyttö ‑palvelu"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ei mitään"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Valittu"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Avustaja voi lukea tietoja järjestelmäsi käyttämistä sovelluksista, mukaan lukien tietoja, jotka näkyvät näytöllä tai jotka ovat käytettävissä sovelluksissa."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Varmista, että luotat tähän sovellukseen&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; päättelee näytöllä olevien kohteiden perusteella, mitä voidaan täyttää automaattisesti."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Lisää palvelu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Sijainti"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Viimeisimmät sijaintipyynnöt"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ei viimeaikaisia sijaintipyyntöjä"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Sovellustason käyttöoikeudet"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Hakeminen"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Sijaintipalvelut"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi-haku"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Salli sovellusten ja palvelujen hakea Wi‑Fi-verkkoja aina, vaikka Wi-Fi olisi pois käytöstä. Näin voidaan esimerkiksi kehittää sijaintiin perustuvia ominaisuuksia ja palveluja."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-haku"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Salli sovellusten ja palvelujen hakea lähellä olevia laitteita aina, vaikka Bluetooth olisi pois käytöstä. Näin voidaan esimerkiksi kehittää sijaintiin perustuvia ominaisuuksia ja palveluja."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Järjestelmä"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Järjestelmäpäivitykset"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Järjestelmäpäivitykset"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-versio"</string>
     <string name="security_patch" msgid="4794276590178386903">"Androidin tietoturvakorjauksen taso"</string>
     <string name="model_info" msgid="4966408071657934452">"Malli"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-versio"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-versio"</string>
     <string name="build_number" msgid="3997326631001009102">"Koontiversion numero"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-osoite"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ei saatavilla"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Tila"</string>
     <string name="device_status" msgid="267298179806290920">"Tila"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Tekijänoikeudet"</string>
     <string name="license_title" msgid="936705938435249965">"Käyttölupa"</string>
     <string name="terms_title" msgid="5201471373602628765">"Käyttöehdot"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"WebView-järjestelmälisenssi"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Järjestelmän WebView-lisenssit"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Taustakuvat"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satelliittikuvat:\n© 2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Kolmannen osapuolen lisenssit"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ongelma ladattaessa lisenssejä"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Ladataan…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Enää <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> vaihetta, niin sinusta tulee kehittäjä.</item>
+      <item quantity="one">Enää <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> vaihe, niin sinusta tulee kehittäjä.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Olet nyt kehittäjä."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Ei tarvitse jatkaa, olet jo kehittäjä."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Kehittäjäasetukset"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Palautusvalinnat"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Verkon, sovellusten tai laitteen palautus"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Nollaa verkko"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Tämä nollaa kaikki verkkoasetukset, myös nämä:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobiilidata"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Tyhjennä kaikki ajoneuvon eSIMit"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Tämä ei peruuta palvelupakettiasi."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIMien nollaus epäonnistui"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Valitse verkko"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Nollaa asetukset"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Nollataanko?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Nollataanko kaikki verkkoasetukset? Toimintoa ei voi peruuttaa."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Nollaa asetukset"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Verkkoasetukset on nollattu"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Nollaa sovellusasetukset"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Kaikki seuraavien asetukset nollataan:\n\n"<li>"Käytöstä poistetut sovellukset"</li>\n<li>"Käytöstä poistetut sovellusilmoitukset"</li>\n<li>"Toimintojen oletussovellukset"</li>\n<li>" Sovellusten taustadatan käyttörajoitukset"</li>\n<li>"Käyttöoikeusrajoitukset"</li>\n\n"Et menetä mitään sovellusten dataa."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Nollaa sovellukset"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Sovellusasetukset on nollattu"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Poista data (tehdasasetusten palautus)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Tämä poistaa ajoneuvon pääyksiköstä kaiken datan, esimerkiksi\n\n"<li>"Google-tilisi"</li>\n<li>"järjestelmän ja sovellusten datan ja asetukset"</li>\n<li>"ladatut sovellukset"</li>"."</string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Olet kirjautuneena sisään seuraaville tileille:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Tällä ajoneuvolla on muita paikalla olevia käyttäjiä."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Nollaa ajoneuvo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Nollataanko?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Haluatko poistaa kaikki henkilötiedot ja ladatut sovellukset? Tätä ei voi peruuttaa."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Poista kaikki"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Poistetaan"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Odota…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Päivämäärä ja aika"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Aseta päivämäärä ja aika"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Aseta päivämäärä, aika, aikavyöhyke ja formaatit"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Lajittele aikavyöhykkeen mukaan"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Päivämäärä"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Aika"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Lisää käyttäjä"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Lisää tili"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Poista käyttäjä"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Uusi käyttäjä"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Vieras"</string>
     <string name="user_admin" msgid="1535484812908584809">"Järjestelmänvalvoja"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Järjestelmänvalvoja kirjautuneena"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Kaikki järjestelmänvalvojan käyttöoikeudet"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Muuta järjestelmänvalvojaksi"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Käyttäjä voi poistaa käyttäjiä, mukaan lukien muita järjestelmänvalvojia, ja palauttaa järjestelmän tehdasasetukset."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Tätä toimintoa ei voi kumota."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Kyllä, muuta järjestelmänvalvojaksi"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Uusien käyttäjien luominen"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Puheluiden soittaminen"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Viestit auton mobiilidatalla"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Uusien sovellusten asennus"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Sovellusten poistaminen"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Lisää käyttäjä"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Uusi käyttäjä"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Lisätäänkö uusi käyttäjä?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Kaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Käyttäjäraja saavutettu"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Voit lisätä korkeintaan <xliff:g id="COUNT">%d</xliff:g> käyttäjää.</item>
+      <item quantity="one">Käyttäjiä voi olla vain yksi.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Uuden käyttäjän luominen epäonnistui"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Poistetaanko käyttäjä?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Kaikki sovellukset ja data poistetaan."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Käyttäjän poistaminen epäonnistui."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ohita"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Yritä uudelleen"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Poistetaanko käyttäjä?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Uusi ylläpitäjä luodaan, jos poistat auton ainoan käyttäjän."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Kaikki käyttäjään liittyvä data, asetukset ja sovellukset poistetaan. Järjestelmä on määritettävä uudelleen."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Valitse uusi ylläpitäjä"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Ylläpitäjiä on oltava vähintään yksi. Valitse uusi ylläpitäjä, jotta voit poistaa aiemman."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Valitse ylläpitäjä"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Vieras"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Vieras"</string>
     <string name="user_switch" msgid="6544839750534690781">"Vaihda"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Sinä (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nimi"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ei määritetty"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Käyttäjätunnuksen muokkaus"</string>
     <string name="users_list_title" msgid="770764290290240909">"Käyttäjät"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Käyttöoikeudet myönnetty: %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Tilit"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Käyttäjä"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Lisää tili"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Tilejä ei lisätty"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Tilit: <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Synkronoi data automaattisesti"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Salli sovellusten päivittää dataa automaattisesti"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Autom. synkronointi päälle?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Kaikki tileihisi verkossa tekemäsi muutokset kopioidaan laitteellesi automaattisesti.\n\nJotkin tilit voivat myös automaattisesti kopioida puhelimella tehdyt muutokset verkkoon. Google-tili toimii näin."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Autom. synkronointi pois päältä?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Tämän vähentää datansiirtomäärä, mutta jokainen tili on synkronoitava manuaalisesti, jos haluat niiden viimeisimmät tiedot käyttöösi. Et myöskään saa ilmoituksia, jos tietoja päivitetään."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Tilitiedot"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Lisää tili"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Lisää tili"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Poista tili"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Poistetaanko tili?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Poistamalla tämän tilin poistat kaikki sen viestit, yhteystiedot ja muut tiedot laitteelta."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Järjestelmänvalvoja ei salli tätä muutosta."</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Poistetaanko käyttäjä?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Kaikki sovellukset ja data poistetaan."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Käyttäjän poistaminen epäonnistui."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Uusi yritys?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Hylkää"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Yritä uudelleen"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Lisätäänkö uusi käyttäjä?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Kaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Tilin poistaminen epäonnistui."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Tilin synkronointi"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synkronointi käytössä <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g> kohteella"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synkronointi käytössä kaikilla kohteilla"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synkronointi pois käytöstä kaikilla kohteilla"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synkronointi EI KÄYTÖSSÄ"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Synkronointivirhe"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Viimeksi synkronoitu: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synkronoidaan…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Synkronoi nyt napauttamalla – <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkronoi nyt"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Peruuta synkronointi"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Synkronoinnissa on tällä hetkellä ongelmia. Palvelu palaa pian takaisin käyttöön."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Tietoturva"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Näytön lukitus"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"–"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-koodi"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Salasana"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Valitse lukitustyyppi"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Näytön lukitusvaihtoehdot"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Lukitusasetukset"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Piirrä kuvio"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Vahvista"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Piirrä uudelleen"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Näytön lukituksen valinta"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Valitse PIN-koodi"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Valitse kuvio"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Valitse salasana"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Valitse salasana"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Nykyinen näytön lukitus"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Aseta kuvio tietoturvasyistä"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Tyhjennä"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IT-järjestelmänvalvoja on estänyt yleiset salasanat. Kokeile eri salasanaa."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Nousevat, laskevat tai toistuvat numerosarjat on kielletty."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Näytön lukitusvaihtoehdot"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g> päivää sitten"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Lisää luotettu laite"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Luotetut laitteet"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> laitetta</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> laite</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> avaa auton lukituksen, kun yhteys on muodostettu. Jos <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> päätyy jonkun muun käsiin, kyseinen henkilö voi ehkä käyttää laitetta"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Vahvista"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Poista luotettu laite"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Valmis"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Määritä luotettu laite kumppanisovelluksen avulla. Voit poistaa käyttäjäprofiilisi lukituksen määrityksen jälkeen, kun ajoneuvo on havainnut puhelimen."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Lataa kumppanisovellus puhelimelle"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Muodosta laitepari valitsemalla <xliff:g id="CAR_NAME">%1$s</xliff:g> puhelimella"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ei tunnistanut tämän laitteen suojausominaisuuksia. Autosi suojaamiseksi luotettu laite voi pitää auton lukituksen avoinna vasta avattuasi lukituksen itse. Luotettu laite voi pitää auton lukituksen avoinna ollessaan sen lähellä, vaikka laite olisi jonkun muun käsissä."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Lisää <xliff:g id="DEVICE_NAME">%1$s</xliff:g> luotetuksi laitteeksi"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> lisätty luotetuksi laitteeksi"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Liittyminen epäonnistui: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Kun olet lisännyt luotetun laitteen, sinun on määritettävä todennustapa. Jos luotetut laitteet eivät ole mukanasi, pääset käyttämään profiilia todennustavan avulla."</string>
     <string name="forget" msgid="3971143908183848527">"Unohda"</string>
+    <string name="connect" msgid="5861699594602380150">"Yhdistä"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Katkaise yhteys"</string>
     <string name="delete_button" msgid="5840500432614610850">"Poista"</string>
     <string name="remove_button" msgid="6664656962868194178">"Poista"</string>
     <string name="cancel" msgid="750286395700355455">"Peruuta"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Poistu esittelytilasta"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Tämä poistaa esittelytilin ja palauttaa järjestelmän tehdasasetukset. Kaikki käyttäjätiedot poistetaan."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Sulje esittely"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"viimeistele asennus"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ei nyt"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"OHITA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Ominaisuus ei ole käytettävissä ajon aikana."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Käyttäjää ei voi lisätä ajon aikana."</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 3202415..4d0eddb 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"assombrir l\'écran, écran tactile, pile"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"assombrir l\'écran, nuit, teinte"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Mode Nuit"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Réseau et Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Réseau cellulaire"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Données mobiles"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accéder aux données sur réseau cellulaire"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Désactiver les données mobiles?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Utilisation de données"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Avertissement et limites de données"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cycle d\'util. données d\'appli."</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Définir avertiss. de données"</string>
+    <string name="data_warning" msgid="116776633806885370">"Avertiss. utilisation données"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Définir. lim. d\'util. données"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limite de données"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitation de l\'util. de données mobiles"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"L\'unité principale de votre véhicule désactivera les données mobiles lorsque la limite que vous définissez sera atteinte.\n\nComme c\'est l\'unité principale qui mesure l\'utilisation de données, et que votre fournisseur de services peut utiliser un système de mesure différent, nous vous conseillons de faire preuve de prudence en définissant votre limite."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configurer et gérer les points d\'accès sans fil"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Activation du Wi-Fi en cours…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Désactivation du Wi-Fi en cours…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Chargement de la liste de connexions Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi désactivé"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Impossible de supprimer le réseau"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Échec de la connexion au réseau"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Ajouter un réseau"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi désactivé"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Associer"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Mot de passe"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Afficher le mot de passe"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nom du réseau"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Entrer le SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sécurité"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Force du signal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Force du signal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"État"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Vitesse de connexion"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Fréquence"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Adresse IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Afficher le mot de passe"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Entrez le nom du réseau"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Entrez le mot de passe"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Faible"</item>
-    <item msgid="2032262610626057081">"Passable"</item>
-    <item msgid="3859756017461098953">"Bonne"</item>
-    <item msgid="1521103743353335724">"Excellente"</item>
+    <item msgid="7683058295076342057">"Faible"</item>
+    <item msgid="1639222824821660744">"Passable"</item>
+    <item msgid="1838705897358163300">"Bonne"</item>
+    <item msgid="6067166649320533751">"Excellente"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Activer le Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth désactivé"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Détails du réseau"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adresse MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Adresse IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Masque de sous-réseau"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adresses IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Passerelle"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Préférences Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Activer le Wi-Fi automatiquement"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Connex. auto. aux réseaux haute qualité enregistrés (ex. à la maison)"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Indisponible (service désactivé). Activez la "<annotation id="link">"localisation"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Voulez-vous activer la recherche de réseaux Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Activer"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"La recherche de réseaux Wi-Fi est activée"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Passer automatiquement au réseau cellulaire"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Utiliser le réseau de données cellulaires lorsque le réseau Wi-Fi n\'a pas accès à Internet. Des frais de transmission de données peuvent s\'appliquer."</string>
+    <string name="learn_more" msgid="8214605928933358604">"En savoir plus"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Gérer les connexions, configurer le nom et l\'identification de l\'appareil"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Ordinateur"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Écouteurs"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Téléphone"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imagerie"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Écouteurs"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Périphérique d\'entrée"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Appareils associés"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Appareils détectés"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Aucun appareil associé"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Aucun appareil à proximité"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Appareil associé"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nom"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Utiliser pour"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Changez le nom de l\'appareil Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Appareil sans nom"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Appareils associés"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Associer un autre appareil"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Le Bluetooth s\'activera pour l\'association"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Voulez-vous déconnecter l\'appareil?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Votre véhicule se déconnectera de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adresse Bluetooth du véhicule : <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adresse Bluetooth de l\'appareil : <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nom du véhicule"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Renommer ce véhicule"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Renommer l\'appareil"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Renommer"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Appareils détectés"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profils"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Demande d\'association Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Associer et connecter"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Code d\'association Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Le NIP contient des lettres ou des symboles"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Entrez le code d\'association, puis appuyez sur Retour ou Entrée"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Habituellement 0000 ou 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Demande d\'association"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Touchez pour associer à <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Langues"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Langues et modes d\'entrée"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Clavier"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Gérer les claviers"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Sortie de synthèse vocale"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Moteur préféré"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Moteur actuel"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Vitesse de la voix"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Ton"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Réinitialiser"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Son"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume de la sonnerie"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume de navigation"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Médias"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Régler le volume pour la musique et les vidéos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarme"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Sonnerie du téléphone"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Son de notification par défaut"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Son d\'alarme par défaut"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Applications et notifications"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Afficher toutes les applications"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Applications par défaut"</string>
     <string name="applications_settings" msgid="794261395191035632">"Détails de l\'application"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forcer l\'arrêt"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Voulez-vous forcer l\'arrêt?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"L\'arrêt forcé d\'une application peut provoquer un fonctionnement instable."</string>
     <string name="disable_text" msgid="4358165448648990820">"Désactiver"</string>
     <string name="enable_text" msgid="1794971777861881238">"Activer"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Désinstaller"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Si vous désactivez cette application, Android et d\'autres applications risquent de ne plus fonctionner correctement."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Désactiver l\'application"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Autorisations"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version : %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Aucune autorisation accordée"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Aucune autorisation demandée"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Utilisation des données"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Util. données applications"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forcer l\'arrêt"</string>
     <string name="computing_size" msgid="5791407621793083965">"Traitement en cours…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisation supplémentaire</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations supplémentaires</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistance et entrée vocale"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Application d\'assistance"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Utiliser le texte affiché à l\'écran"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Autoriser l\'application d\'assistance à accéder aux contenus affichés à l\'écran sous forme de texte"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Utiliser la capture d\'écran"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Autoriser l\'application d\'assistance à accéder à une image affichée à l\'écran"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Service de remplissage automatique"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Aucun"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Sélectionnée"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"L\'Assistant Google pourra accéder aux données des applications en cours d\'utilisation sur votre système, y compris les données visibles à l\'écran ou accessibles au sein des applications."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Assurez-vous de faire confiance à cette application&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Le remplissage automatique de Google&gt;%1$s&lt;/xliff:g&gt; utilise les éléments affichés à l\'écran pour déterminer les champs qui peuvent bénéficier de l\'entrée automatique."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Ajouter un service"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lieu"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Récentes demandes de localisation"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Aucune demande de localisation récente"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorisations à l\'échelle des applications"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Recherche"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Services de localisation"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Recherche de réseaux Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Autorisez les applications et les services à rechercher les réseaux Wi-Fi en tout temps, même lorsque le Wi-Fi est désactivé. Cette option peut, par exemple, être utilisée pour améliorer les fonctionnalités et les services qui utilisent la localisation."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Recherche d\'appareils Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Autorisez les applications et les services à rechercher les appareils à proximité en tout temps, même lorsque le Bluetooth est désactivé. Cette option peut, par exemple, être utilisée pour améliorer les fonctionnalités et les services qui utilisent la localisation."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Système"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Mises à jour système"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Mises à jour système"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Version d\'Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Niveau du correctif de sécurité Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modèle"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Version de bande de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Version du noyau"</string>
     <string name="build_number" msgid="3997326631001009102">"Numéro de version"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adresse Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Indisponible"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"État"</string>
     <string name="device_status" msgid="267298179806290920">"État"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Droits d\'auteur"</string>
     <string name="license_title" msgid="936705938435249965">"Licence"</string>
     <string name="terms_title" msgid="5201471373602628765">"Conditions d\'utilisation"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licence WebView du système"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licences système WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fonds d\'écran"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fournisseurs d\'images satellites :\n© 2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licences tierces"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Problème lors du chargement des licences."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Chargement en cours…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étape pour devenir un concepteur.</item>
+      <item quantity="other">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étapes pour devenir un concepteur.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Vous êtes désormais un concepteur!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Inutile, vous êtes déjà un concepteur."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Options pour concepteurs"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Options de réinitialisation"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Réseau, applications ou réinitialisation de l\'appareil"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Réinitialiser le réseau"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Cette opération réinitialisera tous les paramètres réseau, y compris les suivants :"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Données cellulaires"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Effacer toutes les cartes eSIM du véhicule"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Cette action n\'annulera pas votre forfait."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Impossible de réinitialiser les cartes eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Sélectionner un réseau"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Réinitialiser les paramètres"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Réinitialiser?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Réinitialiser tous les paramètres réseau? Cette action est irréversible."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Réinitialiser les paramètres"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Les paramètres réseau ont été réinitialisés"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Réinitial. préférences des applications"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Cette opération réinitialise toutes les préférences relatives aux éléments suivants :\n\n"<li>"Applications désactivées"</li>\n<li>"Notifications associées aux applications désactivées"</li>\n<li>"Applications par défaut pour les actions"</li>\n<li>"Restrictions de données en arrière-plan pour les applications"</li>\n<li>"Toutes les restrictions d\'autorisations"</li>\n\n"Vous ne perdrez aucune donnée liée aux applications."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Réinitialiser les applications"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Les préférences des applications ont été réinitialisées"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Effacer toutes les données (réinitial.)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Cette action effacera toutes les données de l\'unité principale de votre véhicule, y compris :\n\n"<li>"Votre compte Google"</li>\n<li>"Les données et les paramètres du système et de l\'application"</li>\n<li>"Les applications téléchargées"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Vous êtes actuellement connecté aux comptes suivants :"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"D\'autres personnes utilisent ce véhicule."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Réinitialiser le véhicule"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Effectuez la réinitialisation?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Voulez-vous effacer toutes vos données personnelles et les applications que vous avez téléchargées? Cette action est irréversible!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Tout effacer"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Suppression en cours…"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Veuillez patienter…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Date et heure"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Régler la date et l\'heure"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Configurer la date, l\'heure, le fuseau horaire et les formats"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Trier par fuseau horaire"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Date"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Heure"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Ajouter un utilisateur"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Ajouter un compte"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Supprimer l\'utilisateur"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nouvel utilisateur"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Invité"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrateur"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Connecté comme administrateur"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Toutes les autorisations d\'administrateur"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Rendre administrateur"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"L\'utilisateur pourra supprimer des utilisateurs, y compris d\'autres administrateurs, et réinitialiser le système."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Cette action ne peut pas être annulée."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Oui, rendre administrateur"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Créer des utilisateurs"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Faire des appels téléphoniques"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mess. avec connex. donn. de voiture"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Installer des applications"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Désinstaller des applications"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Ajouter un utilisateur"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nouvel utilisateur"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Ajouter un utilisateur?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Tout utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Limite d\'utilisateurs atteinte"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> utilisateur.</item>
+      <item quantity="other">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> utilisateurs.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Impossible de créer un utilisateur"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Supprimer cet utilisateur?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"L\'ensemble des applications et des données seront supprimées."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Impossible de supprimer l\'utilisateur."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Fermer"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Réessayer"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Suppr. dernier utilisateur?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Après avoir supprimé le seul utilisateur restant pour cette voiture, un nouvel utilisateur administrateur sera créé."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Tous les paramètres, les données et les applications associés à cet utilisateur seront supprimés. Vous devrez configurer le système à nouveau."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Choisissez un nouvel administrateur"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Vous avez besoin d\'au moins un administrateur. Pour supprimer celui-ci, choisissez d\'abord un remplacement."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Choisir un administrateur"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Invité"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Invité"</string>
     <string name="user_switch" msgid="6544839750534690781">"Changer"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vous (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nom"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Non configuré"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Modifier le nom d\'utilisateur"</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilisateurs"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Autorisations accordées à %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Comptes"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Utilisateur"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Ajouter un compte"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Aucun compte ajouté"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Comptes pour <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Synchronisation automatique des données"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Autoriser applications à actualiser données automatiquement"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Activer synchro auto données?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Les modifications que vous apportez à vos comptes sur le Web seront automatiquement copiées sur votre appareil.\n\nCertains comptes peuvent également copier automatiquement sur le Web toutes les modifications que vous effectuez sur le téléphone. C\'est le cas des comptes Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Désactiver synchro auto données?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Cette action limite la consommation de données, mais vous devrez synchroniser manuellement chaque compte pour effectuer la collecte de renseignements récents. Vous ne recevrez en outre aucune notification lors des mises à jour."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Renseignements sur le compte"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Ajouter un compte"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Ajouter un compte"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Supprimer le compte"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Supprimer le compte?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"La suppression de ce compte entraînera la suppression de tous les messages, les contacts et les autres données de l\'appareil."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Cette modification n\'est pas autorisée par votre administrateur"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Supprimer cet utilisateur?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"L\'ensemble des applications et des données seront supprimées."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Échec de la suppression de l\'utilisateur."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Réessayer?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Fermer"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Réessayer"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Ajouter un utilisateur?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Tout utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Impossible de supprimer le compte."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Synchronisation du compte"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"La synchronisation est activée pour <xliff:g id="ID_1">%1$d</xliff:g> éléments sur <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"La synchronisation est activée pour tous les éléments"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"La synchronisation est désactivée pour tous les éléments"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synchronisation désactivée"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Erreur de synchronisation"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Dernière synchronisation : <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synchronisation en cours…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Touchez ici pour lancer la synchronisation<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchroniser maintenant"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annuler la synchronisation"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"La synchronisation rencontre actuellement des problèmes. Elle sera rétablie sous peu."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sécurité"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Verrouill. de l\'écran"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Aucun"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"NIP"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Mot de passe"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Choisissez un type de verrouillage"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Options de verrouillage de l\'écran"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Options de verrouillage"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Entrez votre schéma"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmer"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redessiner"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Configurer le verrouillage de l\'écran"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Choisissez votre NIP"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Choisissez votre schéma"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Choisissez votre mot de passe"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Choisissez votre mot de passe"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Verrouillage actuel de l\'écran"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Pour votre sécurité, déf. un sch. de verr."</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Effacer"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Les mots de passe communs sont bloqués par l\'administrateur de votre service informatique. Essayez un mot de passe différent."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Les suites croissantes, décroissantes ou répétitives de chiffres ne sont pas autorisées."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Options de verrouillage de l\'écran"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : il y a <xliff:g id="NUM_DAYS">%3$s</xliff:g> jours"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Ajouter un appareil de confiance"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Appareils fiables"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> appareil</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> appareils</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Votre <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> déverrouillera votre voiture lorsqu\'il sera connecté. Si une personne prend votre <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, elle pourrait être en mesure d\'accéder à cet appareil."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmer"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Supprimer l\'appareil de confiance"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"OK"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Utilisez l\'application compagnon pour configurer un appareil de confiance. Une fois la configuration terminée et que votre téléphone est détecté par le véhicule, vous pourrez déverrouiller votre profil utilisateur"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Téléchargez l\'application compagnon sur votre téléphone"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Sélectionnez <xliff:g id="CAR_NAME">%1$s</xliff:g> sur votre téléphone pour associer les appareils"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ne peut détecter aucune fonctionnalité de sécurité sur cet appareil. Dans le but de protéger votre voiture, l\'appareil de confiance ne pourra la garder déverrouillée que lorsque vous l\'aurez déverrouillé vous-même au préalable. Votre appareil de confiance peut garder votre voiture déverrouillée lorsqu\'elle se trouve à proximité, même si une autre personne le tient dans sa main."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Ajouter <xliff:g id="DEVICE_NAME">%1$s</xliff:g>comme appareil de confiance"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"L\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g> a bien été ajouté comme appareil de confiance"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Échec de l\'inscription de l\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"L\'ajout d\'un appareil de confiance nécessite ensuite la configuration d\'une méthode d\'authentification. Si vous n\'avez pas votre appareil de confiance avec vous, un processus d\'authentification sera nécessaire pour accéder à votre profil."</string>
     <string name="forget" msgid="3971143908183848527">"Oublier"</string>
+    <string name="connect" msgid="5861699594602380150">"Connexion"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Déconnexion"</string>
     <string name="delete_button" msgid="5840500432614610850">"Supprimer"</string>
     <string name="remove_button" msgid="6664656962868194178">"Supprimer"</string>
     <string name="cancel" msgid="750286395700355455">"Annuler"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Quitter le mode démo"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Cette action supprimera le compte de démonstration et réinitialisera le système. Toutes les données de l\'utilisateur seront perdues."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Quitter le mode démo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"terminer la configuration"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"pas maintenant"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"IGNORER"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Cette fonction n\'est pas accessible durant la conduite."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Impossible d\'ajouter un utilisateur pendant la conduite."</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index f315f4e..18c25bf 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"assombrir l\'écran, écran tactile, batterie"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"assombrir l\'écran, nuit, coloration"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Mode Nuit"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Réseau et Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Réseau mobile"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Données mobiles"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accéder aux données via le réseau mobile"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Désactiver les données mobiles ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Consommation des données"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Avertissement et limite pour les données"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cycle de consommation des données"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Définir une alerte données"</string>
+    <string name="data_warning" msgid="116776633806885370">"Avertissement de conso données"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Définir la limite des données"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limite de données"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitation de la consommation de données mobiles"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Les données mobiles sont désactivées par l\'unité principale du véhicule lorsque la limite de consommation des données que vous avez définie est atteinte.\n\nLa consommation mesurée par l\'unité principale pouvant différer de celle mesurée par votre opérateur, nous vous recommandons de définir une limite stricte."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configurer et gérer les points d\'accès sans fil"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Activation du Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Désactivation du Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Chargement de la liste Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi désactivé"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Échec de la suppression du réseau"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Échec de la connexion au réseau"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Ajouter un réseau"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi désactivé"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Connexion"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Mot de passe"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Afficher le mot de passe"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nom du réseau"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Saisissez le SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sécurité"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Intensité du signal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Intensité du signal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"État"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Vitesse de la connexion"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Fréquence"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Adresse IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Afficher le mot de passe"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Saisissez le nom du réseau"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Saisissez le mot de passe"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"légende_balise_point_accès"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Faible"</item>
-    <item msgid="2032262610626057081">"Satisfaisante"</item>
-    <item msgid="3859756017461098953">"Bonne"</item>
-    <item msgid="1521103743353335724">"Excellente"</item>
+    <item msgid="7683058295076342057">"Faible"</item>
+    <item msgid="1639222824821660744">"Satisfaisante"</item>
+    <item msgid="1838705897358163300">"Bonne"</item>
+    <item msgid="6067166649320533751">"Excellente"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Activer le Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth désactivé"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbit/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Détails du réseau"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adresse MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Adresse IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Masque de sous-réseau"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adresses IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Passerelle"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Préférences Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Activation automatique du Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Réactiver Wi‑Fi près réseaux haute qualité déjà enregistrés, comme réseau domestique"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Indisponible, car "<annotation id="link">"localisation"</annotation>" désactivée. Activez-la."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Activer la recherche de réseaux Wi-Fi ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Activer"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Recherche Wi-Fi activée"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Se connecter automatiquement au réseau de données mobiles"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Les données mobiles sont utilisées si vous n\'avez pas accès à Internet via le réseau Wi‑Fi. Des frais liés à la consommation des données peuvent s\'appliquer."</string>
+    <string name="learn_more" msgid="8214605928933358604">"En savoir plus"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Gérer les connexions, et configurer le nom et la visibilité de l\'appareil"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Ordinateur"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Casque"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Téléphone"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imagerie"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Casque audio"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Périphérique d\'entrée"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Appareils associés"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Appareils disponibles"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Aucun appareil associé"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Aucun appareil disponible"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Appareil associé"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nom"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Utiliser pour"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Changez nom de l\'appareil Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Appareil sans nom"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Appareils associés"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Associer un nouvel appareil"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Le Bluetooth sera activé pour permettre l\'association"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Déconnecter l\'appareil ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Votre véhicule va se déconnecter de \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adresse Bluetooth du véhicule : <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adresse Bluetooth de l\'appareil : <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nom du véhicule"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Renommer ce véhicule"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Renommer l\'appareil"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Renommer"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Appareils disponibles"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profils"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Demande d\'association Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Associer et connecter"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Code d\'association Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Le code contient des lettres ou des symboles"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Saisissez le code d\'association, puis appuyez sur \"Retour\" ou \"Entrée\""</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Habituellement 0000 ou 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Demande d\'association"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Appuyez pour associer l\'appareil à \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Langues"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Langues et saisie"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Clavier"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Gérer les claviers"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Synthèse vocale"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Moteur préféré"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Moteur actuel"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Cadence"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Ton"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Réinitialiser"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Son"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume de la sonnerie"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume de la navigation"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Médias"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Régler le volume pour la musique et les vidéos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarme"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Sonnerie du téléphone"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Son de notification par défaut"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Son de l\'alarme par défaut"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Applications et notifications"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Afficher toutes les applications"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Applications par défaut"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informations sur les applications"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forcer l\'arrêt"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Forcer l\'arrêt ?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"L\'arrêt forcé d\'une application peut provoquer un fonctionnement instable."</string>
     <string name="disable_text" msgid="4358165448648990820">"Désactiver"</string>
     <string name="enable_text" msgid="1794971777861881238">"Activer"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Désinstaller"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Si vous désactivez cette application, il est possible qu\'Android et d\'autres applications ne fonctionnent plus comme prévu."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Désactiver l\'application"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Autorisations"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Aucune autorisation accordée"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Aucune autorisation demandée"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Consommation des données"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Conso des données applis"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forcer l\'arrêt"</string>
     <string name="computing_size" msgid="5791407621793083965">"Calcul…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> autorisation supplémentaire</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorisations supplémentaires</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistance et saisie vocale"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Application d\'assistance"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Utiliser le texte affiché à l\'écran"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Autoriser l\'application d\'assistance à accéder au contenu affiché à l\'écran sous forme de texte"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Utiliser une capture d\'écran"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Autoriser l\'application d\'assistance à accéder au contenu affiché à l\'écran sous forme d\'image"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Service de saisie automatique"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Aucune"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Sélectionnée"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"L\'Assistant pourra accéder aux informations relatives aux applications en cours d\'utilisation sur votre système, y compris aux informations visibles à l\'écran ou accessibles dans les applications."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Assurez-vous de faire confiance à cette application&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; utilise les éléments affichés à l\'écran pour déterminer les champs qui peuvent bénéficier de la saisie automatique."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Ajouter un service"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Position"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Demandes de localisation récentes"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Aucune demande de localisation récente"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorisations de l\'application"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Recherche"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Services de localisation"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Recherche Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Autoriser les applications et les services à rechercher des réseaux Wi-Fi à tout moment, même si le Wi-Fi est désactivé. Cette autorisation peut permettre, par ex., d\'améliorer les fonctionnalités et les services basés sur la localisation."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Recherche Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Autoriser les applications et les services à rechercher des appareils à proximité à tout moment, même si le Bluetooth est désactivé. Cette autorisation peut, par ex., améliorer les fonctionnalités et les services basés sur la localisation."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Système"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Mises à jour du système"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Mises à jour du système"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Version d\'Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Mise à jour du correctif de sécurité Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modèle"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Version de la bande de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Version du noyau"</string>
     <string name="build_number" msgid="3997326631001009102">"Numéro de build"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adresse Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Indisponible"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"État"</string>
     <string name="device_status" msgid="267298179806290920">"État"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licence"</string>
     <string name="terms_title" msgid="5201471373602628765">"Conditions d\'utilisation"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licence WebView du système"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licences système WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fonds d\'écran"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fournisseurs d\'images satellite :\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licences tierces"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Problème lors du chargement des licences."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Chargement…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étape pour devenir un développeur.</item>
+      <item quantity="other">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étapes pour devenir un développeur.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Vous êtes désormais un développeur !"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Inutile, vous êtes déjà développeur."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Options pour développeurs"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Options de réinitialisation"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Réinitialisation du réseau, des applications ou de l\'appareil"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Réinitialiser le réseau"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Cette action réinitialisera tous les paramètres réseau, y compris les suivants :"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Données mobiles"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Effacer toutes les cartes eSIM du véhicule"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Cela n\'entraînera pas la résiliation de votre forfait."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Impossible de réinitialiser les cartes eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Sélectionner un réseau"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Réinitialiser paramètres"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Réinitialiser ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Réinitialiser tous les paramètres réseau ? Cette action est irréversible."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Réinitialiser paramètres"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Les paramètres réseau ont bien été réinitialisés"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Réinitialiser les préférences des applis"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Toutes les préférences relatives aux éléments suivants seront réinitialisées :\n\n"<li>"Applications désactivées"</li>\n<li>"Notifications associées aux applications désactivées"</li>\n<li>"Applications par défaut pour les actions"</li>\n<li>"Restrictions de données en arrière-plan pour les applications"</li>\n<li>"Toutes les restrictions d\'autorisations"</li>\n\n"Vous ne perdrez aucune donnée liée aux applications."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Réinitialiser les applications"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Les préférences relatives aux applications ont été réinitialisées"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Effacer données (rétablir config. d\'usine)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Cette action effacera toutes les données de l\'unité principale du véhicule, y compris :\n\n"<li>"Votre compte Google"</li>\n<li>"Les données et paramètres du système et des applications"</li>\n<li>"Les applications téléchargées"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Vous êtes actuellement connecté aux comptes suivants :"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"D\'autres personnes utilisent ce véhicule."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Réinitialiser le véhicule"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Réinitialiser ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Effacer toutes vos informations personnelles et les applications téléchargées ? Cette action est irréversible."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Tout effacer"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Suppression en cours"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Veuillez patienter..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Date et heure"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Définir la date et l\'heure"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Configurer la date, l\'heure, le fuseau horaire et les formats"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Trier par fuseau horaire"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Date"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Heure"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Ajouter un utilisateur"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Ajouter un compte"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Supprimer un compte utilisateur"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nouvel utilisateur"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Invité"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrateur"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Connecté en tant qu\'administrateur"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Tous les droits d\'administrateur"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Changer en administrateur"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"L\'utilisateur pourra supprimer des profils utilisateur, y compris ceux d\'autres administrateurs, et rétablir la configuration d\'usine du système."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Cette action est irréversible."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Oui, changer en administrateur"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Créer des utilisateurs"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Passer des appels"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Envoyer des SMS via les données mobiles du véhicule"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Installer des applications"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Désinstaller des applications"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Ajouter un utilisateur"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nouvel utilisateur"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Ajouter un utilisateur ?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"N\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Limite nombre utilisateurs atteinte"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> profil utilisateur.</item>
+      <item quantity="other">Vous pouvez créer jusqu\'à <xliff:g id="COUNT">%d</xliff:g> profils utilisateur.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Échec de création profil utilisateur"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Supprimer l\'utilisateur ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Toutes les applications et les données seront supprimées."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Échec de la suppression de l\'utilisateur."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignorer"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Réessayer"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Suppr. dernier utilis. ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Après la suppression du seul utilisateur restant pour cette voiture, un nouveau profil d\'administrateur sera créé."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Tous les paramètres, données et applications associés à cet utilisateur seront supprimés. Vous devrez configurer à nouveau le système."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Sélectionner un nouvel administrateur"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Vous devez disposer d\'au moins un administrateur. Pour supprimer ce profil, choisissez d\'abord un autre administrateur."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Sélect. administrateur"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Invité"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Invité"</string>
     <string name="user_switch" msgid="6544839750534690781">"Changer"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vous (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nom"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Non configuré"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Modifier le nom d\'utilisateur"</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilisateurs"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Autorisations accordées à %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Comptes"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Utilisateur"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Ajouter un compte"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Aucun compte ajouté"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Comptes de <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Synchronisation automatique des données"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Autoriser applis à actualiser les données automatiquement"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Activer synchro auto données ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Les modifications que vous apportez à vos comptes sur le Web sont automatiquement copiées sur votre appareil.\n\nCertains comptes permettent également de copier automatiquement sur le Web toutes les modifications que vous effectuez sur le téléphone. C\'est le cas des comptes Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Désactiver synchro auto données ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Cette action limite la consommation des données, mais vous devrez synchroniser manuellement chaque compte pour obtenir les dernières informations. Vous ne recevrez pas non plus de notifications en cas de mise à jour."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Infos sur le compte"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Ajouter un compte"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Ajouter un compte"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Supprimer le compte"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Supprimer le compte ?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"La suppression de ce compte entraînera la suppression de tous les messages, contacts et autres données de l\'appareil."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Votre administrateur n\'autorise pas cette modification"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Supprimer l\'utilisateur ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"L\'ensemble des applications et des données seront supprimées."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Échec de la suppression de l\'utilisateur."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Réessayer ?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ignorer"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Réessayer"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Ajouter un utilisateur ?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"N\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Échec de la suppression du compte."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Synchronisation du compte"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synchronisation activée pour <xliff:g id="ID_1">%1$d</xliff:g> élément(s) sur <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synchronisation activée pour tous les éléments"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synchronisation désactivée pour tous les éléments"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synchronisation DÉSACTIVÉE"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Erreur de synchronisation"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Dernière synchronisation : <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synchronisation…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Appuyer pour synchroniser maintenant<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchroniser"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annuler la synchronisation"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"La synchronisation rencontre des problèmes et sera bientôt rétablie."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sécurité"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Verrouillage d\'écran"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Aucun"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Code"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Mot de passe"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Choisir verrouillage"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Options de verrouillage de l\'écran"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Options verrouillage"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Tracez le schéma"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmer"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redessiner"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Configurer le verrouillage de l\'écran"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Sélectionner un code"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Choisir votre schéma"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Sélectionner un mot de passe"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Sélectionner un mot de passe"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Verrouillage de l\'écran actuel"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Pour la sécurité, définissez un schéma"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Effacer"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Les mots de passe courants sont bloqués par votre administrateur informatique. Choisissez un autre mot de passe."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Les suites de chiffres croissantes, décroissantes ou répétitives ne sont pas autorisées."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Options de verrouillage de l\'écran"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : il y a <xliff:g id="NUM_DAYS">%3$s</xliff:g> jours"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Ajouter un appareil vérifié"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Appareils vérifiés"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> appareil</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> appareils</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Votre <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> déverrouille cette voiture lorsqu\'il y est connecté. Si une personne saisit votre <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, il est possible qu\'elle puisse accéder à cet appareil"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmer"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Supprimer l\'appareil vérifié"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"OK"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Utilisez l\'application associée pour configurer un appareil vérifié. Une fois cette opération effectuée, vous pourrez déverrouiller votre profil utilisateur lorsque votre téléphone sera détecté par le véhicule"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Téléchargez l\'application associée sur votre téléphone"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Sélectionnez <xliff:g id="CAR_NAME">%1$s</xliff:g> sur votre téléphone pour associer les appareils"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ne parvient pas à détecter les fonctionnalités de sécurité de cet appareil. Dans le but de protéger votre voiture, l\'appareil vérifié ne pourra la maintenir déverrouillée que lorsque vous l\'aurez déjà vous-même déverrouillée. Votre appareil vérifié peut maintenir la voiture déverrouillée lorsqu\'elle se trouve à proximité, même si une autre personne le tient dans sa main."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Ajouter <xliff:g id="DEVICE_NAME">%1$s</xliff:g> comme appareil vérifié"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"L\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g> a bien été ajouté en tant qu\'appareil vérifié"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Échec de l\'inscription de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Pour ajouter un appareil vérifié, vous devez définir une méthode d\'authentification à l\'étape suivante. Si vous n\'avez pas votre appareil vérifié avec vous, vous devrez obligatoirement passer par l\'étape d\'authentification pour accéder à votre profil."</string>
     <string name="forget" msgid="3971143908183848527">"Supprimer"</string>
+    <string name="connect" msgid="5861699594602380150">"Connecter"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Déconnecter"</string>
     <string name="delete_button" msgid="5840500432614610850">"Supprimer"</string>
     <string name="remove_button" msgid="6664656962868194178">"Supprimer"</string>
     <string name="cancel" msgid="750286395700355455">"Annuler"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Quitter le mode de démo"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Le compte de démonstration sera supprimé et la configuration d\'usine du système sera rétablie. Toutes les données utilisateur seront perdues."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Quitter la démo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"terminer la configuration"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"pas maintenant"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"IGNORER"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Fonctionnalité non disponible lorsque vous conduisez."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Impossible d\'ajouter un utilisateur pendant la conduite."</string>
 </resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index e374aaa..f5a4a27 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"atenuar pantalla, pantalla táctil, batería"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"atenuar pantalla, noite, ton"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modo nocturno"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Rede e Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Rede de telefonía móbil"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Datos móbiles"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acceder aos datos cunha rede de telefonía móbil"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Queres desactivar os datos móbiles?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Uso de datos"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Aviso e límite de uso de datos"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de datos das aplicacións"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Definir aviso de uso de datos"</string>
+    <string name="data_warning" msgid="116776633806885370">"Aviso de uso de datos"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Definir límite de uso de datos"</string>
+    <string name="data_limit" msgid="227338836292511425">"Límite de uso de datos"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitar o uso de datos"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Desactivaranse os datos móbiles na unidade principal do vehículo unha vez que se acade o límite que estableceses.\n\nPosto que a unidade principal mide o uso de datos e que posiblemente o teu operador contabilice o uso de forma diferente, considera a posibilidade de configurar un límite conservador."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wifi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configura e xestiona puntos de acceso sen fíos"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Activando a wifi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Desactivando a wifi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Cargando lista de wifi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"A wifi está desactivada"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Produciuse un erro ao esquecer a rede"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Produciuse un erro ao conectar coa rede"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Engadir rede"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"A wifi está desactivada"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Contrasinal"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Mostrar contrasinal"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nome da rede"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Introduce o SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Seguranza"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Intensidade do sinal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Intensidade do sinal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Estado"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Velocidade de vinculación"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frecuencia"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Enderezo IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Mostrar contrasinal"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Introduce o nome da rede"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Introduce o contrasinal"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Baixa"</item>
-    <item msgid="2032262610626057081">"Aceptable"</item>
-    <item msgid="3859756017461098953">"Boa"</item>
-    <item msgid="1521103743353335724">"Excelente"</item>
+    <item msgid="7683058295076342057">"Baixa"</item>
+    <item msgid="1639222824821660744">"Aceptable"</item>
+    <item msgid="1838705897358163300">"Boa"</item>
+    <item msgid="6067166649320533751">"Excelente"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Activar Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Desactivouse o Bluetooth"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalles da rede"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Enderezo MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Enderezo IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Máscara de subrede"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Enderezos IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Pasarela"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferencias da Wifi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Activar a wifi automaticamente"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wifi activada preto de redes de alta calidade gardadas, como a rede doméstica"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Non-dispoñible ao estar a localización desactivada. "<annotation id="link">"Actívaa"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Queres activar a busca de redes wifi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Activar"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Activouse a busca de redes wifi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Cambiar aos datos móbiles automaticamente"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Utiliza datos móbiles cando a Wifi non ten acceso a Internet. É posible que se apliquen cargos polo uso de datos."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Máis información"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Xestiona as conexións e ademais define o nome e a detectabilidade do dispositivo"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Ordenador"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Auriculares"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Teléfono"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Dispositivo de imaxe"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Auriculares"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periférico de entrada"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispositivos sincronizados"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispositivos dispoñibles"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Non hai dispositivos sincronizados"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Non hai dispositivos dispoñibles"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispositivo sincronizado"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nome"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Usar para"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Cambia o nome do dispositivo Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispositivo sen nome"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispositivos vinculados"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Vincular dispositivo novo"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Activarase o Bluetooth para realizar a vinculación"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Desconectar dispositivo?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"O teu vehículo desconectarase do dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Enderezo Bluetooth do vehículo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Enderezo Bluetooth do dispositivo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nome do vehículo"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Cambiar o nome deste vehículo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Cambiar o nome do dispositivo"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Cambiar nome"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispositivos dispoñibles"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Perfís"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Solicitude de sincronización por Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Sincronizar e conectar"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Código de sincronización por Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"O PIN contén letras ou símbolos"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Escribe o código de sincronización e, a continuación, preme Intro"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Normalmente 0000 ou 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Solicitude de sincronización"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Toca para sincronizar con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e introdución de texto"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Xestionar teclados"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Saída da síntese de voz"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motor preferido"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motor actual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Velocidade da fala"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Ton"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Restablecer"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Son"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume do timbre"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume de navegación"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Contido multimedia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Define o volume da música e dos vídeos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarma"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ton de chamada do teléfono"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Son de notificación predeterm."</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Son de alarma predeterminado"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplicacións e notificacións"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Mostrar todas as aplicacións"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplicacións predeterminadas"</string>
     <string name="applications_settings" msgid="794261395191035632">"Información da aplicación"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forzar parada"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Queres forzar a parada?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Se forzas a parada dunha aplicación, é posible que non funcione correctamente."</string>
     <string name="disable_text" msgid="4358165448648990820">"Desactivar"</string>
     <string name="enable_text" msgid="1794971777861881238">"Activar"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Se desactivas esta aplicación, é posible que Android e outras aplicacións deixen de funcionar segundo o previsto."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Desactivar aplicación"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permisos"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versión %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Non se outorgou ningún permiso"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Non se solicitou ningún permiso"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de datos"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de datos da aplicación"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forzar parada"</string>
     <string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permisos adicionais</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permiso adicional</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistente e entrada de voz"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplicación de asistencia"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Usar o texto da pantalla"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Permite que a aplicación de asistencia acceda aos contidos da pantalla en forma de texto"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Usar a captura de pantalla"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Permite que a aplicación de asistencia acceda ás imaxes presentes na pantalla"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Servizo de autocompletar"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ningunha aplicación"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Aplicación seleccionada"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"O asistente poderá ler información sobre as aplicacións en uso no teu sistema, incluídos os datos visibles na túa pantalla ou aos que se pode acceder desde as aplicacións."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Asegúrate de que confías nesta aplicación&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Autocompletar de Google&gt;%1$s&lt;/xliff:g&gt; utiliza o contido da pantalla para determinar o que se pode completar."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Engadir servizo"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Localización"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitudes de localización recentes"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Non hai solicitudes de localización recentes"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisos para as aplicacións"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Busca de localizacións"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Servizos de localización"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Busca de redes wifi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Permite ás aplicacións e aos servizos buscar redes wifi en calquera momento, mesmo cando a wifi está desactivada. Esta opción pode utilizarse, por exemplo, para mellorar as funcións e os servizos baseados na localización."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Busca de dispositivos Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Permite ás aplicacións e aos servizos buscar dispositivos próximos en calquera momento, mesmo cando o Bluetooth está desactivado. Esta opción pode utilizarse, por exemplo, para mellorar as funcións e os servizos baseados na localización."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Actualizacións do sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizacións do sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versión de Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivel de parche de seguranza de Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versión de banda base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versión de kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilación"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Enderezo de Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Non dispoñible"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Estado"</string>
     <string name="device_status" msgid="267298179806290920">"Estado"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licenza"</string>
     <string name="terms_title" msgid="5201471373602628765">"Termos e condicións"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licenza WebView do sistema"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licenzas de WebView do sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fondos de pantalla"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Provedores de imaxes por satélite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenzas de terceiros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Hai un problema para cargar as licenzas."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Cargando…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Agora estás a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos de converterte en programador.</item>
+      <item quantity="one">Agora estás a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso de converterte en programador</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Agora es programador."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Non é necesario, xa es programador."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opcións de programador"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opcións de restablecemento"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Restablecemento do dispositivo, das aplicacións ou da rede"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Restablecer rede"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Con esta acción restablecerase toda a configuración da rede, incluso:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wifi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Datos móbiles"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Borrar todas as eSIM do vehículo"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Non se cancelará o teu plan de servizo."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Non se puideron restablecer as eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Seleccionar rede"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Restablecer configuración"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Restablecer?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Queres restablecer toda a configuración da rede? Esta acción non se pode desfacer."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Restablecer configuración"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Restableceuse a configuración da rede"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Restablecer preferencias das aplicacións"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Con esta acción, restableceranse todas as preferencias de:\n\n"<li>"Aplicacións desactivadas"</li>\n<li>"Notificacións de aplicacións desactivadas"</li>\n" "<li>"Aplicacións predeterminadas para accións"</li>\n<li>"Restricións de datos en segundo plano para aplicacións"</li>\n<li>"Calquera restrición de permisos"</li>\n\n" Non perderás datos de ningunha aplicación."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Restablecer aplicacións"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Restablecéronse as preferencias das aplicacións"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Borrar todos os datos"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Ao realizar esta acción, borraranse todos os datos da unidade principal do teu vehículo, entre os que se inclúen os seguintes:\n\n"<li>"A túa Conta de Google"</li>\n<li>"Os datos e a configuración do sistema e das aplicacións"</li>\n<li>"As aplicacións descargadas"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Actualmente tes a sesión iniciada nas seguintes contas:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Hai outros usuarios neste vehículo."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Restablecer vehículo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Queres restablecer?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Queres borrar toda a túa información persoal e as aplicacións descargadas? Esta acción non se pode desfacer."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Borrar todo"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Borrando"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Agarda..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data e hora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Definir data e hora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Define a data, a hora, o fuso horario e os formatos"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordenar por fuso horario"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Hora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Engadir usuario"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Engadir conta"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Eliminar usuario"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Novo usuario"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Convidado"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrador"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Iniciouse sesión como administrador"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Todos os permisos de administrador"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Converter en administrador"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"O usuario poderá eliminar usuarios, incluídos outros administradores, e facer un restablecemento de fábrica do sistema."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Esta acción non se pode desfacer."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Si, converter en administrador"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Crear novos usuarios"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Facer chamadas"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS por datos móbiles do coche"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalar novas aplicacións"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Desinstalar aplicacións"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Engadir usuario"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Novo usuario"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Engadir un usuario novo?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Cando engades un usuario novo, este deberá configurar o seu espazo."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Calquera usuario pode actualizar as aplicacións para o resto dos usuarios."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Alcanzouse o límite de usuarios"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Pódense crear <xliff:g id="COUNT">%d</xliff:g> usuarios como máximo.</item>
+      <item quantity="one">Só se pode crear un usuario.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Non se puido crear un novo usuario"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Eliminar este usuario?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Eliminaranse todas as aplicacións e os datos."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Houbo un erro ao eliminar o usuario."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignorar"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Tentar de novo"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Eliminar último usuario?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Despois de eliminar o único usuario restante deste coche, crearase un novo administrador."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Eliminaranse todos os datos, a configuración e as aplicacións asociados con este usuario. Ademais, terás que configurar de novo o sistema."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Escolle un novo administrador"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Necesitas polo menos un administrador. Para eliminar este, primeiro escolle outro."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Escoller administrador"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Convidado"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Convidado"</string>
     <string name="user_switch" msgid="6544839750534690781">"Cambiar"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Ti (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Sen configurar"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar nome de usuario"</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuarios"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permisos concedidos a %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Contas"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Usuario"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Engadir conta"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Non se engadiron contas"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Contas de <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizar datos automaticamente"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permite ás aplicacións actualizar os datos automaticamente"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Activar sincronización aut.?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Todos os cambios que efectúes nas túas contas na Web copiaranse automaticamente no teu dispositivo.\n\nAlgunhas contas tamén poden copiar automaticamente na Web os cambios que realices no teléfono. As Contas de Google funcionan desta última forma."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Desactivar sincronización aut.?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Desta forma aforraranse datos, pero terás que sincronizar cada conta manualmente para recompilar a información recente. Non recibirás notificacións cando se realicen actualizacións."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Información da conta"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Engadir conta"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Engadir unha conta"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Quitar conta"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Queres quitar a conta?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Se quitas esta conta, eliminaranse todas as súas mensaxes, contactos e demais datos do dispositivo."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"O administrador non admite este cambio"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Queres quitar o usuario?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Eliminaranse todas as aplicacións e os datos."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Non se puido quitar o usuario"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Queres tentalo de novo?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ignorar"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Tentar de novo"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Engadir un usuario novo?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Cando engades un usuario novo, este deberá configurar o seu espazo."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Calquera usuario pode actualizar as aplicacións para o resto dos usuarios."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Produciuse un erro ao eliminar a conta."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronización da conta"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"A sincronización está activada para <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g> elementos"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"A sincronización está activada para todos os elementos"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"A sincronización está desactivada para todos os elementos"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sen sincronización"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Erro de sincronización"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Última sincronización: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sincronizando agora…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Toca para sincronizar agora<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar agora"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronización"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Neste momentos hai problemas coa sincronizacións, pero restablecerase en breve."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguranza"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueo de pantalla"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ningún"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Contrasinal"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Escolle un tipo de bloqueo"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opcións de bloqueo de pantalla"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opcións de bloqueo"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Introduce o teu padrón"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmar"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Volver debuxar"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Definir un bloqueo de pantalla"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Escolle o teu PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Seleccionar o teu padrón"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Escolle o teu contrasinal"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Escoller o teu contrasinal"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Bloqueo de pantalla actual"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Por cuestións de seguranza, define un padrón"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Borrar"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"O teu administrador de TI bloqueou os contrasinais comúns. Proba cun contrasinal diferente."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Non se permite unha secuencia de díxitos ascendente, descendente nin repetida."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opcións de bloqueo de pantalla"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: hai <xliff:g id="NUM_DAYS">%3$s</xliff:g> días"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Eng. dispositivo de confianza"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Disposit. confianza"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dispositivos</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dispositivo</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Cando o <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> estea conectado, poderase utilizar para desbloquear este coche. Se outra persoa colle o <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> pode acceder a este dispositivo"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmar"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Quitar dispositivo de confianza"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Feito"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Utiliza a aplicación complementaria para configurar un dispositivo de confianza. Unha vez configurado, poderás desbloquear o perfil de usuario cando o vehículo detecte o teléfono"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Descarga a aplicación complementaria no teléfono"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selecciona <xliff:g id="CAR_NAME">%1$s</xliff:g> no teléfono para vincular os dispositivos"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock non pode detectar as funcións de seguranza deste dispositivo. Para axudar a protexer o teu coche, o dispositivo de confianza só poderá manter o coche desbloqueado despois de que o desbloquees ti. O teu dispositivo de confianza pode manter o coche desbloqueado cando está cerca, aínda que o estea sostendo outra persoa."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Engadir <xliff:g id="DEVICE_NAME">%1$s</xliff:g> como dispositivo de confianza"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> engadiuse correctamente como un dispositivo de confianza"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Produciuse un erro durante a inscrición de <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Se engades un dispositivo de confianza, despois terás que definir un método de autenticación. Se non tes á man o dispositivo de confianza, deberás verificar a túa identidade para acceder ao teu perfil."</string>
     <string name="forget" msgid="3971143908183848527">"Borrar"</string>
+    <string name="connect" msgid="5861699594602380150">"Conectar"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Desconectar"</string>
     <string name="delete_button" msgid="5840500432614610850">"Eliminar"</string>
     <string name="remove_button" msgid="6664656962868194178">"Quitar"</string>
     <string name="cancel" msgid="750286395700355455">"Cancelar"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Sae do modo de demostración"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Con esta acción eliminarase a conta de demostración e restableceranse os datos de fábrica do sistema. Perderanse todos os datos do usuario."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Saír da demostración"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"finalizar configuración"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"agora non"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"IGNORAR"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Esta función non está dispoñible mentres conduces."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Non se poden engadir usuarios mentres se conduce."</string>
 </resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 38e0676..ed305a3 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ઝાંખી સ્ક્રીન, ટચસ્ક્રીન, બૅટરી"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ઝાંખી સ્ક્રીન, રાત્રિ, રંગછટા"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"રાત્રિ મોડ"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"નેટવર્ક અને ઇન્ટરનેટ"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"મોબાઇલ નેટવર્ક"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"મોબાઇલ ડેટા"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"મોબાઇલ નેટવર્કનો ઉપયોગ કરીને ડેટા ઍક્સેસ કરો"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"મોબાઇલ ડેટા બંધ કરીએ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ડેટા વપરાશ"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ડેટા સંબંધી ચેતવણી અને મર્યાદા"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ઍપ ડેટા વપરાશનું ચક્ર"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ડેટા વિશેની ચેતવણી સેટ કરો"</string>
+    <string name="data_warning" msgid="116776633806885370">"ડેટા વિશે ચેતવણી"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ડેટાની મર્યાદા સેટ કરો"</string>
+    <string name="data_limit" msgid="227338836292511425">"ડેટાની મર્યાદા"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ડેટાના વપરાશને મર્યાદિત કરો"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"તમે સેટ કરેલી મર્યાદાએ, તમારા વાહનનું હેડ એકમ મોબાઇલનો ડેટા બંધ કરી દેશે.\n\nવાહનના હેડ એકમ અને તમારા કૅરિઅર દ્વારા થતી ડેટા વપરાશની ગણતરીમાં ફરક હોઈ શકવાને કારણે માફકસરની મર્યાદા સેટ કરવાનું વિચારો."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"વાઇ-ફાઇ"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"વાયરલેસ ઍક્સેસ પૉઇન્ટને સેટ અને મેનેજ કરો"</string>
     <string name="wifi_starting" msgid="473253087503153167">"વાઇ-ફાઇ ચાલુ કરી રહ્યાં છીએ…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"વાઇ-ફાઇ બંધ કરી રહ્યાં છીએ…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"વાઇ-ફાઇની સૂચિ લોડ કરી રહ્યું છે"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"વાઇ-ફાઇ બંધ કર્યું"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"નેટવર્ક ભૂલવામાં નિષ્ફળ થયાં"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"નેટવર્ક સાથે કનેક્ટ કરવામાં નિષ્ફળ થયાં"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"નેટવર્ક ઉમેરો"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"વાઇ-ફાઇ બંધ કર્યું"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"કનેક્ટ કરો"</string>
     <string name="wifi_password" msgid="5565632142720292397">"પાસવર્ડ"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"પાસવર્ડ બતાવો"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"નેટવર્કનું નામ"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID દાખલ કરો"</string>
     <string name="wifi_security" msgid="158358046038876532">"સુરક્ષા"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"સિગ્નલ પ્રબળતા"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"સિગ્નલ પ્રબળતા"</string>
     <string name="wifi_status" msgid="5688013206066543952">"સ્ટેટસ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"લિંક ઝડપ"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"આવર્તન"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP ઍડ્રેસ"</string>
+    <string name="show_password" msgid="2074628020371139240">"પાસવર્ડ બતાવો"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"નેટવર્કનું નામ દાખલ કરો"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"પાસવર્ડ દાખલ કરો"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"નબળી"</item>
-    <item msgid="2032262610626057081">"ઠીક"</item>
-    <item msgid="3859756017461098953">"સારી"</item>
-    <item msgid="1521103743353335724">"ઉત્તમ"</item>
+    <item msgid="7683058295076342057">"નબળું"</item>
+    <item msgid="1639222824821660744">"ઠીક"</item>
+    <item msgid="1838705897358163300">"સારું"</item>
+    <item msgid="6067166649320533751">"ઉત્તમ"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"બ્લૂટૂથ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"બ્લૂટૂથ ચાલુ કરો"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"બ્લૂટૂથ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"બ્લૂટૂથ બંધ છે"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"નેટવર્કની વિગતો"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ઍડ્રેસ"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ઍડ્રેસ"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"સબનેટ માસ્ક"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ઍડ્રેસ"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ગેટવે"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"વાઇ-ફાઇ પસંદગીઓ"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"વાઇ-ફાઇ ઑટોમૅટિક રીતે ચાલુ કરો"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"તમારા હોમ નેટવર્ક જેવા ઉચ્ચ ક્વૉલિટીના સાચવેલા નેટવર્કની નજીકમાં વાઇ-ફાઇ ઑટોમૅટિક રીતે ફરી ચાલુ થશે"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"સ્થાન બંધ હોવાને કારણે અનુપલબ્ધ છે. "<annotation id="link">"સ્થાન"</annotation>" ચાલુ કરો."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"વાઇ-ફાઇ સ્કૅનિંગ ચાલુ કરીએ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ચાલુ કરો"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"વાઇ-ફાઇ માટે સ્કૅનિંગ ચાલુ કરી છે"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"મોબાઇલ ડેટા પર ઑટોમૅટિક રીતે સ્વિચ કરો"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"જ્યારે વાઇ-ફાઇ પાસે ઇન્ટરનેટનો ઍક્સેસ ન હોય, ત્યારે મોબાઇલ ડેટાનો ઉપયોગ કરો. ડેટા વપરાશ શુલ્ક લાગુ થઈ શકે છે."</string>
+    <string name="learn_more" msgid="8214605928933358604">"વધુ જાણો"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"બ્લૂટૂથ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"કનેક્શન મેનેજ કરો, ઉપકરણનું નામ અને શોધક્ષમતા સેટ કરો"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"કમ્પ્યુટર"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"હેડસેટ"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ફોન"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ઇમેજિંગ"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"હેડફોન"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ઇનપુટ પેરિફેરલ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"બ્લૂટૂથ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"જોડાણ કરેલા ઉપકરણો"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ઉપલબ્ધ ઉપકરણો"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"કોઈ જોડાયેલ ઉપકરણો નથી"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"કોઈ ઉપકરણ ઉપલબ્ધ નથી"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"જોડાણ કરેલ ઉપકરણ"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"નામ"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"આના માટે ઉપયોગ કરો"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"બ્લૂટૂથ ઉપકરણનું નામ બદલો"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"અનામાંકિત ડિવાઇસ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"જોડાણ કરેલા ડિવાઇસ"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"નવા ડિવાઇસ સાથે જોડાણ બનાવો"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"બ્લૂટૂથ જોડી બનાવવાનું ચાલુ કરશે"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ડિવાઇસને ડિસ્કનેક્ટ કરીએ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"તમારું વાહન <xliff:g id="DEVICE_NAME">%1$s</xliff:g>થી ડિસ્કનેક્ટ થઈ જશે."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"વાહનનું બ્લૂટૂથ ઍડ્રેસ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ડિવાઇસનું Bluetooth ઍડ્રેસ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"વાહનનું નામ"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"આ વાહનનું નામ બદલો"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ડિવાઇસનું નામ બદલો"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"નામ બદલો"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ઉપલબ્ધ ડિવાઇસ"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"પ્રોફાઇલ"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"બ્લૂટૂથ જોડાણ બનાવવાની વિનંતી"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"જોડાણ બનાવો અને કનેક્ટ કરો"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"બ્લૂટૂથ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"બ્લૂટૂથનો જોડાણ કરવાનો કોડ"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"પિનમાં અક્ષરો અથવા પ્રતીકોનો સમાવેશ થાય છે"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"જોડાણ કરવાનો કોડ ટાઇપ કરો, પછી Return અથવા Enter દબાવો"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"સામાન્ય રીતે 0000 અથવા 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"જોડાણ બનાવવાની વિનંતી"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> સાથે જોડાણ બનાવવા માટે ટૅપ કરો."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ભાષાઓ"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ભાષા અને ઇનપુટ"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"કીબોર્ડ"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"કીબોર્ડ મેનેજ કરો"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"ટેક્સ્ટ ટુ સ્પીચ આઉટપુટ"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"મનપસંદ એન્જિન"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"વર્તમાન એન્જિન"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"બોલવાની ઝડપ"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"પિચ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"રીસેટ કરો"</string>
     <string name="sound_settings" msgid="3072423952331872246">"સાઉન્ડ"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"રિંગ વૉલ્યૂમ"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"નૅવિગેશન વૉલ્યૂમ"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"મીડિયા"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"સંગીત અને વીડિઓ માટે વૉલ્યૂમ સેટ કરો"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"એલાર્મ"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ફોન રિંગટોન"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ડિફૉલ્ટ નોટિફિકેશન સાઉન્ડ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ડિફૉલ્ટ અલાર્મ સાઉન્ડ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ઍપ અને નોટિફિકેશન"</string>
+    <string name="all_applications" msgid="7798210477486822168">"બધી ઍપ બતાવો"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ડિફૉલ્ટ ઍપ"</string>
     <string name="applications_settings" msgid="794261395191035632">"ઍપની માહિતી"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ફરજિયાત બંધ કરો"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"ફરજિયાત બંધ કરીએ?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"જો તમે કોઈ ઍપને ફરજિયાત બંધ કરો છો, તો તે બરાબર ચાલશે નહીં."</string>
     <string name="disable_text" msgid="4358165448648990820">"બંધ કરો"</string>
     <string name="enable_text" msgid="1794971777861881238">"ચાલુ કરો"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"અનઇન્સ્ટૉલ કરો"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"જો તમે આ ઍપ બંધ કરો છો, તો Android અને અન્ય ઍપ અપેક્ષા પ્રમાણે કાર્ય કરી શકશે નહીં."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ઍપ બંધ કરો"</string>
     <string name="permissions_label" msgid="2701446753515612685">"પરવાનગીઓ"</string>
     <string name="application_version_label" msgid="8556889839783311649">"વર્ઝન: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"કોઈ પરવાનગીઓ આપેલ નથી"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"કોઈ પરવાનગીઓની વિનંતી કરેલ નથી"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ડેટા વપરાશ"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ઍપ ડેટા વપરાશ"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ફરજિયાત બંધ કરો"</string>
     <string name="computing_size" msgid="5791407621793083965">"ગણતરી કરી રહ્યાં છીએ…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> વધારાની પરવાનગીઓ</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> વધારાની પરવાનગીઓ</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"સહાય અને વૉઇસ ઇનપુટ"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"સહાયક ઍપ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"સ્ક્રીન પરની ટેક્સ્ટનો ઉપયોગ કરો"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"સહાયક ઍપને સ્ક્રીન કન્ટેન્ટને ટેક્સ્ટ તરીકે ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"સ્ક્રીનશૉટનો ઉપયોગ કરો"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"સહાયક ઍપને સ્ક્રીનની છબીને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"આપમેળે ભરાવાની સેવા"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"એકપણ નહીં"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"પસંદ કરેલી"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"તમારી સ્ક્રીન પર જોઈ શકાતી અથવા ઍપમાંથી ઍક્સેસ કરી શકાય તેવી માહિતી સહિતની તમારી સિસ્ટમમાં ઉપયોગમાં લેવાતી ઍપ વિશેની માહિતી આસિસ્ટંટ વાંચી શકશે."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ખાતરી કરો કે તમે આ ઍપનો વિશ્વાસ કરો છો&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google આપમેળે ભરાવાની સુવિધા&gt;%1$s&lt;/xliff:g&gt; તમારી સ્ક્રીન પર શું છે તેનો ઉપયોગ એ નક્કી કરવા કરે છે કે આપમેળે શું ભરાઈ શકે."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"સેવા ઉમેરો"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"સ્થાન"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"સ્થાન માટે તાજેતરની વિનંતીઓ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"સ્થાન માટે તાજેતરમાં કોઈ વિનંતી નથી"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ઍપ લેવલની પરવાનગીઓ"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"સ્કૅનિંગ"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"જગ્યાની સેવાઓ"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"વાઇ-ફાઇ સ્કૅનિંગ"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"જ્યારે વાઇ-ફાઇ બંધ હોય ત્યારે પણ ગમે ત્યારે ઍપ અને સેવાઓને વાઇ-ફાઇ નેટવર્ક સ્કૅન કરવાની મંજૂરી આપો. ઉદાહરણ તરીકે, આનો ઉપયોગ સ્થાન આધારિત સુવિધાઓ અને સેવાઓને વધુ સારી બનાવવા માટે કરી શકાય છે."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"બ્લૂટૂથ સ્કૅનિંગ"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"જ્યારે બ્લૂટૂથ બંધ હોય ત્યારે પણ ગમે ત્યારે ઍપ અને સેવાઓને નજીકનાં ડિવાઇસ સ્કૅન કરવાની મંજૂરી આપો. ઉદાહરણ તરીકે, આનો ઉપયોગ સ્થાન આધારિત સુવિધાઓ અને સેવાઓને વધુ સારી બનાવવા માટે કરી શકાય છે."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"સિસ્ટમ"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"સિસ્ટમ અપડેટ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"સિસ્ટમ અપડેટ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android વર્ઝન"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android સુરક્ષા પૅચ લેવલ"</string>
     <string name="model_info" msgid="4966408071657934452">"મૉડલ"</string>
     <string name="baseband_version" msgid="2370088062235041897">"બેઝબૅન્ડ વર્ઝન"</string>
     <string name="kernel_version" msgid="7327212934187011508">"કર્નલ વર્ઝન"</string>
     <string name="build_number" msgid="3997326631001009102">"બિલ્ડ નંબર"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"બ્લૂટૂથ ઍડ્રેસ"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"ઉપલબ્ધ નથી"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"સ્ટેટસ"</string>
     <string name="device_status" msgid="267298179806290920">"સ્ટેટસ"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"કૉપિરાઇટ"</string>
     <string name="license_title" msgid="936705938435249965">"લાઇસન્સ"</string>
     <string name="terms_title" msgid="5201471373602628765">"નિયમો અને શરતો"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"સિસ્ટમ WebView લાઇસન્સ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"સિસ્ટમ WebView લાઇસન્સ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"વૉલપેપર"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ઉપગ્રહ છબી પ્રદાતાઓ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"તૃતીય-પક્ષ લાઇસન્સ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"લાઇસન્સ લોડ કરવામાં સમસ્યા છે."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"લોડ કરી રહ્યાં છીએ…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">હવે તમે ડેવલપર બનવાથી <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> પગલું દૂર છો.</item>
+      <item quantity="other">હવે તમે ડેવલપર બનવાથી <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> પગલાં દૂર છો.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"તમે હવે ડેવલપર છો!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"કોઈ જરૂર નથી, તમે પહેલાંથી જ ડેવલપર છો."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ડેવલપરના વિકલ્પો"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"રીસેટ કરવાના વિકલ્પો"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"નેટવર્ક, ઍપ અથવા ઉપકરણ રીસેટ કરો"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"નેટવર્ક રીસેટ કરો"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"આ બધા નેટવર્ક સેટિંગ રીસેટ કરશે, જેમાં આનો સમાવેશ છે:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"વાઇ-ફાઇ"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"મોબાઇલ ડેટા"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"બ્લૂટૂથ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"બધા વાહન ઇ-સિમ કાઢી નાખો"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"આમ કરવાથી તમારો સેવા પ્લાન રદ થશે નહીં."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"ઇ-સિમ રીસેટ કરી શકાતા નથી"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"નેટવર્ક પસંદ કરો"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"સેટિંગ રીસેટ કરો"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"રીસેટ કરીએ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"બધા નેટવર્ક સેટિંગ રીસેટ કરીએ? તમે આ ક્રિયામાં થયેલો છેલ્લો ફેરફાર રદ કરી શકતાં નથી!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"સેટિંગ રીસેટ કરો"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"નેટવર્ક સેટિંગ રીસેટ કરવામાં આવ્યું છે"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ઍપ પસંદગીઓને રીસેટ કરો"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"આમ કરવાથી આ બધી પસંદગીઓ રીસેટ થઈ જશે:\n\n"<li>"બંધ કરેલી ઍપ"</li>\n<li>"ઍપના બંધ કરેલા નોટિફિકેશન"</li>\n<li>"ક્રિયાઓ માટેની ડિફૉલ્ટ ઍપ્લિકેશનો"</li>\n<li>"ઍપ માટે બૅકગ્રાઉન્ડ ડેટાના પ્રતિબંધો"</li>\n<li>"કોઈપણ પરવાનગીના પ્રતિબંધો"</li>\n\n"તમે કોઈપણ ઍપનો ડેટા ગુમાવશો નહીં."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ઍપને રીસેટ કરો"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ઍપ પસંદગીઓ રીસેટ કરવામાં આવી છે"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"બધો ડેટા કાઢી નાખો (ફેક્ટરી રીસેટ)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"આ ક્રિયા તમારા વાહનના હેડ યુનિટમાંથી બધો ડેટા કાઢી નાખશે, જેમાં આનો સમાવેશ થાય છે:\n\n"<li>"તમારું Google એકાઉન્ટ"</li>\n<li>"સિસ્ટમ અને ઍપ ડેટા અને સેટિંગ"</li>\n<li>"ડાઉનલોડ કરેલ ઍપ"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"હાલમાં તમે નીચે જણાવેલા બધા એકાઉન્ટમાં સાઇન ઇન થયા છો:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"આ વાહન પર અન્ય વપરાશકર્તા હાજર છે."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"વાહન રીસેટ કરો"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"રીસેટ કરીએ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"તમારી બધી વ્યક્તિગત માહિતી અને ડાઉનલોડ કરેલી એપ્લિકેશન્સને કાઢી નાખીએ? તમે આ ક્રિયાને પૂર્વવત્ કરી શકતા નથી!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"દરેક વસ્તુ કાઢી નાંખો"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"કાઢી નાંખી રહ્યું છે"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"કૃપા કરીને રાહ જુઓ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"તારીખ અને સમય"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"તારીખ અને સમય સેટ કરો"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"તારીખ, સમય, સમય ઝોન અને ફૉર્મેટ સેટ કરો"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"સમય ઝોન પ્રમાણે સૉર્ટ કરો"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"તારીખ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"સમય"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"વપરાશકર્તા ઉમેરો"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"એકાઉન્ટ ઉમેરો"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"વપરાશકર્તા ડિલીટ કરો"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"નવા વપરાશકર્તા"</string>
-    <string name="user_guest" msgid="3465399481257448601">"અતિથિ"</string>
     <string name="user_admin" msgid="1535484812908584809">"વ્યવસ્થાપક"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"વ્યવસ્થાપક તરીકે સાઇન ઇન થયા"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"વ્યવસ્થાપક માટેની બધી પરવાનગીઓ"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"વ્યવસ્થાપક બનાવો"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"આ વપરાશકર્તા, અન્ય વ્યવસ્થાપકો સહિત અન્ય વપરાશકર્તાઓને ડિલીટ કરી શકશે અને સિસ્ટમને ફેક્ટરી રીસેટ પણ કરી શકશે."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"આ ક્રિયા ઉલટાવી શકવા યોગ્ય નથી."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"હા, આમને વ્યવસ્થાપક બનાવો"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"નવા વપરાશકર્તાઓ બનાવો"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ફોન કૉલ કરો"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"કારના મોબાઇલ ડેટા મારફતે મેસેજિંગ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"નવી ઍપ ઇન્સ્ટૉલ કરો"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ઍપ અનઇન્સ્ટૉલ કરો"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"વપરાશકર્તા ઉમેરો"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"નવા વપરાશકર્તા"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"નવા વપરાશકર્તાને ઉમેરીએ?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમની સ્પેસ સેટ કરવાની જરૂર પડે છે."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"કોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"વપરાશકર્તાની મર્યાદા સુધી પહોંચ્યાં"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">તમે <xliff:g id="COUNT">%d</xliff:g> વપરાશકર્તા સુધી મંજૂરી આપી શકશો.</item>
+      <item quantity="other">તમે <xliff:g id="COUNT">%d</xliff:g> વપરાશકર્તા સુધી મંજૂરી આપી શકશો.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"નવો વપરાશકર્તા બનાવવામાં નિષ્ફળ"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"આ યુઝરને ડિલીટ કરીએ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"બધી ઍપ અને ડેટા ડિલીટ કરવામાં આવશે."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"વપરાશકર્તાને ડિલીટ કરવામાં નિષ્ફળ થયાં."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"છોડી દો"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ફરી પ્રયાસ કરો"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"છેલ્લા યુઝરને ડિલીટ કરીએ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"આ કાર માટેના બચેલા એકમાત્ર વપરાશકર્તાને ડિલીટ કર્યા પછી, નવા વ્યવસ્થાપકની રચના થશે."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"આ વપરાશકર્તા સાથે સંબંધિત બધો ડેટા, સેટિંગ અને ઍપ ડિલીટ થશે. તમારે સિસ્ટમને ફરીથી સેટ કરવી જરૂરી થશે."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"નવા વ્યવસ્થાપકની પસંદગી કરો"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"તમારી પાસે એક વ્યવસ્થાપકનું હોવું જરૂરી છે. આને ડિલીટ કરવા માટે, પહેલા નવાની પસંદગી કરો."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"વ્યવસ્થાપક પસંદ કરો"</string>
+    <string name="user_guest" msgid="3465399481257448601">"અતિથિ"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"અતિથિ"</string>
     <string name="user_switch" msgid="6544839750534690781">"સ્વિચ કરો"</string>
     <string name="current_user_name" msgid="3813671533249316823">"તમે (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"નામ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"સેટ કરેલ નથી"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"વપરાશકર્તાના નામમાં ફેરફાર કરો"</string>
     <string name="users_list_title" msgid="770764290290240909">"વપરાશકર્તાઓ"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$sને આપેલી પરવાનગીઓ"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"એકાઉન્ટ"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"વપરાશકર્તા"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"એકાઉન્ટ ઉમેરો"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"કોઈ એકાઉન્ટ ઉમેરવામાં આવ્યા નથી"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> માટેના એકાઉન્ટ"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ડેટાને ઑટોમૅટિક રીતે સિંક કરો"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ઍપને ઑટોમૅટિક રીતે ડેટાને રિફ્રેશ કરવા દો"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ડેટા ઑટો સિંક કરો ચાલુ કરીએ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"તમે વેબ પર તમારા એકાઉન્ટમાં કરો તે કોઈપણ ફેરફારોને ઑટોમૅટિક રીતે તમારા ડિવાઇસ પર કૉપિ કરાશે.\n\nઅમુક એકાઉન્ટ પણ તમે ડિવાઇસ પર કરો તે ફેરફારોને વેબ પર ઑટોમૅટિક રીતે કૉપિ કરશે. Google એકાઉન્ટ આ પ્રમાણે કાર્ય કરે છે."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ડેટા ઑટો સિંક કરો બંધ કરીએ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"આમ કરવું તે ડેટા બચાવશે, પરંતુ તાજેતરની માહિતી એકત્રિત કરવા માટે તમને દરેક એકાઉન્ટને મેન્યુઅલી સિંક કરવાની જરૂર પડશે. અને જ્યારે અપડેટ આવશે ત્યારે તમને નોટિફિકેશન પ્રાપ્ત થશે નહીં."</string>
     <string name="account_details_title" msgid="7529571432258448573">"એકાઉન્ટની માહિતી"</string>
     <string name="add_account_title" msgid="5988746086885210040">"એકાઉન્ટ ઉમેરો"</string>
     <string name="add_an_account" msgid="1072285034300995091">"એક એકાઉન્ટ ઉમેરો"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"એકાઉન્ટ કાઢી નાખો"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"એકાઉન્ટ કાઢી નાખીએ?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"આ એકાઉન્ટને કાઢી નાખવાથી તેમાંના બધા સંદેશા, સંપર્કો તેમજ ઉપકરણમાંનો અન્ય ડેટા ડિલીટ થઈ જશે!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"તમારા વ્યવસ્થાપકે આ ફેરફારની મંજૂરી આપી નથી"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"આ વપરાશકર્તા કાઢી નાખીએ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"બધી ઍપ અને ડેટા ડિલીટ કરવામાં આવશે."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"વપરાશકર્તા કાઢી નાખવામાં નિષ્ફળ રહ્યાં."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"ફરી પ્રયાસ કરીએ?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"છોડી દો"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ફરી પ્રયાસ કરો"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"નવા વપરાશકર્તાને ઉમેરીએ?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમની સ્પેસ સેટ કરવાની જરૂર પડે છે."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"કોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"એકાઉન્ટ કાઢી નાખવામાં નિષ્ફળ થયાં."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"એકાઉન્ટ સિંક કરો"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> માંથી <xliff:g id="ID_1">%1$d</xliff:g> આઇટમ માટે સિંક ચાલુ છે"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"બધી આઇટમ માટે સિંક ચાલુ છે"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"બધી આઇટમ માટે સિંક બંધ છે"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"સિંક બંધ છે"</string>
+    <string name="sync_error" msgid="6698021343089247914">"સિંકમાં ભૂલ"</string>
+    <string name="last_synced" msgid="4745124489150101529">"છેલ્લે સિંક કરેલ <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"હમણાં સિંક કરી રહ્યાં છીએ…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"હમણાં સિંક કરવા માટે ટૅપ કરો<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"હમણાં સિંક કરો"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"સિંક કરવાનું રદ કરો"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"સિંકમાં હાલ સમસ્યા આવી રહી છે. ટૂંક સમયમાં તે ફરીથી કાર્યરત થઈ જશે."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"સુરક્ષા"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"સ્ક્રીન લૉક"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"કોઈ લૉક નથી"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"પિન"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"પાસવર્ડ"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"લૉકનો પ્રકાર પસંદ કરો"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"સ્ક્રીન લૉકના વિકલ્પો"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"લૉક માટે વિકલ્પો"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"તમારી પૅટર્ન દાખલ કરો"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"કન્ફર્મ કરો"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ફરીથી દોરો"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"સ્ક્રીન લૉક સેટ કરો"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"તમારો પિન પસંદ કરો"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"તમારી પૅટર્ન પસંદ કરો"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"તમારો પાસવર્ડ પસંદ કરો"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"તમારો પાસવર્ડ પસંદ કરો"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"વર્તમાન સ્ક્રીન લૉક"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"સુરક્ષા માટે, એક પૅટર્ન સેટ કરો"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"સાફ કરો"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"સામાન્ય પાસવર્ડ તમારા IT વ્યવસ્થાપક દ્વારા બ્લૉક કરવામાં આવે છે. એક અલગ પાસવર્ડ અજમાવી જુઓ."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"અંકોના ચઢતા ક્રમની, ઉતરતા ક્રમની અથવા પુનરાવર્તિત અનુક્રમની મંજૂરી નથી."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"સ્ક્રીન લૉકના વિકલ્પો"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> દિવસ પહેલાં"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"વિશ્વસનીય ડિવાઇસ ઉમેરો"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"વિશ્વસનીય ડિવાઇસ"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ડિવાઇસ</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ડિવાઇસ</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"જ્યારે તમારું <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> કનેક્ટ થયેલું હશે, ત્યારે આ કારને અનલૉક કરી શકશે જો કોઈ તમારી <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>કાર લઈ જશે, તો તેઓ આ ડિવાઇસને ઍક્સેસ કરી શકશે"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"કન્ફર્મ કરો"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"વિશ્વસનીય ડિવાઇસ કાઢી નાખો"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"થઈ ગયું"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"વિશ્વસનીય ડિવાઇસનું સેટઅપ કરવા માટે સાથી ઍપનો ઉપયોગ કરો. એકવાર સેટઅપ થઈ જાય પછી, જ્યારે વાહનને તમારા ફોનની જાણ થાય ત્યારે તમે તમારી વપરાશકર્તા પ્રોફાઇલ અનલૉક કરી શકશો"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. તમારા ફોન પર સાથી ઍપને ડાઉનલોડ કરો"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. ડિવાઇસને તમારા ફોન સાથે જોડાણ કરવા માટે <xliff:g id="CAR_NAME">%1$s</xliff:g>ને પસંદ કરો"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock આ ડિવાઇસની સુરક્ષા સુવિધાઓ શોધી શકતા નથી. તમારા કારને સુરક્ષિત રાખવામાં સહાય કરવા માટે, એકવાર તમે તમારી કાર પહેલેથી અનલૉક કરી દો, માત્ર પછીથી જ વિશ્વસનીય ડિવાઇસ તમારી કારને અનલૉક કરેલી રાખી શકશે. જો અન્ય કોઈ વ્યક્તિએ તમારું વિશ્વસનીય ડિવાઇસ પકડી રાખ્યું હોય, તો પણ જ્યારે તે નજીકમાં હશે ત્યારે તમારી કારને અનલૉક કરેલી રાખી શકશે."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ને વિશ્વસનીય ડિવાઇસ તરીકે ઉમેરો"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ને સફળતાપૂર્વક વિશ્વસનીય ડિવાઇસ તરીકે ઉમેર્યું"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ની નોંધણી નિષ્ફળ રહી"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"કોઈ વિશ્વસનીય ડિવાઇસ ઉમેરવા માટે, તમારે પહેલાં કોઈ પ્રમાણીકરણ પદ્ધતિ સેટ કરવી આવશ્યક છે. જો તમારી પાસે તમારું વિશ્વસનીય ડિવાઇસ ન હોય, તો તમારી પ્રોફાઇલને ઍક્સેસ કરવા માટે પ્રમાણીકરણ આવશ્યક રહેશે."</string>
     <string name="forget" msgid="3971143908183848527">"ભૂલી જાઓ"</string>
+    <string name="connect" msgid="5861699594602380150">"કનેક્ટ કરો"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ડિસ્કનેક્ટ કરો"</string>
     <string name="delete_button" msgid="5840500432614610850">"ડિલીટ કરો"</string>
     <string name="remove_button" msgid="6664656962868194178">"કાઢી નાખો"</string>
     <string name="cancel" msgid="750286395700355455">"રદ કરો"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ડેમો મોડમાંથી બહાર નીકળો"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"આ ક્રિયા ડેમો એકાઉન્ટ ડિલીટ કરશે અને સિસ્ટમને ફેક્ટરી ડેટા પર રીસેટ કરશે. વપરાશકર્તાનો બધો ડેટા ગુમ થશે."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ડેમોમાંથી બહાર નીકળો"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"સેટઅપ સમાપ્ત કરો"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"હમણાં નહીં"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"છોડી દો"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ડ્રાઇવિંગ કરતી વખતે આ સુવિધા ઉપલબ્ધ રહેશે નહીં."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ડ્રાઇવ કરતી વખતે વપરાશકર્તાને ઉમેરી શકાતા નથી."</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index b814e6d..8565440 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"हल्की रोशनी वाली स्क्रीन, टचस्‍क्रीन, बैटरी"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"हल्की रोशनी वाली स्क्रीन, नाइट, टिंट"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"रात वाला मोड"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"नेटवर्क और इंटरनेट"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"मोबाइल नेटवर्क"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"मोबाइल डेटा"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"मोबाइल नेटवर्क का इस्तेमाल करके डेटा एक्सेस करें"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"मोबाइल डेटा बंद करना चाहते हैं?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"डेटा खर्च"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"डेटा खर्च की चेतावनी और तय सीमा"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ऐप्लिकेशन के डेटा खर्च की साइकिल"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"डेटा चेतावनी सेट करें"</string>
+    <string name="data_warning" msgid="116776633806885370">"डेटा खर्च की चेतावनी"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"डेटा सीमा सेट करें"</string>
+    <string name="data_limit" msgid="227338836292511425">"डेटा सीमा"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"डेटा खर्च को सीमित करना"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"आपकी तय की हुई सीमा तक पहुंचते ही आपकी गाड़ी की हेड यूनिट मोबाइल डेटा को बंद कर देगी.\n\nडेटा इस्तेमाल का हिसाब हेड यूनिट लगाती है. ऐसा हो सकता है कि आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी अलग तरह से डेटा खर्च का हिसाब लगाए. इसलिए, इस फ़र्क को ध्यान में रखते हुए सीमा तय करें."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"वाई-फ़ाई"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"वायरलेस एक्सेस पॉइंट सेट और प्रबंधित करें"</string>
     <string name="wifi_starting" msgid="473253087503153167">"वाई-फ़ाई चालू हो रहा है…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"वाई-फ़ाई बंद हो रहा है…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"वाई-फ़ाई सूची लोड हो रही है"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"वाई-फ़ाई बंद किया गया"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"मौजूदा नेटवर्क की जानकारी हटाई नहीं जा सकी"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"नेटवर्क से कनेक्ट नहीं हो पाया"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"नेटवर्क जोड़ें"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"वाई-फ़ाई बंद किया गया"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"जोड़ें"</string>
     <string name="wifi_password" msgid="5565632142720292397">"पासवर्ड"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"पासवर्ड दिखाएं"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"नेटवर्क का नाम"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID डालें"</string>
     <string name="wifi_security" msgid="158358046038876532">"सुरक्षा"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"सिग्‍नल कितना अच्छा है"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"सिग्नल कितना अच्छा है"</string>
     <string name="wifi_status" msgid="5688013206066543952">"स्थिति"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"कनेक्शन की रफ़्तार"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"फ़्रीक्वेंसी"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"आईपी पता"</string>
+    <string name="show_password" msgid="2074628020371139240">"पासवर्ड दिखाएं"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"नेटवर्क का नाम डालें"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"पासवर्ड डालें"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"खराब"</item>
-    <item msgid="2032262610626057081">"ठीक"</item>
-    <item msgid="3859756017461098953">"अच्छा"</item>
-    <item msgid="1521103743353335724">"बेहतरीन"</item>
+    <item msgid="7683058295076342057">"खराब"</item>
+    <item msgid="1639222824821660744">"ठीक"</item>
+    <item msgid="1838705897358163300">"अच्छा"</item>
+    <item msgid="6067166649320533751">"बेहतरीन"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ब्लूटूथ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ब्लूटूथ चालू करें"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ब्लूटूथ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ब्लूटूथ बंद कर दिया गया"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d एमबीपीएस"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 गीगाहर्ट्ज़"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 गीगाहर्ट्ज़"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"नेटवर्क के बारे में जानकारी"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC पता"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"आईपी पता"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"सबनेट मास्क"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"डीएनएस"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 पते"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"गेटवे"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"वाई-फ़ाई से जुड़ी पसंद"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"वाई-फ़ाई अपने आप चालू करें"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"सेव किए गए अच्छी क्वालिटी के नेटवर्क पास होने पर वाई-फ़ाई अपने आप चालू हो जाएगा, जैसे कि आपके घर का नेटवर्क"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"\'जगह की जानकारी\' बंद होने से यह सुविधा उपलब्ध नहीं है. "<annotation id="link">"जगह की जानकारी"</annotation>" चालू करें."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"वाई-फ़ाई नेटवर्क ढूंंढने की सुविधा चालू करें?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"चालू करें"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"वाई-फ़ाई नेटवर्क ढूंढने की सुविधा चालू हो गई है"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"मोबाइल डेटा पर अपने आप जाएं"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"जब वाई-फ़ाई के ज़रिए इंटरनेट की सुविधा न हो, तो मोबाइल डेटा इस्तेमाल करें. डेटा के लिए पैसे चुकाने पड़ सकते हैं."</string>
+    <string name="learn_more" msgid="8214605928933358604">"ज़्यादा जानें"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ब्लूटूथ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"कनेक्‍शन प्रबंधित करें, डिवाइस का नाम सेट करें और उसे खोजने लायक बनाएं"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"कंप्यूटर"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"हेडसेट"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"फ़ोन"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"फ़ोटो या वीडियो बनाने वाले डिवाइस"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"हेडफ़ोन"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"इनपुट पेरिफ़ेरल"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ब्लूटूथ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"जुड़े हुए डिवाइस"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"उपलब्ध डिवाइस"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"कोई भी डिवाइस जुड़ा हुआ नहीं है"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"कोई ब्लूटूथ डिवाइस उपलब्ध नहीं है"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"जुड़ा हुआ डिवाइस"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"नाम"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"इन चीज़ों के लिए इस्तेमाल करें"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"ब्लूटूथ डिवाइस का नाम बदलें"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"बिना नाम वाला डिवाइस"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"जुड़े हुए डिवाइस"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"नया डिवाइस जोड़ें"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"दूसरे डिवाइस से जुड़ने के लिए ब्लूटूथ चालू हो जाएगा"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"डिवाइस डिसकनेक्ट करना चाहते हैं?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"आपका वाहन <xliff:g id="DEVICE_NAME">%1$s</xliff:g> से डिसकनेक्ट हो जाएगा."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"वाहन का ब्लूटूथ पता: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"डिवाइस का ब्लूटूथ पता: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"वाहन का नाम"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"इस वाहन का नाम बदलें"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"डिवाइस का नाम बदलें"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"नाम बदलें"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"उपलब्ध डिवाइस"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"प्रोफ़ाइल"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ब्लूटूथ के ज़रिए जोड़ने का अनुरोध किया गया"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"दूसरे डिवाइस से जोड़ें और कनेक्‍ट करें"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ब्लूटूथ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ब्‍लूटूथ के ज़रिए जोड़ने वाला कोड"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"पिन में अक्षर या चिह्न शामिल होते हैं"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"दूसरे डिवाइस से जोड़ने वाला कोड लिखें और फिर Return या Enter दबाएं"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"आम तौर पर, 0000 या 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"दूसरे डिवाइस से जोड़ने का अनुरोध किया गया"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> से जोड़ने के लिए टैप करें."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"भाषाएं"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"भाषाएं और इनपुट"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"कीबोर्ड"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"कीबोर्ड प्रबंधित करें"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"\'लिख को बोली में बदलना\' आउटपुट"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"पसंदीदा इंजन"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"मौजूदा इंजन"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"बोलने की गति"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"पिच"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"रीसेट करें"</string>
     <string name="sound_settings" msgid="3072423952331872246">"आवाज़"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"घंटी बजने की आवाज़"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"नेविगेशन की आवाज़"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"मीडिया"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"संगीत और वीडियो के लिए आवाज़ कम या ज़्यादा करें"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"अलार्म"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"फ़ोन की रिंगटोन"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"सूचना की डिफ़ॉल्ट आवाज़"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"अलार्म की डिफ़ॉल्ट आवाज़"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ऐप्लिकेशन और सूचनाएं"</string>
+    <string name="all_applications" msgid="7798210477486822168">"सभी ऐप्लिकेशन दिखाएं"</string>
+    <string name="default_applications" msgid="1558183275638697087">"डिफ़ॉल्ट ऐप्लिकेशन"</string>
     <string name="applications_settings" msgid="794261395191035632">"ऐप्लिकेशन की जानकारी"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ज़बरदस्ती रोकें"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"ज़बरदस्ती रोकें?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"अगर आप किसी ऐप्लिकेशन को ज़बरदस्ती रोकते हैं, तो हो सकता है वह ठीक से काम न करे."</string>
     <string name="disable_text" msgid="4358165448648990820">"बंद करें"</string>
     <string name="enable_text" msgid="1794971777861881238">"चालू करें"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"अनइंस्टॉल करें"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"अगर आप इस ऐप्लिकेशन को बंद कर देते हैं, तो हो सकता है कि अब Android और दूसरे ऐप्लिकेशन मनमुताबिक काम न कर पाएं."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ऐप्लिकेशन बंद करें"</string>
     <string name="permissions_label" msgid="2701446753515612685">"अनुमतियां"</string>
     <string name="application_version_label" msgid="8556889839783311649">"वर्शन: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"कोई अनुमति नहीं दी गई"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"किसी अनुमति का अनुरोध नहीं किया गया"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"डेटा खर्च"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ऐप्लिकेशन का डेटा खर्च"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ज़बरदस्ती रोकें"</string>
     <string name="computing_size" msgid="5791407621793083965">"गिनती की जा रही है…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त अनुमतियां</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त अनुमतियां</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"असिस्ट और बोलकर फ़ोन को निर्देश"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"सहायक ऐप्लिकेशन"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"स्क्रीन के टेक्स्ट का इस्तेमाल करना"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"सहायक ऐप्लिकेशन को टेक्स्ट के रूप में स्क्रीन की सामग्री एक्सेस करने दें"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"स्क्रीनशॉट का इस्तेमाल करना"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"सहायक ऐप्लिकेशन को स्क्रीन की इमेज एक्सेस करने दें"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ऑटोमैटिक भरने की सेवा"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"कोई नहीं"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"चुना हुआ ऐप्लिकेशन"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistant आपके सिस्टम पर इस्तेमाल किए जा रहे ऐप्लिकेशन की जानकारी पढ़ सकेगी. इसमें आपकी स्क्रीन पर दिखाई देने वाली या ऐप्लिकेशन में से एक्सेस करने लायक जानकारी शामिल होगी."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;पक्का कर लें कि आप इस ऐप्लिकेशन पर भरोसा करते हैं&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; आपकी स्क्रीन पर मौजूद चीज़ों का इस्तेमाल करता है ताकि ऑटोमैटिक भरी जाने वाली जानकारी तय कर सके."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"सेवा जोड़ें"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"जगह"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"हाल ही में किए गए जगह के अनुरोध"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"हाल ही में जगह का कोई अनुरोध नहीं है"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ऐप्लिकेशन-स्तर की अनुमतियां"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"स्‍कैन करना"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"जगह की जानकारी की सेवाएं"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"वाई-फ़ाई स्कैन करना"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"ऐप्लिकेशन और सेवाओं को किसी भी समय वाई-फ़ाई नेटवर्क स्कैन करने की मंज़ूरी दें, भले ही वाई-फ़ाई बंद हो. इसका इस्तेमाल करके, जगह की जानकारी जैसी सुविधाओं और सेवाओं में सुधार किया जा सकता है."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ब्लूटूथ स्कैन करना"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ऐप्लिकेशन और सेवाओं को किसी भी समय आस-पास के डिवाइस स्कैन करने की मंज़ूरी दें, भले ही ब्लूटूथ बंद हो. इसका इस्तेमाल करके, जगह की जानकारी जैसी सुविधाओं और सेवाओं में सुधार किया जा सकता है."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"सिस्टम"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"सिस्‍टम अपडेट"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"सिस्टम अपडेट"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android का वर्शन"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android सुरक्षा पैच लेवल"</string>
     <string name="model_info" msgid="4966408071657934452">"मॉडल"</string>
     <string name="baseband_version" msgid="2370088062235041897">"मोबाइल रेडियो (बेसबैंड वर्शन)"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel का वर्शन"</string>
     <string name="build_number" msgid="3997326631001009102">"बिल्‍ड नबंर"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ब्लूटूथ का पता"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"उपलब्ध नहीं है"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"स्थिति"</string>
     <string name="device_status" msgid="267298179806290920">"स्थिति"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"कॉपीराइट"</string>
     <string name="license_title" msgid="936705938435249965">"लाइसेंस"</string>
     <string name="terms_title" msgid="5201471373602628765">"नियम और शर्तें"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"सिस्टम वेबव्यू लाइसेंस"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"सिस्‍टम वेबव्यू लाइसेंस"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"वॉलपेपर"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"सैटेलाइट के ज़रिए इमेज उपलब्ध कराने वाली संस्थाएं:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"तीसरे पक्ष के लाइसेंस"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"लाइसेंस लोड करने में कोई समस्‍या है."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"लोड हो रहा है…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">अब आप डेवलपर बनने से <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> कदम दूर हैं.</item>
+      <item quantity="other">अब आप डेवलपर बनने से <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> कदम दूर हैं.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"अब आप डेवलपर बन गए हैं!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"ज़रूरत नहीं है, आप पहले से ही डेवलपर हैं."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"डेवलपर के लिए सेटिंग और टूल"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"डिवाइस को रीसेट करने के विकल्प"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"नेटवर्क, ऐप्लिकेशन या डिवाइस को रीसेट करने के विकल्प"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"नेटवर्क रीसेट करें"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"इससे सभी नेटवर्क सेटिंग रीसेट हो जाएंगी, जिनमें शामिल हैं:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"वाई-फ़ाई"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"मोबाइल डेटा"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ब्लूटूथ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"वाहन से सभी eSIM हमेशा के लिए मिटाएं"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"इससे आपका सेवा प्लान रद्द नहीं होगा."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM रीसेट नहीं किए जा सकते"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"नेटवर्क चुनें"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"सेटिंग रीसेट करें"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"रीसेट करें?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"सभी नेटवर्क सेटिंग रीसेट करें? आप इस कार्रवाई को पहले जैसा नहीं कर सकते!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"सेटिंग रीसेट करें"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"नेटवर्क सेटिंग रीसेट कर दी गई हैं"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ऐप्लिकेशन की सेटिंग रीसेट करें"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"इससे इन सबके लिए प्राथमिकताएं रीसेट हो जाएंगी:\n\n"<li>"बंद किए गए ऐप्लिकेशन"</li>\n<li>"बंद की गई ऐप्लिकेशन सूचनाएं"</li>\n<li>"कार्रवाइयों के लिए डिफ़ॉल्ट ऐप्लिकेशन"</li>\n<li>"ऐप्लिकेशन के लिए बैकग्राउंड डेटा पाबंदियां"</li>\n<li>"अनुमति से जुड़ी सभी पाबंदियां"</li>\n\n"आपका सारा ऐप्लिकेशन डेटा बना रहेगा."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ऐप्लिकेशन रीसेट करें"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ऐप्लिकेशन की सेटिंग रीसेट कर दी गई हैं"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"पूरा डेटा हमेशा के लिए मिटाएं (फ़ैक्ट्री रीसेट)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"इससे आपके वाहन की हेड यूनिट से सारा डेटा हमेशा के लिए मिटा दिया जाएगा, जिसमें शामिल हैं:\n\n"<li>"आपका Google खाता"</li>\n<li>"सिस्टम, ऐप्लिकेशन का डेटा और सेटिंग"</li>\n<li>"डाउनलोड किए गए ऐप्लिकेशन"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"आपने इस समय नीचे दिए गए खातों में साइन इन कर रखा है:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"इस वाहन पर दूसरे उपयोगकर्ता मौजूद हैं."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"वाहन रीसेट करें"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"रीसेट करें?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"अपनी सारी निजी जानकारी और डाउनलोड किए गए ऐप्लिकेशन हमेशा के लिए मिटाना चाहते हैं? आप इस कार्रवाई को पहले जैसा नहीं कर सकते!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"सब कुछ हमेशा के लिए मिटाएं"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"हमेशा के लिए मिटाया जा रहा है"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"कृपया इंतज़ार करें..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"तारीख और समय"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"तारीख और समय सेट करें"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"तारीख, समय, समय क्षेत्र और फ़ॉर्मैट सेट करें"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"समय क्षेत्र के मुताबिक क्रम में लगाएं"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"तारीख"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"समय"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"उपयोगकर्ता जोड़ें"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"खाता जोड़ें"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"उपयोगकर्ता (का नाम) मिटाएं"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"नया उपयोगकर्ता"</string>
-    <string name="user_guest" msgid="3465399481257448601">"मेहमान"</string>
     <string name="user_admin" msgid="1535484812908584809">"एडमिन"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"एडमिन के तौर पर साइन-इन किया है"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"एडमिन के सभी अधिकार"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"एडमिन बनाएं"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"एडमिन बनने वाला उपयोगकर्ता, दूसरे उपयोगकर्ताअों और एडमिन के नाम मिटा सकता है और सिस्टम को फ़ैक्ट्री रीसेट कर सकता है."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"दूसरे उपयोगकर्ता को एडमिन के अधिकार देने के बाद वापस नहीं लिए जा सकते."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"हां, एडमिन बना दें"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"नए उपयोगकर्ता बनाएं"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"फ़ोन कॉल करें"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"कार के मोबाइल डेटा से मैसेज भेजना"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"नए ऐप्लिकेशन इंस्टॉल करें"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ऐप्लिकेशन अनइंस्टॉल करें"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"उपयोगकर्ता जोड़ें"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"नया उपयोगकर्ता"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"नया उपयोगकर्ता जोड़ें?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो, उस व्यक्ति को अपनी जगह सेट करनी होती है."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"कोई भी उपयोगकर्ता बाकी सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकते हैं."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"अब और उपयोगकर्ता नहीं जोड़े जा सकते"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">आप <xliff:g id="COUNT">%d</xliff:g> उपयोगकर्ता जोड़ सकते हैं.</item>
+      <item quantity="other">आप <xliff:g id="COUNT">%d</xliff:g> उपयोगकर्ता जोड़ सकते हैं.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"नया उपयोगकर्ता नहीं जोड़ पाए"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"इस उपयोगकर्ता को हटाएं?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"पूरा डेटा और सभी ऐप्लिकेशन मिटा दिए जाएंगे."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"उपयोगकर्ता को नहीं हटाया जा सका."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"खारिज करें"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"फिर से कोशिश करें"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"आखिरी उपयोगकर्ता हटाएं?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"इस कार के आखिरी उपयोगकर्ता को हटाने के बाद, आपको एडमिन के अधिकारों वाला नया उपयोगकर्ता खाता बनाना होगा."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"इस उपयोगकर्ता का पूरा डेटा, सभी सेटिंग और ऐप्लिकेशन मिटा दिए जाएंगे. आपको सिस्टम फिर से सेट अप करना होगा."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"नया एडमिन चुनें"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"कम से कम एक एडमिन का होना ज़रूरी है. मौजूदा एडमिन को हटाने से पहले कोई दूसरा एडमिन चुनें."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"एडमिन चुनें"</string>
+    <string name="user_guest" msgid="3465399481257448601">"मेहमान"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"मेहमान"</string>
     <string name="user_switch" msgid="6544839750534690781">"स्विच करें"</string>
     <string name="current_user_name" msgid="3813671533249316823">"आप (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"नाम"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"सेट नहीं है"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"\'उपयोगकर्ता नाम\' में बदलाव करें"</string>
     <string name="users_list_title" msgid="770764290290240909">"उपयोगकर्ता"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s को अनुमतियां दी गईं"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"खाते"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"उपयोगकर्ता"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"खाता जोड़ें"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"कोई खाता जोड़ा नहीं गया है"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> के खाते"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"डेटा को अपने आप सिंक करें"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ऐप्लिकेशन को डेटा अपने आप रीफ़्रेश करने दें"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"अपने आप डेटा सिंक होना चालू करें?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"आपने वेब पर अपने खातों में जो भी बदलाव किए हैं, उनकी कॉपी आपके डिवाइस में अपने आप बन जाएगी.\n\nआपने जो भी बदलाव फ़ोन पर किए हैं, उन्हें कुछ खाते वेब पर भी कॉपी कर सकते हैं. Google खाता इसी तरह काम करता है."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"अपने आप डेटा सिंक होना बंद करें?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"इससे डेटा की बचत होगी, लेकिन हाल ही की जानकारी इकट्ठा करने के लिए आपको हर खाते को मैन्युअल रूप से सिंक करना होगा. अपडेट आने पर आपको सूचनाएं नहीं मिलेंगी."</string>
     <string name="account_details_title" msgid="7529571432258448573">"खाते की जानकारी"</string>
     <string name="add_account_title" msgid="5988746086885210040">"खाता जोड़ें"</string>
     <string name="add_an_account" msgid="1072285034300995091">"कोई खाता जोड़ें"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"खाता हटाएं"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"खाता हटाएं?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"यह खाता हटाने से इसके सभी मैसेज, संपर्क और दूसरा डेटा डिवाइस से मिट जाएगा!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"आपका एडमिन इस बदलाव की अनुमति नहीं देता"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"इस उपयोगकर्ता को हटाएं?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"सभी ऐप्लिकेशन और डेटा मिटा दिए जाएंगे."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"उपयोगकर्ता को हटाया नहीं जा सका."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"फिर से कोशिश करें?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"खारिज करें"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"फिर से कोशिश करें"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"नया उपयोगकर्ता जोड़ें?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो, उस व्यक्ति को अपनी जगह सेट करनी होती है."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"कोई भी उपयोगकर्ता बाकी सभी उपयोगकर्ताओं के लिए ऐप्लिकेशन अपडेट कर सकते हैं."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"खाता नहीं हटाया जा सका."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"खाता सिंक करें"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> में से <xliff:g id="ID_1">%1$d</xliff:g> आइटम के लिए सिंक करना चालू है"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"सभी आइटम के लिए सिंक करना चालू है"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"सभी आइटम के लिए सिंक करना बंद है"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"सिंक की सुविधा बंद है"</string>
+    <string name="sync_error" msgid="6698021343089247914">"सिंक करने में गड़बड़ी"</string>
+    <string name="last_synced" msgid="4745124489150101529">"आखिरी बार <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g> बजे सिंक किया गया"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"अभी सिंक हो रहा है…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"अभी सिंक करने के लिए टैप करें<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"अभी सिंक करें"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"सिंक करना रद्द करें"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"सिंक करने में फ़िलहाल समस्याएं आ रही हैं. यह जल्द ही वापस काम करने लगेगा."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"सुरक्षा"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"स्क्रीन लॉक"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"कोई नहीं"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"पिन"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"पासवर्ड"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"स्क्रीन लॉक करने का तरीका चुनें"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"स्क्रीन लॉक के विकल्प"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"लॉक करने के विकल्प"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"अपना पैटर्न डालें"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"पुष्टि करें"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"फिर से बनाएं"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"स्क्रीन लॉक सेट करना"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"अनलॉक करने के लिए पिन चुनें"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"अनलॉक करने के लिए पैटर्न चुनें"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"अनलॉक करने के लिए पासवर्ड चुनें"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"अनलॉक करने के लिए पासवर्ड चुनें"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"मौजूदा स्क्रीन लॉक"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"सुरक्षा के लिए पैटर्न सेट करें"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"हटाएं"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"आपके आईटी एडमिन ने आम तौर पर इस्तेमाल होने वाले पासवर्ड पर रोक लगा रखी है. कोई दूसरा पासवर्ड बनाएं."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"अंकों को बढ़ते, घटते या दोहराए गए क्रम में लिखने की मंज़ूरी नहीं है."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"स्क्रीन लॉक विकल्प"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> days ago"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"भरोसेमंद डिवाइस जोड़ें"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"भरोसेमंद डिवाइस"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> डिवाइस</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> डिवाइस</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"कनेक्ट होने पर आपका <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> इस कार को अनलॉक कर देगा. अगर किसी के पास आपका <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> है, तो वह इस डिवाइस को एक्सेस कर सकता है"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"पुष्टि करें"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"भरोसेमंद डिवाइस हटाएं"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"हो गया"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"भरोसेमंद डिवाइस सेट अप करने के लिए साथी ऐप्लिकेशन का इस्तेमाल करें. इसके सेट अप हो जाने पर, जब गाड़ी आपके फ़ोन को पहचान लेगी तब आप अपनी उपयोगकर्ता प्रोफ़ाइल अनलॉक कर पाएंगे"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. अपने फ़ोन पर साथी ऐप्लिकेशन डाउनलोड करें"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. डिवाइसों को जोड़ने के लिए अपने फ़ोन पर <xliff:g id="CAR_NAME">%1$s</xliff:g> चुनें"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock इस डिवाइस की सुरक्षा सुविधाओं को नहीं पहचान पा रहा है. आपकी कार की सुरक्षा के लिए, भरोसेमंद डिवाइस उसे तभी अनलॉक रख पाएगा जब आपने कार को पहले अनलॉक किया हो. कार आस-पास होने पर आपका भरोसेमंद डिवाइस उसे अनलॉक रख सकता है, भले ही वह डिवाइस किसी और व्यक्ति के पास हो."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को भरोसेमंद डिवाइस के रूप में जोड़ें"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को भरोसेमंद डिवाइस के रूप में जोड़ लिया गया है"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> का नाम दर्ज नहीं हो सका"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"इसके बाद एक भरोसेमंद डिवाइस जोड़ने के लिए आपको पुष्टि करने का तरीका सेट करना होगा. अगर भरोसेमंद डिवाइस आपके पास नहीं है, तो आपकी प्रोफ़ाइल एक्सेस करने के लिए पुष्टि करना ज़रूरी होगा."</string>
     <string name="forget" msgid="3971143908183848527">"भूल जाएं"</string>
+    <string name="connect" msgid="5861699594602380150">"कनेक्शन जोड़ें"</string>
+    <string name="disconnect" msgid="6140789953324820336">"कनेक्शन हटाएं"</string>
     <string name="delete_button" msgid="5840500432614610850">"मिटाएं"</string>
     <string name="remove_button" msgid="6664656962868194178">"हटाएं"</string>
     <string name="cancel" msgid="750286395700355455">"अभी नहीं"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"डेमो मोड से बाहर निकलें"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"डेमो मोड से बाहर निकलने पर, डेमो खाता मिट जाएगा और सिस्टम का डेटा फ़ैक्ट्री रीसेट हो जाएगा. साथ ही, उपयोगकर्ता का पूरा डेटा भी मिट जाएगा."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"डेमो मोड से बाहर निकलें"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"सेटअप पूरा करें"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"अभी नहीं"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"खारिज करें"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"गाड़ी चलाते समय इस सुविधा का इस्तेमाल नहीं किया जा सकता."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"गाड़ी चलाते समय उपयोगकर्ता को जोड़ा नहीं जा सकता."</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index d8f0a22..48f4101 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"zatamnjenje zaslona, dodirni zaslon, baterija"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"zatamnjenje zaslona, noć, preljev"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Noćni način rada"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Mreža i internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilna mreža"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilni podaci"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Pristupi podacima pomoću mobilne mreže"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Isključiti mobilne podatke?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Potrošnja podataka"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Upozorenje o podacima i ograničenje"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciklus potrošnje podatkovnog prometa"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Postavi upozorenje o potrošnji"</string>
+    <string name="data_warning" msgid="116776633806885370">"Upozorenje o podatkov. prometu"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Postavi ograničenje prometa"</string>
+    <string name="data_limit" msgid="227338836292511425">"Ograničenje podatkov. prometa"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ograničavanje potrošnje podatkovnog prometa"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna jedinica vozila isključit će mobilne podatke kad dosegne ograničenje koje ste postavili.\n\nBudući da potrošnju podatkovnog prometa mjeri glavna jedinica i da se obračun mobilnog operatera može razlikovati, možda biste trebali postaviti strože ograničenje."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Postavljanje i upravljanje bežičnim pristupnim točkama"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Uključivanje Wi-Fija…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Isključivanje Wi-Fija…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Učitavanje popisa Wi‑Fija"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi je onemogućen"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Zaboravljanje mreže nije uspjelo"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Povezivanje s mrežom nije uspjelo"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj mrežu"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi je onemogućen"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Zaporka"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Prikaži zaporku"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Naziv mreže"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Unesite SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sigurnost"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Jačina signala"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Jačina signala"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"brzina veze"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvencija"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP adresa"</string>
+    <string name="show_password" msgid="2074628020371139240">"Prikaži zaporku"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Unesite naziv mreže"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Unesite zaporku"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Loša"</item>
-    <item msgid="2032262610626057081">"Solidna"</item>
-    <item msgid="3859756017461098953">"Dobra"</item>
-    <item msgid="1521103743353335724">"Izvrsna"</item>
+    <item msgid="7683058295076342057">"Loša"</item>
+    <item msgid="1639222824821660744">"Solidna"</item>
+    <item msgid="1838705897358163300">"Dobra"</item>
+    <item msgid="6067166649320533751">"Izvrsna"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Uključi Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth onemogućen"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Pojedinosti o mreži"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC adresa"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP adresa"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska podmreže"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 adrese"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Pristupnik"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Postavke Wi‑Fija"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Automatski uključi Wi-Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi se opet uključuje blizu spremljenih kvalitetnih mreža"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nije dostupno jer je lokacija isključena. Uključite "<annotation id="link">"lokaciju"</annotation></string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Uključiti traženje Wi-Fija?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Uključi"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Uključeno je traženje Wi‑Fi-ja"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatski prijeđi na mobilne podatke"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Koristite mobilne podatke kada Wi-Fi nema pristup internetu. Moguća je naplata potrošnje podatkovnog prometa."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Saznajte više"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Upravljajte vezama, postavite uređaj i mogućnost otkrivanja"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Računalo"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Slušalice"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Snimanje"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Slušalice"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periferni uređaj za unos"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Upareni uređaji"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dostupni uređaji"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nema uparenih uređaja"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nema dostupnih uređaja"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Upareni uređaj"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Ime"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Upotrijebi za"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Promijenite naziv Bluetooth uređaja"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Uređaj bez naziva"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Upareni uređaji"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Uparite novi uređaj"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth će se uključiti radi uparivanja"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Prekinuti vezu uređaja?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Vaše vozilo i <xliff:g id="DEVICE_NAME">%1$s</xliff:g> više neće biti povezani."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth adresa vozila: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth adresa uređaja: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Naziv vozila"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Promijenite naziv vozila"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Promijenite naziv uređaja"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Promijeni naziv"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dostupni uređaji"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profili"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Zahtjev za Bluetooth uparivanje"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Upari i poveži"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetoothov kôd za uparivanje"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN sadrži slova ili simbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Unesite kôd za uparivanje pa pritisnite Return ili Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Obično 0000 ili 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Zahtjev za uparivanje"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Dodirnite za uparivanje s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Jezici"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Jezici i unos"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tipkovnica"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Upravljajte tipkovnicama"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Pretvaranje teksta u govor"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Željeni alat"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Trenutačni alat"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Brzina govora"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Visina glasa"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Vrati na zadano"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Zvuk"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Glasnoća zvona"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Glasnoća navigacije"</string>
@@ -100,31 +140,66 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Mediji"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Postavite glasnoću za glazbu i videozapise"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Melodija zvona telefona"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Zadani zvuk obavijesti"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Zadani zvuk alarma"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikacije i obavijesti"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Pokaži sve aplikacije"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Zadane aplikacije"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informacije o aplikaciji"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Prisilno zaustavi"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Prisilno zaustaviti?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ako prisilno zaustavite aplikaciju, možda će se ponašati nepredviđeno."</string>
     <string name="disable_text" msgid="4358165448648990820">"Onemogući"</string>
     <string name="enable_text" msgid="1794971777861881238">"Omogući"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Deinstaliraj"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ako onemogućite tu aplikaciju, Android i druge aplikacije možda više neće funkcionirati pravilno."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Onemogući aplikaciju"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Dopuštenja"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Verzija: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nije odobreno nijedno dopuštenje"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nije zatraženo nijedno dopuštenje"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Potrošnja podataka"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Potrošnja podatkovnog prometa za aplikacije"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Prisilno zaustavi"</string>
     <string name="computing_size" msgid="5791407621793083965">"Izračunavanje..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatno dopuštenje</item>
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatna dopuštenja</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih dopuštenja</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoćnik i glasovni unos"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija pomoćnik"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Koristi tekst sa zaslona"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Dopustite aplikaciji pomoćniku da pristupi sadržaju zaslona kao tekstu"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Koristi snimku zaslona"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Dopustite aplikaciji pomoćniku da pristupi slici na zaslonu"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Usluga automatskog popunjavanja"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nijedna"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Odabrano"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Pomoćnik će moći čitati podatke o aplikacijama koje se upotrebljavaju u vašem sustavu, uključujući podatke vidljive na zaslonu ili podatke kojima se može pristupiti u aplikacijama."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Provjerite je li ova aplikacija pouzdana&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google automatsko popunjavanje&gt;%1$s&lt;/xliff:g&gt; upotrebljava sadržaj na zaslonu za procjenu onoga što se može automatski popuniti."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Dodaj uslugu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavni zahtjevi za lokaciju"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nema nedavnih zahtjeva za lokaciju"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Dopuštenja na razini aplikacije"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Traženje"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Usluge lokacije"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Traženje Wi‑Fija"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Dopustite aplikacijama i uslugama da traže Wi‑Fi mreže u bilo kojem trenutku, čak i kada je Wi‑Fi isključen. Na taj se način mogu, na primjer, poboljšati značajke i usluge koje se temelje na lokaciji."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Traženje Bluetootha"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Dopustite aplikacijama i uslugama da traže uređaje u blizini u bilo kojem trenutku, čak i kada je Bluetooth isključen. Na taj se način mogu, na primjer, poboljšati značajke i usluge koje se temelje na lokaciji."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sustav"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Ažuriranja sustava"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Ažuriranja sustava"</string>
     <string name="firmware_version" msgid="8491753744549309333">"verziju Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Razina Androidove sigurnosne zakrpe"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Osnovna verzija"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verzija jezgre"</string>
     <string name="build_number" msgid="3997326631001009102">"Broj međuverzije"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth adresa"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nije dostupno"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -141,12 +216,50 @@
     <string name="copyright_title" msgid="4220237202917417876">"Autorska prava"</string>
     <string name="license_title" msgid="936705938435249965">"Licenca"</string>
     <string name="terms_title" msgid="5201471373602628765">"Uvjeti i odredbe"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"WebView licenca sustava"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licence web-prikaza sustava"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Pozadine"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Davatelji satelitskih slika:\n©2014. CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence trećih strana"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Došlo je do problema s učitavanjem licenci."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Učitavanje..."</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak i postat ćete razvojni programer.</item>
+      <item quantity="few">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka i postat ćete razvojni programer.</item>
+      <item quantity="other">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka i postat ćete razvojni programer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Sad ste razvojni programer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nema potrebe, već ste razvojni programer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opcije za razvojne programere"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Poništavanje opcija"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Vraćanje mreže, aplikacija ili uređaja na zadano"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Poništi mrežu"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Time će se na zadano vratiti sve postavke mreže, uključujući:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobilni podaci"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Izbriši sve eSIM-ove vozila"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Time se neće otkazati vaš paket usluge."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Poništavanje eSIM-ova nije uspjelo"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Odaberite mrežu"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Vrati postavke na zadano"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Vratiti na zadano?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Želite li vratiti sve postavke mreže na zadano? Tu radnju nije moguće poništiti!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Vrati postavke na zadano"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Postavke mreže vraćene su na zadano"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Vrati postavke aplikacija na zadano"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Time će se poništiti sve postavke za sljedeće:\n\n"<li>"onemogućene aplikacije"</li>\n<li>"onemogućene obavijesti aplikacija"</li>\n<li>"zadane aplikacije za radnje"</li>\n<li>"ograničenja pozadinskih podataka za aplikacije"</li>\n<li>"sva ograničenja dozvola."</li>\n\n"Nećete izgubiti podatke nijedne aplikacije."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Vrati aplikacije na zadano"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Postavke aplikacija vraćene su na zadano"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Izbriši sve podatke (vrati na tvorničke)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Time će se izbrisati svi podaci s glavne jedinice vozila, uključujući:\n\n"<li>"vaš Google račun"</li>\n<li>"podatke i postavke sustava i aplikacija"</li>\n<li>"preuzete aplikacije"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Trenutačno ste prijavljeni na sljedeće račune:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Na ovom vozilu postoje i drugi korisnici."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Vrati vozilo na zadano"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vratiti na zadano?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Želite li izbrisati sve osobne podatke i preuzete aplikacije? Radnju nije moguće poništiti!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Izbriši sve"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Brisanje"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Pričekajte..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum i vrijeme"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Postavljanje datuma i vremena"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Postavljanje datuma, vremena, vremenske zone i formata"</string>
@@ -166,23 +279,60 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Poredaj po vremenskoj zoni"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Vrijeme"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodavanje korisnika"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj račun"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Brisanje korisnika"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Novi korisnik"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Prijavljeni ste kao administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Sva administratorska dopuštenja"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Dodijeli status administratora"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Korisnik će moći brisati korisnike, uključujući druge administratore, i vratiti sustav na tvorničke postavke."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ta se radnja ne može poništiti."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Da, dodijeli status administratora"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Izrada novih korisnika"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Upućivanje telefonskih poziva"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Poruke putem mobilnih podataka auta"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instaliranje novih aplikacija"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Deinstaliranje aplikacija"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodavanje korisnika"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Novi korisnik"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Dodati novog korisnika?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Svaki korisnik može ažurirati aplikacije za ostale korisnike."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Dosegnuto je ograničenje korisnika"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Možete izraditi najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+      <item quantity="few">Možete izraditi najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+      <item quantity="other">Možete izraditi najviše <xliff:g id="COUNT">%d</xliff:g> korisnika.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Izrada novog korisnika nije uspjela"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Izbrisati ovog korisnika?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Izbrisat će se sve aplikacije i podaci."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Brisanje korisnika nije uspjelo."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Odbaci"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Pokušaj opet"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Brisati zadnjeg korisnika?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Nakon brisanja jedinog preostalog korisnika ovog automobila, izradit će se novi admin. korisnik."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Izbrisat će se svi podaci, postavke i aplikacije povezane s tim korisnikom. Morat ćete ponovo postaviti sustav."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Odaberite novog administratora"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Potreban vam je barem jedan administrator. Da biste izbrisali ovoga, najprije odaberite zamjenu."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Odaberite administratora"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gost"</string>
     <string name="user_switch" msgid="6544839750534690781">"Prebaci"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vi (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nije postavljen"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Uređivanje korisničkog imena"</string>
     <string name="users_list_title" msgid="770764290290240909">"Korisnici"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Dopušteno korisniku %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Računi"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Korisnik"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj račun"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nije dodan nijedan račun"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Računi za korisnika <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatski sinkroniziraj podatke"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Dopusti aplikacijama da automatski osvježavaju podatke"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Uključiti auto. sinkronizaciju?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Sve promjene koje napravite na svojim računima na webu automatski će se kopirati na vaš uređaj.\n\nNeki računi također mogu automatski kopirati na web sve promjene koje napravite na telefonu. Google račun funkcionira na taj način."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Isključiti auto. sinkronizaciju?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Time će se uštedjeti na podatkovnom prometu, ali svaki ćete račun morati ručno sinkronizirati kako biste dobili najnovije podatke. Nećete primati ni obavijesti o njihovom ažuriranju."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Podaci o računu"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Dodaj račun"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Dodajte račun"</string>
@@ -190,16 +340,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Ukloni račun"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Ukloniti račun?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Ako uklonite taj račun, s uređaja će se izbrisati sve njegove poruke, kontakti i ostali podaci!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Vaš administrator ne dopušta tu promjenu"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Ukloniti korisnika?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Izbrisat će se sve aplikacije i podaci."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Uklanjanje korisnika nije uspjelo."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Želite li pokušati ponovo?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Odbaci"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Pokušaj ponovo"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Dodati novog korisnika?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Svaki korisnik može ažurirati aplikacije za ostale korisnike."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Uklanjanje računa nije uspjelo."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sinkronizacija računa"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinkronizacija uključena za sljedeći broj stavki: <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinkronizacija uključena za sve stavke"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinkronizacija isključena za sve stavke"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinkronizacija isključena"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Pogreška sinkronizacije"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Posljednja sinkronizacija: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinkronizacija u tijeku…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Dodirnite da biste sinkronizirali odmah <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkroniziraj sada"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Otkaži sinkronizaciju"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronizacija trenutačno ima problema. Uskoro će nastaviti s radom."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sigurnost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaključavanje zaslona"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ništa"</string>
@@ -207,7 +361,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Zaporka"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Odaberite vrstu zaklj."</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opcije zaključavanja zaslona"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opcije zaključavanja"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Unesite uzorak"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Potvrdi"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Iscrtajte ponovo"</string>
@@ -217,7 +371,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Postavljanje zaključavanja zaslona"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Odaberite PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Odaberite uzorak"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Odaberite zaporku"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Odaberite zaporku"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Trenutačno zaključavanje zaslona"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Radi sigurnosti postavite uzorak"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Ukloni"</string>
@@ -295,7 +449,29 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Vaš je IT administrator blokirao uobičajene zaporke. Pokušajte s nekom drugom zaporkom."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Uzastopno rastući ili padajući slijed brojeva ili ponavljanje brojeva nisu dopušteni."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opcije zaključavanja zaslona"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : prije <xliff:g id="NUM_DAYS">%3$s</xliff:g> dana"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Dodaj pouzdani uređaj"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Pouzdani uređaji"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> uređaj</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> uređaja</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uređaja</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Vaš uređaj <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> otključat će ovaj automobil kad se poveže. Ako vam netko uzme vaš uređaj <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, možda će moći pristupiti ovom uređaju"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Potvrdi"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Ukloni pouzdani uređaj"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Gotovo"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Pouzdani uređaj postavite pomoću popratne aplikacije. Nakon postavljanja moći ćete otključavati svoj korisnički profil kad vozilo otkrije vaš telefon"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Preuzmite popratnu aplikaciju na telefon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Odaberite automobil <xliff:g id="CAR_NAME">%1$s</xliff:g> na telefonu da biste uparili uređaje"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ne može otkriti sigurnosne značajke na ovom uređaju. Radi zaštite vašeg automobila pouzdani uređaj moći će zadržati automobil otključanim samo nakon što ga otključate sami. Vaš pouzdani uređaj može zadržati vaš automobil otključanim kad je u blizini, čak i ako ga drži netko drugi."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Dodajte uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kao pouzdani"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> uspješno je dodan kao pouzdani"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Upis uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije uspio"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Nakon što dodate pouzdani uređaj, morate postaviti način autentifikacije. Ako nemate pouzdani uređaj sa sobom, morat ćete se autentificirati da biste pristupili svojem profilu."</string>
     <string name="forget" msgid="3971143908183848527">"Zaboravi"</string>
+    <string name="connect" msgid="5861699594602380150">"Poveži"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Prekini vezu"</string>
     <string name="delete_button" msgid="5840500432614610850">"Izbriši"</string>
     <string name="remove_button" msgid="6664656962868194178">"Ukloni"</string>
     <string name="cancel" msgid="750286395700355455">"Otkaži"</string>
@@ -305,8 +481,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Napustite demo-način"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Time će se izbrisati demo-račun, a sustav će se vratiti na tvorničko stanje. Svi će se podaci korisnika izgubiti."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Napustite demo-način"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"dovršite postavljanje"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ne sada"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ODBACI"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Značajka nije dostupna tijekom vožnje."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Nije moguće dodati korisnika tijekom vožnje."</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 2ffd429..a5ab2b9 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"képernyő halványítása, érintőképernyő, akkumulátor"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"képernyő halványítása, éjszaka, árnyalás"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Éjszakai mód"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Hálózat és internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilhálózat"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiladat"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Adathozzáférés a mobilhálózaton keresztül"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Kikapcsolja a mobiladatokat?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Adathasználat"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Adatfigyelmeztetés és -korlát"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Alkalmazások adatforgalmi ciklusa"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Figyelmeztetés beállítása"</string>
+    <string name="data_warning" msgid="116776633806885370">"Adatforgalmi figyelmeztetés"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Adatkorlát megadása"</string>
+    <string name="data_limit" msgid="227338836292511425">"Adatforgalmi korlátozás"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Adatforgalom korlátozása"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"A jármű fejegysége kikapcsolja a mobiladat-kapcsolatot, amint eléri a beállított korlátot.\n\nMivel az adatforgalmat a fejegység méri, és a szolgáltató mérései ettől eltérhetnek, érdemes lehet szigorúbb korlátot megadnia."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Vezeték nélküli hozzáférési pontok beállítása és kezelése"</string>
     <string name="wifi_starting" msgid="473253087503153167">"A Wi-Fi bekapcsolása…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"A Wi-Fi kikapcsolása…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi-lista betöltése folyamatban"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi kikapcsolva"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Nem sikerült elfelejteni a hálózatot."</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Nem sikerült hálózathoz csatlakozni."</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Hálózat hozzáadása"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi kikapcsolva"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Csatlakozás"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Jelszó"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Jelszó megjelenítése"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Hálózat neve"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Adja meg az SSID-t"</string>
     <string name="wifi_security" msgid="158358046038876532">"Biztonság"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Jelerősség"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Jelerősség"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Állapot"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Kapcsolódás sebessége"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvencia"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-cím"</string>
+    <string name="show_password" msgid="2074628020371139240">"Jelszó megjelenítése"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Adja meg a hálózat nevét"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Írja be a jelszót"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Gyenge"</item>
-    <item msgid="2032262610626057081">"Közepes"</item>
-    <item msgid="3859756017461098953">"Jó"</item>
-    <item msgid="1521103743353335724">"Kiváló"</item>
+    <item msgid="7683058295076342057">"Gyenge"</item>
+    <item msgid="1639222824821660744">"Közepes"</item>
+    <item msgid="1838705897358163300">"Jó"</item>
+    <item msgid="6067166649320533751">"Kiváló"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth bekapcsolása"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth kikapcsolva"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Hálózati információk"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-cím"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-cím"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Alhálózati maszk"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-címek"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Átjáró"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi-beállítások"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi automatikus bekapcsolása"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"A Wi‑Fi újra bekapcsol jó minőségű mentett hálózatok (például az otthoni hálózat) közelében"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nem áll rendelkezésre, mert a helyszolgáltatás ki van kapcsolva. "<annotation id="link">"Helyszolgáltatás"</annotation>" bekapcsolása."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Bekapcsolja a Wi‑Fi-alapú keresést?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Bekapcsolás"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi-keresés bekapcsolva"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatikus váltás mobiladat-kapcsolatra"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Mobilhálózat használata, ha nincs Wi-Fi-kapcsolat. A szolgáltató adatforgalmi díjat számíthat fel."</string>
+    <string name="learn_more" msgid="8214605928933358604">"További információ"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Kapcsolatok kezelése, eszköz nevének és felfedezhetőségének beállítása"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Számítógép"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Képalkotó"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Fejhallgató"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Beviteli periféria"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Párosított eszközök"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Rendelkezésre álló eszközök"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nincsenek párosított eszközök"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nincsenek rendelkezésre álló eszközök"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Párosított eszköz"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Név"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Használat módja:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Módosítsa a Bluetooth-eszköz nevét"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Név nélküli eszköz"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Párosított eszközök"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Új eszköz párosítása"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"A Bluetooth bekapcsol a párosítás végrehajtása érdekében"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Leválasztja az eszközt?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Járműve le lesz választva a következőről: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"A jármű Bluetooth-címe: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Az eszköz Bluetooth-címe: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Jármű neve"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Jármű átnevezése"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Eszköz átnevezése"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Átnevezés"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Rendelkezésre álló eszközök"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profilok"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth párosítási kérelem"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Párosítás és csatlakozás"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-párosítókód"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"A PIN-kód betűket vagy szimbólumokat tartalmaz"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Gépelje be a párosítókódot, majd nyomja meg az Enter vagy a Return gombot"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Általában 0000 vagy 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Párosítási kérelem"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Koppintson a(z) <xliff:g id="DEVICE_NAME">%1$s</xliff:g> eszközzel való párosításhoz."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Nyelvek"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Nyelvek és bevitel"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Billentyűzet"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Billentyűzetek kezelése"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Szövegfelolvasás"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Elsődleges motor"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Jelenlegi motor"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Beszéd sebessége"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Hangmagasság"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Visszaállítás"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Hang"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Csengés hangereje"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigáció hangereje"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Média"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Zenék és videók hangerejének beállítása"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Ébresztő"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefon csengőhangja"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Alapértelmezett értesítőhang"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Alapértelmezett ébresztőhang"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Alkalmazások és értesítések"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Összes alkalmazás mutatása"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Alapértelmezett alkalmazások"</string>
     <string name="applications_settings" msgid="794261395191035632">"Alkalmazásinformáció"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Kényszerített leállítás"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Kényszeríti a leállítást?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ha leállásra kényszeríti az alkalmazást, lehetséges, hogy hibásan fog működni."</string>
     <string name="disable_text" msgid="4358165448648990820">"Letiltás"</string>
     <string name="enable_text" msgid="1794971777861881238">"Engedélyezés"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Eltávolítás"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ha letiltja ezt az alkalmazást, akkor előfordulhat, hogy az Android- és más alkalmazások nem működnek majd megfelelően."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Alkalmazás letiltása"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Engedélyek"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Verzió: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nincsenek megadott engedélyek"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nincsenek kért engedélyek"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Adathasználat"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Alkalmazás adathasználata"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Kényszerített leállítás"</string>
     <string name="computing_size" msgid="5791407621793083965">"Számítás…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> további engedély</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> további engedély</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Segédalkalmazás és hangbevitel"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Segédalkalmazás"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Képernyő szövegének használata"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"A segédalkalmazás hozzáférhet a képernyőn megjelenő tartalmakhoz szövegként"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Képernyőkép használata"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"A segédalkalmazás hozzáférhet az aktuális képernyőképhez"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Automatikus kitöltés"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nincs"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Kijelölve"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"A segéd hozzáfér majd a rendszer éppen használatban lévő alkalmazásainak információihoz, beleértve a képernyőn megjelenő vagy az alkalmazásokban hozzáférhető információkat is."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Győződjön meg arról, hogy az alkalmazás megbízható.&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; A(z) &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; az Ön képernyőjén szereplő információk alapján határozza meg, hogy mit lehet automatikusan kitölteni."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Szolgáltatás hozzáadása"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Hely"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Legutóbbi helylekérdezések"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nincsenek friss helylekérdezések"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Alkalmazásszintű engedélyek"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Keresés"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Helyszolgáltatások"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi-alapú keresés"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Engedélyezi az alkalmazásoknak és szolgáltatásoknak, hogy Wi-Fi-hálózatokat keressenek még akkor is, ha ki van kapcsolva a Wi-Fi. Ez például a helyalapú funkciók és szolgáltatások javítására használható."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-alapú keresés"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Engedélyezi az alkalmazásoknak és szolgáltatásoknak, hogy közeli eszközöket keressenek még akkor is, ha ki van kapcsolva a Bluetooth. Ez például a helyalapú funkciók és szolgáltatások javítására használható."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Rendszer"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Rendszerfrissítések"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Rendszerfrissítések"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-verzió"</string>
     <string name="security_patch" msgid="4794276590178386903">"Androidos biztonsági hibajavító csomag szintje"</string>
     <string name="model_info" msgid="4966408071657934452">"Modell"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Alapsáv verziója"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel verziója"</string>
     <string name="build_number" msgid="3997326631001009102">"Buildszám"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-cím"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nem hozzáférhető"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Állapot"</string>
     <string name="device_status" msgid="267298179806290920">"Állapot"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Szerzői jog"</string>
     <string name="license_title" msgid="936705938435249965">"Licenc"</string>
     <string name="terms_title" msgid="5201471373602628765">"Általános Szerződési Feltételek"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"WebView-rendszerlicenc"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"A rendszer WebView-licencei"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Háttérképek"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"A műholdképek szolgáltatói:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Harmadik felek licencei"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Probléma adódott a licencek betöltésekor."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Betöltés…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> lépésre van attól, hogy fejlesztő legyen.</item>
+      <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> lépésre van attól, hogy fejlesztő legyen.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Ön mostantól már fejlesztő!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nincs rá szükség, Ön már fejlesztő."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Fejlesztői beállítások"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Beállítások visszaállítása"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Hálózat, alkalmazások vagy eszköz visszaállítása"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Hálózati adatok visszaállítása"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ez visszaállítja az összes hálózati beállítást, beleértve a következőket:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobiladat"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"A jármű összes eSIM-jének törlése"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Ezzel előfizetése nem szűnik meg."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Nem lehet visszaállítani az eSIM-eket"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Hálózat kiválasztása"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Beállítások visszaállítása"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Visszaállítja?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Visszaállítja az összes hálózati beállítást? Ezt a műveletet nem lehet visszavonni."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Beállítások visszaállítása"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"A hálózati beállítások vissza lettek állítva."</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Alkalmazásbeállítások visszaállítása"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Ez visszaállítja a következőkre vonatkozó összes beállítást:\n\n"<li>"Letiltott alkalmazások"</li>\n<li>"Letiltott alkalmazásértesítések"</li>\n<li>"Alapértelmezett alkalmazások adott műveletekhez"</li>\n<li>"Az alkalmazások háttéradataira vonatkozó korlátozások"</li>\n<li>"Minden engedélykorlátozás"</li>\n\n"Az alkalmazásadatok nem vesznek el."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Alkalmazások visszaállítása"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Az alkalmazásbeállítások vissza lettek állítva"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Minden adat törlése (visszaállítás)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Ez minden adatot töröl a jármű fejegységéből, beleértve a következőket:\n\n"<li>"Az Ön Google-fiókja"</li>\n<li>"A rendszer- és alkalmazásadatok, illetve beállítások"</li>\n<li>"A letöltött alkalmazások"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Jelenleg a következő fiókokba van bejelentkezve:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Más felhasználók is vannak a járművön."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Jármű visszaállítása"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Visszaállítja?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Törli az összes személyes adatot és letöltött alkalmazást? A műveletet nem lehet visszavonni."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Minden törlése"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Törlés"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Kérjük, várjon…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Dátum és idő"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Dátum és idő beállítása"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Dátum, idő, időzóna és formátumok beállítása"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Rendezés időzóna szerint"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Dátum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Idő"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Felhasználó felvétele"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Fiók hozzáadása"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Felhasználó törlése"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Új felhasználó"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Vendég"</string>
     <string name="user_admin" msgid="1535484812908584809">"Rendszergazda"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Rendszergazdaként bejelentkezve"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Összes adminisztrátori engedély"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Rendszergazdai jogosultság megadása"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"A felhasználó képes lesz más felhasználókat törölni, beleértve a többi rendszergazdát is, és vissza tudja majd állítani a rendszer gyári beállításait."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"A művelet nem vonható vissza."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Igen, tegye rendszergazdává"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Új felhasználók létrehozása"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefonhívások"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS-ezés az autó mobiladatából"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Új alkalmazások telepítése"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Alkalmazások eltávolítása"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Felhasználó felvétele"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Új felhasználó"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Hozzáad új felhasználót?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját felületét."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Bármely felhasználó frissítheti az alkalmazásokat valamennyi felhasználó számára."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Maximális felhasználószám elérve"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Legfeljebb <xliff:g id="COUNT">%d</xliff:g> felhasználót lehet létrehozni.</item>
+      <item quantity="one">Csak egy felhasználót lehet létrehozni.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Az új felhasználó létrehozása sikertelen"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Törli a felhasználót?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Az összes alkalmazás és adat törlődik."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Nem sikerült törölni a felhasználót."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Bezárás"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Újra"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Törli az utolsót?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Az autó utolsó felhasználójának törlése után új adminisztrátort hoz létre a rendszer."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"A felhasználóhoz társított minden adat, beállítás és alkalmazás törlődik. Újra be kell majd állítania a rendszert."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Új adminisztrátor kiválasztása"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Legalább egy adminisztrátorra szükség van. Ha törölni szeretné a jelenlegit, előbb válassza ki azt, akivel helyettesítené."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Adminisztrátor választása"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Vendég"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Vendég"</string>
     <string name="user_switch" msgid="6544839750534690781">"Váltás"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Ön (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Név"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nincs beállítva"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Felhasználónév szerkesztése"</string>
     <string name="users_list_title" msgid="770764290290240909">"Felhasználók"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s megkapta az engedélyeket"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Fiókok"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Felhasználó"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Fiók hozzáadása"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nincs hozzáadott fiók"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> fiókjai"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Adatok automatikus szinkronizálása"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Az adatok automatikus frissítésének engedélyezése"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Bekapcsolja a szinkronizálást?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Az interneten végrehajtott fiókmódosítások automatikusan megjelennek az eszközén is.\n\nEgyes fiókok esetében ez fordítva is igaz. A Google-fiók így működik."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Kikapcsolja a szinkronizálást?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Ez mérsékli az adathasználatot, de minden egyes fiókot manuálisan kell majd szinkronizálnia a legfrissebb információk begyűjtéséhez. Emellett a frissítésekről sem kap értesítéseket."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Fiókadatok"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Fiók hozzáadása"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Fiók hozzáadása"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Fiók eltávolítása"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Eltávolítja a fiókot?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"A fiók eltávolításával az összes üzenetet, névjegyet és egyéb adatot is törli az eszközről."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Ezt a módosítást nem engedélyezi a rendszergazda"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Törli a felhasználót?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Az összes alkalmazás és adat törlődik."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"A felhasználó eltávolítása sikertelen."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Újrapróbálja?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Elvetés"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Újra"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Hozzáad új felhasználót?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját felületét."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Bármely felhasználó frissítheti az alkalmazásokat valamennyi felhasználó számára."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Nem sikerült eltávolítani a fiókot."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Fiók szinkronizálása"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Szinkronizálás bekapcsolva <xliff:g id="ID_2">%2$d</xliff:g>/<xliff:g id="ID_1">%1$d</xliff:g> elemnél"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Szinkronizálás bekapcsolva minden elemnél"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Szinkronizálás kikapcsolva minden elemnél"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Szinkronizálás: KI"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Szinkronizálási hiba"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Utolsó szinkronizálás: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Szinkronizálás…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Koppintson az azonnali szinkronizáláshoz<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Szinkronizálás most"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Szinkronizálás megszakítása"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"A szinkronizálással problémák vannak. Hamarosan helyreáll."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Biztonság"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Képernyőzár"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Egyik sem"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-kód"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Jelszó"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Lezárás típusa"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"A képernyőzár beállításai"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Zárolási lehetőségek"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Adja meg a mintáját"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Megerősítés"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Újrarajzolás"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Képernyőzár beállítása"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN-kód kiválasztása"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Válassza ki a mintát"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Jelszó kiválasztása"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Jelszó kiválasztása"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Jelenlegi képernyőzár"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"A biztonság érdekében állítson be mintát"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Törlés"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Rendszergazdája letiltotta a gyakran használt jelszavakat. Próbálkozzon másik jelszóval."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Növekvő, csökkenő vagy ismétlődő számsor megadása nem engedélyezett."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"A képernyőzár beállításai"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g> nappal ezelőtt"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Megbízható eszköz hozzáadása"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Megbízható eszközök"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> eszköz</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> eszköz</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"A(z) <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> kapcsolódáskor feloldja az autózárat. Ha valaki elveszi a(z) <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> eszközét, akkor az illető hozzáférhet az eszközhöz"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Megerősítés"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Megbízható eszköz eltávolítása"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Kész"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Állítson be megbízható eszközt a társalkalmazással. A beállítás után feloldhatja felhasználói profilját, amikor a jármű érzékeli telefonját"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Töltse le telefonjára a társalkalmazást."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Az eszközök párosításához válassza a(z) <xliff:g id="CAR_NAME">%1$s</xliff:g> elemet a telefonon."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"A Smart Lock nem észleli az eszköz biztonsági funkcióit. Az autó védelme érdekében a megbízható eszköz csak akkor tarthatja feloldott állapotban az autót, ha Ön előtte elvégezte a feloldást. A megbízható eszköz feloldott állapotban tarthatja az autót, ha a közelében van, még akkor is, ha valaki más tartja az eszközt."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> hozzáadása megbízható eszközként"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Sikerült a(z) <xliff:g id="DEVICE_NAME">%1$s</xliff:g> eszközt megbízhatóként hozzáadni"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Nem sikerült a(z) <xliff:g id="DEVICE_NAME">%1$s</xliff:g> regisztrációja"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ha megbízható eszközt szeretne hozzáadni, akkor a következő lépésben hitelesítési módot kell megadnia. Ha nincs Önnél megbízható eszköze, hitelesítésre lesz szükség a profiljához való hozzáféréshez."</string>
     <string name="forget" msgid="3971143908183848527">"Elfelejtés"</string>
+    <string name="connect" msgid="5861699594602380150">"Csatlakozás"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Leválasztás"</string>
     <string name="delete_button" msgid="5840500432614610850">"Törlés"</string>
     <string name="remove_button" msgid="6664656962868194178">"Eltávolítás"</string>
     <string name="cancel" msgid="750286395700355455">"Mégse"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Kilépés a demó módból"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ez törli a demófiókot, és visszaállítja a rendszer gyári adatait. Az összes felhasználói adat elveszik."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Kilépés a demóból"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"beállítás befejezése"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"most nem"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ELVETÉS"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Vezetés közben nem áll rendelkezésre a funkció."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Vezetés közben nem lehet hozzáadni felhasználót."</string>
 </resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 8529553..fba0362 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"խամրեցված էկրան, հպէկրան, մարտկոց"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"խամրեցված էկրան, գիշեր, երանգ"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Գիշերային ռեժիմ"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Ցանց և ինտերնետ"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Բջջային ցանց"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Բջջային ինտերնետ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Օգտվել բջջային ինտերնետից"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Անջատե՞լ բջջային ինտերնետը"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Թրաֆիկի օգտագործում"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Զգուշացումներ և սահմանաչափ"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Վիճակագրության ժամանակահատվածը"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Երբ զգուշացնել"</string>
+    <string name="data_warning" msgid="116776633806885370">"Զգուշացում թրաֆիկի մասին"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Սահմանել թրաֆիկի սահմանաչափը"</string>
+    <string name="data_limit" msgid="227338836292511425">"Թրաֆիկի սահմանաչափը"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Տվյալների օգտագործման սահմանափակում"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Նշված սահմանաչափն անցնելու դեպքում մեքենայի գլխավոր վահանակը կանջատի բջջային ինտերնետը։\n\nՕպերատորի վիճակագրությունը կարող է տարբերվել գլխավոր վահանակի տվյալներից, ուստի խորհուրդ ենք տալիս նշել նախատեսվածից ցածր սահմանաչափ։"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Կարգավորել և կառավարել անլար միացման կետերը"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi-ը միանում է…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi-ն անջատվում է…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi-ի ցանկի բեռնում"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi-ն անջատած է"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Չհաջողվեց հեռացնել ցանցը"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Չհաջողվեց միանալ ցանցին"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Ավելացնել ցանց"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi-ն անջատած է"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Միանալ"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Գաղտնաբառ"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Ցուցադրել գաղտնաբառը"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Ցանցի անունը"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Մուտքագրեք SSID-ն"</string>
     <string name="wifi_security" msgid="158358046038876532">"Անվտանգություն"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Ազդանշանի հզորությունը"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Ազդանշանի հզորությունը"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Կարգավիճակ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Կապի արագությունը"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Հաճախականություն"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP հասցե"</string>
+    <string name="show_password" msgid="2074628020371139240">"Ցուցադրել գաղտնաբառը"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Մուտքագրեք ցանցի անունը"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Մուտքագրեք գաղտնաբառը"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Թույլ"</item>
-    <item msgid="2032262610626057081">"Բավարար"</item>
-    <item msgid="3859756017461098953">"Լավ"</item>
-    <item msgid="1521103743353335724">"Գերազանց"</item>
+    <item msgid="7683058295076342057">"Թույլ"</item>
+    <item msgid="1639222824821660744">"Միջին"</item>
+    <item msgid="1838705897358163300">"Լավ"</item>
+    <item msgid="6067166649320533751">"Գերազանց"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Միացնել Bluetooth-ը"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth-ն անջատած է"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Մբիթ/վ"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 ԳՀց"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ԳՀց"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Ցանցի տվյալներ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC հասցե"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP հասցե"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Ենթացանցի դիմակ"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 հասցեներ"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Անցախուց"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi-ի կարգավորումներ"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Ավտոմատ միացնել Wi‑Fi-ը"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi-ը կրկին կմիանա պահված բարձր որակի ցանցերի (օր.՝ ձեր տան ցանցի) մոտակայքում"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Անհասանելի է, քանի որ տեղորոշումն անջատված է։ Միացրեք "<annotation id="link">"այն"</annotation>"։"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Միացնե՞լ Wi-Fi ցանցերի որոնումը"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Միացնել"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi-Fi ցանցերի որոնումը միացված է"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Ավտոմատ կերպով անցնել բջջային ինտերնետի"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Օգտագործել բջջային ինտերնետը, եթե չի հաջողվում միանալ համացանցին Wi-Fi-ի միջոցով։ Կարող են կիրառվել գանձումներ։"</string>
+    <string name="learn_more" msgid="8214605928933358604">"Մանրամասն"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Կարգավորել միացումները, սարքի անունը և հայտնաբերելիությունը"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Համակարգիչ"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Ականջակալ-խոսափող"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Հեռախոս"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Տեսախցիկ"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Ականջակալ"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Ներածման արտաքին սարք"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Զուգակցված սարքեր"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Հասանելի սարքեր"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Զուգակցված սարքեր չկան"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Հասանելի սարքեր չկան"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Զուգակցված սարք"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Անուն"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Օգտագործել հետևյալի համար՝"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Փոխեք Bluetooth սարքի անունը"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Անանուն սարք"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Զուգակցված սարքեր"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Զուգակցել նոր սարք"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth-ը կմիանա"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Անջատե՞լ սարքը"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Ձեր մեքենան կանջատվի <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքից:"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Ավտոմեքենայի Bluetooth հասցեն՝ <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Սարքի Bluetooth հասցեն՝ <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Ավտոմեքենայի անունը"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Ավտոմեքենայի վերանվանում"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Սարքի վերանվանում"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Վերանվանել"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Հասանելի սարքեր"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Պրոֆիլներ"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth-ով զուգակցման հարցում"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Զուգակցել և միանալ"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-ով զուգակցման կոդ"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN կոդը տառեր և նշաններ է պարունակում"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Մուտքագրեք զուգակցման կոդը, ապա սեղմեք Վերադառնալ կամ Մտնել"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Սովորաբար 0000 կամ 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Զուգակցման հարցում"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Հպեք` <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի հետ զուգակցելու համար:"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Լեզուներ"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Լեզուներ և մուտքագրում"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Ստեղնաշար"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Կառավարել ստեղնաշարերը"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Տեքստի հնչեցում"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Կանխադրված սինթեզատոր"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Ընթացիկ սինթեզատոր"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Խոսքի արագություն"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Ձայներանգ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Զրոյացնել"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Ձայն"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Զանգի ձայնը"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Նավիգացիայի ձայնը"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Մեդիա"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Կարգավորել երաժշտության և տեսանյութերի ձայնը"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Զարթուցիչ"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Հեռախոսի զանգերանգը"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Ծանուցման կանխադրված ազդանշանը"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Զարթուցիչի կանխադրված ազդանշանը"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Հավելվածներ և ծանուցումներ"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Ցուցադրել բոլոր հավելվածները"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Կանխադրված հավելվածներ"</string>
     <string name="applications_settings" msgid="794261395191035632">"Հավելվածի մասին"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Ստիպողաբար դադարեցնել"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Ստիպողաբար դադարեցնե՞լ"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Հավելվածի ստիպողաբար դադարեցումը կարող է ազդել դրա աշխատանքի վրա։"</string>
     <string name="disable_text" msgid="4358165448648990820">"Անջատել"</string>
     <string name="enable_text" msgid="1794971777861881238">"Միացնել"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Ապատեղադրել"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Եթե անջատեք այս հավելվածը, Android-ը և այլ հավելվածներ հնարավոր է՝ սխալներով աշխատեն:"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Անջատել հավելվածը"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Թույլտվություններ"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Տարբերակ՝ %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Թույլտվություններ չեն տրվել"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Թույլտվությունների հարցում չի արվել"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Թրաֆիկի օգտագործում"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Հավելվածի թրաֆիկ"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Ստիպողաբար դադարեցնել"</string>
     <string name="computing_size" msgid="5791407621793083965">"Հաշվարկում…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> լրացուցիչ թույլտվություն</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> լրացուցիչ թույլտվություն</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Հուշումներ և ձայնային ներածում"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Օգնական հավելված"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Օգտագործել էկրանի տեքստը"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Թույլ տալ օգնական հավելվածին օգտագործել էկրանի տեքստը"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Օգտագործել սքրինշոթը"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Թույլ տալ օգնական հավելվածին օգտագործել էկրանի պատկերները"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Ինքնալրացման ծառայություն"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ոչ մի"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Նշված"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Օգնականը կկարողանա կարդալ համակարգում օգտագործվող հավելվածների մասին տվյալները, այդ թվում՝ էկրանին ցուցադրվող կամ հավելվածներից ստացվող տեղեկությունները:"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Համոզվեք, որ այս հավելվածը վստահելի է&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google-ի ինքնալրացման ծառայությունը&gt;%1$s&lt;/xliff:g&gt; վերլուծում է էկրանի պարունակությունը և գտնում է դաշտերը, որոնք կարող են ինքնալրացվել:"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Ավելացնել ծառայություն"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Տեղորոշում"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Տեղադրության տվյալների վերջին հարցումները"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Վերջերս տեղորոշման տվյալների հարցումներ չեն արվել"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Հավելվածի թույլտվություններ"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Որոնում"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Տեղորոշման ծառայություններ"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi ցանցերի որոնում"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Թույլ տալ հավելվածներին և ծառայություններին որոնել Wi‑Fi ցանցեր ցանկացած ժամանակ, նույնիսկ եթե Wi-Fi-ն անջատած է: Դա կարող է լավացնել տեղորոշում օգտագործող գործառույթներն ու ծառայությունները:"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth սարքերի որոնում"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Թույլ տալ հավելվածներին և ծառայություններին որոնել մոտակայքում գտնվող սարքեր ցանկացած ժամանակ, նույնիսկ եթե Bluetooth-ն անջատած է: Դա կարող է լավացնել տեղորոշում օգտագործող գործառույթներն ու ծառայությունները:"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Համակարգ"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Համակարգի թարմացումներ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Համակարգի թարմացումներ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-ի տարբերակը"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-ի խոցելիության շտկման մակարդակը"</string>
     <string name="model_info" msgid="4966408071657934452">"Մոդել"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-ի տարբերակը"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Միջուկի տարբերակը"</string>
     <string name="build_number" msgid="3997326631001009102">"Տարբերակի համարը"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-ի հասցե"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Հասանելի չէ"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Կարգավիճակ"</string>
     <string name="device_status" msgid="267298179806290920">"Կարգավիճակ"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Հեղինակային իրավունք"</string>
     <string name="license_title" msgid="936705938435249965">"Արտոնագիր"</string>
     <string name="terms_title" msgid="5201471373602628765">"Օգտագործման պայմաններ"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Համակարգի WebView լիցենզիա"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Համակարգի WebView արտոնագրեր"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Պաստառներ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Արբանյակային լուսանկարներ՝\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Այլ արտոնագրեր"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Չհաջողվեց բեռնել արտոնագրերը:"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Բեռնում…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Մշակող դառնալու համար ձեզ մնացել է <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> քայլ</item>
+      <item quantity="other">Մշակող դառնալու համար ձեզ մնացել է <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> քայլ</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Դուք արդեն մշակող եք:"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Կարիք չկա, դուք արդեն իսկ մշակող եք:"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Մշակողների համար"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Կարգավորումների վերակայում"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Ցանցի, հավելվածների և սարքի վերակայում"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Զրոյացնել ցանցի կարգավորումները"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ցանցի բոլոր կարգավորումները կվերակայվեն, այդ թվում՝"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi-Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Բջջային ինտերնետ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Ջնջել մեքենայի բոլոր eSIM քարտերը"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Ձեր սակագնային պլանը չի չեղարկվի:"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Չհաջողվեց վերակայել eSIM քարտերը"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Ընտրեք ցանց"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Վերակայել կարգավորումները"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Վերակայե՞լ"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Վերակայե՞լ ցանցի բոլոր կարգավորումները: Այս գործողությունը հնարավոր չի լինի հետարկել:"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Վերակայել կարգավորումները"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Ցանցի կարգավորումները վերակայվել են"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Վերակայել հավելվածների կարգավորումները"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Հետևյալ կարգավորումները կզրոյանան՝\n\n"<li>"անջատված հավելվածները,"</li>\n<li>"հավելվածների անջատված ծանուցումները,"</li>\n<li>"կանխադրված հավելվածները,"</li>\n<li>"ֆոնային ռեժիմում տվյալների փոխանցման սահմանափակումները,"</li>\n<li>"թույլտվությունների բոլոր սահմանափակումները։"</li>\n\n"Հավելվածների տվյալները կպահպանվեն։"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Վերակայել կարգավորումները"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Հավելվածների կարգավորումները վերակայվեցին"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Ջնջել բոլոր տվյալները (գործ. վերակայում)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Մեքենայի գլխավոր վահանակից կջնջվեն բոլոր տվյալները, այդ թվում՝\n\n"<li>"Ձեր Google հաշիվը"</li>\n<li>"Համակարգի և հավելվածների տվյալներն ու կարգավորումները"</li>\n<li>"Ներբեռնված հավելվածները"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Դուք մտել եք հետևյալ հաշիվներ՝"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Այս մեքենայում այլ օգտատերեր կան:"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Զրոյացնել կարգավորումները"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Զրոյացնե՞լ"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Ջնջե՞լ բոլոր անձնական տեղեկությունները և ներբեռնված հավելվածները: Դուք այլևս չեք կարողանա հետարկել այս գործողությունը:"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Ջնջել ամեն ինչ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Ջնջում"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Խնդրում ենք սպասել..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Ամսաթիվ և ժամ"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Սահմանել ամսաթիվը և ժամը"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Սահմանել ամսաթիվը, ժամը, ժամային գոտին և ձևաչափերը"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Տեսակավորել ըստ ժամային գոտու"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Ամսաթիվ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Ժամանակ"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Ավելացնել օգտատեր"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Ավելացնել հաշիվ"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Ջնջել օգտատիրոջը"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Նոր օգտատեր"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Հյուր"</string>
     <string name="user_admin" msgid="1535484812908584809">"Ադմինիստրատոր"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Դուք մտել եք որպես ադմինիստրատոր"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Ադմինիստրատորի բոլոր թույլտվությունները"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Դարձնել ադմինիստրատոր"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Օգտատերը կկարողանա ջնջել այլ օգտատերերի և ադմինիստրատորների, ինչպես նաև վերակայել համակարգի գործարանային կարգավորումները:"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Այս գործողությունը hնարավոր չէ հետարկել:"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Այո, դարձնել ադմինիստրատոր"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Ստեղծել նոր օգտատերեր"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Զանգել"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS-ներ մեքենայի ինտերնետի միջոցով"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Տեղադրել նոր հավելվածներ"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Ապատեղադրել հավելվածներ"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Ավելացնել օգտատեր"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Նոր օգտատեր"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Ավելացնե՞լ նոր օգտատեր"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Երբ դուք նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Ցանկացած օգտատեր կարող է թարմացնել հավելվածները բոլոր մյուս հաշիվների համար:"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Սահմանաչափը սպառված է"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Դուք կարող եք ստեղծել մինչև <xliff:g id="COUNT">%d</xliff:g> օգտատեր:</item>
+      <item quantity="other">Դուք կարող եք ստեղծել մինչև <xliff:g id="COUNT">%d</xliff:g> օգտատեր:</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Չհաջողվեց ստեղծել նոր օգտատեր"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Հեռացնե՞լ պրոֆիլը"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Բոլոր հավելվածներն ու տվյալները կջնջվեն:"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Չհաջողվեց հեռացնել օգտատիրոջը"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Փակել"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Նորից փորձել"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Հեռացնե՞լ վերջին օգտատիրոջը"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Համակարգում վերջին օգտատիրոջը հեռացնելուց հետո ձեզ կառաջարկվի ընտրել ադմինիստրատորի նոր պրոֆիլ։"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Բոլոր տվյալները, կարգավորումներն ու հավելվածները, որոնք կապված են այս օգտատիրոջ հետ, կջնջվեն։ Հարկավոր կլինի նորից կարգավորել համակարգը։"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Ընտրեք նոր ադմինիստրատոր"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Հարկավոր է ընտրել առնվազն մեկ ադմինիստրատոր։ Այս ադմինիստրատորին հեռացնելուց առաջ ընտրեք նրան փոխարինողին։"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Ընտրել ադմինիստրատոր"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Հյուր"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Հյուր"</string>
     <string name="user_switch" msgid="6544839750534690781">"Փոխել օգտատիրոջը"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Դուք (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Անուն"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Կարգավորված չէ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Օգտատիրոջ անվան փոփոխում"</string>
     <string name="users_list_title" msgid="770764290290240909">"Օգտատերեր"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s-ի թույլտվությունները"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Հաշիվներ"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Օգտատեր"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Ավելացնել հաշիվ"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Հաշիվներ չեն ավելացվել"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>-ի հաշիվներ"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Ավտոմատ համաժամեցնել տվյալները"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Թույլ տալ հավելվածներին ավտոմատ թարմացնել տվյալները"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Միացնե՞լ ավտոմատ համաժամեցումը"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Համացանցում կատարած ցանկացած փոփոխություն ավտոմատ կպատճենվի ձեր սարքում:\n\nՈրոշ հաշիվներ կարող են հեռախոսով կատարած փոփոխություններն ավտոմատ պատճենել համացանցում: Google հաշիվն աշխատում է հենց այդպես:"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Անջատե՞լ ավտոմատ համաժամեցումը"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Դա կկրճատի թրաֆիկի օգտագործումը, բայց դուք պետք է ձեռքով համաժամեցնեք բոլոր հաշիվների տվյալները։ Թարմացումների մասին ծանուցումներ չեն ցուցադրվի։"</string>
     <string name="account_details_title" msgid="7529571432258448573">"Հաշվի մասին"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Ավելացրեք հաշիվ"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Ավելացրեք հաշիվ"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Հեռացնել հաշիվը"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Հեռացնե՞լ հաշիվը"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Սարքից կջնջվեն նաև հաշվի բոլոր հաղորդագրությունները, կոնտակտներն ու մյուս տվյալները:"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Ձեր ադմինիստրատորը չի թույլատրում այս փոփոխությունը"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Հեռացնե՞լ այս օգտատիրոջը"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Բոլոր հավելվածներն ու տվյալները կջնջվեն:"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Չհաջողվեց հեռացնել օգտատիրոջը"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Կրկին փորձե՞լ:"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Փակել"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Կրկնել"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Ավելացնե՞լ նոր օգտատեր"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Երբ դուք նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Ցանկացած օգտատեր կարող է թարմացնել հավելվածները բոլոր մյուս հաշիվների համար:"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Չհաջողվեց հեռացնել հաշիվը"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Հաշվի համաժամեցում"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Համաժամեցումը միացված է <xliff:g id="ID_2">%2$d</xliff:g> տարրերից <xliff:g id="ID_1">%1$d</xliff:g>-ի համար"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Համաժամեցումը միացված է բոլոր տարրերի համար"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Համաժամեցումն անջատված է բոլոր տարրերի համար"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Համաժամեցումն անջատված է"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Համաժամեցման սխալ"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Վերջին համաժամեցումը` <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Համաժամեցումը ընթացքի մեջ է…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Հպեք` համաժամեցնելու համար<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Համաժամացնել հիմա"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Չեղարկել համաժամեցումը"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Համաժամեցման ընթացքում խնդիրներ են առաջացել: Կարճ ժամանակ անց այն կվերականգնվի:"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Անվտանգություն"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Էկրանի կողպում"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ոչ մեկը"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN կոդ"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Գաղտնաբառ"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Ընտրեք կողպման եղանակ"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Էկրանի կողպման տարբերակներ"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Կողպման տարբերակներ"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Մուտքագրեք նախշը"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Հաստատել"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Նորից գծել"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Էկրանի կողպման կարգավորում"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Ընտրեք ձեր PIN-ը"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Ընտրեք ձեր նախշը"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Ընտրեք ձեր գաղտնաբառը"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Ընտրեք ձեր գաղտնաբառը"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Կողպման ընթացիկ եղանակը"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Անվտանգության համար ավելացրեք նախշ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Մաքրել"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ՏՏ ադմինիստրատորն արգելափակել է պարզ գաղտնաբառերը: Փորձեք մեկ այլ գաղտնաբառ:"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Թվանշանների աճող, նվազող կամ կրկնվող հաջորդականությունն արգելված է:"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Էկրանի կողպման տարբերակներ"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> – <xliff:g id="NUM_DAYS">%3$s</xliff:g> օր առաջ"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Ավելացնել վստահելի սարք"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Վստահելի սարքեր"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> սարք</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> սարք</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Միացված լինելու դեպքում ձեր <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> սարքը կկարողանա ապակողպել այս մեքենան: Եթե ձեր <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>-ը ինչ-որ մեկի մոտ հայտնվի, նա կկարողանա մտնել այս սարք:"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Հաստատել"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Հեռացնել վստահելի սարքը"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Փակել"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Ուղեկցող հավելվածի օգնությամբ կարգավորեք վստահելի սարքը։ Վերջինիս միջոցով դուք կկարողանաք ապակողպել օգտատիրոջ ձեր պրոֆիլը, երբ հեռախոսը միանա մեքենային։"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Ներբեռնեք ուղեկցող հավելվածը հեռախոսում։"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Սարքերը զուգակցելու համար ընտրեք «<xliff:g id="CAR_NAME">%1$s</xliff:g>» մեքենան հեռախոսում։"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock-ը չի կարողանում հայտնաբերել այս սարքի անվտանգության գործառույթները: Մեքենայի պաշտպանության համար վստահելի սարքը կկարողանա ապակողպված պահել մեքենան, միայն երբ այն արդեն ապակողպվել է ձեր կողմից։ Մեքենան կարող է ապակողպված մնալ, երբ այն գտնվում է ձեր վստահելի սարքի մոտակայքում՝ նույնիսկ մեկ այլ անձի ձեռքում:"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Ավելացրեք <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը վստահելիների ցանկում"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքն ավելացվեց վստահելիների ցանկում"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Չհաջողվեց գրանցել «<xliff:g id="DEVICE_NAME">%1$s</xliff:g>» սարքը"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Վստահելի սարք ավելացնելու համար ընտրեք նույնականացման եղանակ: Եթե վստահելի սարքը ձեզ մոտ չէ, պրոֆիլ մուտք գործելու համար կպահանջվի նույնականացում:"</string>
     <string name="forget" msgid="3971143908183848527">"Հեռացնել"</string>
+    <string name="connect" msgid="5861699594602380150">"Միանալ"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Անջատել"</string>
     <string name="delete_button" msgid="5840500432614610850">"Ջնջել"</string>
     <string name="remove_button" msgid="6664656962868194178">"Հեռացնել"</string>
     <string name="cancel" msgid="750286395700355455">"Չեղարկել"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Ելք դեմո ռեժիմից"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Դեմո հաշիվը կջնջվի, և համակարգում կվերականգնվեն գործարանային տվյալները։ Օգտատիրոջ բոլոր տվյալները կկորչեն։"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Անջատել դեմո ռեժիմը"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ավարտել կարգավորումը"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ոչ հիմա"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ՓԱԿԵԼ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Վարելու ընթացքում գործառույթը հասանելի չէ:"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Վարելու ժամանակ հնարավոր չէ օգտատեր ավելացնել:"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 6eca0bb..20502a2 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"layar redup, layar sentuh, baterai"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"layar redup, malam, tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Mode malam"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Jaringan &amp; internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Jaringan seluler"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Kuota"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Akses data menggunakan jaringan seluler"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Nonaktifkan kuota?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Penggunaan data"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Peringatan &amp; batas data"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Siklus penggunaan data aplikasi"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Setel peringatan data"</string>
+    <string name="data_warning" msgid="116776633806885370">"Peringatan data"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Setel batas data"</string>
+    <string name="data_limit" msgid="227338836292511425">"Batas data"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Membatasi penggunaan data"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Head unit kendaraan akan menonaktifkan kuota jika mencapai batas yang disetel.\n\nKarena penggunaan data diukur oleh head unit, dan operator dapat menghitung penggunaan secara berbeda, pertimbangkan untuk menyetel batas yang konservatif."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Siapkan &amp; kelola titik akses nirkabel"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Mengaktifkan Wi-Fi..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Menonaktifkan Wi-Fi..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Memuat daftar Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi dinonaktifkan"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Gagal melupakan jaringan"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Gagal menyambung ke jaringan"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Tambahkan jaringan"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi dinonaktifkan"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Sambungkan"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Sandi"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Tampilkan sandi"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nama jaringan"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Masukkan SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Keamanan"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Kekuatan sinyal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Kekuatan sinyal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Kecepatan link"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekuensi"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Alamat IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Tampilkan sandi"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Masukkan nama jaringan"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Masukkan sandi"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Buruk"</item>
-    <item msgid="2032262610626057081">"Sedang"</item>
-    <item msgid="3859756017461098953">"Bagus"</item>
-    <item msgid="1521103743353335724">"Sangat bagus"</item>
+    <item msgid="7683058295076342057">"Buruk"</item>
+    <item msgid="1639222824821660744">"Sedang"</item>
+    <item msgid="1838705897358163300">"Baik"</item>
+    <item msgid="6067166649320533751">"Sangat bagus"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Aktifkan Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth dinonaktifkan"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detail jaringan"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Alamat MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Alamat IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Alamat IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferensi Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Aktifkan Wi‑Fi secara otomatis"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi aktif lagi dekat jaringan tersimpan berkualitas tinggi, mis. jaringan rumah"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Tidak tersedia karena lokasi dinonaktifkan. Aktifkan "<annotation id="link">"lokasi"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Aktifkan pemindaian Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aktifkan"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Pemindaian Wi-Fi diaktifkan"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Beralih ke kuota secara otomatis"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Gunakan kuota saat Wi-Fi tidak memiliki akses internet. Mungkin dikenakan biaya penggunaan data."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Pelajari lebih lanjut"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Mengelola sambungan, menyetel nama perangkat &amp; visibilitas"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Komputer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Ponsel"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Pencitraan"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Headphone"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periferal Masukan"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Perangkat yang tersambung"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Perangkat yang tersedia"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Tidak ada perangkat yang tersambung"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Perangkat tidak tersedia"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Perangkat yang tersambung"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nama"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Gunakan untuk"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Ubah nama perangkat Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Perangkat tanpa nama"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Perangkat yang tersambung"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Sambungkan perangkat baru"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth akan diaktifkan untuk menyambungkan"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Putuskan sambungan perangkat?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Kendaraan Anda akan diputuskan sambungannya dari <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Alamat Bluetooth kendaraan: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Alamat Bluetooth perangkat: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nama kendaraan"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Ganti nama kendaraan ini"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Ganti nama perangkat"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Ganti nama"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Perangkat yang tersedia"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profil"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Permintaan penyambungan Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Sambungkan &amp; hubungkan"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Kode penyambungan Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN berisi huruf atau simbol"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Ketik kode penghubung, lalu tekan Kembali atau Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Biasanya 0000 atau 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Permintaan penyambungan"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tap untuk menyambungkan dengan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Bahasa"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Bahasa &amp; masukan"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Kelola keyboard"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Keluaran text-to-speech"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Mesin yang dipilih"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Mesin saat ini"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Laju Bicara"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tinggi nada"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Setel ulang"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Suara"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume dering"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume navigasi"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Menyetel volume musik dan video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Nada dering ponsel"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Suara notifikasi default"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Suara alarm default"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikasi &amp; notifikasi"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Tampilkan semua aplikasi"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplikasi default"</string>
     <string name="applications_settings" msgid="794261395191035632">"Info aplikasi"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Paksa berhenti"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Paksa berhenti?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Jika aplikasi dihentikan secara paksa, mungkin fungsinya akan terganggu."</string>
     <string name="disable_text" msgid="4358165448648990820">"Nonaktifkan"</string>
     <string name="enable_text" msgid="1794971777861881238">"Aktifkan"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Uninstal"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Jika Anda menonaktifkan aplikasi ini, Android dan aplikasi lain mungkin tidak berfungsi lagi sesuai harapan."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Nonaktifkan aplikasi"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Izin"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versi: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Tidak ada izin yang diberikan"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Tidak ada izin yang diminta"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Penggunaan data"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Penggunaan data aplikasi"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Paksa berhenti"</string>
     <string name="computing_size" msgid="5791407621793083965">"Menghitung..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> izin tambahan</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> izin tambahan</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Bantuan &amp; masukan suara"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplikasi bantuan"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Gunakan teks dari layar"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Izinkan aplikasi bantuan mengakses konten layar sebagai teks"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Gunakan screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Izinkan aplikasi bantuan mengakses gambar layar"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Layanan IsiOtomatis"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Tidak Ada"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Dipilih"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asisten dapat membaca informasi tentang aplikasi yang sedang digunakan di sistem, termasuk informasi yang terlihat di layar atau dapat diakses dalam aplikasi."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Pastikan Anda memercayai aplikasi ini&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google IsiOtomatis&gt;%1$s&lt;/xliff:g&gt; menggunakan item yang ada di layar untuk menentukan item apa saja yang dapat diisi otomatis."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Tambahkan layanan"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokasi"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Permintaan Lokasi Terbaru"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Tidak ada permintaan lokasi terbaru"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Izin tingkat aplikasi"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Pemindaian"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Layanan Lokasi"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Pemindaian Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Izinkan aplikasi dan layanan memindai jaringan Wi-Fi kapan saja, meskipun Wi-Fi nonaktif. Hal ini dapat dilakukan, misalnya, untuk menyempurnakan fitur dan layanan berbasis lokasi."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Pemindaian Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Izinkan aplikasi dan layanan memindai perangkat di sekitar kapan saja, meskipun Bluetooth nonaktif. Hal ini dapat dilakukan, misalnya, untuk menyempurnakan fitur dan layanan berbasis lokasi."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Update sistem"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Update sistem"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versi Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Tingkat patch keamanan Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versi pita basis"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versi kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Nomor versi"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Alamat bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Tidak tersedia"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Hak Cipta"</string>
     <string name="license_title" msgid="936705938435249965">"Lisensi"</string>
     <string name="terms_title" msgid="5201471373602628765">"Persyaratan dan ketentuan"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Lisensi WebView Sistem"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Lisensi WebView sistem"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Penyedia citra satelit:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Lisensi pihak ketiga"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ada masalah saat memuat lisensi."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Memuat…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Tinggal <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> langkah untuk menjadi developer.</item>
+      <item quantity="one">Tinggal <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> langkah untuk menjadi developer.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Sekarang Anda adalah seorang developer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Tidak perlu, Anda sudah menjadi developer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opsi developer"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opsi setel ulang"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Menyetel ulang jaringan, aplikasi, atau perangkat"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Setel ulang jaringan"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Tindakan ini akan menyetel ulang semua setelan jaringan, termasuk:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Kuota"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Hapus semua eSIM kendaraan"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Tindakan ini tidak akan membatalkan paket layanan Anda."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Tidak dapat menyetel ulang eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Pilih jaringan"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Setel ulang setelan"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Setel ulang?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Setel ulang semua setelan jaringan? Tindakan ini tidak dapat diurungkan!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Setel ulang setelan"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Setelan jaringan telah disetel ulang"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Setel ulang preferensi aplikasi"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Tindakan ini akan menyetel ulang semua preferensi untuk:\n\n"<li>"Aplikasi yang dinonaktifkan"</li>\n<li>"Notifikasi aplikasi yang dinonaktifkan"</li>\n<li>"Aplikasi default untuk tindakan"</li>\n<li>"Batasan data latar belakang untuk aplikasi"</li>\n<li>"Batasan izin apa pun"</li>\n\n"Data aplikasi Anda tidak akan hilang."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Setel ulang aplikasi"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Preferensi aplikasi telah disetel ulang"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Hapus semua (reset ke setelan pabrik)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Tindakan ini akan menghapus semua data dari head unit kendaraan, termasuk:\n\n"<li>"Akun Google Anda"</li>\n<li>"Data sistem dan aplikasi serta setelan"</li>\n<li>"Aplikasi yang diunduh"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Saat ini Anda telah login ke akun berikut:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Ada pengguna lain yang aktif di kendaraan ini."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Setel ulang kendaraan"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Setel ulang?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Hapus semua informasi pribadi dan aplikasi yang didownload? Tindakan ini tidak dapat diurungkan!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Hapus semua"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Menghapus"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Harap tunggu..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Tanggal &amp; waktu"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Setel tanggal dan waktu"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Menyetel tanggal, waktu, zona waktu &amp; format"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Urutkan menurut zona waktu"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Tanggal"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Waktu"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Tambahkan pengguna"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Tambahkan akun"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Menghapus pengguna"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Pengguna baru"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Tamu"</string>
     <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Sedang login admin"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Semua izin admin"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Jadikan Admin"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Pengguna dapat menghapus pengguna, termasuk Admin lain, dan me-reset sistem ke setelan pabrik."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Tindakan ini tidak dapat dibatalkan."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ya, jadikan admin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Membuat pengguna baru"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Melakukan panggilan telepon"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mengirim pesan dengan kuota mobil"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Menginstal aplikasi baru"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Meng-uninstal aplikasi"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Tambahkan pengguna"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Pengguna baru"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Tambahkan pengguna baru?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruang mereka sendiri."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Setiap pengguna dapat mengupdate aplikasi untuk semua pengguna lain."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Batas pengguna tercapai"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Anda dapat membuat hingga <xliff:g id="COUNT">%d</xliff:g> pengguna.</item>
+      <item quantity="one">Hanya dapat membuat satu pengguna.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Gagal membuat pengguna baru"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Hapus pengguna ini?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Semua aplikasi dan data akan dihapus."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Gagal menghapus pengguna."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Tutup"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Coba lagi"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Hapus pengguna terakhir?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Setelah menghapus satu-satunya pengguna yang tersisa untuk mobil ini, pengguna admin baru akan dibuat."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Semua data, setelan, dan aplikasi yang terkait dengan pengguna ini akan dihapus. Anda harus menyiapkan sistem lagi."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Pilih admin baru"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Anda memerlukan minimal satu admin. Untuk menghapus admin ini, terlebih dahulu pilih pengganti."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Pilih admin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Tamu"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Tamu"</string>
     <string name="user_switch" msgid="6544839750534690781">"Ganti"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Anda (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nama"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Tidak disiapkan"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit nama pengguna"</string>
     <string name="users_list_title" msgid="770764290290240909">"Pengguna"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Izin diberikan kepada %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Akun"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Pengguna"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Tambahkan akun"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Tidak ada akun yang ditambahkan"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Akun untuk <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Otomatis sinkronkan data"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Izinkan aplikasi memuat ulang data secara otomatis"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Aktifkan sinkronisasi data otomatis?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Perubahan apa pun yang dilakukan pada akun Anda di web akan disalin ke perangkat secara otomatis.\n\nBeberapa akun juga dapat otomatis menyalin setiap perubahan yang dilakukan di ponsel ke web. Akun Google mengikuti cara kerja tersebut."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Nonaktifkan sinkronisasi data otomatis?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Tindakan ini akan menghemat kuota, tetapi Anda perlu menyinkronkan setiap akun secara manual untuk mengumpulkan informasi terkini. Selain itu, Anda tidak akan menerima notifikasi ketika ada update."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Info akun"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Tambahkan akun"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Tambahkan akun"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Hapus akun"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Hapus akun?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Menghapus akun ini akan menghapus semua pesan, kontak, dan data lain akun tersebut dari perangkat."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Perubahan ini tidak diizinkan oleh admin"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Hapus pengguna ini?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Semua aplikasi dan data akan dihapus."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Gagal menghapus pengguna"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Coba lagi?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Tutup"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Coba lagi"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Tambahkan pengguna baru?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruang mereka sendiri."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Setiap pengguna dapat mengupdate aplikasi untuk semua pengguna lain."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Gagal menghapus akun."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sinkronisasi akun"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinkronisasi untuk <xliff:g id="ID_1">%1$d</xliff:g> dari <xliff:g id="ID_2">%2$d</xliff:g> item aktif"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinkronisasi untuk semua item aktif"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinkronisasi untuk semua item nonaktif"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinkronisasi NONAKTIF"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Error sinkronisasi"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Terakhir disinkronkan <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sedang menyinkronkan..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tap untuk menyinkronkan sekarang<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkronkan sekarang"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Batalkan sinkronisasi"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Saat ini sinkronisasi mengalami masalah. Sinkronisasi akan segera berfungsi kembali."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Keamanan"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kunci layar"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Tidak ada"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Sandi"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Pilih jenis kunci"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opsi kunci layar"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opsi penguncian"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Masukkan pola"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Konfirmasi"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Gambar ulang"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Setel kunci layar"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Pilih PIN Anda"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Pilih pola Anda"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Pilih sandi Anda"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Pilih sandi Anda"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Kunci layar saat ini"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Untuk keamanan, setel pola"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Hapus"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Sandi umum diblokir oleh admin IT. Coba sandi lain."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Urutan digit naik, turun, atau berulang tidak diizinkan."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opsi kunci layar"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> hari yang lalu"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Tambahkan perangkat tepercaya"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Perangkat tepercaya"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> perangkat</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> perangkat</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> akan membuka kunci mobil Anda saat terhubung. Jika seseorang mengambil <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> Anda, orang tersebut mungkin dapat mengakses perangkat ini"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Konfirmasi"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Hapus perangkat tepercaya"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Selesai"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Gunakan aplikasi pendamping untuk menyiapkan perangkat dipercaya. Setelah menyiapkannya, Anda dapat membuka kunci profil pengguna jika ponsel terdeteksi oleh kendaraan"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Download aplikasi pendamping di ponsel"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Pilih <xliff:g id="CAR_NAME">%1$s</xliff:g> di ponsel untuk menghubungkan perangkat"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock tidak dapat mendeteksi fitur keamanan perangkat ini. Untuk membantu melindungi mobil Anda, perangkat dipercaya hanya dapat membuka kunci mobil jika Anda sudah membuka kuncinya. Perangkat dipercaya dapat membuka kunci mobil Anda saat berada di sekitarnya, meski orang lain memegangnya."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Tambahkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> sebagai perangkat dipercaya"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> berhasil ditambahkan sebagai perangkat dipercaya"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Pendaftaran <xliff:g id="DEVICE_NAME">%1$s</xliff:g> gagal"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Menambahkan perangkat dipercaya mewajibkan Anda menetapkan metode autentikasi setelahnya. Jika Anda tidak membawa perangkat dipercaya, autentikasi akan diperlukan untuk mengakses profil Anda."</string>
     <string name="forget" msgid="3971143908183848527">"Lupakan"</string>
+    <string name="connect" msgid="5861699594602380150">"Hubungkan"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Putuskan hubungan"</string>
     <string name="delete_button" msgid="5840500432614610850">"Hapus"</string>
     <string name="remove_button" msgid="6664656962868194178">"Hapus"</string>
     <string name="cancel" msgid="750286395700355455">"Batal"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Keluar dari mode demo"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Tindakan ini akan menghapus akun demo dan mereset sistem ke setelan pabrik. Semua data pengguna akan hilang."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Keluar dari Demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"selesaikan penyiapan"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"lain kali"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"TOLAK"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Fitur tidak tersedia saat mengemudi."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Tidak dapat menambahkan pengguna saat mengemudi."</string>
 </resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 8159267..38493e6 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"dekkja skjá, snertiskjár, rafhlaða"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"myrkva skjá, nótt, litblær"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Næturstilling"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Netkerfi og internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Farsímakerfi"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Farsímagögn"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Aðgangur að gögnum um farsímakerfi"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Slökkva á farsímagögnum?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Gagnanotkun"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Gagnaviðvörun og hámark"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Notkunarferli forritagagna"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Stilla gagnaviðvörun"</string>
+    <string name="data_warning" msgid="116776633806885370">"Gagnaviðvörun"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Velja gagnamörk"</string>
+    <string name="data_limit" msgid="227338836292511425">"Gagnamörk"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Takmörkun gagnanotkunar"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Mælaborð bílsins mun slökkva á farsímagögnum þegar markinu sem þú hefur stillt er náð.\n\nÞar sem mælaborðið mælir gagnanotkun og símafyrirtækið gæti reiknað notkun á annan hátt skaltu íhuga að stilla hófleg mörk."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Setja upp og stjórna þráðlausum aðgangsstöðum"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Kveikir á Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Slekkur á Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Hleður Wi‑Fi lista"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Slökkt á Wi‑Fi"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Ekki tókst að gleyma neti"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Ekk tókst að tengjast neti"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Bæta við neti"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Slökkt á Wi‑Fi"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Tengja"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Aðgangsorð"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Sýna aðgangsorð"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Heiti nets"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Sláðu inn SSID-kennið"</string>
     <string name="wifi_security" msgid="158358046038876532">"Öryggi"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Sendistyrkur"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Sendistyrkur"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Staða"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Hraði tengingar"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Tíðni"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-tala"</string>
+    <string name="show_password" msgid="2074628020371139240">"Sýna aðgangsorð"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Slá inn heiti nets"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Slá inn aðgangsorð"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Lélegt"</item>
-    <item msgid="2032262610626057081">"Sæmilegt"</item>
-    <item msgid="3859756017461098953">"Gott"</item>
-    <item msgid="1521103743353335724">"Frábært"</item>
+    <item msgid="7683058295076342057">"Lélegt"</item>
+    <item msgid="1639222824821660744">"Sæmilegt"</item>
+    <item msgid="1838705897358163300">"Gott"</item>
+    <item msgid="6067166649320533751">"Frábært"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Kveikja á Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Slökkt á Bluetooth"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/sek."</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Upplýsingar um net"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-vistfang"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-tala"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Undirnetssía"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-tölur"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gátt"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi stillingar"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Kveikja sjálfkrafa á Wi-Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi kveikir á sér nálægt vistuðum hágæðanetum, t.d. heima"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Ótiltækt – slökkt er á staðsetningu. Kveiktu á "<annotation id="link">"staðsetningu"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Kveikja á Wi-Fi leit?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Kveikja"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Kveikt á Wi‑Fi leit"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Skipta sjálfkrafa yfir í farsímagögn"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Nota farsímagögn þegar Wi-Fi er ekki með nettengingu. Gjöld fyrir gagnanotkun kunna að eiga við."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Frekari upplýsingar"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Stjórna tengingum, stilla heiti tækisins og sýnileika"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Tölva"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Höfuðtól"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Sími"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Myndherming"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Heyrnartól"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Jaðartæki með inntak"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Pöruð tæki"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Tæki í boði"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Engin pöruð tæki"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Engin tæki í boði"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Parað tæki"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nafn"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Nota fyrir"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Breyttu heiti Bluetooth-tækisins"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Ónefnt tæki"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Pöruð tæki"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Para nýtt tæki"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Kveikt verður á Bluetooth til að para"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Aftengja tæki?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Tenging ökutækisins við <xliff:g id="DEVICE_NAME">%1$s</xliff:g> verður rofin."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth-vistfang ökutækis: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth-vistfang tækis: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Heiti ökutækis"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Endurnefna þetta ökutæki"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Endurnefna tæki"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Endurnefna"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Tæki í boði"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Prófílar"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Beiðni um Bluetooth-pörun"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Pörun og tenging"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-pörunarkóði"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN inniheldur bókstafi eða tákn"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Sláðu inn pörunarkóðann og ýttu svo á Return eða Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Yfirleitt 0000 eða 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Beiðni um pörun"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Ýttu til að para við <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Tungumál"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Tungumál og inntak"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Lyklaborð"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Stjórna lyklaborðum"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Úttak upplesturs"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Valin vél"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Núverandi vél"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Talhraði"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tónhæð"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Endurstilla"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Hljóð"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Hljóðstyrkur hringingar"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Hljóðstyrkur leiðsagnar"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Efni"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Stilla hljóðstyrk fyrir tónlist og myndskeið"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Vekjari"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Hringitónn síma"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Sjálfgefið hljóð tilkynninga"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Sjálfgefið hljóð í vekjara"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Forrit og tilkynningar"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Sýna öll forrit"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Sjálfgefin forrit"</string>
     <string name="applications_settings" msgid="794261395191035632">"Upplýsingar um forrit"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Þvinga lokun"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Þvinga fram lokun?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ef þú þvingar fram lokun forrits gæti það látið illa."</string>
     <string name="disable_text" msgid="4358165448648990820">"Slökkva"</string>
     <string name="enable_text" msgid="1794971777861881238">"Kveikja"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Fjarlægja"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ef þú slekkur á þessu forriti getur verið að Android og önnur forrit virki ekki lengur sem skyldi."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Slökkva á forriti"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Heimildir"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Útgáfa: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Engar heimildir veittar"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Engar heimildarbeiðnir"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Gagnanotkun"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Gagnanotkun forrits"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Þvinga lokun"</string>
     <string name="computing_size" msgid="5791407621793083965">"Reiknar…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> viðbótarheimild</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> viðbótarheimildir</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Aðstoð og raddinntak"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aðstoðarforrit"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Nota texta af skjánum"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Veita aðstoðarforritinu aðgang að efni skjásins sem texta"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Nota skjámynd"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Veita aðstoðarforritinu aðgang að mynd af skjánum"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Sjálfvirk útfyllingarþjónusta"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ekkert"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Valið"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Hjálparinn mun geta séð upplýsingar um forrit í notkun í kerfinu þínu, þar á meðal upplýsingar sem sjást á skjánum eða eru aðgengilegar úr forritum."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Gakktu úr skugga um að þú treystir þessu forriti&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Sjálfvirk útfylling Google&gt;%1$s&lt;/xliff:g&gt; notar það sem er á skjánum til að ákvarða hvað er hægt að fylla sjálfkrafa út."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Bæta þjónustu við"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Staðsetning"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nýlegar staðsetningarbeiðnir"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Engar nýlegar staðsetningarbeiðnir"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Heimildir á forritsstigi"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skönnun"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Staðsetningarþjónusta"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi leit"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Leyfa forritum og þjónustu að leita að Wi-Fi netum hvenær sem er, jafnvel þegar slökkt er á Wi-Fi. Sem dæmi er hægt að nota þetta til að bæta eiginleika og þjónustu sem byggja á staðsetningu."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-leit"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Leyfa forritum og þjónustu að leita að nálægum tækjum hvenær sem er, jafnvel þegar slökkt er á Bluetooth. Sem dæmi er hægt að nota þetta til að bæta eiginleika og þjónustu sem byggja á staðsetningu."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Kerfi"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Kerfisuppfærslur"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Kerfisuppfærslur"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android útgáfa"</string>
     <string name="security_patch" msgid="4794276590178386903">"Stig Android öryggisplásturs"</string>
     <string name="model_info" msgid="4966408071657934452">"Gerð"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Grunnbandsútgáfa"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kjarnaútgáfa"</string>
     <string name="build_number" msgid="3997326631001009102">"Útgáfunúmer smíðar"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-vistfang"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ekki í boði"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Staða"</string>
     <string name="device_status" msgid="267298179806290920">"Staða"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Höfundarréttur"</string>
     <string name="license_title" msgid="936705938435249965">"Leyfi"</string>
     <string name="terms_title" msgid="5201471373602628765">"Skilmálar"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Leyfi vefglugga í kerfi"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"WebView leyfi kerfis"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Veggfóður"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Gervihnattamyndir frá \n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Leyfi þriðju aðila"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Vandamál kom upp við að hlaða leyfin."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Hleður…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Nú ertu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skrefi frá því að vera þróunaraðili.</item>
+      <item quantity="other">Nú ertu <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skrefum frá því að vera þróunaraðili.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Nú ertu þróunaraðili!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Þetta er óþarfi; þú ert nú þegar þróunaraðili."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Forritunarkostir"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Valkostir endurstillingar"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Endurstilling netkerfis, forrita eða tækis"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Endurstilla net"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Þetta mun endurstilla allar netstillingar, þar á meðal:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi-Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Farsímagögn"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Eyða öllum eSIM-kortum ökutækisins"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Þetta segir ekki upp áskrift þinni."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Ekki er hægt að endurstilla eSIM-kort"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Veldu net"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Endurstilla stillingar"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Endurstilla?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Endurstilla allar netstillingar? Ekki er hægt að afturkalla þessa aðgerð!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Endurstilla stillingar"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Netstillingar voru endurstilltar"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Endurstilla stillingar forrita"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Þetta endurstillir allar kjörstillingar fyrir:\n\n "<li>"Óvirk forrit"</li>\n" "<li>"Óvirkar tilkynningar forrita"</li>\n" "<li>"Sjálfgefin forrit aðgerða"</li>\n" "<li>"Takmarkanir á bakgrunnsgögnum forrita"</li>\n" "<li>"Takmarkanir á heimildum"</li>\n\n" Þú glatar engum forritagögnum."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Endurstilla forrit"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Stillingar forrita voru endurstilltar"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Eyða öllum gögnum (núllstilla)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Þetta mun eyða öllum gögnum af mælaborði farartækisins þíns, þ.m.t.:\n\n"<li>"Google reikningnum þínum"</li>\n<li>"Kerfis- og forritagögnum og stillingum"</li>\n<li>"Sóttum forritum"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Þú ert skráð(ur) inn á eftirfarandi reikninga:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Það eru aðrir notendur í þessu farartæki."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Endurstilla farartæki"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Endurstilla?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Viltu eyða öllum persónuupplýsingum og sóttum forritum? Ekki er hægt að afturkalla þessa aðgerð."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Eyða öllu"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Eyðir"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Augnablik..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Dagsetning og tími"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Veldu dagsetningu og tíma"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Velja dagsetningu, tíma, tímabelti og snið"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Raða eftir tímabelti"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Dagsetning"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Tími"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Bæta notanda við"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Bæta reikningi við"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Eyða notanda"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nýr notandi"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gestur"</string>
     <string name="user_admin" msgid="1535484812908584809">"Stjórnandi"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Skráð(ur) inn sem stjórnandi"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Allar stjórnandaheimildir"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Gera að stjórnanda"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Notandinn mun geta eytt öðrum notendum, þar á meðal stjórnendum, og núllstillt kerfið."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ekki er hægt að afturkalla þessa aðgerð."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Já, gera að stjórnanda"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Nýskrá notendur"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Hringja símtöl"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Skilaboð í gegnum farsímagögn bíls"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Setja upp ný forrit"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Fjarlægja forrit"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Bæta notanda við"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nýr notandi"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Bæta nýjum notanda við?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Þegar þú bætir nýjum notanda við þarf viðkomandi að setja upp sitt eigið svæði."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Allir notendur geta uppfært forrit fyrir alla aðra notendur."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Notandahámarki náð"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Þú getur búið til allt að <xliff:g id="COUNT">%d</xliff:g> notanda.</item>
+      <item quantity="other">Þú getur búið til allt að <xliff:g id="COUNT">%d</xliff:g> notendur.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Ekki tókst að búa til nýjan notanda"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Eyða þessum notanda?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Öllum forritum og gögnum verður eytt."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Ekki tókst að eyða notanda."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Hunsa"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Reyna aftur"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Eyða síðasta notanda?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Þegar eina notanda þessa bíls sem eftir er hefur verið eytt verður nýr stjórnandi valinn."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Öllum gögnum, stillingum og forritum sem tengjast þessum notanda verður eytt. Þú munt þurfa að setja kerfið upp aftur."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Velja nýjan stjórnanda"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Þú þarft að minnsta kosti einn stjórnanda. Til að eyða þessum þarftu fyrst að finna einhvern í staðinn."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Velja stjórnanda"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gestur"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gestur"</string>
     <string name="user_switch" msgid="6544839750534690781">"Skipta"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Þú (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nafn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ekki uppsett"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Breyta notandanafni"</string>
     <string name="users_list_title" msgid="770764290290240909">"Notendur"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s veitt heimild"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Reikningar"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Notandi"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Bæta reikningi við"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Engum reikningum bætt við"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Reikningar fyrir <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Samstilla gögn sjálfkrafa"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Leyfa forritum að endurnýja gögn sjálfkrafa"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Kveikja á gagnasamstillingu?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Allar breytingar sem þú gerir á reikningunum þínum á vefnum verða sjálfkrafa afritaðar yfir í tækið.\n\nEinhverjir reikningar kunna einnig að afrita sjálfkrafa allar breytingar sem þú gerir í símanum yfir á vefinn. Þetta gildir um Google reikninga."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Slökkva á gagnasamstillingu?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Þetta dregur úr gagnanotkun en þú þarft að samstilla hvern reikning handvirkt til að sækja nýjustu upplýsingar. Þú færð ekki tilkynningar þegar uppfærslur fara fram."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Reikningsupplýsingar"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Bæta reikningi við"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Bæta reikningi við"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Fjarlægja reikning"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Viltu fjarlægja reikninginn?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Ef þessi reikningur er fjarlægður verður öllum skilaboðum hans, tengiliðum og öðrum gögnum eytt úr tækinu!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Stjórnandinn þinn leyfir ekki þessa breytingu"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Fjarlægja þennan notanda?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Öllum forritum og gögnum verður eytt."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Ekki tókst að fjarlægja notanda."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Reyna aftur?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Hunsa"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Reyna aftur"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Bæta nýjum notanda við?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Þegar þú bætir nýjum notanda við þarf viðkomandi að setja upp sitt eigið svæði."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Allir notendur geta uppfært forrit fyrir alla aðra notendur."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Ekki tókst að fjarlægja reikning."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Samstilling reiknings"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Kveikt á samstillingu fyrir <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g> atriðum"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Kveikt á samstillingu fyrir öll atriði"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Slökkt á samstillingu fyrir öll atriði"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Slökkt er á samstillingu"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Samstillingarvilla"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Síðast samstillt <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Samstillir…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Ýttu til að samstilla núna<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Samstilla núna"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Hætta við samstillingu"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Vandamál eru með samstillingu sem stendur. Hún verður aftur í boði von bráðar."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Öryggi"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skjálás"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Enginn"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-númer"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Aðgangsorð"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Velja lásgerð"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Valkostir skjálæsingar"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Valkostir skjálæsinga"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Færðu inn mynstrið þitt"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Staðfesta"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Teikna aftur"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Setja upp skjálás"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Veldu þér PIN-númer"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Veldu þér mynstur"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Veldu þér aðgangsorð"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Veldu aðgangsorð"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Núverandi skjálás"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Settu upp mynstur til að gæta fyllsta öryggis"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Hreinsa"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Kerfisstjórinn þinn hefur lokað á algeng aðgangsorð. Prófaðu annað aðgangsorð."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Hækkandi, lækkandi eða endurtekin röð tölustafa er óheimil."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Valkostir skjálæsingar"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : Fyrir <xliff:g id="NUM_DAYS">%3$s</xliff:g> dögum"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Bæta við traustu tæki"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Traust tæki"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tæki</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tæki</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> mun opna þennan bíl þegar það er tengt. Ef einhver kemst yfir <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> kann viðkomandi að geta fengið aðgang að þessu tæki"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Staðfesta"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Fjarlægja traust tæki"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Lokið"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Notaðu fylgiforritið til að setja upp traust tæki. Þegar það hefur verið sett upp geturðu opnað notandaprófílinn þinn þegar bíllinn ber kennsl á símann þinn"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Sæktu fylgiforritið í símann þinn"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Veldu <xliff:g id="CAR_NAME">%1$s</xliff:g> í símanum til að para tækin"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock getur ekki greint öryggiseiginleika þessa tækis. Til að tryggja öryggi bílsins þíns getur traust tæki aðeins haldið bílnum ólæstum þegar þú hefur þegar tekið hann úr lás. Trausta tækið þitt getur haldið bílnum ólæstum þegar það er nálægt, jafnvel þótt einhver annar haldi á því."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Bæta <xliff:g id="DEVICE_NAME">%1$s</xliff:g> við sem traustu tæki"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> bætt við sem traustu tæki"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Skráning <xliff:g id="DEVICE_NAME">%1$s</xliff:g> mistókst"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ef þú bætir við traustu tæki verðurðu að stilla auðkenningarmáta. Ef þú ert ekki með traust tæki við höndina verður auðkenningar krafist til að fá aðgang að prófílnum þínum."</string>
     <string name="forget" msgid="3971143908183848527">"Gleyma"</string>
+    <string name="connect" msgid="5861699594602380150">"Tengja"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Aftengja"</string>
     <string name="delete_button" msgid="5840500432614610850">"Eyða"</string>
     <string name="remove_button" msgid="6664656962868194178">"Fjarlægja"</string>
     <string name="cancel" msgid="750286395700355455">"Hætta við"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Hætta í kynningarútgáfu"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Þetta eyðir kynningarreikningnum og núllstillir kerfið. Öll notandagögn glatast."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Hætta í kynningarútgáfu"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ljúka við uppsetningu"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ekki núna"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"HUNSA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Þessi eiginleiki er ekki í boði á meðan þú ekur."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Ekki er hægt að bæta við notanda meðan á akstri stendur."</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index a6f1e66..7105eaa 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"attenuazione schermo, touchscreen, batteria"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"attenuazione schermo, notte, tonalità"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modalità notturna"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Rete e Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Rete mobile"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dati mobili"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accedi ai dati tramite la rete mobile"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Disattivare i dati mobili?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Utilizzo dei dati"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Limite dati e avviso"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo di utilizzo dei dati delle app"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Imposta avviso sui dati"</string>
+    <string name="data_warning" msgid="116776633806885370">"Avviso sui dati"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Imposta limite dati"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limite dati"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitazione utilizzo dei dati"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"L\'unità principale del tuo veicolo disattiverà i dati mobili una volta raggiunto il limite impostato.\n\nPoiché l\'utilizzo dei dati viene misurato dall\'unità principale e il tuo operatore potrebbe tener conto dell\'utilizzo in modo diverso, è consigliabile impostare un limite conservativo."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configura e gestisci punti di accesso wireless"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Attivazione Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Disattivazione Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Caricamento dell\'elenco di reti Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi disattivato"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Eliminazione delle rete non riuscita"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Conessione alla rete non riuscita"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Aggiungi rete"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi disattivato"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Collega"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Password"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Mostra password"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nome rete"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Inserisci l\'SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sicurezza"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Intensità segnale"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Intensità segnale"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Stato"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Velocità di collegamento"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequenza"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Indirizzo IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Mostra password"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Inserisci il nome della rete"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Inserisci la password"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Debole"</item>
-    <item msgid="2032262610626057081">"Medio"</item>
-    <item msgid="3859756017461098953">"Buono"</item>
-    <item msgid="1521103743353335724">"Ottimo"</item>
+    <item msgid="7683058295076342057">"Debole"</item>
+    <item msgid="1639222824821660744">"Medio"</item>
+    <item msgid="1838705897358163300">"Buono"</item>
+    <item msgid="6067166649320533751">"Ottimo"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Attiva Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth disattivato"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Dettagli rete"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Indirizzo MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Indirizzo IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Indirizzi IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferenze Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Attiva Wi‑Fi automaticamente"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"La connessione Wi-Fi si riattiverà vicino a reti salvate di alta qualità, ad esempio la rete di casa"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Non disponibile perché geolocalizzazione non attiva. "<annotation id="link">"Attiva"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Vuoi attivare la ricerca di reti Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Attiva"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Ricerca di reti Wi-Fi attiva"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Passa automaticamente ai dati mobili"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Usa dati mobili quando la rete Wi-Fi non ha accesso a Internet. Potrebbero essere applicati costi per l\'utilizzo dei dati."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Ulteriori informazioni"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Gestisci le connessioni, imposta il nome e la rilevabilità del dispositivo"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Auricolare"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefono"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imaging"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Cuffie"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periferica di immissione"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispositivi accoppiati"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispositivi disponibili"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nessun dispositivo accoppiato"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nessun dispositivo disponibile"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispositivo accoppiato"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nome"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Utilizza per"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Modifica nome dispositivo Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispositivo senza nome"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispositivi accoppiati"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Accoppia nuovo dispositivo"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Il Bluetooth verrà attivato per consentire l\'accoppiamento"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Scollegare il dispositivo?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Il veicolo verrà scollegato dal dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Indirizzo Bluetooth del veicolo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Indirizzo Bluetooth del dispositivo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nome del veicolo"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Rinomina questo veicolo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Rinomina dispositivo"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Rinomina"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispositivi disponibili"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profili"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Richiesta accoppiamento Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Accoppia e connetti"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Codice di accoppiamento Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Il PIN contiene lettere o simboli"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Digita il codice di accoppiamento e premi INVIO"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Di solito 0000 o 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Richiesta accoppiamento"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tocca per l\'accoppiamento con <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Lingue"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Lingue e immissione"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastiera"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Gestisci tastiere"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Output sintesi vocale"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motore preferito"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motore attuale"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Velocità voce"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tono"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Reimposta"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Audio"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume suoneria"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume per la navigazione"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Contenuti multimediali"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Imposta il volume di musica e video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Sveglia"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Suoneria telefono"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Suono di notifica predefinito"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Suono sveglia predefinito"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"App e notifiche"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Mostra tutte le app"</string>
+    <string name="default_applications" msgid="1558183275638697087">"App predefinite"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informazioni sull\'app"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forza interruzione"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Vuoi forzare l\'interruzione?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Se forzi l\'interruzione di un\'app, questa potrebbe funzionare in modo anomalo."</string>
     <string name="disable_text" msgid="4358165448648990820">"Disattiva"</string>
     <string name="enable_text" msgid="1794971777861881238">"Attiva"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Disinstalla"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Se disattivi questa app, Android e altre app potrebbero non funzionare più come previsto."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Disattiva app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Autorizzazioni"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versione: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nessuna autorizzazione concessa"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nessuna autorizzazione richiesta"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Utilizzo dei dati"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Utilizzo dati dell\'app"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forza interruzione"</string>
     <string name="computing_size" msgid="5791407621793083965">"Elaborazione…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorizzazioni aggiuntive</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> autorizzazione aggiuntiva</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistenza e input vocale"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"App di assistenza"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Utilizza testo sullo schermo"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Consenti all\'app di assistenza di accedere ai contenuti dello schermo come il testo"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Utilizza screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Consenti all\'app di assistenza di accedere a un\'immagine dello schermo"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Compilazione automatica"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nessuna"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Selezionata"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"L\'assistente potrà leggere informazioni sulle app utilizzate dal sistema, incluse quelle visibili su schermo o accessibili all\'interno delle app."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Verifica che questa app sia attendibile&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=La Compilazione Automatica di Google&gt;%1$s&lt;/xliff:g&gt; si basa sui contenuti visualizzati sullo schermo per stabilire quali dati è possibile compilare automaticamente."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Aggiungi servizio"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Luogo"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Richieste di posizione recenti"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nessuna richiesta di posizione recente"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorizzazioni a livello di app"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Ricerca"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Servizi di geolocalizzazione"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Scansione di reti Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Consenti ad app e servizi di cercare reti Wi-Fi in qualsiasi momento, anche quando il Wi-Fi non è attivo. Questa funzione è utile, ad esempio, per migliorare funzioni e servizi basati sulla posizione."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Scansione di dispositivi Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Consenti ad app e servizi di cercare dispositivi nelle vicinanze in qualsiasi momento, anche quando il Bluetooth non è attivo. Questa funzione è utile, ad esempio, per migliorare funzioni e servizi basati sulla posizione."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Aggiornamenti di sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Aggiornamenti di sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versione Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Livello patch di sicurezza Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modello"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versione banda di base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versione kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Numero build"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Indirizzo Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Non disponibile"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Stato"</string>
     <string name="device_status" msgid="267298179806290920">"Stato"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licenza"</string>
     <string name="terms_title" msgid="5201471373602628765">"Termini e condizioni"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licenza di sistema per WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licenze di sistema per WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Sfondi"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fornitori di immagini satellitari:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenze di terze parti"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Errore di caricamento delle licenze."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Caricamento…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Ti mancano <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passaggi per diventare sviluppatore.</item>
+      <item quantity="one">Ti manca <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> passaggio per diventare sviluppatore.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Ora sei sviluppatore."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Non è necessario, sei già sviluppatore."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opzioni sviluppatore"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opzioni di reimpostazione"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Reimpostazione di rete, app o dispositivo"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Reimposta rete"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"L\'operazione reimposta tutte le impostazioni di rete, tra cui:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Dati mobili"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Resetta tutte le eSIM del veicolo"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Il tuo piano di servizio non verrà annullato."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Impossibile reimpostare le eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Seleziona rete"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Reimposta impostazioni"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Reimpostare?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Reimpostare tutte le impostazioni di rete? Questa azione è irreversibile."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Reimposta impostazioni"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Le impostazioni di rete sono state reimpostate"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Reimposta preferenze app"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Verranno reimpostate tutte le preferenze relative a:\n\n"<li>"App disattivate"</li>\n<li>"Notifiche di app disattivate"</li>\n<li>"Applicazioni predefinite per azioni"</li>\n<li>"Limitazioni di dati in background per app"</li>\n<li>"Eventuali limitazioni di autorizzazione"</li>\n\n"Non perderai i dati delle app."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Reimposta app"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Le preferenze dell\'app sono state reimpostate"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Cancella tutti i dati"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Tutti i dati verranno cancellati dall\'unità principale del veicolo, inclusi:\n\n"<li>"Il tuo Account Google"</li>\n<li>"Le impostazioni e i dati di sistema e delle app"</li>\n<li>"Le app scaricate"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Al momento sono collegati i seguenti account:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Sono presenti altri utenti su questo veicolo."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Reimposta veicolo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vuoi reimpostare?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Vuoi cancellare tutte le informazioni personali e le app scaricate? Questa azione è irreversibile."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Cancella tutto"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Cancellazione"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Attendi…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data e ora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Imposta data e ora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Imposta data, ora, fuso orario e formati"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordina per fuso orario"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Ora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Aggiungi utente"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Aggiungi account"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Elimina utente"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nuovo utente"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Ospite"</string>
     <string name="user_admin" msgid="1535484812908584809">"Amministratore"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Accesso eseguito da amministratore"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Tutte le autorizzazioni di amministratore"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Imposta come amministratore"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"L\'utente potrà eliminare utenti, includere altri amministratori e ripristinare le impostazioni di fabbrica del sistema."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Questa azione è irreversibile."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Sì, imposta come amministratore"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Creazione di nuovi utenti"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Fare telefonate"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Messaggi tramite dati mobili auto"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Installazione di nuove app"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Disinstallazione di app"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Aggiungi utente"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nuovo utente"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Aggiungere nuovo utente?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Il nuovo utente, una volta aggiunto, dovrà configurare il suo spazio."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualsiasi utente può aggiornare le app per tutti gli altri."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Limite utenti raggiunto"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Puoi creare massimo <xliff:g id="COUNT">%d</xliff:g> utenti.</item>
+      <item quantity="one">Può essere creato un solo utente.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Creazione nuovo utente non riuscita"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Eliminare questo utente?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Tutti i dati e le app verranno eliminati."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Impossibile eliminare l\'utente."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignora"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Riprova"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Eliminare ultimo utente?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Dopo aver eliminato l\'unico utente rimanente di quest\'auto verrà creato un nuovo amministratore."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Verranno eliminati tutti i dati, le impostazioni e le app associati all\'utente. Dovrai riconfigurare il sistema."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Scegli il nuovo amministratore"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Devi avere almeno un amministratore. Per eliminare questo devi prima sceglierne uno sostitutivo."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Scegli l\'amministratore"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Ospite"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Ospite"</string>
     <string name="user_switch" msgid="6544839750534690781">"Cambia"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Tu (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Non configurato"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Modifica il nome utente"</string>
     <string name="users_list_title" msgid="770764290290240909">"Utenti"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Autorizzazioni concesse a %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Account"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Utente"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Aggiungi account"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nessun account aggiunto"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Account per <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizza i dati automaticamente"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Consenti aggiornamento automatico dei dati delle app"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Attivare sincron. automatica?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Tutte le modifiche che apporti ai tuoi account sul Web verranno automaticamente copiate sul dispositivo.\n\nAlcuni account potrebbero inoltre copiare automaticamente sul Web tutte le modifiche che apporti sul telefono. Gli Account Google funzionano in questo modo."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Disattivare sincron. automatica?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"I dati verranno conservati, ma dovrai sincronizzare manualmente ogni account per raccogliere le informazioni recenti. Inoltre non riceverai notifiche quando verranno eseguiti aggiornamenti."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Dati dell\'account"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Aggiungi account"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Aggiungi un account"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Rimuovi account"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Rimuovere l\'account?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"La rimozione di questo account comporta l\'eliminazione di tutti i relativi messaggi, contatti e altri dati dal dispositivo."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Questa modifica non è consentita dall\'amministratore"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Rimuovere questo utente?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Tutte le app e i dati verranno eliminati."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Impossibile rimuovere l\'utente."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Vuoi riprovare?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ignora"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Riprova"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Aggiungere nuovo utente?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Il nuovo utente, una volta aggiunto, dovrà configurare il suo spazio."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualsiasi utente può aggiornare le app per tutti gli altri."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Impossibile rimuovere l\'account."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronizzazione account"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sincronizzazione attiva per <xliff:g id="ID_1">%1$d</xliff:g> elementi su <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sincronizzazione attivata per tutti gli elementi"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sincronizzazione disattivata per tutti gli elementi"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sincronizzaz. non attiva"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Errore sincronizzazione"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Ultima sincronizzazione: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sincronizzazione…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tocca per sincronizzare adesso<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizza ora"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Annulla sincronizzazione"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"La sincronizzazione presenta dei problemi. Riprenderà a breve."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sicurezza"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Blocco schermo"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nessuno"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Password"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Scegli tipo di blocco"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opzioni di blocco schermo"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opzioni di blocco"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Inserisci la sequenza"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Conferma"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Ricrea"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Imposta un blocco schermo"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Scegli il PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Scegli la tua sequenza"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Scegli la password"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Scegli la tua password"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Blocco schermo attuale"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Per sicurezza, imposta una sequenza"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Cancella"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Le password comuni sono state bloccate dall\'amministratore IT. Prova a usare un\'altra password."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Non sono consentite sequenze di cifre in ordine crescente o decrescente oppure ripetute."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opzioni di blocco schermo"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g> giorni fa"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Aggiungi dispos. attendibile"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Dispos. attendibili"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dispositivi</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dispositivo</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Il dispositivo <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> consente di sbloccare l\'auto quando è connesso. Se qualcuno prende il tuo dispositivo <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, potrebbe riuscire a eseguire l\'accesso."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Conferma"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Rimuovi dispositivo attendibile"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Fine"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Utilizza l\'app companion per configurare un dispositivo attendibile. Terminata la configurazione, potrai sbloccare il tuo profilo utente quando il veicolo rileva il telefono"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Scarica l\'app companion sul tuo telefono"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Seleziona <xliff:g id="CAR_NAME">%1$s</xliff:g> sul tuo telefono per accoppiare i dispositivi"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock non può rilevare le funzionalità di sicurezza di questo dispositivo. Per contribuire alla protezione del veicolo, il dispositivo attendibile potrà tenere sbloccato il veicolo solo se prima lo sblocchi tu. Il tuo dispositivo attendibile può tenere sbloccato il veicolo quando si trova nelle vicinanze, anche se viene utilizzato da qualcun altro."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Aggiungi <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ai dispositivi attendibili"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Il dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g> è stato aggiunto correttamente come dispositivo attendibile"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Registrazione del dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g> non riuscita"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"L\'aggiunta di un dispositivo attendibile comporta necessariamente la successiva impostazione di un metodo di autenticazione. Se non hai con te il dispositivo attendibile, l\'autenticazione dovrà necessariamente accedere al tuo profilo."</string>
     <string name="forget" msgid="3971143908183848527">"Elimina"</string>
+    <string name="connect" msgid="5861699594602380150">"Collega"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Scollega"</string>
     <string name="delete_button" msgid="5840500432614610850">"Elimina"</string>
     <string name="remove_button" msgid="6664656962868194178">"Rimuovi"</string>
     <string name="cancel" msgid="750286395700355455">"Annulla"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Esci dalla modalità demo"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"L\'account dimostrativo verrà eliminato e verranno ripristinati i dati di fabbrica del sistema. Tutti i dati utente andranno persi."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Chiudi demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"termina configurazione"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"non ora"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"IGNORA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funzione non disponibile durante la guida."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Impossibile aggiungere l\'utente durante la guida."</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index a4a8aa5..eb83a1f 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"עמעום מסך, מסך מגע, סוללה"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"עמעום מסך, לילה, גוון"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"מצב לילה"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"רשת ואינטרנט"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"רשת סלולרית"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"חבילת גלישה"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"שימוש בחבילת הגלישה דרך הרשת הסלולרית"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"לכבות את חבילת הגלישה?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"שימוש בחבילת הגלישה"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"אזהרות והגבלות של נתונים"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"מחזור שימוש בחבילת הגלישה באפליקציות"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"מתי תופיע אזהרת שימוש בנתונים"</string>
+    <string name="data_warning" msgid="116776633806885370">"אזהרה לגבי שימוש בנתונים"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"הגדרת מגבלת נתונים"</string>
+    <string name="data_limit" msgid="227338836292511425">"מגבלת נתונים"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"הגבלת שימוש בחבילת הגלישה"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"כשיחידת הראש ברכב תגיע למגבלה שהגדרת, היא תשבית את חבילת הגלישה.\n\nמכיוון שעשויים להיות הבדלים בין השימוש בחבילת הגלישה שנמדד על ידי יחידת הראש לבין השימוש שנמדד על ידי הספק, מומלץ להגדיר מגבלה סבירה."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"הגדרה וניהול של נקודות גישה אלחוטיות"</string>
     <string name="wifi_starting" msgid="473253087503153167">"מתבצעת הפעלת Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"מתבצע כיבוי של Wi-Fi..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"רשימה של רשתות Wi‑Fi בטעינה"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi מושבת"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"נכשל הניסיון לשכוח את הרשת"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"נכשל הניסיון להתחבר לרשת"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"הוספת רשת"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi מושבת"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"התחברות"</string>
     <string name="wifi_password" msgid="5565632142720292397">"סיסמה"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"הצגת סיסמה"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"שם הרשת"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"הזנת ה-SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"אבטחה"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"עוצמת אות"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"עוצמת אות"</string>
     <string name="wifi_status" msgid="5688013206066543952">"סטטוס"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"מהירות קישור"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"תדר"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"כתובת IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"הצגת סיסמה"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"יש להזין שם רשת"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"יש להזין סיסמה"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"חלש"</item>
-    <item msgid="2032262610626057081">"סביר"</item>
-    <item msgid="3859756017461098953">"טוב"</item>
-    <item msgid="1521103743353335724">"מצוין"</item>
+    <item msgid="7683058295076342057">"חלש"</item>
+    <item msgid="1639222824821660744">"סביר"</item>
+    <item msgid="1838705897358163300">"טוב"</item>
+    <item msgid="6067166649320533751">"מצוין"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"הפעלת Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth מושבת"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"‎2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"‎5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"פרטי הרשת"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"כתובת MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"כתובת IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"מסכה של רשת משנה"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"כתובות IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"שער"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"העדפות Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"הפעלת Wi‑Fi באופן אוטומטי"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi יחזור לפעול בסביבת רשתות שמורות באיכות גבוהה, כמו הרשת הביתית"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"התכונה לא זמינה כי הגדרת המיקום כבויה. יש להפעיל "<annotation id="link">"מיקום"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"להפעיל סריקת Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"הפעלה"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"סריקת Wi-Fi מופעלת"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"מעבר אוטומטי לחבילת גלישה"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"יש להשתמש בחבילת הגלישה כשאין גישה לאינטרנט ברשת Wi-Fi. ייתכנו חיובים על שימוש בחבילת הגלישה."</string>
+    <string name="learn_more" msgid="8214605928933358604">"מידע נוסף"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"ניהול חיבורים, הגדרת שם מכשיר ויכולת גילוי"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"מחשב"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"אוזניות"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"טלפון"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"הדמיה"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"אוזנייה"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ציוד קלט היקפי"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"מכשירים מותאמים"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"מכשירים זמינים"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"אין מכשירים מותאמים"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"אין מכשירים זמינים"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"מכשיר מותאם"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"שם"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"לשימוש עבור"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"שינוי השם של מכשיר Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"מכשיר ללא שם"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"מכשירים מותאמים"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"התאמה של מכשיר חדש"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth יופעל לצורך התאמה"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"לנתק את המכשיר?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"יתבצע ניתוק של הרכב מ-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"כתובת ה-Bluetooth של הרכב: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"כתובת המכשיר לחיבור דרך Bluetooth: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"שם הרכב"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"שינוי שם הרכב הזה"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"שינוי שם המכשיר"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"שינוי שם"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"מכשירים זמינים"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"פרופילים"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"בקשה להתאמת Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"התאמה וחיבור"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"קוד התאמת Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"קוד הגישה מכיל אותיות או סמלים"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"יש להקליד את קוד ההתאמה ולאחר מכן ללחוץ על Return או Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"בדרך כלל 0000 או 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"בקשת התאמה"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"יש להקיש כדי ליצור התאמה עם <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"שפות"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"שפות וקלט"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"מקלדת"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"ניהול מקלדות"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"פלט של המרת טקסט לדיבור"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"מנוע מועדף"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"המנוע הנוכחי"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"קצב דיבור"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"גובה צליל"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"איפוס"</string>
     <string name="sound_settings" msgid="3072423952331872246">"צליל"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"עוצמת הצלצול"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"עוצמת קול של ניווט"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"מדיה"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"הגדרת עוצמת קול למוזיקה ולסרטונים"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"התראה"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"רינגטון לשיחת טלפון"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"צליל ברירת מחדל להתראות"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"צליל ברירת מחדל לשעון מעורר"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"אפליקציות והתראות"</string>
+    <string name="all_applications" msgid="7798210477486822168">"הצגת כל האפליקציות"</string>
+    <string name="default_applications" msgid="1558183275638697087">"אפליקציות ברירת מחדל"</string>
     <string name="applications_settings" msgid="794261395191035632">"פרטי אפליקציה"</string>
+    <string name="force_stop" msgid="2153183697014720520">"סגירה ידנית"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"לסגור ידנית?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"אם סוגרים אפליקציה ידנית, ייתכן שהיא לא תפעל כהלכה."</string>
     <string name="disable_text" msgid="4358165448648990820">"השבת"</string>
     <string name="enable_text" msgid="1794971777861881238">"הפעלה"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"הסרת התקנה"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"אם האפליקציה הזו תושבת, ייתכן ש-Android ואפליקציות אחרות לא יפעלו כצפוי."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"השבתת האפליקציה"</string>
     <string name="permissions_label" msgid="2701446753515612685">"הרשאות"</string>
     <string name="application_version_label" msgid="8556889839783311649">"גרסה: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"לא הוענקו הרשאות"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"לא התבקשו הרשאות"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"שימוש בחבילת הגלישה"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"שימוש בחבילת הגלישה באפל\'"</string>
-    <string name="force_stop" msgid="2153183697014720520">"סגירה ידנית"</string>
     <string name="computing_size" msgid="5791407621793083965">"מתבצע חישוב…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> הרשאות נוספות</item>
@@ -117,15 +168,39 @@
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> הרשאות נוספות</item>
       <item quantity="one">הרשאה אחת (<xliff:g id="COUNT_0">%d</xliff:g>) נוספת</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"קלט אסיסטנט וקלט קולי"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"אפליקציית עזרה"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"שימוש בטקסט המופיע במסך"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"אפליקציית העזרה תוכל לגשת לתוכן במסך, למשל לטקסט"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"שימוש בצילום מסך"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"אפליקציית העזרה תוכל לגשת לצילום של המסך"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"שירות מילוי אוטומטי"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ללא"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"נבחרה"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ה-Assistant יוכל לקרוא מידע על אפליקציות שבהן נעשה שימוש במערכת שלך, כולל מידע המופיע במסך או שניתן לגשת אליו באפליקציות."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;יש לוודא שהאפליקציה מהימנה&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=המילוי האוטומטי של Google&gt;%1$s&lt;/xliff:g&gt; משתמש בתוכן המסך כדי לקבוע אילו שדות אפשר למלא באופן אוטומטי."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"הוספת שירות"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"מיקום"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"בקשות של מיקומים אחרונים"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"אין בקשות של מיקומים אחרונים"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"הרשאות ברמת אפליקציה"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"סריקה"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"שירותי מיקום"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"סריקת Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"אפליקציות ושירותים יוכלו לסרוק רשתות Wi‑Fi בכל עת, גם כאשר ה-Wi‑Fi כבוי. ניתן להשתמש בכך, למשל, כדי לשפר תכונות ושירותים מבוססי מיקום."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"סריקת Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"אפליקציות ושירותים יוכלו לסרוק מכשירים בקרבת מקום בכל עת, גם כאשר ה-Bluetooth כבוי. ניתן להשתמש בכך, למשל, כדי לשפר תכונות ושירותים מבוססי מיקום."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"מערכת"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"עדכוני מערכת"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"עדכוני מערכת"</string>
     <string name="firmware_version" msgid="8491753744549309333">"גרסת Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"רמת תיקון האבטחה ב-Android"</string>
     <string name="model_info" msgid="4966408071657934452">"דגם"</string>
     <string name="baseband_version" msgid="2370088062235041897">"גרסת פס בסיס"</string>
     <string name="kernel_version" msgid="7327212934187011508">"גרסת ליבה"</string>
     <string name="build_number" msgid="3997326631001009102">"מספר Build"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"כתובת Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"לא זמין"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"סטטוס"</string>
     <string name="device_status" msgid="267298179806290920">"סטטוס"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"זכויות יוצרים"</string>
     <string name="license_title" msgid="936705938435249965">"רישיון"</string>
     <string name="terms_title" msgid="5201471373602628765">"תנאים והגבלות"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"רישיון WebView במערכת"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"רישיונות WebView של המערכת"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"טפטים"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ספקים של צילומי לוויין:\n‎©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"רישיונות צד שלישי"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"יש בעיה בטעינת הרישיון."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"בטעינה…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="two">בעוד <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> צעדים התואר שלך יהיה מפתח/ת.</item>
+      <item quantity="many">בעוד <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> צעדים התואר שלך יהיה מפתח/ת.</item>
+      <item quantity="other">בעוד <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> צעדים התואר שלך יהיה מפתח/ת.</item>
+      <item quantity="one">בעוד צעד אחד (<xliff:g id="STEP_COUNT_0">%1$d</xliff:g>) התואר שלך יהיה מפתח/ת.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"את/ה מפתח/ת עכשיו!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"אין צורך, את/ה כבר מפתח/ת."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"אפשרויות למפתחים"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"אפשרויות איפוס"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"איפוס של הרשת, האפליקציות או של המכשיר"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"איפוס הרשת"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"פעולה זו תאפס את כל הגדרות הרשת, כולל:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"חבילת גלישה"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"מחיקת כל כרטיסי ה-eSIM של הרכב"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"הפעולה לא תבטל את תוכנית השירות שלך."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"לא ניתן לאתחל את כרטיסי ה-eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"בחירת רשת"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"איפוס הגדרות"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"לאפס?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"האם לאפס את כל הגדרות הרשת? לא ניתן לבטל את הפעולה!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"איפוס הגדרות"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"הגדרות הרשת אופסו"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"איפוס העדפות האפליקציה"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"הפעולה תאפס את כל ההעדפות עבור:\n\n"<li>"אפליקציות מושבתות"</li>\n<li>"השבתת התראות של אפליקציות"</li>\n<li>"אפליקציות שהן ברירת המחדל לביצוע פעולות"</li>\n<li>"הגבלות של נתוני רקע לאפליקציות"</li>\n<li>"הגבלת הרשאות"</li>\n\n"נתוני האפליקציות לא יאבדו."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"איפוס אפליקציות"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"העדפות האפליקציה אופסו"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"מחיקת כל הנתונים (איפוס להגדרות היצרן)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"פעולה זו תמחק את כל הנתונים מיחידת הראש של הרכב שלך, כולל:\n\n"<li>"חשבון Google שלך"</li>\n<li>"נתוני מערכת ואפליקציות והגדרות"</li>\n<li>"אפליקציות שהורדו"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"יש לך חיבור פעיל כרגע אל החשבונות הבאים:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"קיימים משתמשים נוספים ברכב זה."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"איפוס הרכב"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"לאפס?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"האם למחוק את כל המידע האישי שלך והאפליקציות שהורדת? לא ניתן לבטל את הפעולה!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"מחיקת הכול"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"המחיקה מתבצעת"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"יש להמתין…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"תאריך ושעה"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"הגדרת תאריך ושעה"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"הגדרת תאריך, שעה, אזור זמן ופורמטים"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"מיון לפי אזור זמן"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"תאריך"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"שעה"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"הוספת משתמש"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"הוספת חשבון"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"מחיקת משתמש"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"משתמש חדש"</string>
-    <string name="user_guest" msgid="3465399481257448601">"אורח"</string>
     <string name="user_admin" msgid="1535484812908584809">"מנהל מערכת"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"כניסה בתור מנהל מערכת"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"כל ההרשאות של מנהל מערכת"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"הגדרה כמנהל מערכת"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"למשתמש תהיה היכולת למחוק משתמשים, כולל מנהלי מערכת אחרים, ולאפס את המערכת להגדרות היצרן."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"פעולה זו אינה הפיכה."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"כן, הגדרה כמנהל מערכת"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"יצירת משתמשים חדשים"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ביצוע שיחות טלפון"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"העברת הודעות דרך חבילת הגלישה ברכב"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"התקנת אפליקציות חדשות"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"הסרת התקנה של אפליקציות"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"הוספת משתמש"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"משתמש חדש"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"האם להוסיף משתמש חדש?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את המרחב שלו."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"כל משתמש יכול לעדכן אפליקציות לכל שאר המשתמשים."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"הגעת למגבלת המשתמשים שניתן להוסיף"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="two">ניתן ליצור עד <xliff:g id="COUNT">%d</xliff:g> משתמשים.</item>
+      <item quantity="many">ניתן ליצור עד <xliff:g id="COUNT">%d</xliff:g> משתמשים.</item>
+      <item quantity="other">ניתן ליצור עד <xliff:g id="COUNT">%d</xliff:g> משתמשים.</item>
+      <item quantity="one">ניתן ליצור רק משתמש אחד.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"ניסיון היצירה של משתמש חדש נכשל"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"למחוק את המשתמש הזה?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"כל האפליקציות והנתונים יימחקו."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"לא ניתן היה למחוק את המשתמש."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ביטול"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ניסיון חוזר"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"למחוק את המשתמש האחרון?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"לאחר מחיקת המשתמש היחיד שנשאר למכונית הזאת, ייווצר מנהל מערכת חדש."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"כל הנתונים, ההגדרות והאפליקציות ששויכו למשתמש הזה, יימחקו. יהיה עליך להגדיר שוב את המערכת."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"בחירת מנהל מערכת חדש"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"יש צורך במנהל מערכת אחד לפחות: לפני שמוחקים את מנהל המערכת הזה, צריך לבחור מחליף."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"לבחירת מנהל מערכת"</string>
+    <string name="user_guest" msgid="3465399481257448601">"אורח"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"אורח"</string>
     <string name="user_switch" msgid="6544839750534690781">"החלפה"</string>
     <string name="current_user_name" msgid="3813671533249316823">"את/ה (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"שם"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"לא מוגדר"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"עריכת שם המשתמש"</string>
     <string name="users_list_title" msgid="770764290290240909">"משתמשים"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"הרשאות הוענקו למשתמש %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"חשבונות"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"משתמש"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"הוספת חשבון"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"לא נוספו חשבונות"</string>
     <string name="account_list_title" msgid="7631588514613843065">"חשבונות עבור <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"סנכרון נתונים באופן אוטומטי"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"אפליקציות יוכלו לרענן נתונים באופן אוטומטי"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"להפעיל סנכרון אוטומטי של נתונים?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"כל שינוי שיבוצע בחשבונות שלך באינטרנט יועתק באופן אוטומטי למכשיר.\n\nייתכן גם שחלק מהשינויים שיבוצעו בטלפון יועתקו באופן אוטומטי לאינטרנט. כך פועל חשבון Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"להשבית סנכרון אוטומטי של נתונים?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"פעולה זו תחסוך בשימוש בנתונים, אבל יהיה צורך לסנכרן כל חשבון באופן ידני כדי לאסוף מידע עדכני. בזמן עדכונים לא יתקבלו התראות."</string>
     <string name="account_details_title" msgid="7529571432258448573">"פרטי חשבון"</string>
     <string name="add_account_title" msgid="5988746086885210040">"הוספת חשבון"</string>
     <string name="add_an_account" msgid="1072285034300995091">"הוספת חשבון"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"הסרת חשבון"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"להסיר את החשבון?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"הסרת חשבון זה תגרום למחיקת כל ההודעות, אנשי הקשר ונתונים נוספים מהמכשיר!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"מנהל המכשיר אינו מתיר שינוי זה"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"האם להסיר משתמש זה?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"כל האפליקציות והנתונים יימחקו."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"הניסיון להסרת המשתמש נכשל."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"לנסות שוב?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"סגירה"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ניסיון חוזר"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"האם להוסיף משתמש חדש?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את המרחב שלו."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"כל משתמש יכול לעדכן אפליקציות לכל שאר המשתמשים."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"לא ניתן היה להסיר את החשבון."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"סנכרון חשבון"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"הסנכרון פועל ל-<xliff:g id="ID_1">%1$d</xliff:g> מתוך <xliff:g id="ID_2">%2$d</xliff:g> פריטים"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"הסנכרון פועל לכל הפריטים"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"הסנכרון כבוי לכל הפריטים"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"הסנכרון כבוי"</string>
+    <string name="sync_error" msgid="6698021343089247914">"שגיאת סנכרון"</string>
+    <string name="last_synced" msgid="4745124489150101529">"סונכרן לאחרונה ב-<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"הסנכרון מתבצע עכשיו…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"יש להקיש כדי לסנכרן כעת<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"לסנכרון עכשיו"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ביטול הסנכרון"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"יש כרגע בעיות בסינכרון. הוא יתחדש תוך זמן קצר."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"אבטחה"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"נעילת מסך"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ללא"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"קוד גישה"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"סיסמה"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"בחירת סוג נעילה"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"אפשרויות נעילת מסך"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"אפשרויות נעילה"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"הזנת קו ביטול נעילה"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"אישור"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ציור מחדש"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"הגדרת מסך נעילה"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"בחירת קוד גישה"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"הגדרת הקו לביטול נעילה"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"בחירת סיסמה"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"בחירת סיסמה"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"נעילת המסך הנוכחית"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"מטעמי אבטחה, יש להגדיר קו ביטול נעילה"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"ניקוי"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"סיסמאות נפוצות חסומות בידי מנהל ה-IT. יש לנסות סיסמה אחרת."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"אין להגדיר רצף ספרות עולה, יורד או חוזר."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"אפשרויות נעילת מסך"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : לפני <xliff:g id="NUM_DAYS">%3$s</xliff:g> ימים"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"הוספת מכשיר מהימן"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"מכשירים מהימנים"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> מכשירים</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> מכשירים</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> מכשירים</item>
+      <item quantity="one">מכשיר אחד (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"ה-<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> שלך יבטל את נעילה המכונית הזו כשהוא מחובר. אם מישהו ייקח את ה-<xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, הוא יוכל לגשת אל המכשיר הזה"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"אישור"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"הסרת מכשיר מהימן"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"סיום"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"יש להשתמש באפליקציה הנלווית כדי להגדיר מכשיר מהימן. לאחר ההגדרה, ניתן יהיה לבטל את הנעילה של פרופיל המשתמש כשהרכב מזהה את הטלפון"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. יש להוריד את האפליקציה הנלווית לטלפון שלך"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. יש לבחור את <xliff:g id="CAR_NAME">%1$s</xliff:g> בטלפון כדי להתאים את המכשירים"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock לא מצליח לזהות את תכונות האבטחה של המכשיר הזה. כדי לעזור בהגנה על המכונית, מכשיר מהימן יוכל למנוע את נעילת המכונית רק לאחר שהנעילה תבוטל על ידך. המכשיר המהימן שלך יכול למנוע את נעילת המכונית כשהוא בקרבת מקום, גם אם הוא בידיו של מישהו אחר."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"הוספה של <xliff:g id="DEVICE_NAME">%1$s</xliff:g> כמכשיר מהימן"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> נוסף בהצלחה כמכשיר מהימן"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"ההרשמה של <xliff:g id="DEVICE_NAME">%1$s</xliff:g> נכשלה"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"כדי להוסיף מכשיר מהימן, צריך להגדיר שיטת אימות בשלב הבא. אם המכשיר המהימן לא נמצא ברשותך, יידרש אימות כדי לקבל גישה לפרופיל שלך."</string>
     <string name="forget" msgid="3971143908183848527">"מחיקה"</string>
+    <string name="connect" msgid="5861699594602380150">"חיבור"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ניתוק"</string>
     <string name="delete_button" msgid="5840500432614610850">"מחיקה"</string>
     <string name="remove_button" msgid="6664656962868194178">"הסרה"</string>
     <string name="cancel" msgid="750286395700355455">"ביטול"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"יציאה ממצב הדגמה"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"פעולה זו תמחק את חשבון ההדגמה ותבצע למערכת איפוס לנתוני היצרן. כל נתוני המשתמש יאבדו."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"יציאה ממצב הדגמה"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"סיום ההגדרה"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"לא עכשיו"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"סגירה"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"התכונה לא זמינה במהלך הנהיגה."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"לא ניתן להוסיף משתמש בזמן הנהיגה."</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 533ce42..09e1b3f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"画面を暗くする、タッチスクリーン、電池"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"画面を暗くする、夜間、ティント"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"夜間モード"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ネットワークとインターネット"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"モバイル ネットワーク"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"モバイルデータ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"モバイル ネットワーク経由でデータにアクセス"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"モバイルデータを OFF にしますか?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"データ使用"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"データの警告と上限"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"アプリのデータ使用量のサイクル"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"データ使用の警告を設定"</string>
+    <string name="data_warning" msgid="116776633806885370">"データ使用の警告"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"データの上限を設定"</string>
+    <string name="data_limit" msgid="227338836292511425">"データの上限"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"データ使用の上限の設定"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"車載ヘッドユニットで設定した上限に達するとモバイルデータが OFF になります。\n\nデータ使用量はヘッドユニットで測定された値ですが、携帯通信会社での使用量の計算はこれと異なることがあるため、余裕をもって上限を設定することをおすすめします。"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ワイヤレス アクセス ポイントを設定、管理する"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi を ON にしています…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi を OFF にしています…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi リストを読み込んでいます"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi が無効です"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ネットワークを削除できませんでした"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ネットワークに接続できませんでした"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"ネットワークを追加"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi が無効です"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"接続"</string>
     <string name="wifi_password" msgid="5565632142720292397">"パスワード"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"パスワードを表示する"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ネットワーク名"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID を入力"</string>
     <string name="wifi_security" msgid="158358046038876532">"セキュリティ"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"電波強度"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"電波強度"</string>
     <string name="wifi_status" msgid="5688013206066543952">"ステータス"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"リンク速度"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"周波数"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP アドレス"</string>
+    <string name="show_password" msgid="2074628020371139240">"パスワードの表示"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ネットワーク名の入力"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"パスワードの入力"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"弱"</item>
-    <item msgid="2032262610626057081">"中"</item>
-    <item msgid="3859756017461098953">"強"</item>
-    <item msgid="1521103743353335724">"非常に強い"</item>
+    <item msgid="7683058295076342057">"弱"</item>
+    <item msgid="1639222824821660744">"中"</item>
+    <item msgid="1838705897358163300">"強"</item>
+    <item msgid="6067166649320533751">"非常に強い"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth を ON にする"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth が無効"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ネットワークの詳細"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC アドレス"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP アドレス"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"サブネット マスク"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 アドレス"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ゲートウェイ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi 設定"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi を自動的に ON にする"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"ホーム ネットワークなどの高品質の保存済みネットワークの検出時に Wi‑Fi を ON にする"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259"><annotation id="link">"位置情報"</annotation>"が OFF のため使用できません。ON にしてください。"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi のスキャンを ON にしますか?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ON にする"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi のスキャンを ON にしました"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"モバイルデータへの自動切り替え"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi でインターネットにアクセスできない場合にモバイルデータを使用します。データ通信料が発生する可能性があります。"</string>
+    <string name="learn_more" msgid="8214605928933358604">"詳細"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"接続を管理し、デバイス名や検出の許可を設定する"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"パソコン"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ヘッドセット"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"スマートフォン"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"画像関連"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ヘッドフォン"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"入力用周辺機器"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"ペア設定済みのデバイス"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"使用可能なデバイス"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ペア設定されたデバイスがありません"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"使用可能なデバイスがありません"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"ペア設定済みのデバイス"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"名前"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"使用目的"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth デバイスの名前を変更"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"名前のないデバイス"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"ペア設定済みのデバイス"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"新しいデバイスとペア設定"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"ペア設定できるよう Bluetooth が ON になります"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"デバイスの接続を解除しますか?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"車と <xliff:g id="DEVICE_NAME">%1$s</xliff:g> との接続を解除します。"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"車の Bluetooth アドレス: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"デバイスの Bluetooth アドレス: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"車の名前"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"この車の名前を変更"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"デバイス名の変更"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"名前を変更"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"使用可能なデバイス"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"プロファイル"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth のペア設定リクエスト"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ペア設定して接続"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth ペア設定コード"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN に英字や記号を含める"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"ペア設定コードを入力してから Return キーまたは Enter キーを押してください"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"通常は 0000 または 1234 です"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"ペア設定リクエスト"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」とペア設定するにはタップしてください。"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"言語"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"言語と入力"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"キーボード"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"キーボードの管理"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"テキスト読み上げの設定"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"優先するエンジン"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"現在のエンジン"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"読み上げ速度"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"音の高さ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"リセット"</string>
     <string name="sound_settings" msgid="3072423952331872246">"音"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"着信音の音量"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"ナビの音量"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"メディア"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"音楽や動画の再生音量を設定"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"アラーム"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"着信音"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"デフォルトの通知音"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"デフォルトのアラーム音"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"アプリと通知"</string>
+    <string name="all_applications" msgid="7798210477486822168">"すべてのアプリを表示"</string>
+    <string name="default_applications" msgid="1558183275638697087">"デフォルトのアプリ"</string>
     <string name="applications_settings" msgid="794261395191035632">"アプリ情報"</string>
+    <string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"強制停止しますか?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"アプリを強制停止すると、アプリが正常に機能しなくなる恐れがあります。"</string>
     <string name="disable_text" msgid="4358165448648990820">"無効にする"</string>
     <string name="enable_text" msgid="1794971777861881238">"有効にする"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"アンインストール"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"このアプリを無効にすると、Android などの他のアプリが正しく動作しなくなる恐れがあります。"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"アプリを無効にする"</string>
     <string name="permissions_label" msgid="2701446753515612685">"権限"</string>
     <string name="application_version_label" msgid="8556889839783311649">"バージョン: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"権限が付与されていません"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"リクエストされた権限はありません"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"データ使用量"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"アプリのデータ使用量"</string>
-    <string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
     <string name="computing_size" msgid="5791407621793083965">"計算しています…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 個の追加権限</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 個の追加権限</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"アシストと音声入力"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"アシストアプリ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"画面のテキストを使用"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"画面コンテンツのテキストにアクセスすることをアシストアプリに許可します"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"スクリーンショットを使用"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"画面の画像にアクセスすることをアシストアプリに許可します"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"自動入力サービス"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"なし"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"選択済み"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"アシスタントはシステムで使用中のアプリに関する情報(画面に表示される情報、アプリ内でアクセス可能な情報など)を読み取れるようになります。"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;このアプリが信頼できることを確認してください&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; は画面上の内容に基づいて、自動入力可能な情報を判別します。"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"サービスの追加"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"位置情報"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近の位置情報リクエスト"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近の位置情報リクエストはありません"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"アプリレベルの権限"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"スキャン"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"位置情報サービス"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi のスキャン"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"アプリやサービスに対し、Wi‑Fi が OFF の場合でも、常に Wi-Fi ネットワークをスキャンすることを許可します。たとえば、位置情報を使用する機能やサービスの改善に役立ちます。"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth のスキャン"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"アプリやサービスに対し、Bluetooth が OFF の場合でも、常に付近の端末をスキャンすることを許可します。たとえば、位置情報を使用する機能やサービスの改善に役立ちます。"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"システム"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"システム アップデート"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"システム アップデート"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android のバージョン"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android セキュリティ パッチレベル"</string>
     <string name="model_info" msgid="4966408071657934452">"モデル"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ベースバンド バージョン"</string>
     <string name="kernel_version" msgid="7327212934187011508">"カーネル バージョン"</string>
     <string name="build_number" msgid="3997326631001009102">"ビルド番号"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth アドレス"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"該当なし"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"ステータス"</string>
     <string name="device_status" msgid="267298179806290920">"ステータス"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"著作権"</string>
     <string name="license_title" msgid="936705938435249965">"ライセンス"</string>
     <string name="terms_title" msgid="5201471373602628765">"利用規約"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"システムの WebView ライセンス"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"システムの WebView ライセンス"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"壁紙"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"航空写真の提供:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"サードパーティ ライセンス"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ライセンスの読み込み中に問題が発生しました。"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"読み込んでいます…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">デベロッパー設定が有効になるまであと <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ステップです。</item>
+      <item quantity="one">デベロッパー設定が有効になるまであと <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ステップです。</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"デベロッパー設定が有効になりました!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"デベロッパー設定はすでに有効です。"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"開発者向けオプション"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"リセット オプション"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ネットワーク、アプリ、端末のリセット"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ネットワークをリセット"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"この操作を行うと、以下を含むすべてのネットワーク設定がリセットされます。"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"モバイルデータ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"車のすべての eSIM を消去"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"この操作でご利用のサービスプランがキャンセルされることはありません。"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM のリセットエラー"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ネットワークの選択"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"設定をリセット"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"リセットしますか?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"すべてのネットワーク設定をリセットしますか?この操作は元に戻せません。"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"設定をリセット"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ネットワーク設定をリセットしました"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"アプリの設定をリセット"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"この操作により、次の設定がすべてリセットされます。\n\n"<li>"無効化されているアプリ"</li>\n<li>"無効化されているアプリの通知"</li>\n<li>"特定の操作で使用するデフォルトのアプリ"</li>\n<li>"アプリのバックグラウンド データの制限"</li>\n<li>"権限のすべての制限"</li>\n\n"アプリのデータが失われることはありません。"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"アプリをリセット"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"アプリの設定をリセットしました"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"全データを消去(出荷時リセット)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"この操作を行うと、以下のデータを含め、車のヘッドユニットの全データが消去されます。\n\n"<li>"Google アカウント"</li>\n<li>"システムやアプリのデータと設定"</li>\n<li>"ダウンロードしたアプリ"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"以下のアカウントにログインしています。"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"この車には他にもユーザーがいます。"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"車をリセット"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"リセットしますか?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"個人情報とダウンロードしたアプリをすべて消去しますか?この操作は元に戻せません。"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"すべて消去"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"消去しています"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"お待ちください..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"日付と時刻"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"日時の設定"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"日付、時刻、タイムゾーン、フォーマットを設定する"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"タイムゾーン順"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"日付"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"時刻"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"ユーザーを追加"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"アカウントを追加"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ユーザーの削除"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"新しいユーザー"</string>
-    <string name="user_guest" msgid="3465399481257448601">"ゲスト"</string>
     <string name="user_admin" msgid="1535484812908584809">"管理者"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"管理者としてログインしました"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"すべての管理者権限"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"管理者にする"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"このユーザーは、他の管理者を含むユーザーの削除、システムデータの初期化を行えるようになります。"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"この操作は元に戻せません。"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"はい、管理者にする"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"新しいユーザーの作成"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"電話の発信"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"車のモバイルデータを使用した SMS"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"新しいアプリのインストール"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"アプリのアンインストール"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ユーザーを追加"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"新しいユーザー"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"新しいユーザーを追加しますか?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"どのユーザーも他のすべてのユーザーに代わってアプリを更新できます。"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"ユーザー数が上限に達しました"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">最大 <xliff:g id="COUNT">%d</xliff:g> 人のユーザーを作成できます。</item>
+      <item quantity="one">作成できるユーザーは 1 人のみです。</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"新しいユーザーを作成できませんでした"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"このユーザーの削除"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"すべてのアプリとデータが削除されます。"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ユーザーを削除できませんでした。"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"閉じる"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"再試行"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"最後のユーザーの削除"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"この車の最後のユーザーを削除すると、新しい管理者ユーザーが作成されます。"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"このユーザーに関連付けられているすべてのデータ、設定、アプリが削除されます。システムの再設定が必要になります。"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"新しい管理者の選択"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"管理者は少なくとも 1 人必要です。この管理者を削除するには、まず代わりの管理者を選択してください。"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"管理者を選択"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ゲスト"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ゲスト"</string>
     <string name="user_switch" msgid="6544839750534690781">"切り替える"</string>
     <string name="current_user_name" msgid="3813671533249316823">"自分(%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"名前"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"セットアップしていません"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ユーザー名の編集"</string>
     <string name="users_list_title" msgid="770764290290240909">"ユーザー"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s さんに権限が付与されました"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"アカウント"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ユーザー"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"アカウントを追加"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"アカウントが追加されていません"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> のアカウント"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"データの自動同期"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"データの自動更新をアプリに許可します"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"データ自動同期をONにしますか?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ウェブでアカウントに変更を加えると自動的にデバイスに反映されます。\n\nGoogle アカウントなど、アカウントによっては、スマートフォンで変更を加えた場合も自動的にウェブに反映されます。"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"データ自動同期をOFFにしますか?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"OFF にすると、データの使用を節約できますが、最新情報を取得するには手動で各アカウントを同期する必要があります。また、更新があったときに通知を受け取れません。"</string>
     <string name="account_details_title" msgid="7529571432258448573">"アカウント情報"</string>
     <string name="add_account_title" msgid="5988746086885210040">"アカウントの追加"</string>
     <string name="add_an_account" msgid="1072285034300995091">"アカウントの追加"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"アカウントを削除"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"アカウントを削除しますか?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"このアカウントを削除すると、メール、連絡先などのすべてのデータも端末から削除されます。"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"この変更は管理者によって許可されていません"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ユーザーを削除しますか?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"すべてのアプリとデータが削除されます。"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"ユーザーを削除できませんでした。"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"再試行しますか?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"閉じる"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"再試行"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"新しいユーザーを追加しますか?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"どのユーザーも他のすべてのユーザーに代わってアプリを更新できます。"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"アカウントを削除できませんでした。"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"アカウントの同期"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> 件中 <xliff:g id="ID_1">%1$d</xliff:g> 件のアイテムで同期が ON"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"すべてのアイテムで同期が ON"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"すべてのアイテムで同期が OFF"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"同期 OFF"</string>
+    <string name="sync_error" msgid="6698021343089247914">"同期エラー"</string>
+    <string name="last_synced" msgid="4745124489150101529">"最終同期日時: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"同期しています…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"タップして今すぐ同期<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"今すぐ同期"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"同期をキャンセル"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"現在同期で問題が発生しています。しばらくお待ちください。"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"セキュリティ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"画面ロック"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"なし"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"パスワード"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"ロックタイプの選択"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"画面ロックの方法"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"設定できるロック"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"パターンの入力"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"確認"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"再入力"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"画面ロックの設定"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN の選択"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"パターンの選択"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"パスワードの選択"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"パスワードの選択"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"現在の画面ロック"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"セキュリティ強化のためにパターンを設定"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"消去"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"一般的なパスワードは IT 管理者によってブロックされています。別のパスワードをお試しください。"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"一連の数字を昇順や降順にしたり、繰り返したりすることはできません。"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"画面ロックの方法"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g> 日前"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"信頼できるデバイスを追加"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"信頼できるデバイス"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 台のデバイス</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 台のデバイス</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"接続すると、<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> によりこの車のロックが解除されます。<xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> が第三者の手に渡ると、このデバイスを利用されてしまうおそれがあります"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"確認"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"信頼できるデバイスを削除"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"完了"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"コンパニオン アプリを使用して、信頼できるデバイスをセットアップしてください。セットアップすると、車でスマートフォンが検出されたときにユーザー プロフィールのロックを解除できます"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. スマートフォンにコンパニオン アプリをダウンロードします"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. スマートフォンで、デバイスとペア設定する <xliff:g id="CAR_NAME">%1$s</xliff:g> を選択します"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ではこのデバイスのセキュリティ機能を検出できません。車を保護するため、信頼できるデバイスでは、あなたがすでにロック解除した車のロックを解除されたままにする以外のことはできません。第三者がそのデバイスを手に取っている場合でも、近くにある車のロックが解除されたままになることがあります。"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"信頼できるデバイスとして <xliff:g id="DEVICE_NAME">%1$s</xliff:g> を追加"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> を信頼できるデバイスとして追加しました"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> の登録に失敗しました"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"信頼できるデバイスを追加するには、次に認証方式を設定してください。信頼できるデバイスがない場合は、プロフィールにアクセスする際に認証が必要になります。"</string>
     <string name="forget" msgid="3971143908183848527">"削除"</string>
+    <string name="connect" msgid="5861699594602380150">"接続"</string>
+    <string name="disconnect" msgid="6140789953324820336">"接続を解除"</string>
     <string name="delete_button" msgid="5840500432614610850">"削除"</string>
     <string name="remove_button" msgid="6664656962868194178">"削除"</string>
     <string name="cancel" msgid="750286395700355455">"キャンセル"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"デモモードの終了"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"デモアカウントが削除され、システムが出荷時の設定にリセットされます。すべてのユーザーデータは失われます。"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"デモを終了"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"設定を完了"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"後で行う"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"閉じる"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"この機能は運転中は利用できません。"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"運転中はユーザーを追加できません。"</string>
 </resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 83df5ff..41a5aa6 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ეკრანის გამქრქალება, სენსორული ეკრანი, ბატარეა"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ეკრანის გამქრქალება, ღამე, ელფერი"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"ღამის რეჟიმი"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ქსელი და ინტერნეტი"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"მობილური ქსელი"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"მობილური ინტერნეტი"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"მონაცემებზე წვდომა მობილური ქსელით"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"გსურთ მობილური ინტერნეტის გამორთვა?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"მონაცემთა მოხმარება"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"მოხმარების შესახებ გაფრთხილება და ლიმიტი"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"აპების მიერ ტრაფიკის მოხმარების ციკლი"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"გაფრთხილების დაყენება"</string>
+    <string name="data_warning" msgid="116776633806885370">"მოხმარების შესახებ გაფრთხილება"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ტრაფიკის ლიმიტის დაყენება"</string>
+    <string name="data_limit" msgid="227338836292511425">"ტრაფიკის ლიმიტი"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ტრაფიკის მოხმარების შეზღუდვა"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"მითითებული ლიმიტის მიღწევის შემდეგ თქვენი ავტომობილის საინფორმაციო-გასართობი სისტემა გამორთავს მობილურ ინტერნეტს.\n\nლიმიტის არჩევისას გაითვალისწინეთ, რომ ავტომობილის საინფორმაციო-გასართობი სისტემა და თქვენი ოპერატორი შეიძლება განსხვავებულად აღრიცხავდეს ინტერნეტის მოხმარებას."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"უსადენო წვდომის წერტილების დაყენება და მართვა"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi ირთვება…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"WiFi-ის გამორთვა…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"მიმდინარეობს Wi‑Fi ქსელების სიის ჩატვირთვა"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi გათიშულია"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ქსელის დავიწყება ვერ მოხერხდა"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ქსელთან დაკავშირება ვერ ხერხდება"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"ქსელის დამატება"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi გათიშულია"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"დაკავშირება"</string>
     <string name="wifi_password" msgid="5565632142720292397">"პაროლი"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"პაროლის გამოჩენა"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ქსელის სახელი"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"შეიყვანეთ SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"უსაფრთხოება"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"სიგნალის სიძლიერე"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"სიგნალის სიძლიერე"</string>
     <string name="wifi_status" msgid="5688013206066543952">"სტატუსი"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"დაკავშირების სიჩქარე"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"სიხშირე"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP მისამართი"</string>
+    <string name="show_password" msgid="2074628020371139240">"პაროლის გამოჩენა"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"შეიყვანეთ ქსელის სახელი"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"შეიყვანეთ პაროლი"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ცუდი"</item>
-    <item msgid="2032262610626057081">"ნორმალური"</item>
-    <item msgid="3859756017461098953">"კარგი"</item>
-    <item msgid="1521103743353335724">"შესანიშნავი"</item>
+    <item msgid="7683058295076342057">"ცუდი"</item>
+    <item msgid="1639222824821660744">"ნორმალური"</item>
+    <item msgid="1838705897358163300">"კარგი"</item>
+    <item msgid="6067166649320533751">"შესანიშნავი"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth-ის ჩართვა"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth გათიშულია"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d მბიტი/წმ"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 გჰც"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 გჰც"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ქსელის დეტალები"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC მისამართი"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP მისამართი"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"ქვექსელის ნიღაბი"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 მისამართები"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"შლუზი"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi-ს პარამეტრები"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi-ს ავტომატურად ჩართვა"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi ჩაირთვება შენახულ, მაღალხარისხიან ქსელებთან (მაგალითად, სახლის ქსელთან) სიახლოვისას"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"მიუწვდომელია გამორთული მდებარეობის გამო. ჩართეთ "<annotation id="link">"მდებარეობა"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"გსურთ Wi‑Fi სკანირების ჩართვა?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ჩართვა"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi სკანირება ჩართულია"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"ავტომატურად გადართვა მობილურ ინტერნეტზე"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"მობილური ინტერნეტის გამოყენება, როცა Wi‑Fi ქსელს არ აქვს წვდომა ინტერნეტზე. შესაძლოა მოგიწიოთ მობილური ინტერნეტის საფასურის გადახდა."</string>
+    <string name="learn_more" msgid="8214605928933358604">"შეიტყვეთ მეტი"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"კავშირების მართვა, მოწყობილობის სახელის &amp;amp დადგენა; ხელმისაწვდომობა"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"კომპიუტერი"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ყურსაცვამი"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ტელეფონი"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"გამოსახულებათა დამუშავების მოწყობილობა"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ყურსასმენი"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"შეყვანის პერიფერიული მოწყობილობა"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"დაწყვილებული მოწყობილობები"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ხელმისაწვდომი მოწყობილობები"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"დაწყვილებული მოწყობილობები არ არის"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"ხელმისაწვდომი მოწყობილობები არ არის"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"დაწყვილებული მოწყობილობა"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"სახელი"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"გამოყენება:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth მოწყობილობის გადარქმევა"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"უსახელო მოწყობილობა"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"დაწყვილებული მოწყობილობები"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"ახალი მოწყობილობის დაწყვილება"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"დასაწყვილებლად ჩაირთვება Bluetooth"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"გსურთ მოწყობ. გამოერთება?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"თქვენი ავტომობილი და <xliff:g id="DEVICE_NAME">%1$s</xliff:g> აღარ იქნება დაკავშირებული."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"ავტომობილის Bluetooth მისამართი: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"მოწყობილობის Bluetooth მისამართი: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ავტომობილის სახელი"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ამ ავტომობილის გადარქმევა"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"მოწყობილობის გადარქმევა"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"გადარქმევა"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ხელმისაწვდომი მოწყობილობები"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"პროფილები"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth დაწყვილების მოთხოვნა"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"დაწყვილება და შეერთება"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-ის დაკავშირების კოდი"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN მოიცავს ასოებს ან სიმბოლოებს"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"აკრიფეთ დაწყვილების კოდი და დააჭირეთ Return-ს ან Enter-ს"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ჩვეულებრივ 0000 ან 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"დაწყვილების თხოვნა"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"შეეხეთ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-თან დასაწყვილებლად."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ენები"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ენები და შეყვანა"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"კლავიატურა"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"კლავიატურების მართვა"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"გახმოვანებული ტექსტის გამოტანა"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"სასურველი ძრავა"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"ამჟამინდელი ძრავა"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"მეტყველების ტემპი"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"სიმაღლე"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"გადაყენება"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ხმა"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"ზარის სიმძლავრე"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"ნავიგაციის ხმა"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"მედია"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"მუსიკისა და ვიდეოებისთვის ხმის დაყენება"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"მაღვიძარა"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ტელეფონის ზარი"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"შეტყობინების ნაგულისხმევი ხმა"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"მაღვიძარას ნაგულისხმევი ხმა"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"აპები და შეტყობინებები"</string>
+    <string name="all_applications" msgid="7798210477486822168">"ყველა აპის ჩვენება"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ნაგულისხმევი აპები"</string>
     <string name="applications_settings" msgid="794261395191035632">"აპის ინფო"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ძალით შეჩერება"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"გსურთ ძალით შეჩერება?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"აპისთვის მუშაობის ძალით შეჩერების შემთხვევაში, მან შეიძლება არასათანადოდ იმუშაოს."</string>
     <string name="disable_text" msgid="4358165448648990820">"გათიშვა"</string>
     <string name="enable_text" msgid="1794971777861881238">"ჩართვა"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"დეინსტალაცია"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ამ აპის გათიშვის შემთხვევაში, Android-მა და სხვა აპებმა შეიძლება გამართულად აღარ იმუშაოს."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"აპის გათიშვა"</string>
     <string name="permissions_label" msgid="2701446753515612685">"ნებართვები"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ვერსია: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ნებართვები არ არის გაცემული"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ნებართვებზე მოთხოვნები არ არის"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"მონაცემთა მოხმარება"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"აპის მონაცემთა გამოყენება"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ძალით შეჩერება"</string>
     <string name="computing_size" msgid="5791407621793083965">"გამოთვლა…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> დამატებითი ნებართვა</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> დამატებითი ნებართვა</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ასისტენტი და ხმოვანი შეყვანა"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"დამხმარე აპი"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ტექსტის გამოყენება ეკრანიდან"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"დამხმარე აპისთვის ეკრანზე არსებულ კონტენტზე ტექსტის სახით წვდომის დაშვება"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ეკრანის ანაბეჭდის გამოყენება"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"დამხმარე აპისთვის ეკრანის სურათზე წვდომის დაშვება"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ავტომატური შევსების სერვისი"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"არცერთი"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"არჩეულია"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ასისტენტი შეძლებს თქვენს სისტემაში გამოყენებული აპების ინფორმაციის წაკითხვას (მათ შორის, ინფორმაციის, რომელიც ნაჩვენებია თქვენს ეკრანზე ან ხელმისაწვდომია აპებში)."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;დარწმუნდით, რომ ენდობით ამ აპს&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google-ის ავტომატური შევსება&gt;%1$s&lt;/xliff:g&gt; იყენებს თქვენს ეკრანზე არსებულ კონტენტს, რომ გაარკვიოს, რა შეიძლება შეივსოს ავტომატურად."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"სერვისის დამატება"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"მდებარეობა"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"მდებარეობის ბოლოდროინდელი მოთხოვნები"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"მდებარეობის ბოლოდროინდელი მოთხოვნები არ არის"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ნებართვები აპის დონეზე"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"სკანირება"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"მდებარეობის სერვისები"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi სკანირება"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"აპებისა და სერვისებისთვის Wi‑Fi ქსელების ნებისმიერ დროს სკანირების დაშვება, მაშინაც კი, როცა Wi‑Fi გამორთულია. მაგალითად, აღნიშნული გამოიყენება მდებარეობაზე დაფუძნებული ფუნქციებისა და სერვისების გასაუმჯობესებლად."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth სკანირება"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"აპებისა და სერვისებისთვის ახლომდებარე მოწყობილობების ნებისმიერ დროს სკანირების დაშვება, მაშინაც კი, როცა Bluetooth გამორთულია. მაგალითად, აღნიშნული გამოიყენება მდებარეობაზე დაფუძნებული ფუნქციებისა და სერვისების გასაუმჯობესებლად."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"სისტემა"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"სისტემის განახლებები"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"სისტემის განახლებები"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-ის ვერსია"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-ის უსაფრთხოების ნაწილაკის დონე"</string>
     <string name="model_info" msgid="4966408071657934452">"მოდელი"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Baseband-ის ვერსია"</string>
     <string name="kernel_version" msgid="7327212934187011508">"kernel-ის ვერსია"</string>
     <string name="build_number" msgid="3997326631001009102">"ანაწყობის ნომერი"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth მისამართი"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"მიუწვდომელი"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"სტატუსი"</string>
     <string name="device_status" msgid="267298179806290920">"სტატუსი"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"საავტორო უფლებები"</string>
     <string name="license_title" msgid="936705938435249965">"ლიცენზია"</string>
     <string name="terms_title" msgid="5201471373602628765">"წესები და პირობები"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"სისტემის ვებ მიმოხილვის ლიცენზია"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"System WebView ლიცენზიები"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ფონები"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"სატელიტური სურათების პროვაიდერები:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"მესამე მხარის ლიცენზიები"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ლიცენზიის ჩამოტვირთვასთან პრობლემაა."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"მიმდინარეობს ჩატვირთვა…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">დეველოპერობამდე <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ნაბიჯი დაგრჩათ.</item>
+      <item quantity="one">დეველოპერობამდე <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ნაბიჯი დაგრჩათ.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ახლა დეველოპერი ხართ!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"არ არის საჭირო, უკვე დეველოპერი ხართ."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"დეველოპერთა პარამეტრები"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"გადაყენების ვარიანტები"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ქსელის, აპების ან მოწყობილობის გადაყენება"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ქსელის გადაყენება"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ამ ქმედებით გადაყენებული იქნება ქსელის ყველა პარამეტრი, მათ შორის:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"მობილური ინტერნეტი"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"სატრანსპორტო საშუალების ყველა eSIM-ის ამოშლა"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ეს ქმედება არ გააუქმებს თქვენს სატარიფო გეგმას."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM-ების გადაყენება ვერ ხერხდება"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"აირჩიეთ ქსელი"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"პარამეტრების გადაყენება"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"გსურთ გადაყენება?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"გსურთ ქსელის ყველა პარამეტრის გადაყენება? ამ ქმედების გაუქმება შეუძლებელი იქნება."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"პარამეტრების გადაყენება"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ქსელის პარამეტრები გადაყენებულია"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"აპთა პარამეტრების გადაყენება"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ეს ქმედება გადააყენებს ყველა პარამეტრს, რომელიც ეხება:\n\n"<li>"გათიშულ აპებს"</li>\n<li>"აპების გათიშულ შეტყობინებებს"</li>\n<li>"ქმედებებზე მიმაგრებულ ნაგულისხმევ აპლიკაციებს"</li>\n<li>"ფონურ რეჟიმში მონაცემთა გამოყენების შეზღუდვებს აპებისთვის"</li>\n<li>"ნებისმიერი ნებართვის შეზღუდვას"</li>\n\n"აპების მონაცემები არ დაიკარგება."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"აპების გადაყენება"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"აპების პარამეტრები გადაყენებულია"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ყველა მონაცემის ამოშლა (ქარხნული პარამეტრების დაბრუნება)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ეს ქმედება ამოშლის ყველა მონაცემს თქვენი ავტომობილის საინფორმაციო-გასართობი სისტემიდან. მათ შორის, ამოიშლება შემდეგი:\n\n"<li>"თქვენი Google ანგარიში"</li>\n<li>"სისტემის/აპების მონაცემები და პარამეტრები"</li>\n<li>"ჩამოტვირთული აპები"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"ამჟამად შესული ხართ შემდეგ ანგარიშებში:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ამ ავტომობილს იყენებენ სხვა მომხმარებლებიც."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"ავტომობილის გადაყენება"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"გსურთ გადაყენება?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"გსურთ მთელი თქვენი პერსონალური ინფორმაციისა და ჩამოტვირთული აპების წაშლა? ამ მოქმედების გაუქმებას ვეღარ მოახერხებთ!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ყველაფრის ამოშლა"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"მიმდინარეობს ამოშლა"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"გთხოვთ, მოითმინოთ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"თარიღი და დრო"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"თარიღისა და დროის დაყენება"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"თარიღის, დროის, დროის ზონის და ფორმატების დაყენება"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"დროის სარტყელით სორტირება"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"თარიღი"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"დრო"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"მომხმარებლის დამატება"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"ანგარიშის დამატება"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"მომხმარებლის წაშლა"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"ახალი მომხმარებელი"</string>
-    <string name="user_guest" msgid="3465399481257448601">"სტუმარი"</string>
     <string name="user_admin" msgid="1535484812908584809">"ადმინისტრატორი"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"შესული ხართ, როგორც ადმინისტრატორი"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"ადმინისტრატორის ყველა ნებართვა"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"ადმინისტრატორად დანიშვნა"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"მომხმარებელი შეძლებს სხვა მომხმარებლების (მათ შორის, ადმინისტრატორების) წაშლას და სისტემის დაბრუნებას ქარხნულ პარამეტრებზე."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ამ ქმედებას ვერ გააუქმებთ."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"დიახ, დაინიშნოს ადმინისტრატორად"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"ახალი მომხმარებლების შექმნა"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"სატელეფონო ზარების განხორციელება"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS მიმოცვლა მანქანის მობ. ინტ.-ით"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"ახალი აპების ინსტალაცია"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"აპების დეინსტალაცია"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"მომხმარებლის დამატება"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"ახალი მომხმარებელი"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"დაემატოს ახალი მომხმარებელი?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"მიღწეულია მომხმარებელთა ლიმიტი"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">შესაძლებელია მაქსიმუმ <xliff:g id="COUNT">%d</xliff:g> მომხმარებლის შექმნა.</item>
+      <item quantity="one">შესაძლებელია მხოლოდ ერთი მომხმარებლის შექმნა.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"ახალი მომხმარებლის შექმნა ვერ მოხერხდა"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"წაიშალოს ეს მომხმარებელი?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"წაიშლება ყველა აპი და მონაცემი."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"მომხმარებლის წაშლა ვერ მოხერხდა."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"დახურვა"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ხელახლა ცდა"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"ამოიშალოს ბოლო მომხმარებელი?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ამ მანქანის ერთადერთი დარჩენილი მომხმარებლის ამოშლის შემდეგ შეიქმნება ახალი ადმინისტრატორი მომხმარებელი."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"წაიშლება ამ მომხმარებელთან დაკავშირებული ყველა მონაცემი, პარამეტრი და აპი. სისტემის დაყენება ხელახლა მოგიწევთ."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"აირჩიეთ ახალი ადმინისტრატორი"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"საჭიროა მინიმუმ ერთი ადმინისტრატორი. ამ ადმინისტრატორის წასაშლელად ჯერ აირჩიეთ მისი შემცვლელი."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"ადმინისტრატორის არჩევა"</string>
+    <string name="user_guest" msgid="3465399481257448601">"სტუმარი"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"სტუმარი"</string>
     <string name="user_switch" msgid="6544839750534690781">"გადართვა"</string>
     <string name="current_user_name" msgid="3813671533249316823">"თქვენ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"სახელი"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"არ არის დარეგულირებული"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"მომხმარებლის სახელის რედაქტირება"</string>
     <string name="users_list_title" msgid="770764290290240909">"მომხმარებლები"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s-ის ნებართვები"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"ანგარიშები"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"მომხმარებელი"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"ანგარიშის დამატება"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ანგარიშები დამატებული არ არის"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>-ის ანგარიშები"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"მონაცემების ავტომატური სინქრონიზაცია"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"აპებისთვის მონაცემების ავტომატურად განახლების დაშვება"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ჩაირთოს ავტომ. სინქრონიზაცია?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ვების მეშვეობით თქვენს ანგარიშებში განხორციელებული ნებისმიერი ცვლილება ავტომატურად აისახება თქვენს მოწყობილობაში.\n\nზოგიერთი ანგარიშის შემთხვევაში, ტელეფონში განხორციელებული ნებისმიერი ცვლილება შეიძლება ავტომატურად აისახოს ვებშიც. სწორედ ასე ფუნქციონირებს Google ანგარიში."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"გამოირთოს ავტომ. სინქრონიზაცია?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ეს შეამცირებს მონაცემთა მოხმარებას, თუმცა ბოლოდროინდელი ინფორმაციის მისაღებად დაგჭირდებათ თითოეული ანგარიშის ხელით სინქრონიზაცია. გარდა ამისა, არც განახლებების შესახებ შეტყობინებებს მიიღებთ."</string>
     <string name="account_details_title" msgid="7529571432258448573">"ანგარიშის ინფორმაცია"</string>
     <string name="add_account_title" msgid="5988746086885210040">"ანგარიშის დამატება"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ანგარიშის დამატება"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"ანგარიშის წაშლა"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"გსურთ ანგარიშის ამოშლა?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ამ ანგარიშის წაშლის შემთხვევაში მოწყობილობაზე წაიშლება მასთან დაკავშირებული ყველა შეტყობინება, კონტაქტი და სხვა მონაცემი!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ეს ცვლილება თქვენი ადმინისტრატორის მიერ ნებადართული არ არის"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"წაიშალოს ეს მომხმარებელი?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"ყველა აპი და მონაცემები წაიშლება."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"მომხმარებლის ამოშლა ვერ მოხერხდა."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"გსურთ ისევ ცდა?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"დახურვა"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ხელახლა ცდა"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"დაემატოს ახალი მომხმარებელი?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"ანგარიშის ამოშლა ვერ მოხერხდა."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ანგარიშის სინქრონიზაცია"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"სინქრონიზაცია ჩართულია <xliff:g id="ID_2">%2$d</xliff:g>-დან <xliff:g id="ID_1">%1$d</xliff:g> ერთეულისთვის"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"სინქრონიზაცია ჩართულია ყველა ერთეულისთვის"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"სინქრონიზაცია გამორთულია ყველა ერთეულისთვის"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"სინქრონიზაცია გამორთულია"</string>
+    <string name="sync_error" msgid="6698021343089247914">"შეცდომა სინქრონიზაციისას"</string>
+    <string name="last_synced" msgid="4745124489150101529">"ბოლო სინქრონიზაცია: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"მიმდინარეობს სინქრონიზაცია…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"შეეხეთ ახლავე სინქრონიზაციისთვის<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ახლავე სინქრონიზაცია"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"სინქრონიზაციის გაუქმება"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ამჟამად სინქრონიზაცია ვერ ხერხდება პრობლემის გამო. ეს ფუნქცია მალე აღდგება."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"უსაფრთხოება"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ეკრანის დაბლოკვა"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"არცერთი"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-კოდი"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"პაროლი"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"აირჩიეთ ჩაკეტვის ტიპი"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"ეკრანის დაბლოკვის ვარიანტები"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ჩაკეტვის ვარიანტები"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"შეიყვანეთ განმბლოკავი ნიმუში"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"დადასტურება"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ხელმეორედ აღწარმოება"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"ეკრანის დაბლოკვის მეთოდის დაყენება"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"თქვენი PIN-კოდის არჩევა"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"აირჩიეთ განმბლოკავი ნიმუში"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"აირჩიეთ პაროლი"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"აირჩიეთ პაროლი"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"ეკრანის დაბლოკვის ამჟამინდელი მეთოდი"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"უსაფრთხოებისთვის, დააყენეთ განსაბლოკი ნიმუში"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"გასუფთავება"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ხშირად გამოყენებული პაროლები თქვენი IT ადმინისტრატორის მიერ დაბლოკილია. ცადეთ სხვა პაროლი."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ციფრების ზრდადი, კლებადი ან გამეორებადი მიმდევრობის გამოყენება ნებადართული არ არის."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"ეკრანის დაბლოკვის ვარიანტები"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> დღის წინ"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"სანდო მოწყობილობის დამატება"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"სანდო მოწყობილობები"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> მოწყობილობა</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> მოწყობილობა</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"თქვენი <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> განბლოკავს ამ მანქანას, როცა ის დაკავშირებული იქნება. თუ თქვენი <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> სხვის ხელში აღმოჩნდება, ის შეძლებს ამ მოწყობილობაზე წვდომას."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"დადასტურება"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"სანდო მოწყობილობის ამოშლა"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"მზადაა"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"გამოიყენეთ კომპანიონი აპი სანდო მოწყობილობის დასაყენებლად. დაყენების შემდეგ შეგეძლებათ თქვენი მომხმარებლის პროფილის განბლოკვა, როცა ავტომობილი ამოიცნობს თქვენს ტელეფონს."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ჩამოტვირთეთ კომპანიონი აპი თქვენს ტელეფონზე"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. თქვენს ტელეფონზე აირჩიეთ <xliff:g id="CAR_NAME">%1$s</xliff:g> მოწყობილობების დასაწყვილებლად"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock-მა ვერ მოახერხა ამ მოწყობილობის უსაფრთხოების ფუნქციების დადგენა. ავტომობილის დაცვის მიზნით, სანდო მოწყობილობა თქვენი ავტომობილის განბლოკილ მდგომარეობაში შენარჩუნებას შეძლებს მხოლოდ მას შემდეგ, რაც ის თქვენ მიერ განიბლოკება. სანდო მოწყობილობა თქვენი ავტომობილის განბლოკილ მდგომარეობაში შენარჩუნებას შეძლებს, როცა ის ახლოს მდებარეობს, მაშინაც კი, თუ ის სხვას უკავია."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ის სანდო მოწყობილობად დამატება"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> წარმატებით დაემატა სანდო მოწყობილობად"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ის რეგისტრაცია ვერ მოხერხდა"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"სანდო მოწყობილობის დასამატებლად მომდევნო ეტაპზე საჭირო იქნება ავტორიზაციის მეთოდის დაყენება. ავტორიზაცია საჭირო იქნება თქვენს პროფილზე წვდომისთვის, როცა სანდო მოწყობილობა თან არ გექნებათ."</string>
     <string name="forget" msgid="3971143908183848527">"დავიწყება"</string>
+    <string name="connect" msgid="5861699594602380150">"დაკავშირება"</string>
+    <string name="disconnect" msgid="6140789953324820336">"კავშირის გაწყვეტა"</string>
     <string name="delete_button" msgid="5840500432614610850">"წაშლა"</string>
     <string name="remove_button" msgid="6664656962868194178">"წაშლა"</string>
     <string name="cancel" msgid="750286395700355455">"გაუქმება"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"დემო-რეჟიმის დატოვება"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ეს ქმედება წაშლის დემო-ანგარიშს და სისტემის ქარხნულ მონაცემებს აღადგენს. სამომხმარებლო მონაცემები მთლიანად წაიშლება."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"დემოს დატოვება"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"დაყენების დასრულება"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ახლა არა"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"დახურვა"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ფუნქცია მიუწვდომელია მანქანის მართვისას."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"მანქანის მართვისას მომხმარებლის დამატება ვერ მოხერხდება."</string>
 </resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index aabc217..c6162cf 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"экранды күңгірттеу, сенсорлық экран, батарея"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"экранды күңгірттеу, түн, реңк"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Түнгі режим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Желі және интернет"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобильдік желі"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобильдік интернет"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Деректерге мобильдік желі арқылы кіру"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Мобильдік интернет өшірілсін бе?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Дерек трафигі"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Дерек ескертуі және шегі"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Қолданбаның дерек трафигі циклі"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Дерек ескертуін белгілеу"</string>
+    <string name="data_warning" msgid="116776633806885370">"Дерек ескертуі"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Дерек шегін белгілеу"</string>
+    <string name="data_limit" msgid="227338836292511425">"Дерек шегі"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Дерек трафигін шектеу"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Орнатқан шекке жеткеннен кейін, көліктегі құрылғы мобильдік деректерді өшіреді.\n\nҚұрылғы деректерді пайдалану шегін белгілейтіндіктен және оператор трафикті басқаша есептеуі мүмкін болғандықтан, қатаңырақ шек қойған жөн."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Сымсыз кіру нүктелерін реттеу және басқару"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi байланысын қосуда…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi байланысы өшірілуде…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi тізімі жүктелуде"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi өшірулі"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Желі өшірілмеді"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Желіге қосылмады"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Желіні енгізу"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi өшірулі"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Қосылу"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Құпия сөз"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Құпия сөзді көрсету"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Желі атауы"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID идентификаторын енгізіңіз"</string>
     <string name="wifi_security" msgid="158358046038876532">"Қауіпсіздік"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Сигнал күші"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Сигнал күші"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Күйі"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Байланыс жылдамдығы"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Жиілік"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP мекенжайы"</string>
+    <string name="show_password" msgid="2074628020371139240">"Құпия сөзді көрсету"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Желі атауын енгізу"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Құпия сөзді енгізу"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Нашар"</item>
-    <item msgid="2032262610626057081">"Орташа"</item>
-    <item msgid="3859756017461098953">"Жақсы"</item>
-    <item msgid="1521103743353335724">"Өте жақсы"</item>
+    <item msgid="7683058295076342057">"Нашар"</item>
+    <item msgid="1639222824821660744">"Орташа"</item>
+    <item msgid="1838705897358163300">"Жақсы"</item>
+    <item msgid="6067166649320533751">"Өте жақсы"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth желісін қосу"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth өшірулі"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Мб/с"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 ГГц"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ГГц"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Желі деректері"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC мекенжайы"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP мекенжайы"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Қосалқы желі маскасы"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 мекенжайлары"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Шлюз"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi параметрлері"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi желісін автоматты түрде қосу"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi бұрын сақталған жоғары сапалы желі аймағында (үйдегідей) қайта қосылады"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Орынды анықтау функциясы өшірулі болғандықтан, қолжетімді емес. "<annotation id="link">"Орынды анықтау"</annotation>" қызметін қосыңыз."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi іздеу функциясы қосылсын ба?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Қосу"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi іздеу функциясы қосулы"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Мобильдік деректерге автоматты ауысу"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi‑Fi желісінде интернетпен байланыс болмаған кезде, мобильдік деректер пайдаланылады. Деректер ақысы алынуы мүмкін."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Толығырақ"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Байланыстарды басқарып, құрылғы атауы мен табылу мүмкіндігін тағайындаңыз"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Компьютер"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Гарнитура"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Телефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Бейне құралы"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Құлақаспап"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Кіріс құралы"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Жұпталған құрылғылар"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Қолжетімді құрылғылар"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Ешқандай құрылғы жұпталмаған"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Ешқандай құрылғы қолжетімді емес"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Жұпталған құрылғы"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Аты"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Келесі үшін пайдалану"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth құрылғысының атын өзгерту"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Атаусыз құрылғы"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Жұпталған құрылғылар"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Жаңа құрылғыны жұптау"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Жұптау үшін Bluetooth функциясы қосылады"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Құрылғы ажыратылсын ба?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Көлігіңіз <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысынан ажыратылады."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Көліктің Bluetooth мекенжайы: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Құрылғының Bluetooth мекенжайы: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Көлік атауы"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Осы көліктің атауын өзгерту"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Құрылғы атауын өзгерту"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Атын өзгерту"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Жұптауға болатын құрылғылар"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профильдер"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth жұптау сұрауы"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Жұптау және жалғау"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth жұптау коды"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN коды әріптерден не таңбалардан құралады"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Жұптау кодын енгізіп, \"Оралу\" немесе \"Енгізу\" түймесін басыңыз"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Әдетте 0000 немесе 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Жұптау сұрауы"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысымен жұптау үшін түртіңіз."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Тілдер"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Тілдер және кіріс"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Пернетақта"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Пернетақтаны басқару"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Мәтінді дыбыстау шығысы"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Таңдалған жүйе"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Ағымдағы жүйе"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Дыбыстау жылдамдығы"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Дауыс тембрі"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Қалпына келтіру"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Дыбыс"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Қоңыраудың дыбыс деңгейі"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Навигациялау дыбысының қаттылығы"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Meдиа"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Музыка және бейне дыбысын реттеу"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Дабыл"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Телефон рингтоны"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Әдепкі хабарландыру дыбысы"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Әдепкі дабыл сигналы"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Қолданбалар мен хабарландырулар"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Барлық қолданбаларды көрсету"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Әдепкі қолданбалар"</string>
     <string name="applications_settings" msgid="794261395191035632">"Қолданба ақпараты"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Қолмен тоқтату"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Қолмен тоқтатылсын ба?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Егер қолданбаны күштеп тоқтату оның жұмысына кері әсерін тигізуі мүмкін."</string>
     <string name="disable_text" msgid="4358165448648990820">"Өшіру"</string>
     <string name="enable_text" msgid="1794971777861881238">"Қосу"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Жою"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Бұл қолданбаны өшірсеңіз, Android жүйесі мен басқа қолданбалар тиісінше жұмыс істемеуі мүмкін."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Қолданбаны өшіру"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Рұқсаттар"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Нұсқа: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ешқандай рұқсат берілмеген"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ешқандай рұқсат сұралмаған"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Деректер трафигі"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Қолданбаның дерек шығыны"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Қолмен тоқтату"</string>
     <string name="computing_size" msgid="5791407621793083965">"Есептелуде…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> қосымша рұқсат</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> қосымша рұқсат</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Көмекші және дауыспен енгізу"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Көмекші қолданба"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Экрандағы мәтінді пайдалану"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Көмекші қолданбаға мәтін сияқты экран мазмұнына кіруге рұқсат ету"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Скриншотты пайдалану"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Көмекші қолданбаға экран кескінін пайдалануға рұқсат ету"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Автотолтыру қызметі"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Жоқ"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Таңдалды"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistant жүйеде пайдаланылып жатқан қолданбалар туралы ақпаратты, соның ішінде экранға шығатын немесе қолданбалардағы деректерді оқи алады."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Осы қолданбаға сенетініңізге көз жеткізіңіз&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Автотолтыру&gt;%1$s&lt;/xliff:g&gt; қызметі автоматты түрде толтыруға болатын деректерді анықтау үшін экран мазмұнын пайдаланады."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Қызметті енгізу"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Орналасқан жер"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Жақында жасалған орналасқан жерді анықтау сұраулары"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Орналасқан жерді анықтау сұраулары жақында жасалмаған"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Қолданба деңгейіндегі рұқсаттар"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Іздеу"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Орынды анықтау қызметтері"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi іздеу"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Қолданбаларға және қызметтерге, Wi-Fi өшірулі кезде де, Wi-Fi желілерін кез келген уақытта іздеуге рұқсат ету. Бұл параметрді, мысалы, орналасуды анықтау функциялары мен қызметтерін жақсарту үшін пайдалануға болады."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth іздеу"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Bluetooth өшірулі болса да, қолданбалар мен қызметтерге маңайдағы құрылғыларды іздеуге рұқсат беру. Бұл параметрді, мысалы, геодеректер негізіндегі функциялар мен қызметтерді жақсарту үшін пайдалануға болады."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Жүйе"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Жүйенің жаңартылған нұсқалары"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Жүйенің жаңа нұсқалары"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android нұсқасы"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android қауіпсіздік түзетуінің деңгейі"</string>
     <string name="model_info" msgid="4966408071657934452">"Үлгісі"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Тікелей тарату нұсқасы"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Ядро нұсқасы"</string>
     <string name="build_number" msgid="3997326631001009102">"Жинақ нөмірі"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth мекенжайы"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Қолжетімді емес"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Күйі"</string>
     <string name="device_status" msgid="267298179806290920">"Күйі"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Авторлық құқық"</string>
     <string name="license_title" msgid="936705938435249965">"Лицензия"</string>
     <string name="terms_title" msgid="5201471373602628765">"Шарттары"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Жүйенің WebView лицензиясы"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Жүйенің WebView лицензиялары"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тұсқағаздар"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellite сурет провайдерлері:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Үшінші тараптық лицензиялар"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Лицензияларды жүктеу барысында ақау орын алды."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Жүктелуде…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> қадамнан кейін әзірлеуші атанасыз.</item>
+      <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> қадамнан кейін әзірлеуші атанасыз.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Енді сіз әзірлеушісіз!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Қажет емес, сіз енді әзірлеушісіз."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Әзірлеуші опциялары"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Опцияларды қайтару"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Желі, қолданбалар және құрылғы параметрлерін қайтару"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Желіні бастапқы күйге қайтару"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Келесілерді қоса, барлық желі параметрлері бастапқы күйіне қайтарылады:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобильдік деректер"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Көліктің барлық eSIM карталарының деректерін өшіру"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Қызмет жоспарынан бас тартылмайды."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM карталарын бастапқы күйіне қайтару мүмкін емес"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Желіні таңдау"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Бастапқы күйге қайтару"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Бастапқы күйге қайтарылсын ба?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Барлық желі параметрлері бастапқы күйіне қайтарылсын ба? Бұл әрекетті қайтару мүмкін емес!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Бастапқы күйге қайтару"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Желі параметрлері бастапқы күйіне қайтарылды"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Параметрлерді бастапқы күйіне қайтару"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Келесілердің параметрлері бастапқы күйіне қайтарылады:\n\n"<li>"өшірілген қолданбалар;"</li>\n<li>"қолданбалардың өшірілген хабарландырулары;"</li>\n<li>"әрекеттерге арналған әдепкі қолданбалар;"</li>\n<li>"фондық режимдегі дерек тасымалын шектеу;"</li>\n<li>"барлық рұқсат шектеулері."</li>\n\n"Қолданба деректері жоғалмайды."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Бастапқы күйге қайтару"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Қолданба параметрлері бастапқы күйіне қайтарылды"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Барлық деректі өшіру (зауыттық мәнге қайтару)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Көліктің басты құрылғысынан барлық деректер өшеді, оның ішінде:\n\n"<li>"Google есептік жазбаңыз;"</li>\n<li>"жүйе мен қолданба деректері және параметрлері;"</li>\n<li>"жүктеп алынған қолданбалар."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Сіз келесі есептік жазбаларға кірдіңіз:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Бұл көлікте басқа пайдаланушылар бар."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Көлікті бастапқы күйге қайтару"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Бастапқы күйге қайтарылсын ба?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Барлық жеке ақпаратыңыз бен жүктелген қолданбаларыңыз өшірілсін бе? Бұл әрекетті кері қайтару мүмкін емес!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Барлығын өшіру"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Өшірілуде"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Күте тұрыңыз…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Күн және уақыт"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Күн мен уақытты реттеу"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Күнін, уақытын, уақыт белдеуін, форматтарды реттеу"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Уақыт белдеуі бойынша сұрыптау"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Күні"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Уақыт"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Пайдаланушы енгізу"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Есептік жазба енгізу"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Пайдаланушыны жою"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Жаңа пайдаланушы"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Қонақ"</string>
     <string name="user_admin" msgid="1535484812908584809">"Әкімші"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Әкімші ретінде кірдіңіз"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Барлық әкімші рұқсаттары"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Әкімші ету"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Пайдаланушы басқа пайдаланушыларды, соның ішінде әкімшілерді жоя алады және жүйені зауыттық мәндеріне қайтара алады."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Бұл әрекетті қайтару мүмкін емес."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Иә, әкімші етілсін"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Жаңа пайдаланушы профильдерін жасау"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Телефон қоңырауларын шалу"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Автокөліктің мобильдік деректері арқылы хабар алмасу"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Жаңа қолданбаларды орнату"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Қолданбаларды жою"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Пайдаланушы енгізу"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Жаңа пайдаланушы"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Жаңа пайдаланушы енгізілсін бе?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Енгізілген жаңа пайдаланушы өз профилін реттеуі керек."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Кез келген пайдаланушы қолданбаларды басқа пайдаланушылар үшін жаңарта алады."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Пайдаланушылар саны шегіне жетті"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> пайдаланушыға дейін жасауға болады.</item>
+      <item quantity="one">Тек бір пайдаланушыны жасауға болады.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Жаңа пайдаланушы жасалмады"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Пайдаланушы жойылсын ба?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Барлық қолданбалар және деректер жойылады."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Пайдаланушы жойылмады."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Қабылдамау"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Қайталау"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Соңғы пайдаланушы жойылсын ба?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Бұл көлік үшін соңғы қалған пайдаланушыны жойғаннан кейін, жаңа әкімші пайдаланушы жасалады."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Бұл пайдаланушымен байланыстырылған деректер, параметрлер және қолданба жойылады. Жүйені қайта реттеу қажет болады."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Жаңа әкімшіні таңдаңыз"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Кемінде бір әкімші болуы керек. Ағымдағы әкімшіні жою үшін алдымен жаңасын таңдаңыз."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Әкімшіні таңдау"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Қонақ"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Қонақ"</string>
     <string name="user_switch" msgid="6544839750534690781">"Ауысу"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Сіз (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Аты"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Реттелмеген"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Пайдаланушы атын өзгерту"</string>
     <string name="users_list_title" msgid="770764290290240909">"Пайдаланушылар"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s: рұқсаттар"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Есептік жазбалар"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Пайдаланушы"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Есептік жазба енгізу"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Ешқандай есептік жазба енгізілмеген"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> атты пайдаланушының есептік жазбалары"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Деректерді автоматты түрде синхрондау"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Қолданбалардың деректерді автоматты жаңартуына рұқсат беру"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Автосихрондау қосылсын ба?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Компьютер арқылы есептік жазбаларыңызға енгізілген өзгертулер құрылғыңызға автоматты түрде көшіріледі.\n\nСондай-ақ телефоныңыз арқылы есептік жазбаларға енгізілген кейбір өзгертулер компьютерге көшірілуі мүмкін. Google есептік жазбасы осылай жұмыс істейді."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Автосинхрондау өшірілсін бе?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Трафик үнемделеді, бірақ соңғы ақпаратты жинау үшін әр есептік жазбаны қолмен синхрондау қажет болады. Сондай-ақ жаңартылған нұсқалар шыққанда, хабарландыру жіберілмейді."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Есептік жазба ақпараты"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Есептік жазба енгізу"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Есептік жазба енгізу"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Есептік жазбаны өшіру"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Есептік жазба өшірілсін бе?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Бұл есептік жазба өшірілсе, құрылғыдағы барлық хабарлар, контактілер және басқа деректер қоса жойылады!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Бұл өзгертуге әкімші рұқсат етпеген"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Пайдаланушы өшірілсін ба?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Барлық қолданбалар және деректер жойылады."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Пайдаланушы өшірілмеді."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Қайталансын ба?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Жабу"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Қайталау"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Жаңа пайдаланушы енгізілсін бе?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Енгізілген жаңа пайдаланушы өз профилін реттеуі керек."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Кез келген пайдаланушы қолданбаларды басқа пайдаланушылар үшін жаңарта алады."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Есептік жазба өшірілмеді."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Есептік жазбаны синхрондау"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>/<xliff:g id="ID_1">%1$d</xliff:g> элемент үшін синхрондау қосулы"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Барлық элементтер үшін синхрондау қосулы"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Барлық элементтер үшін синхрондау өшірулі"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Синхрондау ӨШІРУЛІ"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Синхрондауда қате кетті"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Соңғы рет синхрондалды: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Сихрондалуда…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Синхрондау үшін түртіңіз<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Қазір синхрондау"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Синхрондауды өшіру"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Синхрондауда қате шығуда. Кішкене уақыттан кейін қалпына келеді."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Қауіпсіздік"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Экранды құлыптау"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Жоқ"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Құпия сөз"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Құлып түрін таңдау"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Экранды құлыптау опциялары"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Құлыптау опциялары"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Өрнекті енгізіңіз"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Растау"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Қайта салу"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Экранды құлыптауды орнатыңыз"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN кодын таңдаңыз"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Өрнегіңізді жасаңыз"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Құпия сөзді таңдаңыз"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Құпия сөзді таңдаңыз"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Ағымдағы экран құлпы"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Қауіпсіздік үшін өрнекті орнатыңыз"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Өшіру"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Оңай құпия сөздерге АТ әкімшісі тыйым салды. Басқа құпия сөз енгізіп көріңіз."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Сандардың артатын, кемитін немесе қайталанатын ретіне рұқсат берілмейді"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Экранды құлыптау опциялары"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> күн бұрын"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Сенімді құрылғыны қосу"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Сенімді құрылғылар"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> құрылғы</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> құрылғы</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> жалғанған кезде, ол көлігіңіздің құлпын ашады. Әлдекім <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> құрылғыңызды алса, оған осы құрылғыға кіре алады."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Растау"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Сенімді құрылғыны өшіру"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Дайын"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Сенімді құрылғыны реттеу үшін қосымша қолданбаны пайдаланыңыз. Реттеу аяқталғаннан кейін, телефонды көлік анықтаған кезде, пайдаланушы профилінің құлпын аша аласыз."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Телефоныңызға қосымша қолданбаны жүктеп алыңыз."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Құрылғыларды жұптау үшін телефоныңыздан <xliff:g id="CAR_NAME">%1$s</xliff:g> көлігін таңдаңыз."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock бұл құрылғының қауіпсіздік функцияларын анықтай алмайды. Қауіпсіздік мақсатында сенімді құрылғы, көлігіңіздің құлпын өзіңіз ашқаннан кейін ғана, оны құлыптамай ұстап тұрады. Сенімді құрылғыңыз жақын маңайдағы басқа біреуде болса да, көлігіңіздің құлпын ашық ұстайды."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысын сенімді құрылғы ретінде енгізу"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысы сенімді құрылғы ретінде енгізілді."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> тіркелмеді."</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Сенімді құрылғыны енгізу үшін аутентификация әдісін орнату қажет. Сенімді құрылғыңыз болмаса, профильге кіру үшін аутентификация керек."</string>
     <string name="forget" msgid="3971143908183848527">"Ұмыту"</string>
+    <string name="connect" msgid="5861699594602380150">"Жалғау"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Ажырату"</string>
     <string name="delete_button" msgid="5840500432614610850">"Жою"</string>
     <string name="remove_button" msgid="6664656962868194178">"Өшіру"</string>
     <string name="cancel" msgid="750286395700355455">"Бас тарту"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Деморежимнен шығу"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Демо есептік жазбаңыз жойылады және жүйенің зауыттық деректері қалпына келтіріледі. Пайдаланушының барлық деректері жоғалады."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Деморежимнен шығу"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"реттеуді аяқтау"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"қазір емес"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ЖАБУ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Көлік жүргізу кезінде бұл функция жұмыс істемейді."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Көлік жүргізу кезінде пайдаланушыны енгізу мүмкін емес."</string>
 </resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index f6b6896..e56f0a1 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"អេក្រង់ពន្លឺតិច​ អេក្រង់ចុច ថ្ម"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"អេក្រង់ពន្លឺតិច យប់ ពណ៌ព្រឿងៗ"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"មុខងារយប់"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"បណ្តាញ និង​អ៊ីនធឺណិត"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"បណ្ដាញទូរសព្ទចល័ត"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"ទិន្នន័យ​ទូរសព្ទចល័ត"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ចូល​ប្រើ​ទិន្នន័យ​ដោយ​ប្រើ​បណ្ដាញ​​ទូរសព្ទ​ចល័ត"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"បិទទិន្នន័យ​ទូរសព្ទចល័ត?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ការ​ប្រើ​ទិន្នន័យ"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ការកម្រិត និង​ការព្រមាន​ពីការប្រើទិន្នន័យ"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"វដ្ត​នៃការ​ប្រើ​ទិន្នន័យ​កម្មវិធី"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"កំណត់ការព្រមានពីការប្រើទិន្នន័យ"</string>
+    <string name="data_warning" msgid="116776633806885370">"ការព្រមានពីការប្រើទិន្នន័យ"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"កំណត់កម្រិត​ទិន្នន័យ"</string>
+    <string name="data_limit" msgid="227338836292511425">"កម្រិត​កំណត់​ទិន្នន័យ"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ការ​កម្រិត​លើ​ការ​ប្រើ​ទិន្នន័យ"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ឧបករណ៍​ចាក់សំឡេង​របស់​យានជំនិះ​​​អ្នក​នឹង​បិទ​ទិន្នន័យ​ទូរសព្ទចល័ត ​នៅ​ពេល​ដែល​វា​ប្រើប្រាស់​ទិន្នន័យ​​ដល់កម្រិតដែល​អ្នក​បាន​កំណត់។\n\nដោយសារ​​ការ​ប្រើ​ប្រាស់​ទិន្នន័យ​ត្រូវ​បាន​វាស់​ស្ទង់ដោយឧបករណ៍​ចាក់សំឡេង​របស់​យានជំនិះ​​​ ​ហើយក្រុមហ៊ុនបម្រើសេវាទូរសព្ទ​របស់​អ្នកអាចគណនាលើការប្រើប្រាស់​ខុសពីនោះ សូមពិចារណា​កំណត់កម្រិតប្រើប្រាស់​ទិន្នន័យ​ទាប។"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"រៀបចំ និង​គ្រប់គ្រង​ចំណុច​ចូល​ប្រើ​ដោយឥត​ខ្សែ"</string>
     <string name="wifi_starting" msgid="473253087503153167">"កំពុង​បើក Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"កំពុង​បិទ Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"កំពុងផ្ទុក​បញ្ជី Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"បាន​បិទ Wi‑Fi"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"មិន​អាច​បំភ្លេច​បណ្ដាញ​បានទេ"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"មិន​អាច​ភ្ជាប់​បណ្ដាញ​បានទេ"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"បញ្ចូល​បណ្ដាញ"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"បាន​បិទ Wi‑Fi"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"ភ្ជាប់"</string>
     <string name="wifi_password" msgid="5565632142720292397">"ពាក្យសម្ងាត់"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"បង្ហាញពាក្យសម្ងាត់"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ឈ្មោះ​បណ្តាញ"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"បញ្ចូល SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"សុវត្ថិភាព"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"កម្លាំងរលកសញ្ញា"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"កម្លាំងរលកសញ្ញា"</string>
     <string name="wifi_status" msgid="5688013206066543952">"ស្ថានភាព"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"ល្បឿនត​ភ្ជាប់"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ប្រេកង់"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"អាសយដ្ឋាន IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"បង្ហាញពាក្យសម្ងាត់"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"បញ្ចូល​ឈ្មោះបណ្ដាញ"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"បញ្ចូល​ពាក្យសម្ងាត់"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ខ្សោយ​"</item>
-    <item msgid="2032262610626057081">"មធ្យម"</item>
-    <item msgid="3859756017461098953">"ខ្លាំង"</item>
-    <item msgid="1521103743353335724">"ខ្លាំងណាស់"</item>
+    <item msgid="7683058295076342057">"ខ្សោយ​"</item>
+    <item msgid="1639222824821660744">"មធ្យម"</item>
+    <item msgid="1838705897358163300">"ល្អ"</item>
+    <item msgid="6067166649320533751">"ខ្លាំងណាស់"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ប៊្លូធូស"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"បើកប៊្លូធូស"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ប៊្លូធូស"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"បានបិទប៊្លូធូស"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ព័ត៌មាន​លម្អិត​អំពីបណ្ដាញ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"អាសយដ្ឋាន MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"អាសយដ្ឋាន IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"របាំងបណ្តាញរង"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"អាសយដ្ឋាន IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ច្រក"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ចំណូល​ចិត្ត Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"បើក Wi‑Fi ដោយស្វ័យប្រវត្តិ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi នឹងបើកឡើងវិញ​នៅក្បែរបណ្តាញ​គុណភាពខ្ពស់ដែលបានរក្សាទុកដូចជា បណ្តាញនៅផ្ទះ​របស់អ្នកជាដើម"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"មិន​អាចប្រើ​បានទេ ដោយសារ​ទីតាំង​បាន​បិទ។ សូមបើក"<annotation id="link">"ទីតាំង"</annotation>"។"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"បើក​ការស្កេន Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"បើក"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"បានបើក​ការស្កេន Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"ប្តូរទៅ​ទិន្នន័យទូរសព្ទ​ចល័តដោយស្វ័យ​ប្រវត្តិ"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"ប្រើទិន្នន័យ​ទូរសព្ទចល័ត​ នៅពេល​ដែល Wi‑Fi មិនមាន​ការភ្ជាប់អ៊ីនធឺណិត។ អាច​នឹង​គិតថ្លៃលើការ​ប្រើទិន្នន័យ។"</string>
+    <string name="learn_more" msgid="8214605928933358604">"ស្វែងយល់បន្ថែម"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ប៊្លូធូស"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"គ្រប់គ្រង​ការ​តភ្ជាប់ កំណត់​ឈ្មោះ​ឧបករណ៍ និង​ការរកឃើញ"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"កុំព្យូទ័រ"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"កាស"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ទូរសព្ទ"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ឧបករណ៍ផ្ដិតយករូប"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"កាស"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"​ឧបករណ៍សម្រាប់​ភ្ជាប់​ជាមួយ​កុំព្យូទ័រ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ប៊្លូធូស"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"ឧបករណ៍​ដែល​បាន​ផ្គូផ្គង"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ឧបករណ៍​ដែល​អាច​ភ្ជាប់បាន"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"គ្មាន​ឧបករណ៍​ដែល​បាន​ផ្គូផ្គង​ទេ"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"គ្មាន​ឧបករណ៍​ដែល​អាច​ភ្ជាប់បាន​ទេ"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"ឧបករណ៍​ដែល​បាន​ផ្គូផ្គង"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"ឈ្មោះ"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"ប្រើ​សម្រាប់"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"ប្ដូរ​ឈ្មោះ​ឧបករណ៍​ប៊្លូធូស"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"ឧបករណ៍​គ្មានឈ្មោះ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"ឧបករណ៍​ដែល​បាន​ផ្គូផ្គង"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"ផ្គូផ្គង​ឧបករណ៍ថ្មី"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"ប៊្លូធូស​នឹង​បើក​ដើម្បី​ផ្គូផ្គង"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ផ្ដាច់​ឧបករណ៍?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"យានជំនិះរបស់អ្នក​នឹងផ្ដាច់ពី <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ។"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"អាសយដ្ឋានប៊្លូធូស​របស់យានជំនិះ៖ <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"អាសយដ្ឋាន​ប៊្លូធូស​របស់ឧបករណ៍៖ <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ឈ្មោះយានជំនិះ"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ប្ដូរឈ្មោះ​យានជំនិះនេះ"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ប្ដូរឈ្មោះឧបករណ៍"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"ប្ដូរ​ឈ្មោះ"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ឧបករណ៍​ដែល​អាច​ភ្ជាប់បាន"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"កម្រងព័ត៌មាន"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"សំណើ​ផ្គូផ្គង​តាម​ប៊្លូធូស"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ផ្គូផ្គង និងភ្ជាប់"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ប៊្លូធូស"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"កូដ​ផ្គូផ្គង​តាម​ប៊្លូធូស"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"កូដ PIN មាន​អក្សរ ឬសញ្ញា"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"វាយ​បញ្ចូល​កូដ​ផ្គូផ្គង បន្ទាប់​មក​ចុច Return ឬ Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ជា​ធម្មតា​គឺ 0000 ឬ 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"សំណើ​ផ្គូផ្គង"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"ចុច​ដើម្បី​ផ្គូផ្គង​ជាមួយ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ។"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ភាសា"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ភាសា និងការបញ្ចូល"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"ក្ដារចុច"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"គ្រប់គ្រងក្តារចុច"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"លទ្ធផលនៃការបំប្លែងអត្ថបទទៅជាការនិយាយ"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ម៉ាស៊ីន​ដែល​ចង់បាន"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"ម៉ាស៊ីន​បច្ចុប្បន្ន"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"ល្បឿននៃការនិយាយ"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"កម្រិត​សំឡេង"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"កំណត់​ឡើង​វិញ"</string>
     <string name="sound_settings" msgid="3072423952331872246">"សំឡេង"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"កម្រិត​សំឡេង​រោទ៍"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"កម្រិតសំឡេង​ការរុករក"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"មេឌៀ"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"កំណត់​កម្រិត​សំឡេង​សម្រាប់​តន្ត្រី និង​វីដេអូ"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"ម៉ោងរោទ៍"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"សំឡេងរោទ៍ទូរសព្ទ"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"សំឡេង​ជូន​ដំណឹង​លំនាំដើម"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"សំឡេង​ម៉ោងរោទ៍​លំនាំដើម"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"កម្មវិធី និងការជូនដំណឹង"</string>
+    <string name="all_applications" msgid="7798210477486822168">"បង្ហាញ​​កម្មវិធី​ទាំងអស់"</string>
+    <string name="default_applications" msgid="1558183275638697087">"កម្មវិធី​លំនាំដើម"</string>
     <string name="applications_settings" msgid="794261395191035632">"ព័ត៌មាន​អំពី​កម្មវិធី"</string>
+    <string name="force_stop" msgid="2153183697014720520">"បង្ខំ​ឱ្យ​បញ្ឈប់"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"បង្ខំ​ឱ្យ​បញ្ឈប់?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"ប្រសិនបើ​អ្នក​បង្ខំ​ឱ្យបញ្ឈប់​កម្មវិធី នោះ​កម្មវិធីអាចនឹង​ដំណើរការ​មិន​ត្រឹមត្រូវ។"</string>
     <string name="disable_text" msgid="4358165448648990820">"បិទ"</string>
     <string name="enable_text" msgid="1794971777861881238">"បើក"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"លុប"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ប្រសិន​បើ​អ្នក​បិទ​កម្មវិធីនេះ Android និង​កម្មវិធី​ផ្សេង​ទៀត​ប្រហែលជា​មិនដំណើរការ​ដូចការគ្រោង​ទុកតទៅ​ទៀតទេ។"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"បិទកម្មវិធី"</string>
     <string name="permissions_label" msgid="2701446753515612685">"ការអនុញ្ញាត"</string>
     <string name="application_version_label" msgid="8556889839783311649">"កំណែ៖ %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"មិន​បាន​ផ្តល់សិទ្ធិអនុញ្ញាតទេ"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"មិន​បាន​ស្នើសុំសិទ្ធិអនុញ្ញាតទេ"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ការ​ប្រើ​ទិន្នន័យ"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ការប្រើទិន្នន័យកម្មវិធី"</string>
-    <string name="force_stop" msgid="2153183697014720520">"បង្ខំ​ឱ្យ​បញ្ឈប់"</string>
     <string name="computing_size" msgid="5791407621793083965">"កំពុង​គណនា…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">ការអនុញ្ញាតបន្ថែម <xliff:g id="COUNT_1">%d</xliff:g></item>
       <item quantity="one">ការអនុញ្ញាតបន្ថែម <xliff:g id="COUNT_0">%d</xliff:g></item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ជំនួយ និងការបញ្ចូលសំឡេង"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"កម្មវិធី​ជំនួយ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ប្រើ​អត្ថបទ​ពី​អេក្រង់"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"អនុញ្ញាតឱ្យ​កម្មវិធីជំនួយ​ចូលប្រើ​ខ្លឹមសារ​ជា​អត្ថបទ​លើអេក្រង់"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ប្រើ​រូបថតអេក្រង់"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"អនុញ្ញាតឱ្យ​កម្មវិធីជំនួយ​ចូលប្រើ​រូបភាព​អេក្រង់"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"សេវាកម្មបំពេញដោយស្វ័យប្រវត្តិ"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"គ្មាន"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"បានជ្រើសរើស"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ជំនួយការនឹងអាចអានព័ត៌មានអំពីកម្មវិធីដែលកំពុងប្រើនៅក្នុងប្រព័ន្ធរបស់អ្នក រួម​ទាំងព័ត៌មានដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬព័ត៌មានដែលអាចចូលប្រើនៅក្នុងកម្មវិធី​នោះផងដែរ​។"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;សូម​ប្រាកដថា​អ្នក​ទុក​ចិត្ត​លើ​កម្មវិធី​នេះ&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; ប្រើប្រាស់​អ្វី​ដែល​មាននៅ​លើ​អេក្រង់​របស់អ្នក ដើម្បី​កំណត់​អ្វីដែល​អាចបំពេញ​ដោយ​ស្វ័យប្រវត្តិ។"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"បញ្ចូល​សេវាកម្ម"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ទីតាំង"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"សំណើ​ទីតាំង​ថ្មីៗ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"គ្មាន​សំណើ​ទីតាំង​ថ្មីៗ​ទេ"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ការ​អនុញ្ញាត​កម្រិត​កម្មវិធី"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"ការស្កេន"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"សេវាកម្ម​ទីតាំង"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"ការស្កេន Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"អនុញ្ញាត​ឱ្យ​កម្មវិធី និង​សេវាកម្ម​ស្កេនរក​បណ្ដាញ Wi‑Fi បាន​គ្រប់ពេល ទោះបីជា Wi‑Fi ​បិទក៏ដោយ។ ឧទាហរណ៍ សកម្មភាព​នេះ​អាច​ត្រូវ​បាន​ប្រើ ដើម្បី​កែលម្អ​មុខងារ និង​សេវាកម្មនានា​ដែល​ផ្អែក​លើ​ទីតាំង។"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ការស្កេនប៊្លូធូស"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"អនុញ្ញាត​ឱ្យ​កម្មវិធី និងសេវាកម្ម​ស្កេនរក​ឧបករណ៍ដែល​នៅ​ជិត​បាន​គ្រប់ពេល ទោះបីជា​ប៊្លូធូសបិទ​ក៏ដោយ។ ឧទាហរណ៍ សកម្មភាព​នេះ​អាច​ត្រូវ​បាន​ប្រើ ដើម្បី​កែលម្អ​មុខងារ និងសេវាកម្មនានា​ដែល​ផ្អែក​លើ​ទីតាំង។"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"ប្រព័ន្ធ"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"បច្ចុប្បន្នភាព​ប្រព័ន្ធ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"បច្ចុប្បន្នភាព​ប្រព័ន្ធ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"កំណែ Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"កម្រិតបំណះសុវត្ថិភាព Android"</string>
     <string name="model_info" msgid="4966408071657934452">"ម៉ូដែល"</string>
     <string name="baseband_version" msgid="2370088062235041897">"កំណែ​មូលដ្ឋាន"</string>
     <string name="kernel_version" msgid="7327212934187011508">"កំណែ​ខឺណែល"</string>
     <string name="build_number" msgid="3997326631001009102">"លេខ​កំណែបង្កើត"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"អាសយដ្ឋាន​ប៊្លូធូស"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"មិនមានទេ"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"ស្ថានភាព"</string>
     <string name="device_status" msgid="267298179806290920">"ស្ថានភាព"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"រក្សាសិទ្ធិ"</string>
     <string name="license_title" msgid="936705938435249965">"អាជ្ញាបណ្ណ"</string>
     <string name="terms_title" msgid="5201471373602628765">"លក្ខខណ្ឌ​"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"អាជ្ញាបណ្ណ System WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"អាជ្ញាបណ្ណ System WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ផ្ទាំង​រូបភាព"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ក្រុមហ៊ុន​ផ្ដល់​សេវារូបភាព​ផ្កាយរណប៖\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"អាជ្ញាបណ្ណភាគីទីបី"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"មាន​បញ្ហា​ក្នុង​ការ​ផ្ទុក​អាជ្ញាបណ្ណ។"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"កំពុង​ផ្ទុក…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">ឥឡូវនេះ នៅសល់ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ជំហាន​ទៀត អ្នកនឹង​​ក្លាយ​ជាអ្នកអភិវឌ្ឍន៍​។</item>
+      <item quantity="one">ឥឡូវនេះ នៅសល់ <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ជំហាន​ទៀត អ្នកនឹង​​​ក្លាយ​ជាអ្នកអភិវឌ្ឍន៍​។</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ឥឡូវ​នេះ អ្នក​ក្លាយ​ជា​អ្នក​អភិវឌ្ឍ​ន៍ហើយ!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"មិន​ចាំបាច់​ទេ អ្នក​​ក្លាយ​ជា​អ្នក​អភិវឌ្ឍ​ន៍​ហើយ។"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ជម្រើស​សម្រាប់អ្នក​អភិវឌ្ឍន៍"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ជម្រើស​កំណត់​ឡើងវិញ"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ការកំណត់​បណ្តាញ កម្មវិធី ឬ​ឧបករណ៍​ឡើងវិញ"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"កំណត់បណ្ដាញ​ឡើងវិញ"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"សកម្មភាព​នេះ​នឹង​កំណត់​ការកំណត់​បណ្តាញ​ទាំងអស់​ឡើងវិញ រួម​ទាំង៖"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"ទិន្នន័យ​ទូរសព្ទចល័ត"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ប៊្លូធូស"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"លុប eSIM សម្រាប់យានជំនិះ​ទាំងអស់"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ការធ្វើបែបនេះនឹងមិនបោះបង់គម្រោង​សេវាកម្មរបស់អ្នកទេ។"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"មិន​អាច​កំណត់ eSIM ​ឡើងវិញ​បានទេ"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ជ្រើសរើស​បណ្តាញ"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"កំណត់ការកំណត់ឡើងវិញ"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"កំណត់ឡើងវិញ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"កំណត់ការកំណត់បណ្តាញទាំងអស់ឡើងវិញ? អ្នកមិនអាចត្រឡប់សកម្មភាពនេះវិញបានទេ!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"កំណត់ការកំណត់ឡើងវិញ"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"បានកំណត់ការកំណត់បណ្តាញឡើងវិញ"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"កំណត់​ចំណូល​ចិត្ត​កម្មវិធី​ឡើងវិញ"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ការធ្វើបែបនេះ​នឹងកំណត់​ចំណូលចិត្ត​ទាំងអស់​ឡើងវិញសម្រាប់៖\n\n"<li>"កម្មវិធី​ដែលបានបិទ"</li>\n<li>"ការជូនដំណឹង​កម្មវិធីដែលបានបិទ"</li>\n<li>"កម្មវិធីលំនាំដើម​សម្រាប់​សកម្មភាពផ្សេងៗ"</li>\n<li>"ការដាក់កំហិតទិន្នន័យផ្ទៃខាងក្រោយ​លើកម្មវិធីផ្សេងៗ"</li>\n<li>"ការដាក់កំហិត​លើការអនុញ្ញាត​ទាំងឡាយ"</li>\n\n"អ្នកនឹងមិន​បាត់បង់ទិន្នន័យ​កម្មវិធីណាមួយឡើយ។"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"កំណត់​កម្មវិធី​ឡើងវិញ"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"បាន​កំណត់​ចំណូល​ចិត្ត​កម្មវិធីឡើង​វិញ​ហើយ"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"លុប​ទិន្នន័យ​ទាំងអស់ (កំណត់ដូច​ដើម​ឡើងវិញ)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ការធ្វើបែបនេះ​នឹងលុប​ទិន្នន័យ​ទាំងអស់​ពីឧបករណ៍​ចាក់សំឡេង​របស់​យានជំនិះ​អ្នក រួមទាំង៖\n\n"<li>"កម្មវិធី​ដែលបាន​ទាញយក"</li>\n<li>"ទិន្នន័យ​កម្មវិធី និង​ប្រព័ន្ធ ព្រមទាំង​ការកំណត់"</li>\n<li>"គណនី Google របស់អ្នក"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"បច្ចុប្បន្ន​ អ្នក​បាន​ចូល​គណនី​ដូច​ខាង​ក្រោម៖"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"មាន​វត្តមានរបស់​អ្នកប្រើប្រាស់​ផ្សេងទៀត​នៅលើ​យានជំនិះនេះ។"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"កំណត់​យានជំនិះ​ឡើងវិញ"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"កំណត់ឡើងវិញ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"លុប​ព័ត៌មាន​ផ្ទាល់ខ្លួន និង​កម្មវិធី​ដែលបាន​ទាញយក​ទាំងអស់​របស់អ្នក? អ្នក​មិនអាច​ត្រឡប់​សកម្មភាពនេះ​វិញបានទេ!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"លុប​អ្វីគ្រប់យ៉ាង"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"កំពុងលុប"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"សូម​រង់ចាំ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"កាលបរិច្ឆេទ និង​ម៉ោង"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"កំណត់​កាលបរិច្ឆេទ និង​ម៉ោង"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"កំណត់​កាលបរិច្ឆេទ ម៉ោង ល្វែងម៉ោង និង​ទម្រង់"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"តម្រៀប​តាម​ល្វែងម៉ោង"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"កាលបរិច្ឆេទ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"ម៉ោង"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"បញ្ចូល​អ្នក​ប្រើប្រាស់"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"បញ្ចូលគណនី"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"លុប​អ្នក​ប្រើប្រាស់"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"អ្នក​ប្រើប្រាស់​ថ្មី"</string>
-    <string name="user_guest" msgid="3465399481257448601">"ភ្ញៀវ"</string>
     <string name="user_admin" msgid="1535484812908584809">"អ្នកគ្រប់គ្រង"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"បាន​ចូលជា​អ្នក​គ្រប់គ្រង"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"ការ​អនុញ្ញាត​គ្រប់គ្រង​ទាំងអស់"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"កំណត់​ជាអ្នក​គ្រប់គ្រង"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"អ្នក​ប្រើប្រាស់​នឹងអាច​លុបអ្នក​ប្រើប្រាស់ រួមទាំង​អ្នកគ្រប់គ្រង​ផ្សេងទៀត និង​កំណត់​ប្រព័ន្ធ​ដូចដើម​ឡើងវិញ។"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"សកម្មភាព​នេះ​មិនអាច​ត្រឡប់វិញ​បានទេ។"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"បាទ/ចាស កំណត់​ជាអ្នក​គ្រប់គ្រង"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"បង្កើត​អ្នកប្រើប្រាស់ថ្មី"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ហៅ​ទូរសព្ទ"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"ការផ្ញើសារតាមរយៈទិន្នន័យទូរសព្ទចល័តរបស់​រថយន្ត"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"ដំឡើង​កម្មវិធី​ថ្មី"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"លុបកម្មវិធី"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"បញ្ចូល​អ្នក​ប្រើប្រាស់"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"អ្នក​ប្រើប្រាស់​ថ្មី"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"បញ្ចូល​អ្នក​ប្រើប្រាស់​ថ្មី?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"នៅពេលដែល​អ្នក​បញ្ចូល​អ្នក​ប្រើប្រាស់​ថ្មី បុគ្គល​នោះ​ត្រូវតែ​រៀបចំ​ទំហំ​ផ្ទុក​របស់គេ។"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"អ្នកប្រើប្រាស់​ណាក៏​អាច​ដំឡើង​ជំនាន់កម្មវិធី​សម្រាប់​អ្នក​ប្រើប្រាស់​ទាំងអស់​ផ្សេង​ទៀត​បាន​ដែរ។"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"​បាន​ឈាន​ដល់ចំនួន​កំណត់អ្នកប្រើប្រាស់"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">អ្នកអាច​បង្កើត​អ្នកប្រើប្រាស់​បាន​រហូតដល់ <xliff:g id="COUNT">%d</xliff:g> នាក់។</item>
+      <item quantity="one">អាច​បង្កើត​អ្នក​ប្រើប្រាស់​បាន​​តែម្នាក់ប៉ុណ្ណោះ។</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"មិន​អាច​បង្កើត​អ្នកប្រើប្រាស់​ថ្មី​បាន​ទេ"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"លុបអ្នកប្រើប្រាស់​នេះមែនទេ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"កម្មវិធី និង​ទិន្នន័យ​ទាំងអស់​នឹង​ត្រូវ​បាន​លុប។"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"មិនអាច​លុបអ្នកប្រើប្រាស់​បានទេ។"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ច្រានចោល"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ព្យាយាមម្ដងទៀត"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"លុបអ្នកប្រើប្រាស់​ចុងក្រោយ​មែនទេ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"​បន្ទាប់ពី​លុបអ្នក​ប្រើប្រាស់​នៅសល់ចុងក្រោយ​សម្រាប់​រថយន្តនេះ អ្នកប្រើប្រាស់​ដែលជា​អ្នកគ្រប់គ្រងថ្មី​នឹងត្រូវបាន​បង្កើត។"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ទិន្នន័យ ការកំណត់ និងកម្មវិធី​ទាំងអស់​ដែលពាក់ព័ន្ធ​ជាមួយ​អ្នកប្រើប្រាស់​នេះនឹង​ត្រូវបាន​លុប។ អ្នកនឹង​​ត្រូវរៀបចំ​ប្រព័ន្ធ​ម្ដងទៀត។"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"ជ្រើសរើស​អ្នកគ្រប់គ្រងថ្មី"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"អ្នកត្រូវការ​​អ្នកគ្រប់គ្រងយ៉ាងហោចណាស់​ម្នាក់។ ដើម្បីលុប​អ្នកគ្រប់គ្រង​នេះ សូមជ្រើសរើស​អ្នកជំនួស​ជាមុនសិន។"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"ជ្រើសរើសអ្នកគ្រប់គ្រង"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ភ្ញៀវ"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ភ្ញៀវ"</string>
     <string name="user_switch" msgid="6544839750534690781">"ប្ដូរ"</string>
     <string name="current_user_name" msgid="3813671533249316823">"អ្នក (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"ឈ្មោះ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"មិន​បាន​រៀបចំ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"កែសម្រួល​ឈ្មោះអ្នក​ប្រើប្រាស់"</string>
     <string name="users_list_title" msgid="770764290290240909">"អ្នកប្រើប្រាស់"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"បានផ្ដល់​ការអនុញ្ញាត​ឱ្យ %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"គណនី"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"អ្នក​ប្រើប្រាស់"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"បញ្ចូលគណនី"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"មិន​មាន​ការ​បញ្ចូល​គណនី​ទេ"</string>
     <string name="account_list_title" msgid="7631588514613843065">"គណនី​សម្រាប់ <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ធ្វើ​សមកាលកម្ម​ទិន្នន័យ​ដោយស្វ័យប្រវត្តិ"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"អនុញ្ញាតឱ្យ​កម្មវិធី​ផ្ទុកទិន្នន័យ​ឡើងវិញ​ដោយស្វ័យប្រវត្តិ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"បើក​ការ​ធ្វើ​សម​កាល​កម្ម​ទិន្នន័យ​ស្វ័យ​ប្រវត្តិ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ការ​ផ្លាស់ប្ដូរ​ណា​មួយ​ដែល​អ្នក​ធ្វើ​ឡើងចំពោះ​គណនី​របស់​អ្នក​នៅ​លើ​បណ្ដាញ នឹង​ត្រូវ​បាន​ចម្លង​ដោយ​ស្វ័យ​ប្រវត្តិ​ទៅ​ឧបករណ៍​របស់​អ្នក។\n\nគណនី​មួយ​ចំនួន​ក៏​អាច​ចម្លង​ការ​ផ្លាស់ប្ដូរ​របស់អ្នក​នៅលើ​ទូរសព្ទ​ទៅ​បណ្ដាញដោយ​ស្វ័យ​ប្រវត្តិផងដែរ។ គណនី Google ដំណើរការ​តាម​វិធី​នេះ។"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"បិទការធ្វើ​សមកាលកម្មទិន្នន័យស្វ័យ​ប្រវតិ្ត?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ការធ្វើបែបនេះ​នឹងរក្សាទិន្នន័យ ប៉ុន្តែអ្នក​នឹងត្រូវធ្វើសមកាលកម្ម​គណនីនីមួយៗ​ដោយផ្ទាល់ ដើម្បីប្រមូលព័ត៌មានថ្មីៗ។ ហើយអ្នកនឹង​មិនទទួលបាន​ការជូនដំណឹងទេ នៅពេលមានការធ្វើ​បច្ចុប្បន្នភាព។"</string>
     <string name="account_details_title" msgid="7529571432258448573">"ព័ត៌មាន​​អំពី​​គណនី"</string>
     <string name="add_account_title" msgid="5988746086885210040">"បញ្ចូលគណនី"</string>
     <string name="add_an_account" msgid="1072285034300995091">"បញ្ចូលគណនី"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"លុប​គណនី​​"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"លុបគណនី​?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ការលុប​គណនី​នេះ​នឹង​លុប​សារ ទំនាក់ទំនង និង​ទិន្នន័យ​ផ្សេងៗ​របស់​គណនី​នេះ​ទាំង​អស់​ចេញ​ពី​ឧបករណ៍!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ការផ្លាស់ប្ដូរនេះ​មិនត្រូវ​បាន​អនុញ្ញាត​ដោយ​អ្នក​គ្រប់គ្រង​របស់អ្នក​ទេ"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"លុប​អ្នកប្រើប្រាស់​នេះ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"កម្មវិធី និង​ទិន្នន័យ​ទាំងអស់​នឹង​ត្រូវ​បាន​លុប។"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"មិនអាច​លុប​អ្នកប្រើប្រាស់​បានទេ។"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"ព្យាយាម​ម្ដងទៀត?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"ច្រានចោល"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ព្យាយាមម្ដងទៀត"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"បញ្ចូល​អ្នក​ប្រើប្រាស់​ថ្មី?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"នៅពេលដែល​អ្នក​បញ្ចូល​អ្នក​ប្រើប្រាស់​ថ្មី បុគ្គល​នោះ​ត្រូវតែ​រៀបចំ​ទំហំ​ផ្ទុក​របស់គេ។"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"អ្នកប្រើប្រាស់​ណាក៏​អាច​ដំឡើង​ជំនាន់កម្មវិធី​សម្រាប់​អ្នក​ប្រើប្រាស់​ទាំងអស់​ផ្សេង​ទៀត​បាន​ដែរ។"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"មិនអាច​លុបគណនី​បានទេ។"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ធ្វើសមកាលកម្មគណនី"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"បើក​សមកាលកម្មសម្រាប់ធាតុ <xliff:g id="ID_1">%1$d</xliff:g> ក្នុងចំណោម <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"បើក​សមកាលកម្ម​សម្រាប់ធាតុ​ទាំងអស់"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"បិទ​សមកាលកម្ម​សម្រាប់ធាតុ​ទាំងអស់"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"បានបិទការធ្វើសមកាលកម្ម"</string>
+    <string name="sync_error" msgid="6698021343089247914">"មានបញ្ហាក្នុង​ការ​ធ្វើ​សម​កាល​កម្ម"</string>
+    <string name="last_synced" msgid="4745124489150101529">"បាន​ធ្វើ​សម​កាល​កម្ម​លើកចុងក្រោយ​នៅថ្ងៃទី <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"កំពុង​ធ្វើ​សម​កាល​កម្មឥឡូវនេះ…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ចុចដើម្បីធ្វើសមកាលកម្មឥឡូវនេះ <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ធ្វើសម្មកាលកម្មឥឡូវនេះ"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"បោះបង់​ការ​ធ្វើ​សម​កាល​កម្ម"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ការធ្វើសម​កាលកម្ម​កំពុងជួបបញ្ហា​ឥឡូវនេះ។ ការធ្វើសមកាលកម្ម​នឹងមានឡើងវិញ​ក្នុងពេលបន្តិច​ទៀត​នេះ។"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"សុវត្ថិភាព"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ការចាក់សោអេក្រង់"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"គ្មាន"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"លេខ​កូដ PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"ពាក្យសម្ងាត់"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"ជ្រើសរើស​ប្រភេទ​សោ"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"ជម្រើស​ចាក់សោអេក្រង់"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ជម្រើសចាក់សោ"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"បញ្ចូល​លំនាំ​របស់​អ្នក"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"បញ្ជាក់"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"គូរ​ឡើងវិញ"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"កំណត់​ការចាក់​សោអេក្រង់"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"ជ្រើសរើសកូដ PIN របស់អ្នក"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"ជ្រើស​រើសលំនាំ​របស់​អ្នក"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"ជ្រើសរើស​ពាក្យសម្ងាត់​របស់អ្នក"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"ជ្រើសរើស​ពាក្យ​សម្ងាត់​របស់​អ្នក"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"ការចាក់សោអេក្រង់បច្ចុប្បន្ន"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ដើម្បីសុវត្ថិភាព សូមកំណត់លំនាំ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"សម្អាត"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ពាក្យសម្ងាត់​លក្ខណៈ​សាមញ្ញ​ត្រូវ​បាន​ទប់ស្កាត់​ដោយ​អ្នក​គ្រប់គ្រង​ព័ត៌មាន​វិទ្យា​របស់អ្នក។ សាកល្បង​ប្រើ​ពាក្យ​សម្ងាត់​ផ្សេង​ពី​នេះ។"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"មិន​អនុញ្ញាត​ឱ្យ​មាន​លេខ​លំដាប់​ឡើង ចុះ ឬ​ដដែលៗ​ទេ។"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"ជម្រើស​ការចាក់សោអេក្រង់"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\nថ្ងៃ <xliff:g id="DATE">%2$s</xliff:g>៖ <xliff:g id="NUM_DAYS">%3$s</xliff:g> ថ្ងៃមុន"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"បញ្ចូល​ឧបករណ៍​ដែលទុកចិត្ត"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"ឧបករណ៍​ដែល​ទុកចិត្ត"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other">ឧបករណ៍ <xliff:g id="COUNT_1">%d</xliff:g></item>
+      <item quantity="one">ឧបករណ៍ <xliff:g id="COUNT_0">%d</xliff:g></item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> របស់​អ្នក​នឹង​ដោះសោរថយន្ត​នេះ នៅពេល​ភ្ជាប់។ ប្រសិនបើ​នរណាម្នាក់យក​ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> របស់អ្នក បុគ្គល​នោះ​អាច​នឹងចូលប្រើ​ឧបករណ៍​នេះ​បាន"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"បញ្ជាក់"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"លុបឧបករណ៍ដែលទុកចិត្ត"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"រួចរាល់"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"ប្រើ​កម្មវិធី​ដៃគូ ដើម្បី​រៀបចំឧបករណ៍​ដែល​ទុក​ចិត្ត។ បន្ទាប់ពីរៀបចំរួចហើយ អ្នក​នឹង​អាច​ដោះ​សោ​កម្រង​ព័ត៌មាន​អ្នក​ប្រើប្រាស់​របស់អ្នក នៅពេលយានជំនិះ​រកឃើញ​ទូរសព្ទ​របស់អ្នក"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ទាញយក​កម្មវិធី​ដៃគូ​នៅលើទូរសព្ទរបស់អ្នក"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. ជ្រើសរើស​ <xliff:g id="CAR_NAME">%1$s</xliff:g> នៅលើ​ទូរសព្ទ​របស់អ្នក ដើម្បីផ្គូផ្គង​ឧបករណ៍"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock រក​មិនឃើញ​មុខងារ​សុវត្ថិភាព​នៅលើ​ឧបករណ៍​នេះ​ទេ។ ដើម្បី​ជួយ​ការពារ​រថយន្ត​​របស់​អ្នក  ឧបករណ៍​ដែល​ទុកចិត្តនឹង​អាច​រក្សា​ឱ្យ​រថយន្ត​របស់អ្នកដោះសោ​ បន្ទាប់​ពីអ្នក​បាន​ដោះ​សោ​រថយន្ត​ហើយ​ប៉ុណ្ណោះ។ ឧបករណ៍​ដែល​ទុកចិត្តរបស់អ្នក​អាចរក្សា​ឱ្យ​រថយន្ត​របស់អ្នកដោះសោ​ នៅពេល​វា​ស្ថិតនៅ​ជិត ទោះបី​ជា​អ្នក​ផ្សេងទៀត​កំពុង​កាន់ឧបករណ៍​នោះ​ក៏​ដោយ។"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"បញ្ចូល <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ជា​ឧបករណ៍​ដែល​ទុកចិត្ត"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"បាន​បញ្ចូល <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ជាឧបករណ៍ដែលទុកចិត្ត​ដោយជោគជ័យ​ហើយ"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"មិន​អាច​ចុះឈ្មោះ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> បាន​ទេ​"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"ការបញ្ចូល​ឧបករណ៍​ដែល​ទុកចិត្ត​តម្រូវឱ្យអ្នក​កំណត់​វិធីផ្ទៀងផ្ទាត់​បន្ទាប់។ ប្រសិនបើអ្នក​គ្មាន​ឧបករណ៍​ដែលទុកចិត្ត​ជាប់ខ្លួនអ្នក​ទេ នោះនឹង​តម្រូវឱ្យ​មានការផ្ទៀងផ្ទាត់ ដើម្បី​ចូលប្រើ​កម្រងព័ត៌មាន​របស់អ្នក។"</string>
     <string name="forget" msgid="3971143908183848527">"បំភ្លេច"</string>
+    <string name="connect" msgid="5861699594602380150">"ភ្ជាប់"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ផ្ដាច់"</string>
     <string name="delete_button" msgid="5840500432614610850">"លុប"</string>
     <string name="remove_button" msgid="6664656962868194178">"លុប"</string>
     <string name="cancel" msgid="750286395700355455">"បោះបង់"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ចាក​ចេញ​ពីមុខងារបង្ហាញ​សាកល្បង"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ការចាកចេញ​នេះ​នឹង​លុប​គណនីបង្ហាញ​សាកល្បង និងកំណត់​ទិន្នន័យប្រព័ន្ធ​ដូច​ចេញ​ពី​រោងចក្រ។​ ទិន្នន័យ​អ្នក​ប្រើប្រាស់​ទាំងអស់​នឹង​បាត់បង់។"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ចាក​ចេញ​ពីការបង្ហាញ​សាកល្បង"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"បញ្ចប់​ការរៀបចំ"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"កុំ​ទាន់"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ច្រានចោល"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"មិនអាច​ប្រើមុខងារ​នេះបានទេ ខណៈពេល​កំពុង​បើកបរ។"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"មិនអាច​បញ្ចូល​អ្នកប្រើប្រាស់​ខណៈពេល​បើកបរ​បានទេ។"</string>
 </resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index ab76ec1..92c956d 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ಡಿಮ್‌‌ ಪರದೆ, ಟಚ್‌ಸ್ಕ್ರೀನ್, ಬ್ಯಾಟರಿ"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ಮಂದ ಪರದೆ, ರಾತ್ರಿ ,ಟಿಂಟ್"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"ರಾತ್ರಿ ಮೋಡ್"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ನೆಟ್‌ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"ಮೊಬೈಲ್‌ ನೆಟ್‌ವರ್ಕ್‌"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"ಮೊಬೈಲ್ ಡೇಟಾ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ ಬಳಸಿ ಡೇಟಾ ಪ್ರವೇಶಿಸಿ"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"ಮೊಬೈಲ್ ಡೇಟಾ ಆಫ್ ಮಾಡಬೇಕೆ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ಡೇಟಾ ಬಳಕೆ"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ಡೇಟಾ ಎಚ್ಚರಿಕೆ ಮತ್ತು ಮಿತಿ"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ಆ್ಯಪ್‌ ಡೇಟಾ ಬಳಕೆ ಆವರ್ತನೆ"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ಡೇಟಾ ಎಚ್ಚರಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string>
+    <string name="data_warning" msgid="116776633806885370">"ಡೇಟಾ ಎಚ್ಚರಿಕೆ"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ಡೇಟಾ ಮಿತಿ ಹೊಂದಿಸಿ"</string>
+    <string name="data_limit" msgid="227338836292511425">"ಡೇಟಾ ಮಿತಿ"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ಡೇಟಾ ಬಳಕೆಯನ್ನು ಮಿತಿಗೊಳಿಸುವಿಕೆ"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ನೀವು ಹೊಂದಿಸಿರುವ ಮಿತಿಯನ್ನು ತಲುಪಿದಾಗ ನಿಮ್ಮ ವಾಹನದ ಹೆಡ್ ಯೂನಿಟ್ ಒಮ್ಮೆ ನಿಮ್ಮ ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಆಫ್ ಮಾಡುತ್ತದೆ.\n\n ಡೇಟಾ ಬಳಕೆಯನ್ನು ಹೆಡ್ ಯೂನಿಟ್ ಮೂಲಕ ಅಳೆಯಲಾಗುವ ಕಾರಣ ಮತ್ತು ನಿಮ್ಮ ವಾಹಕವು ಬಳಕೆಯನ್ನು ಬೇರೆ ರೀತಿಯಲ್ಲಿ ಪರಿಗಣಿಸಬಹುದಾದ ಕಾರಣ, ಸುರಕ್ಷಿತ ಮಿತಿಯನ್ನು ಹೊಂದಿಸುವುದು ಸೂಕ್ತ."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"ವೈ‑ಫೈ"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ವಯರ್‌ಲೆಸ್‌ ಪ್ರವೇಶಿಸುವಿಕೆ ಅಂಶಗಳನ್ನು ಸೆಟಪ್‌ ಮಾಡಿ ಮತ್ತು ನಿರ್ವಹಿಸಿ"</string>
     <string name="wifi_starting" msgid="473253087503153167">"ವೈ-ಫೈ ಆನ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"ವೈ-ಫೈ ಆಫ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"ವೈ-ಫೈ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"ವೈ-ಫೈ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ನೆಟ್‌ವರ್ಕ್‌ ಮರೆಯಲು ವಿಫಲವಾಗಿದೆ"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"ನೆಟ್‌ವರ್ಕ್‌ ಸೇರಿಸಿ"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"ವೈ-ಫೈ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"ಸಂಪರ್ಕಿಸಿ"</string>
     <string name="wifi_password" msgid="5565632142720292397">"ಪಾಸ್‌ವರ್ಡ್"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"ಪಾಸ್‌ವರ್ಡ್ ತೋರಿಸಿ"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ನೆಟ್‌ವರ್ಕ್‌ ಹೆಸರು"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID ನಮೂದಿಸಿ"</string>
     <string name="wifi_security" msgid="158358046038876532">"ಭದ್ರತೆ"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ"</string>
     <string name="wifi_status" msgid="5688013206066543952">"ಸ್ಥಿತಿ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"ಲಿಂಕ್ ವೇಗ"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ತರಂಗಾಂತರ"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP ವಿಳಾಸ"</string>
+    <string name="show_password" msgid="2074628020371139240">"ಪಾಸ್‌ವರ್ಡ್ ತೋರಿಸಿ"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ನೆಟ್‌ವರ್ಕ್ ಹೆಸರನ್ನು ನಮೂದಿಸಿ"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ಕಳಪೆ"</item>
-    <item msgid="2032262610626057081">"ಸಾಮಾನ್ಯ"</item>
-    <item msgid="3859756017461098953">"ಉತ್ತಮ"</item>
-    <item msgid="1521103743353335724">"ಉತ್ಕೃಷ್ಟ"</item>
+    <item msgid="7683058295076342057">"ಕಳಪೆ"</item>
+    <item msgid="1639222824821660744">"ಸಾಮಾನ್ಯ"</item>
+    <item msgid="1838705897358163300">"ಉತ್ತಮ"</item>
+    <item msgid="6067166649320533751">"ಅತ್ಯುತ್ತಮ"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ಬ್ಲೂಟೂತ್‌"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ಬ್ಲೂಟೂತ್‌"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ಬ್ಲೂಟೂತ್‌ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ನೆಟ್‌ವರ್ಕ್‌ ವಿವರಗಳು"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ವಿಳಾಸ"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ವಿಳಾಸ"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"ಸಬ್‌ನೆಟ್‌ ಮಾಸ್ಕ್‌"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ವಿಳಾಸಗಳು"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ಗೇಟ್‌ವೇ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ವೈ-ಫೈ ಆದ್ಯತೆಗಳು"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"ವೈ-ಫೈ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಮಾಡಿ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"ನಿಮ್ಮ ಮನೆಯ ನೆಟ್‌ವರ್ಕ್‍ನಂತಹ ಉಳಿಸಿದ ಉನ್ನತ-ಗುಣಮಟ್ಟದ ನೆಟ್‌ವರ್ಕ್‌ಗಳ ಸಮೀಪದಲ್ಲಿರುವಾಗ ವೈ-ಫೈ ಸ್ವಯಂ ಆನ್ ಆಗುತ್ತದೆ"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"ಸ್ಥಳವನ್ನು ಆಫ್ ಮಾಡಿರುವ ಕಾರಣ ಲಭ್ಯವಿಲ್ಲ. "<annotation id="link">"ಸ್ಥಳವನ್ನು"</annotation>" ಆನ್ ಮಾಡಿ."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"ವೈ-ಫೈ ಸ್ಕ್ಯಾನ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡುವುದೇ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ಆನ್ ಮಾಡಿ"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"ವೈ-ಫೈ ಸ್ಕ್ಯಾನಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"ಮೊಬೈಲ್ ಡೇಟಾಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬದಲಿಸಿ"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"ವೈ-ಫೈ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರದಿದ್ದರೆ, ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಬಳಸಿ. ಡೇಟಾ ಬಳಕೆಯ ಶುಲ್ಕ ಅನ್ವಯಿಸಬಹುದು."</string>
+    <string name="learn_more" msgid="8214605928933358604">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ಬ್ಲೂಟೂತ್‌"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ, ಸಾಧನದ ಹೆಸರು &amp; ಅನ್ವೇಷಣೆಯಾಗುವಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"ಕಂಪ್ಯೂಟರ್‌"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ಹೆಡ್‌ಸೆಟ್"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ಫೋನ್"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ಇಮೇಜಿಂಗ್"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ಹೆಡ್‌ಫೋನ್"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ಪೆರಿಪೆರಲ್ ಇನ್‌ಪುಟ್‌‌"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ಬ್ಲೂಟೂತ್‌"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"ಜೋಡಿಸಲಾದ ಸಾಧನಗಳು"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ಲಭ್ಯವಿರುವ ಸಾಧನಗಳು"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ಯಾವುದೇ ಜೋಡಿಸಲಾದ ಸಾಧನಗಳಿಲ್ಲ"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"ಲಭ್ಯವಿರುವ ಯಾವುದೇ ಸಾಧನಗಳಿಲ್ಲ"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"ಜೋಡಿ ಮಾಡಲಾಗಿರುವ ಸಾಧನ"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"ಹೆಸರು"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"ಇದಕ್ಕೆ ಬಳಸಿ"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"ಬ್ಲೂಟೂತ್ ಸಾಧನದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಿ"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"ಹೆಸರಿಸದಿರುವ ಸಾಧನ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"ಜೋಡಿಸಲಾದ ಸಾಧನಗಳು"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"ಹೊಸ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"ಜೋಡಿಸಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗುತ್ತದೆ"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ಸಾಧನದ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸುವುದೇ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನದಿಂದ ನಿಮ್ಮ ವಾಹನದ ಸಂಪರ್ಕವನ್ನು ಕಡಿತಗೊಳಿಸಲಾಗುತ್ತದೆ."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"ವಾಹನದ ಬ್ಲೂಟೂತ್‌ ವಿಳಾಸ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ಸಾಧನದ ಬ್ಲೂಟೂತ್ ವಿಳಾಸ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ವಾಹನದ ಹೆಸರು"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ಈ ವಾಹನವನ್ನು ಮರುಹೆಸರಿಸಿ"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ಸಾಧನವನ್ನು ಮರುಹೆಸರಿಸಿ"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"ಮರುಹೆಸರಿಸಿ"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ಲಭ್ಯವಿರುವ ಸಾಧನಗಳು"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"ಪ್ರೊಫೈಲ್‌ಗಳು"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ಬ್ಲೂಟೂತ್‌‌ ಜೋಡಣೆ ವಿನಂತಿ"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ಜೋಡಿಸಿ ಮತ್ತು ಸಂಪರ್ಕಪಡಿಸಿ"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ಬ್ಲೂಟೂತ್‌"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ಬ್ಲೂಟೂತ್ ಜೋಡಣೆ ಕೋಡ್"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ಅಕ್ಷರಗಳು ಅಥವಾ ಚಿಹ್ನೆಗಳನ್ನು ಪಿನ್‌ ಹೊಂದಿದೆ"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"ಜೋಡಣೆ ಕೋಡ್‌ ಟೈಪ್‌ ಮಾಡಿ ತದನಂತರ ರಿಟರ್ನ್‌ ಅಥವಾ ಎಂಟರ್‌ ಒತ್ತಿ."</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ಸಾಮಾನ್ಯವಾಗಿ 0000 ರಿಂದ 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"ಜೋಡಣೆ ವಿನಂತಿ"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ಭಾಷೆಗಳು"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ಭಾಷೆಗಳು &amp; ಇನ್‌ಪುಟ್"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"ಕೀಬೋರ್ಡ್"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"ಕೀಬೋರ್ಡ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಔಟ್‌ಪುಟ್‌"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ಆದ್ಯತೆಯ ಎಂಜಿನ್‌"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"ಪ್ರಸ್ತುತ ಎಂಜಿನ್"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"ಧ್ವನಿಯ ಪ್ರಮಾಣ"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"ಪಿಚ್"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ಮರುಹೊಂದಿಸಿ"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ಶಬ್ದ"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"ರಿಂಗ್ ವಾಲ್ಯೂಮ್"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"ನ್ಯಾವಿಗೇಷನ್ ವಾಲ್ಯೂಮ್‌"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"ಮಾಧ್ಯಮ"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"ಸಂಗೀತ ಮತ್ತು ವೀಡಿಯೊಗಳಿಗೆ ವಾಲ್ಯೂಮ್‌ ಅನ್ನು ಹೊಂದಿಸಿ"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"ಅಲಾರಮ್"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ಫೋನ್ ರಿಂಗ್‌ಟೋನ್"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ಡಿಫಾಲ್ಟ್ ಅಧಿಸೂಚನೆ ಧ್ವನಿ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ಡಿಫಾಲ್ಟ್ ಅಲಾರಮ್ ಧ್ವನಿ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು"</string>
+    <string name="all_applications" msgid="7798210477486822168">"ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳನ್ನು ತೋರಿಸಿ"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ಡೀಫಾಲ್ಟ್ ಆ್ಯಪ್‌ಗಳು"</string>
     <string name="applications_settings" msgid="794261395191035632">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ಸ್ಥಗಿತಗೊಳಿಸಿ"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"ಬಲವಂತವಾಗಿ ಸ್ಥಗಿತಗೊಳಿಸುವುದೇ?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಬಲವಂತವಾಗಿ ಸ್ಥಗಿತಗೊಳಿಸಿದರೆ, ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು."</string>
     <string name="disable_text" msgid="4358165448648990820">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="enable_text" msgid="1794971777861881238">"ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಇನ್ನು ಮುಂದೆ Android  ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಉದ್ದೇಶಿಸಿದಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ಅಪ್ಲಿಕೇಶನ್‌ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="permissions_label" msgid="2701446753515612685">"ಅನುಮತಿಗಳು"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ಆವೃತ್ತಿ: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ಯಾವುದೇ ಅನುಮತಿಗಳನ್ನು ನೀಡಲಾಗಿಲ್ಲ"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ಯಾವುದೇ ಅನುಮತಿಗಳನ್ನು ವಿನಂತಿಸಿಲ್ಲ"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ಡೇಟಾ ಬಳಕೆ"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ಅಪ್ಲಿಕೇಶನ್‌ ಡೇಟಾ ಬಳಕೆ"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ಸ್ಥಗಿತಗೊಳಿಸಿ"</string>
     <string name="computing_size" msgid="5791407621793083965">"ಗಣನೆ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳು</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳು</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ಅಸಿಸ್ಟೆಂಟ್ ಮತ್ತು ಧ್ವನಿ ಇನ್‌ಪುಟ್"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್‌"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ಪರದೆಯಿಂದ ಪಠ್ಯವನ್ನು ಬಳಸಿ"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್‌ಗೆ ಪರದೆ ವಿಷಯಗಳನ್ನು ಪಠ್ಯದಂತೆ ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸಿ"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಬಳಸಿ"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"ಅಸಿಸ್ಟೆಂಟ್ ಆ್ಯಪ್‌ಗೆ ಪರದೆಯ ಚಿತ್ರವನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸಿ"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ಸ್ವಯಂ ಭರ್ತಿ ಸೇವೆ"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ಯಾವುದೂ ಬೇಡ"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ಆ್ಯಪ್‌ಗಳಲ್ಲಿಯೇ ಪ್ರವೇಶಿಸಬಹುದಾದಂತಹ ಮಾಹಿತಿ ಸೇರಿದಂತೆ, ನಿಮ್ಮ ಸಿಸ್ಟಂನಲ್ಲಿ ಬಳಕೆಯಲ್ಲಿರುವ ಆ್ಯಪ್‌ಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಓದಲು ಅಸಿಸ್ಟೆಂಟ್‌ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ನಿಮಗೆ ಈ ಅಪ್ಲಿಕೇಶನ್ ಮೇಲೆ ವಿಶ್ವಾಸವಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ &lt;/b&gt; &lt;br/&gt; &lt;br/&gt; ಯಾವ ಕ್ಷೇತ್ರಗಳನ್ನು ಸ್ವಯಂ-ಭರ್ತಿ ಮಾಡಬಹುದು ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸಲು &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; ನಿಮ್ಮ ಪರದೆಯಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಳ್ಳುತ್ತದೆ."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"ಸೇವೆಯನ್ನು ಸೇರಿಸಿ"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ಸ್ಥಳ"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ಇತ್ತೀಚಿನ ಸ್ಥಳ ವಿನಂತಿಗಳು"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಸ್ಥಳ ವಿನಂತಿಗಳು ಇಲ್ಲ"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ಆ್ಯಪ್‌ ಹಂತದ ಅನುಮತಿಗಳು"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"ಸ್ಕ್ಯಾನ್ ಮಾಡುವಿಕೆ"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"ಸ್ಥಳ ಸೇವೆಗಳು"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"ವೈ-ಫೈ ಸ್ಕ್ಯಾನಿಂಗ್"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"ವೈ-ಫೈ ಆಫ್‌ ಆಗಿದ್ದರೂ ಸಹ, ಯಾವ ಸಮುಯದಲ್ಲಾದರೂ ವೈ-ಫೈಗೆ ಸ್ಕ್ಯಾನ್‌ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳನ್ನು ಅನುಮತಿಸಿ. ಉದಾಹರಣೆಗೆ, ಸ್ಥಳ ಆಧಾರಿತ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಮತ್ತು ಸೇವೆಗಳನ್ನು ಸುಧಾರಿಸಲು ಇದನ್ನು ಬಳಸಬಹುದಾಗಿದೆ."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ಬ್ಲೂಟೂತ್ ಸ್ಕ್ಯಾನಿಂಗ್"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ಬ್ಲೂಟೂತ್‌ ಆಫ್‌ ಆಗಿದ್ದರೂ ಸಹ, ಯಾವ ಸಮಯದಲ್ಲಾದರೂ ಸಮೀಪದ ಸಾಧನಗಳಿಗೆ ಸ್ಕ್ಯಾನ್‌ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳನ್ನು ಅನುಮತಿಸಿ. ಉದಾಹರಣೆಗೆ, ಸ್ಥಳ ಆಧಾರಿತ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಮತ್ತು ಸೇವೆಗಳನ್ನು ಸುಧಾರಿಸಲು ಇದನ್ನು ಬಳಸಬಹುದಾಗಿದೆ."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"ಸಿಸ್ಟಂ"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"ಸಿಸ್ಟಂ ಅಪ್‌ಡೇಟ್‌ಗಳು"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"ಸಿಸ್ಟಂ ಅಪ್‌ಡೇಟ್‌ಗಳು"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ಆವೃತ್ತಿ"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android ಭದ್ರತೆ ಪ್ಯಾಚ್ ಮಟ್ಟ"</string>
     <string name="model_info" msgid="4966408071657934452">"ಮಾಡೆಲ್"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ಬೇಸ್‌ಬ್ಯಾಂಡ್ ಆವೃತ್ತಿ"</string>
     <string name="kernel_version" msgid="7327212934187011508">"ಕೆರ್ನಲ್ ಆವೃತ್ತಿ"</string>
     <string name="build_number" msgid="3997326631001009102">"ಬಿಲ್ಡ್ ಸಂಖ್ಯೆ"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ಬ್ಲೂಟೂತ್‌‌ ವಿಳಾಸ"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"ಸ್ಥಿತಿ"</string>
     <string name="device_status" msgid="267298179806290920">"ಸ್ಥಿತಿ"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"ಹಕ್ಕುಸ್ವಾಮ್ಯ"</string>
     <string name="license_title" msgid="936705938435249965">"ಪರವಾನಗಿ"</string>
     <string name="terms_title" msgid="5201471373602628765">"ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳು"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"ಸಿಸ್ಟಂ ವೆಬ್‌ವೀಕ್ಷಣೆ ಪರವಾನಗಿ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"ಸಿಸ್ಟಂ ವೆಬ್‌ವೀಕ್ಷಣೆ ಪರವಾನಗಿಗಳು"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ವಾಲ್‌ಪೇಪರ್‌ಗಳು"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ಉಪಗ್ರಹ ಚಿತ್ರಣ ಪೂರೈಕೆದಾರರು:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ಮೂರನೇ-ವ್ಯಕ್ತಿ ಪರವಾನಗಿಗಳು"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ಪರವಾನಗಿಗಳನ್ನು ಲೋಡ್‌ ಮಾಡುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"ಲೋಡ್ ಆಗುತ್ತಿದೆ..."</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">ನೀವು ಇದೀಗ ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ಹಂತಗಳ ದೂರದಲ್ಲಿರುವಿರಿ.</item>
+      <item quantity="other">ನೀವು ಇದೀಗ ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ಹಂತಗಳ ದೂರದಲ್ಲಿರುವಿರಿ.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ಇದೀಗ ನೀವು ಡೆವಲಪರ್‌!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"ಅಗತ್ಯವಿಲ್ಲ, ನೀವು ಈಗಾಗಲೇ ಡೆವಲಪರ್‌ ಆಗಿರುವಿರಿ."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ಡೆವಲಪರ್ ಆಯ್ಕೆಗಳು"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ಮರುಹೊಂದಿಸುವ ಆಯ್ಕೆಗಳು"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ನೆಟ್‌ವರ್ಕ್, ಆ್ಯಪ್‌ಗಳು ಅಥವಾ ಸಾಧನಗಳ ಮರುಹೊಂದಿಸುವಿಕೆ"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ನೆಟ್‌ವರ್ಕ್‌ ಮರುಹೊಂದಿಸಿ"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ಇದು ನೆಟ್‌ವರ್ಕ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಎಲ್ಲವನ್ನೂ ಮರುಹೊಂದಿಸುತ್ತದೆ, ಅವುಗಳಲ್ಲಿ ಈ ಮುಂದಿನವುಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"ವೈ-ಫೈ"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"ಮೊಬೈಲ್ ಡೇಟಾ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ಬ್ಲೂಟೂತ್"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"ಎಲ್ಲಾ ವಾಹನದ eSIMಗಳನ್ನು ಅಳಿಸಿ"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ಇದು ನಿಮ್ಮ ಸೇವಾ ಯೋಜನೆಯನ್ನು ರದ್ದುಗೊಳಿಸುವುದಿಲ್ಲ."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM ಗಳನ್ನು ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ನೆಟ್‌ವರ್ಕ್ ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ಸೆಟ್ಟಿಂಗ್‌ ಮರುಹೊಂದಿಸಿ"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"ಮರುಹೊಂದಿಸುವುದೇ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮರುಹೊಂದಿಸುವುದೇ? ನೀವು ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ಸೆಟ್ಟಿಂಗ್‌ ಮರುಹೊಂದಿಸಿ"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ನೆಟ್‌ವರ್ಕ್‌ ಸೆಟ್ಟಿಂಗ್‌ ಅನ್ನು ಮರುಹೊಂದಿಸಲಾಗಿದೆ"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ಆ್ಯಪ್ ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ಮರುಹೊಂದಿಸಿ"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ಇದು ಕೆಳಗಿನ ಎಲ್ಲಾ ಆದ್ಯತೆಗಳಿಗಾಗಿ ಮರುಹೊಂದಿಸುತ್ತದೆ:\n\n"<li>"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ ಆ್ಯಪ್‌ಗಳು"</li>\n<li>"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ ಆ್ಯಪ್‌ ಅಧಿಸೂಚನೆಗಳು"</li>\n<li>"ಕ್ರಿಯೆಗಳಿಗಾಗಿ ಡೀಫಾಲ್ಟ್ ಆ್ಯಪ್‌ಗಳು"</li>\n<li>"ಆ್ಯಪ್‌ ಹಿನ್ನೆಲೆ ಡೇಟಾ ನಿರ್ಬಂಧಗಳು"</li>\n<li>"ಯಾವುದೇ ಅನುಮತಿ ನಿರ್ಬಂಧಗಳು"</li>\n\n"ಯಾವುದೇ ಆ್ಯಪ್‌ ಡೇಟಾವನ್ನು ನೀವು ಕಳೆದುಕೊಳ್ಳುವುದಿಲ್ಲ."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ಆಪ್‌‌ಗಳನ್ನು ಮರುಹೊಂದಿಸಿ"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ಮರುಹೊಂದಿಸಲಾಗಿದೆ"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ಎಲ್ಲಾ ಡೇಟಾ ಅಳಿಸಿ (ಫ್ಯಾಕ್ಟರಿ ಮರುಹೊಂದಿಸಿ)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ಇವುಗಳು ಸೇರಿದಂತೆ ಇದು ನಿಮ್ಮ ವಾಹನದ ಹೆಡ್ ಯೂನಿಟ್‌ನಲ್ಲಿರುವ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ:\n\n"<li>"ನಿಮ್ಮ Google ಖಾತೆ"</li>\n<li>"ಸಿಸ್ಟಂ ಮತ್ತು ಆ್ಯಪ್‌ ಡೇಟಾ ಹಾಗೂ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</li>\n<li>"ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಆ್ಯಪ್‌ಗಳು"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"ನೀವು ಪ್ರಸ್ತುತವಾಗಿ ಕೆಳಗಿನ ಖಾತೆಗಳಿಗೆ ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ಈ ವಾಹನದಲ್ಲಿ ಇತರ ಬಳಕೆದಾರರಿದ್ದಾರೆ."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"ವಾಹನವನ್ನು ಮರುಹೊಂದಿಸಿ"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"ಮರುಹೊಂದಿಸುವುದೇ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"ನಿಮ್ಮ ಎಲ್ಲ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿ ಮತ್ತು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಆ್ಯಪ್‌ಗಳನ್ನು ಅಳಿಸಬೇಕೇ? ನೀವು ಈ ಕ್ರಿಯೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ಎಲ್ಲವನ್ನೂ ಅಳಿಸಿ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"ಅಳಿಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"ನಿರೀಕ್ಷಿಸಿ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ಬದಲಾಯಿಸಿ"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ಹೊಂದಿಸಿ"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"ದಿನಾಂಕ, ಸಮಯ, ಸಮಯದ ವಲಯದ, ಮತ್ತು ಫರ್ಮ್ಯಾಟ್‌ಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"ಸಮಯ ವಲಯದ ಅನುಸಾರ ವಿಂಗಡಿಸಿ"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"ದಿನಾಂಕ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"ಸಮಯ"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"ಖಾತೆ ಸೇರಿಸಿ"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಿ"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"ಹೊಸ ಬಳಕೆದಾರರು"</string>
-    <string name="user_guest" msgid="3465399481257448601">"ಅತಿಥಿ"</string>
     <string name="user_admin" msgid="1535484812908584809">"ನಿರ್ವಾಹಕ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"ನಿರ್ವಾಹಕರಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"ಎಲ್ಲಾ ನಿರ್ವಾಹಕರ ಅನುಮತಿಗಳು"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"ನಿರ್ವಹಣೆ ಮಾಡಿ"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ಬಳಕೆದಾರರಿಗೆ ಇತರ ನಿರ್ವಾಹಕರು ಸೇರಿದಂತೆ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ, ಮತ್ತು ಸಿಸ್ಟಂ ಅನ್ನು ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ಈ ಕ್ರಿಯೆಯನ್ನು ಹಿಂತಿರುಗಿಸಲಾಗುವುದಿಲ್ಲ."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ಹೌದು, ನಿರ್ವಹಣೆ ಮಾಡಿ"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಿ"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ಫೋನ್ ಕರೆಗಳನ್ನು ಮಾಡಿ"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"ಕಾರ್‌ನ ಮೊಬೈಲ್ ಡೇಟಾದ ಮೂಲಕ ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"ಹೊಸ ಆ್ಯಪ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ಆ್ಯಪ್‌ಗಳನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"ಹೊಸ ಬಳಕೆದಾರರು"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ನೀವು ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"ಬಳಕೆದಾರರ ಮಿತಿ ತಲುಪಿದೆ"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">ನೀವು <xliff:g id="COUNT">%d</xliff:g> ಬಳಕೆದಾರರವರೆಗೆ ಸೇರಿಸಬಹುದು.</item>
+      <item quantity="other">ನೀವು <xliff:g id="COUNT">%d</xliff:g> ಬಳಕೆದಾರರವರೆಗೆ ಸೇರಿಸಬಹುದು.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ಈ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸುವುದೇ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಲು ವಿಫಲವಾಗಿದೆ."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ವಜಾಗೊಳಿಸಿ"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ಮರುಪ್ರಯತ್ನ"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"ಬಳಕೆದಾರನನ್ನು ಅಳಿಸುವುದೇ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ಈ ಕಾರಿಗೆ ಉಳಿದಿರುವ ಬಳಕೆದಾರರನ್ನು ಅಳಿಸಿದ ನಂತರ, ಹೊಸ ನಿರ್ವಾಹಕ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ಈ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಎಲ್ಲಾ ಡೇಟಾ, ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ಆ್ಯಪ್‌ಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ. ನೀವು ಸಿಸ್ಟಮ್ ಅನ್ನು ಮತ್ತೆ ಹೊಂದಿಸಬೇಕಾಗಿದೆ."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"ಹೊಸ ನಿರ್ವಾಹಕವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"ನಿಮಗೆ ಕನಿಷ್ಟ ಒಂದು ನಿರ್ವಾಹಕ ಅಗತ್ಯವಿರುತ್ತದೆ. ಇದನ್ನು ಅಳಿಸಲು, ಮೊದಲು ಬದಲಿ ಆಯ್ಕೆ ಮಾಡಿ."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"ನಿರ್ವಾಹಕವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ಅತಿಥಿ"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ಅತಿಥಿ"</string>
     <string name="user_switch" msgid="6544839750534690781">"ಬದಲಿಸಿ"</string>
     <string name="current_user_name" msgid="3813671533249316823">"ನೀವು (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"ಹೆಸರು"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ಇನ್ನೂ ಸೆಟಪ್‌ ಮಾಡಿಲ್ಲ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ಬಳಕೆದಾರರ ಹೆಸರನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
     <string name="users_list_title" msgid="770764290290240909">"ಬಳಕೆದಾರರು"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ಗೆ ಅನುಮತಿಗಳನ್ನು ನೀಡಲಾಗಿದೆ"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"ಖಾತೆಗಳು"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ಬಳಕೆದಾರ"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"ಖಾತೆ ಸೇರಿಸಿ"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ಯಾವುದೇ ಖಾತೆಗಳನ್ನು ಸೇರಿಸಿಲ್ಲ"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> ಅವರಿಗಾಗಿ ಖಾತೆಗಳು"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ಡೇಟಾವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಿಂಕ್ ಮಾಡಿ"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ಆ್ಯಪ್‌ಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೇಟಾವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಲಿ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ಸ್ವಯಂ-ಸಿಂಕ್‌ ಡೇಟಾ ಆನ್‌‌ಮಾಡುವುದೇ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ವೆಬ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಖಾತೆಗಳಿಗೆ ಮಾಡಲಾದ ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ನಕಲಿಸಲಾಗುತ್ತದೆ. \n\nಫೋನ್‌ನಲ್ಲಿ ನೀವು ಮಾಡುವ ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಕೆಲವು ಖಾತೆಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವೆಬ್‌ಗೆ ನಕಲಿಸುತ್ತವೆ. Google ಖಾತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ರೀತಿ ಇದು."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ಸ್ವಯಂ-ಸಿಂಕ್‌ ಡೇಟಾ ಆಫ್‌ ಮಾಡುವುದೇ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ಇದು ಡೇಟಾ ಪೋಲಾಗದಂತೆ ತಡೆಯುತ್ತದೆ, ಆದರೆ ಇತ್ತೀಚಿನ ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಲು ನೀವು ಪ್ರತಿ ಖಾತೆಯನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಸಿಂಕ್‌ ಮಾಡಬೇಕಾಗುತ್ತದೆ. ಮತ್ತು ಅಪ್‌ಡೇಟ್‌ಗಳ ಸಂದರ್ಭದಲ್ಲಿ ನೀವು ಅಧಿಸೂಚನೆಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ."</string>
     <string name="account_details_title" msgid="7529571432258448573">"ಖಾತೆಯ ಮಾಹಿತಿ"</string>
     <string name="add_account_title" msgid="5988746086885210040">"ಖಾತೆ ಸೇರಿಸಿ"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ಖಾತೆಯನ್ನು ಸೇರಿಸಿ"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ಈ ಖಾತೆಯನ್ನು ತೆಗೆದುಹಾಕುವುದರಿಂದ ಸಾಧನದಲ್ಲಿರುವ ಅದರ ಎಲ್ಲ ಸಂದೇಶಗಳು, ಸಂಪರ್ಕಗಳು ಮತ್ತು ಇತರೆ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ಈ ಬದಲಾವಣೆಗೆ ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ಬಳಕೆದಾರರನ್ನು ತೆಗೆಯುವುದೇ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಲು ವಿಫಲವಾಗಿದೆ."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುವುದೇ?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"ವಜಾಗೊಳಿಸಿ"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ಮರುಪ್ರಯತ್ನಿಸಿ"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ನೀವು ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬಹುದು."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"ಖಾತೆ ತೆಗೆದುಹಾಕಲು ವಿಫಲವಾಗಿದೆ."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ಖಾತೆ ಸಿಂಕ್"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> ಐಟಂಗಳಲ್ಲಿ <xliff:g id="ID_1">%1$d</xliff:g> ಕ್ಕಾಗಿ ಸಿಂಕ್ ಆನ್ ಇದೆ"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"ಎಲ್ಲಾ ಐಟಂಗಳಿಗಾಗಿ ಸಿಂಕ್ ಆನ್ ಇದೆ"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"ಎಲ್ಲಾ ಐಟಂಗಳಿಗಾಗಿ ಸಿಂಕ್ ಆಫ್ ಇದೆ"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"ಸಿಂಕ್‌ ಆಫ್ ಆಗಿದೆ"</string>
+    <string name="sync_error" msgid="6698021343089247914">"ಸಿಂಕ್ ದೋಷ"</string>
+    <string name="last_synced" msgid="4745124489150101529">"ಕೊನೆಯದಾಗಿ ಸಿಂಕ್ ಮಾಡಿರುವುದು <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ಇದೀಗ ಸಿಂಕ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ಈಗ ಸಿಂಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ಈಗ ಸಿಂಕ್ ಮಾಡಿ"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ಸಿಂಕ್ ರದ್ದುಗೊಳಿಸಿ"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ಸಿಂಕ್‌ ಪ್ರಸ್ತುತ ಸಮಸ್ಯೆ ಎದುರಿಸುತ್ತಿದೆ. ಶೀಘ್ರದಲ್ಲಿಯೇ ಅದು ಯಥಾಸ್ಥಿತಿಗೆ ಬರಲಿದೆ."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ಭದ್ರತೆ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ಪರದೆ ಲಾಕ್"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ಯಾವುದೂ ಅಲ್ಲ"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"ಪಿನ್"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"ಪಾಸ್‌ವರ್ಡ್"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"ಲಾಕ್ ಪ್ರಕಾರವನ್ನು ಆರಿಸಿ"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಆಯ್ಕೆಗಳು"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ಲಾಕ್ ಆಯ್ಕೆಗಳು"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿ"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"ದೃಢೀಕರಿಸಿ"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ಮರುರಚಿಸಿ"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"ಪರದೆ ಲಾಕ್ ಹೊಂದಿಸಿ"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"ನಿಮ್ಮ ಪಿನ್‌ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"ಪ್ಯಾಟರ್ನ್ ಆಯ್ಕೆ ಮಾಡಿ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ಆರಿಸಿಕೊಳ್ಳಿ"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"ಪ್ರಸ್ತುತ ಸ್ಕ್ರೀನ್ ಲಾಕ್"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ಸುರಕ್ಷತೆಗಾಗಿ, ಪ್ಯಾಟ್ರನ್ ಹೊಂದಿಸಿ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"ತೆರವುಗೊಳಿಸಿ"</string>
@@ -232,7 +384,7 @@
     <string name="error_saving_lockpattern" msgid="2933512812768570130">"ಪ್ಯಾಟರ್ನ್‌ ಉಳಿಸುವಲ್ಲಿ ದೋಷ"</string>
     <string name="okay" msgid="4589873324439764349">"ಸರಿ"</string>
     <string name="remove_screen_lock_title" msgid="1234382338764193387">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ತೆಗೆದುಹಾಕಿ"</string>
-    <string name="remove_screen_lock_message" msgid="6675850371585564965">"ಇದು ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಯಾರಾದರೂ ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸುತ್ತದೆ"</string>
+    <string name="remove_screen_lock_message" msgid="6675850371585564965">"ಇದು ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಯಾರು ಬೇಕಾದರೂ ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸುತ್ತದೆ"</string>
     <string name="lock_settings_enter_pin" msgid="1669172111244633904">"ನಿಮ್ಮ ಪಿನ್ ನಮೂದಿಸಿ"</string>
     <string name="lock_settings_enter_password" msgid="2636669926649496367">"ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
     <string name="choose_lock_pin_message" msgid="2963792070267774417">"ಸುರಕ್ಷತೆಗಾಗಿ, ಪಿನ್ ಅನ್ನು ಹೊಂದಿಸಿ"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ಸರಳವಾದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ನಿಮ್ಮ ಐಟಿ ನಿರ್ವಾಹಕರಿಂದ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ಬೇರೆಯ ಪಾಸ್‌ವರ್ಡ್‌ ಪ್ರಯತ್ನಿಸಿ."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ಅಂಕಿಗಳ ಆರೋಹಣ, ಅವರೋಹಣ ಅಥವಾ ಪುನರಾವರ್ತಿತ ಅನುಕ್ರಮವನ್ನು ನಿಷೇಧಿಸಲಾಗಿದೆ."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಆಯ್ಕೆಗಳು"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ದಿನಗಳ ಹಿಂದೆ"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನ ಸೇರಿಸಿ"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನಗಳು"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ಸಾಧನಗಳು</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ಸಾಧನಗಳು</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"ನಿಮ್ಮ <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ಸಂಪರ್ಕಿತಗೊಂಡಾಗ ಈ ಕಾರ್‌ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡುತ್ತದೆ. ಒಂದು ವೇಳೆ ನಿಮ್ಮ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> ಅನ್ನು ಯಾರಾದರೂ ತೆಗೆದುಕೊಂಡರೆ, ಅವರಿಗೆ ಈ ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗಬಹುದು"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"ದೃಢೀಕರಿಸಿ"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ಮುಗಿದಿದೆ"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನವನ್ನು ಸೆಟಪ್ ಮಾಡಲು ಕಂಪ್ಯಾನಿಯನ್ ಆ್ಯಪ್ ಅನ್ನು ಬಳಸಿ. ಸೆಟಪ್ ನಂತರ, ವಾಹನವು ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿದಾಗ ನಿಮ್ಮ ಬಳಕೆದಾರ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿರುವ ಕಂಪ್ಯಾನಿಯನ್ ಆ್ಯಪ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. ಸಾಧನಗಳನ್ನು ಜೋಡಿಸಲು ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿರುವ <xliff:g id="CAR_NAME">%1$s</xliff:g> ಆಯ್ಕೆಮಾಡಿ"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ಗೆ ಈ ಸಾಧನದ ಭದ್ರತೆ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಪತ್ತೆಹೆಚ್ಚಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಕಾರ್ ಸಂರಕ್ಷಿಸುವುದಕ್ಕೆ ಸಹಾಯ ಮಾಡಲು, ನೀವು ಈಗಾಗಲೇ ನಿಮ್ಮ ಕಾರ್ ಅನ್‌ಲಾಕ್ ಮಾಡಿದ್ದರೆ ಅದನ್ನು ಅನ್‌ಲಾಕ್ ಆಗಿಯೇ ಇರಿಸಲು ಮಾತ್ರವೇ ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನಕ್ಕೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ. ಬೇರೆ ಯಾರಾದರೂ ನಿಮ್ಮ ಕಾರ್ ಇರಿಸಿಕೊಂಡಿದ್ದರೂ, ಅದು ಹತ್ತಿರದಲ್ಲಿರುವಾಗ ನಿಮ್ಮ ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನ ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಆಗಿ ಇರಿಸಬಹುದು."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನ ಎಂಬಂತೆ ಸೇರಿಸಿ"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನ ಎಂಬಂತೆ ಸೇರಿಸಲಾಗಿದೆ"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ನೋಂದಣಿ ವಿಫಲವಾಗಿದೆ"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನವನ್ನು ಸೇರಿಸುವುದು ನೀವು ಪ್ರಮಾಣೀಕರಣ ವಿಧಾನವನ್ನು ಹೊಂದಿಸುವ ಅಗತ್ಯವಿದೆ. ನೀವು ವಿಶ್ವಾಸಾರ್ಹ ಸಾಧನವನ್ನು ನಿಮ್ಮೊಂದಿಗೆ ಹೊಂದಿಲ್ಲದೇ ಇದ್ದರೆ, ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಪ್ರಮಾಣೀಕರಣದ ಅಗತ್ಯವಿದೆ."</string>
     <string name="forget" msgid="3971143908183848527">"ಮರೆಯಿರಿ"</string>
+    <string name="connect" msgid="5861699594602380150">"ಸಂಪರ್ಕಿಸಿ"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿ"</string>
     <string name="delete_button" msgid="5840500432614610850">"ಅಳಿಸಿ"</string>
     <string name="remove_button" msgid="6664656962868194178">"ತೆಗೆದುಹಾಕಿ"</string>
     <string name="cancel" msgid="750286395700355455">"ರದ್ದುಮಾಡಿ"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ಡೆಮೊ ಮೋಡ್‌ನಿಂದ ನಿರ್ಗಮಿಸಿ"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ಇದು ಡೆಮೊ ಖಾತೆಯನ್ನು ಅಳಿಸುತ್ತದೆ ಮತ್ತು ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾ ಸಿಸ್ಟಂ ಅನ್ನು ಮರುಹೊಂದಿಸುತ್ತದೆ. ಎಲ್ಲಾ ಬಳಕೆದಾರ ಡೇಟಾವನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ಡೆಮೊದಿಂದ ನಿರ್ಗಮಿಸಿ"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ಸೆಟಪ್ ಪೂರ್ಣಗೊಳಿಸಿ"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ಈಗಲೇ ಬೇಡ"</string>
-    <string name="restricted_while_driving" msgid="6217369093121968299">"ಚಾಲನೆ ಮಾಡುವಾಗ ವೈಶಿಷ್ಟ್ಯ ಲಭ್ಯವಿಲ್ಲ."</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ವಜಾಗೊಳಿಸಿ"</string>
+    <string name="restricted_while_driving" msgid="6217369093121968299">"ಡ್ರೈವ್ ಮಾಡುವಾಗ ಈ ವೈಶಿಷ್ಟ್ಯ ಲಭ್ಯವಿಲ್ಲ."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ಚಾಲನೆ ಮಾಡುವಾಗ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 85dea65..7143834 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"화면 어둡게 하기, 터치스크린, 배터리"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"화면 어둡게 하기, 밤, 농담 효과"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"야간 모드"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"네트워크 및 인터넷"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"모바일 네트워크"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"모바일 데이터"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"모바일 네트워크를 사용하여 데이터 액세스"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"모바일 데이터를 사용 중지하시겠습니까?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"데이터 사용량"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"데이터 경고 및 한도"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"앱 데이터 사용량 주기"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"데이터 경고 설정"</string>
+    <string name="data_warning" msgid="116776633806885370">"데이터 경고"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"데이터 한도 설정"</string>
+    <string name="data_limit" msgid="227338836292511425">"데이터 한도"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"데이터 사용량 제한"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"설정한 모바일 데이터 한도에 도달하면 차량에서 모바일 데이터를 사용 중지합니다.\n\n데이터 사용량은 헤드 유닛에서 측정되며 이동통신사에서 사용량을 다르게 계산할 수 있으므로 한도를 낮게 설정해 보세요."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"무선 액세스 포인트 설정 및 관리"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi 사용 설정 중..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi 사용 중지 중..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi 목록 로드 중"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi가 사용 중지됨"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"네트워크 기록 삭제 실패"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"네트워크에 연결하지 못했습니다."</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"네트워크 추가"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi가 사용 중지됨"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"연결"</string>
     <string name="wifi_password" msgid="5565632142720292397">"비밀번호"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"비밀번호 표시"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"네트워크 이름"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID 입력"</string>
     <string name="wifi_security" msgid="158358046038876532">"보안"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"신호 강도"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"신호 강도"</string>
     <string name="wifi_status" msgid="5688013206066543952">"상태"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"링크 속도"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"주파수"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP 주소"</string>
+    <string name="show_password" msgid="2074628020371139240">"비밀번호 표시"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"네트워크 이름 입력"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"비밀번호 입력"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"나쁨"</item>
-    <item msgid="2032262610626057081">"양호"</item>
-    <item msgid="3859756017461098953">"좋음"</item>
-    <item msgid="1521103743353335724">"우수함"</item>
+    <item msgid="7683058295076342057">"나쁨"</item>
+    <item msgid="1639222824821660744">"양호"</item>
+    <item msgid="1838705897358163300">"좋음"</item>
+    <item msgid="6067166649320533751">"우수함"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"블루투스"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"블루투스 켜기"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"블루투스"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"블루투스 사용 중지됨"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$dMbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"네트워크 세부정보"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC 주소"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP 주소"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"서브넷 마스크"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 주소"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"게이트웨이"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi 환경설정"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"자동으로 Wi‑Fi 사용 설정"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"홈 네트워크 등의 저장된 고품질 네트워크가 가까이 있을 때 Wi‑Fi가 다시 사용 설정됨"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"위치 정보가 사용 중지되어 있으므로 사용할 수 없습니다. "<annotation id="link">"위치 정보"</annotation>"를 사용 설정해 주세요."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi 검색을 사용 설정하시겠습니까?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"사용"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi 검색 사용 설정됨"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"모바일 데이터로 자동 전환"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi‑Fi 인터넷 액세스가 끊기면 모바일 데이터를 사용합니다. 데이터 사용 요금이 부과될 수 있습니다."</string>
+    <string name="learn_more" msgid="8214605928933358604">"자세히 알아보기"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"블루투스"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"연결 관리, 기기 이름 및 검색 가능 여부 설정"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"컴퓨터"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"헤드셋"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"전화"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"이미징"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"헤드폰"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"입력 주변기기"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"블루투스"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"페어링된 기기"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"사용 가능한 기기"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"페어링된 기기가 없음"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"사용할 수 있는 기기가 없음"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"페어링된 기기"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"이름"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"용도"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"블루투스 기기 이름 변경"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"이름이 없는 기기"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"페어링된 기기"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"새 기기와 페어링"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"페어링을 위해 블루투스가 사용 설정됩니다."</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"기기 연결을 해제하시겠습니까?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"차량이 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>에서 연결 해제됩니다."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"차량의 블루투스 주소: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"기기 블루투스 주소: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"차량 이름"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"챠량 이름 변경"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"기기 이름 변경"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"이름 변경"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"사용 가능한 기기"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"프로필"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"블루투스 페어링 요청"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"페어링 및 연결"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"블루투스"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"블루투스 페어링 코드"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN에 문자나 기호가 포함됨"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"페어링 코드를 입력하고 Return 또는 Enter 키를 누르세요."</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"일반적으로 0000 또는 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"페어링 요청"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에 페어링하려면 탭하세요."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"언어"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"언어 및 입력"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"키보드"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"키보드 관리"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"TTS(텍스트 음성 변환) 출력"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"기본 엔진"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"현재 엔진"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"말하는 속도"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"높낮이"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"재설정"</string>
     <string name="sound_settings" msgid="3072423952331872246">"소리"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"벨소리 볼륨"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"내비게이션 볼륨"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"미디어"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"음악 및 동영상 볼륨 설정"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"알람"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"전화 벨소리"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"기본 알림 소리"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"기본 알람 소리"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"앱 및 알림"</string>
+    <string name="all_applications" msgid="7798210477486822168">"모든 앱 표시"</string>
+    <string name="default_applications" msgid="1558183275638697087">"기본 앱"</string>
     <string name="applications_settings" msgid="794261395191035632">"앱 정보"</string>
+    <string name="force_stop" msgid="2153183697014720520">"강제 종료"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"강제 종료하시겠습니까?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"앱을 강제 종료하면 예기치 않은 오류가 발생할 수 있습니다."</string>
     <string name="disable_text" msgid="4358165448648990820">"사용 중지"</string>
     <string name="enable_text" msgid="1794971777861881238">"사용"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"제거"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"이 앱을 사용 중지하면 Android와 다른 앱이 제대로 작동하지 않을 수도 있습니다."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"앱 사용 중지"</string>
     <string name="permissions_label" msgid="2701446753515612685">"권한"</string>
     <string name="application_version_label" msgid="8556889839783311649">"버전: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"부여된 권한이 없습니다."</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"요청한 권한이 없습니다."</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"데이터 사용량"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"앱 데이터 사용량"</string>
-    <string name="force_stop" msgid="2153183697014720520">"강제 종료"</string>
     <string name="computing_size" msgid="5791407621793083965">"계산 중..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">추가 권한 <xliff:g id="COUNT_1">%d</xliff:g>개</item>
       <item quantity="one">추가 권한 <xliff:g id="COUNT_0">%d</xliff:g>개</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"어시스트 및 음성 입력"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"지원 앱"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"화면의 텍스트 사용"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"지원 앱이 화면의 텍스트 콘텐츠에 액세스하도록 허용합니다."</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"스크린샷 사용"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"지원 앱이 화면의 이미지에 액세스하도록 허용합니다."</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"자동완성 서비스"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"없음"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"선택됨"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"어시스턴트가 시스템에서 사용 중인 앱에 관한 정보를 읽을 수 있게 됩니다. 여기에는 화면에 표시된 정보 또는 앱 내에서 액세스할 수 있는 정보가 포함됩니다."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;이 앱을 신뢰할 수 있는지 확인하세요.&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google 자동 완성&gt;%1$s&lt;/xliff:g&gt;에서는 자동 완성할 수 있는 항목을 결정하기 위해 화면의 내용을 사용합니다."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"서비스 추가"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"위치"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"최근 위치 요청"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"최근 위치 요청 없음"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"앱 수준 권한"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"검색 중"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"위치 서비스"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi 검색"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi‑Fi가 꺼져 있을 때도 항상 앱과 서비스에서 Wi-Fi 네트워크를 검색하도록 허용합니다. 이 설정은 예를 들면 위치 기반 기능 및 서비스를 개선하는 데 사용될 수 있습니다."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"블루투스 검색"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"블루투스가 꺼져 있을 때도 항상 앱과 서비스에서 주변 기기를 검색하도록 허용합니다. 이 설정은 예를 들면 위치 기반 기능 및 서비스를 개선하는 데 사용될 수 있습니다."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"시스템"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"시스템 업데이트"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"시스템 업데이트"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 버전"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android 보안 패치 수준"</string>
     <string name="model_info" msgid="4966408071657934452">"모델"</string>
     <string name="baseband_version" msgid="2370088062235041897">"베이스밴드 버전"</string>
     <string name="kernel_version" msgid="7327212934187011508">"커널 버전"</string>
     <string name="build_number" msgid="3997326631001009102">"빌드 번호"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"블루투스 주소"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"사용할 수 없음"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"상태"</string>
     <string name="device_status" msgid="267298179806290920">"상태"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"저작권"</string>
     <string name="license_title" msgid="936705938435249965">"라이선스"</string>
     <string name="terms_title" msgid="5201471373602628765">"약관"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"시스템 WebView 라이선스"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"시스템 WebView 라이선스"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"배경화면"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"위성 이미지 제공업체:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"타사 라이선스"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"라이선스를 로드하는 동안 문제가 발생했습니다."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"로드 중…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">개발자가 되려면 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>단계가 남았습니다.</item>
+      <item quantity="one">개발자가 되려면 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g>단계가 남았습니다.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"개발자가 되셨습니다."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"이미 개발자입니다."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"개발자 옵션"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"옵션 재설정"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"네트워크, 앱, 기기 재설정"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"네트워크 재설정"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"다음을 포함한 모든 네트워크 설정을 초기화합니다."</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"모바일 데이터"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"블루투스"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"모든 자동차 eSIM 삭제"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"서비스 요금제는 취소되지 않습니다."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM을 재설정할 수 없음"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"네트워크 선택"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"설정 초기화"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"초기화하시겠습니까?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"모든 네트워크 설정을 초기화하시겠습니까? 이 작업은 실행취소할 수 없습니다."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"설정 초기화"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"네트워크 설정이 초기화되었습니다."</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"앱 환경설정 초기화"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"이 작업을 하면 다음 환경설정이 재설정됩니다.\n\n"<li>"사용 중지된 앱"</li>\n<li>"사용 중지된 알림"</li>\n<li>"작업에 사용하는 기본 애플리케이션"</li>\n<li>"앱의 백그라운드 데이터 제한"</li>\n<li>"그 밖의 권한 제한"</li>\n\n"앱 데이터는 손실되지 않습니다."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"앱 초기화"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"앱 환경설정이 초기화되었습니다."</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"모든 데이터 삭제(초기화)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"초기화하면 다음을 포함한 차량 헤드 유닛의 모든 데이터가 삭제됩니다. \n\n"<li>"Google 계정"</li>\n<li>"시스템과 앱 데이터 및 설정"</li>\n<li>"다운로드한 앱"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"현재 다음 계정에 로그인함:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"이 차량에 다른 사용자가 있습니다."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"차량 초기화"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"초기화하시겠습니까?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"모든 개인정보와 다운로드한 앱을 삭제하시겠습니까? 삭제한 후에는 작업을 취소할 수 없습니다."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"모두 삭제"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"삭제 중"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"잠시 기다려 주세요..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"날짜 및 시간"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"날짜 및 시간 설정"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"날짜, 시간, 표준시간대 및 형식 설정"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"시간대 순으로 정렬"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"날짜"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"시간"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"사용자 추가"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"계정 추가"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"사용자 삭제"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"새 사용자"</string>
-    <string name="user_guest" msgid="3465399481257448601">"게스트"</string>
     <string name="user_admin" msgid="1535484812908584809">"관리자"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"관리자로 로그인했습니다."</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"모든 관리자 권한"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"관리자 권한 부여"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"사용자는 다른 관리자를 포함한 사용자를 삭제하고 시스템을 초기화할 수 있게 됩니다."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"이 작업은 되돌릴 수 없습니다."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"관리자 권한 부여"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"새 사용자 만들기"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"전화 걸기"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"자동차의 모바일 데이터를 통해 메시지 보내기"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"새 앱 설치"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"앱 제거"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"사용자 추가"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"새 사용자"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"새 사용자를 추가할까요?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"사용자 제한 도달"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">사용자는 <xliff:g id="COUNT">%d</xliff:g>명까지 만들 수 있습니다.</item>
+      <item quantity="one">사용자는 한 명만 만들 수 있습니다.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"새 사용자를 만들지 못했습니다."</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"이 사용자를 삭제하시겠습니까?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"모든 앱과 데이터가 삭제됩니다."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"사용자를 삭제하지 못했습니다"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"닫기"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"재시도"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"마지막 사용자를 삭제하시겠습니까?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"이 자동차의 남은 사용자만 삭제한 후에 새 관리자를 생성합니다."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"이 사용자와 관련된 모든 데이터, 설정 및 앱이 삭제됩니다. 시스템을 다시 설정해야 합니다."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"새 관리자 선택"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"관리자 한 명 이상을 선택해야 합니다. 이 관리자를 삭제하려면 먼저 대체 관리자를 선택하세요."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"관리자 선택"</string>
+    <string name="user_guest" msgid="3465399481257448601">"게스트"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"게스트"</string>
     <string name="user_switch" msgid="6544839750534690781">"전환"</string>
     <string name="current_user_name" msgid="3813671533249316823">"사용자(%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"이름"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"설정되지 않음"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"사용자 이름 수정"</string>
     <string name="users_list_title" msgid="770764290290240909">"사용자"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s에 부여된 권한"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"계정"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"사용자"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"계정 추가"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"추가된 계정이 없습니다."</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>님의 계정"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"자동으로 데이터 동기화"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"앱에서 데이터를 자동으로 새로고침하도록 허용"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"데이터 자동 동기화를 사용하시겠습니까?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"웹에서 변경한 계정 정보는 모두 기기에 자동으로 복사됩니다.\n\n또한 일부 계정은 휴대전화의 변경사항을 웹에 자동으로 복사할 수 있습니다. Google 계정은 이러한 자동 동기화를 지원합니다."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"데이터 자동 동기화를 사용 중지하시겠습니까?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"이 경우 데이터 사용량이 절약되지만, 최근 정보를 수집하려면 각 계정을 직접 동기화해야 합니다. 또한 업데이트가 발생해도 알림을 받지 못합니다."</string>
     <string name="account_details_title" msgid="7529571432258448573">"계정 정보"</string>
     <string name="add_account_title" msgid="5988746086885210040">"계정 추가"</string>
     <string name="add_an_account" msgid="1072285034300995091">"계정 추가"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"계정 삭제"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"계정을 삭제할까요?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"계정을 삭제하면 기기의 메시지, 연락처 및 다른 데이터가 모두 지워집니다."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"관리자가 이 변경을 허용하지 않습니다."</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"사용자를 삭제할까요?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"모든 앱과 데이터가 삭제됩니다."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"사용자를 삭제하지 못함"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"다시 시도할까요?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"닫기"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"다시 시도"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"새 사용자를 추가할까요?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"계정을 삭제하지 못했습니다"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"계정 동기화"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>개 항목 중 <xliff:g id="ID_1">%1$d</xliff:g>개 동기화"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"모든 항목 동기화"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"모든 항목을 동기화하지 않음"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"동기화 사용 안함"</string>
+    <string name="sync_error" msgid="6698021343089247914">"동기화 오류"</string>
+    <string name="last_synced" msgid="4745124489150101529">"마지막 동기화 시간: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"지금 동기화하는 중..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"탭하여 지금 동기화하세요.<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"지금 동기화"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"동기화 취소"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"동기화에 현재 문제가 발생했습니다. 곧 다시 동기화됩니다."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"보안"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"화면 잠금"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"없음"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"비밀번호"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"잠금 유형 선택"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"화면 잠금 옵션"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"잠금 옵션"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"패턴 입력"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"확인"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"다시 그리기"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"화면 잠금 설정"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN 선택"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"패턴 선택"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"비밀번호 선택"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"비밀번호 선택"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"현재 화면 잠금"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"보안을 위해 패턴을 설정하세요."</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"삭제"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IT 관리자가 일반적으로 사용되는 비밀번호를 허용하지 않습니다. 다른 비밀번호로 시도해 보세요."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"연속으로 올라가거나 내려가는 숫자 또는 반복되는 숫자의 배열은 허용되지 않습니다."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"화면 잠금 옵션"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g>일 전"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"신뢰할 수 있는 기기 추가"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"신뢰할 수 있는 기기"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other">기기 <xliff:g id="COUNT_1">%d</xliff:g>대</item>
+      <item quantity="one">기기 <xliff:g id="COUNT_0">%d</xliff:g>대</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g>이(가) 연결되면 차량을 잠금 해제합니다. 누군가 <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>을(를) 가져가면 이 차량에 액세스할 수도 있습니다."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"확인"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"신뢰할 수 있는 기기 삭제"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"완료"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"호환 앱을 사용해 신뢰할 수 있는 기기를 설정하세요. 설정이 완료되면 차량에서 휴대전화가 감지된 경우 사용자 프로필을 잠금 해제할 수 있습니다."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. 휴대전화에 호환 앱을 다운로드합니다."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. 휴대전화에서 <xliff:g id="CAR_NAME">%1$s</xliff:g>을(를) 선택하여 기기를 페어링합니다."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock에서 이 기기의 보안 기기를 감지할 수 없습니다. 차량 보호를 위해 신뢰할 수 있는 기기 기능을 사용하더라도 사용자가 이미 차량을 잠금 해제한 경우에만 잠금 해제된 상태를 유지할 수 있습니다. 가까이에 다른 사람이 신뢰할 수 있는 기기를 갖고 있더라도 차량을 잠금 해제된 상태로 유지할 수 있습니다."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>을(를) 신뢰할 수 있는 기기로 추가"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>이(가) 신뢰할 수 있는 기기로 추가되었습니다."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>을(를) 등록하는 데 실패했습니다."</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"신뢰할 수 있는 기기를 추가하면 다음번에 인증 수단을 설정해야 합니다. 신뢰할 수 있는 기기가 없으면 인증 과정을 거쳐야 내 프로필에 액세스할 수 있습니다."</string>
     <string name="forget" msgid="3971143908183848527">"삭제"</string>
+    <string name="connect" msgid="5861699594602380150">"연결"</string>
+    <string name="disconnect" msgid="6140789953324820336">"연결 해제"</string>
     <string name="delete_button" msgid="5840500432614610850">"삭제"</string>
     <string name="remove_button" msgid="6664656962868194178">"삭제"</string>
     <string name="cancel" msgid="750286395700355455">"취소"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"데모 모드 종료"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"데모 계정을 삭제하고 시스템을 초기화합니다. 사용자 데이터는 모두 사라집니다."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"데모 종료"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"설정 완료"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"나중에"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"닫기"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"운전 중 기능 사용 불가"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"운전 중에는 사용자를 추가할 수 없습니다."</string>
 </resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index e254da1..8411903 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"күңүрт экран, сенсордук экран, батарея"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"күңүрт экран, түн, кошумча түс"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Түнкү режим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Тармак жана Интернет"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобилдик тармак"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилдик Интернет"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Интернетке мобилдик тармак аркылуу чыгуу"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Мобилдик Интернет өчүрүлсүнбү?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Дайындардын колдонулушу"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Трафик жана чектөөлөр"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Статистика цикли"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Трафик тууралуу эскертүү"</string>
+    <string name="data_warning" msgid="116776633806885370">"Трафик тууралуу эскертүү"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Трафикти чектөө"</string>
+    <string name="data_limit" msgid="227338836292511425">"Чектелген трафик"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Трафикти чектөө"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Белгиленген чекке жеткенде, унааңыздын негизги тутуму мобилдик Интернетти өчүрөт.\n\nТелефонуңуздун статистикасы менен байланыш операторунун статистикасы аздыр-көптүр айырмалангандыктан, чекти кабелтең коюңуз."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Зымсыз кошулуу түйүндөрүн жөндөө жана башкаруу"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi күйгүзүлүүдө…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi өчүрүлүүдө…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi тизмеси жүктөлүүдө"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi өчүрүлдү"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Тармак өчүрүлгөн жок"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Тармакка туташпай калды"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Тармак кошуу"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi өчүрүлдү"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Туташуу"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Сырсөз"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Сырсөздү көрсөтүү"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Тармактын аталышы"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID\'ни киргизиңиз"</string>
     <string name="wifi_security" msgid="158358046038876532">"Коопсуздук"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Сигналдын күчү"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Сигналдын күчү"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Абалы"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Байланыш ылдамдыгы"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Жыштык"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP дарек"</string>
+    <string name="show_password" msgid="2074628020371139240">"Сырсөздү көрсөтүү"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Тармактын аталышын киргизиңиз"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Сырсөздү киргизиңиз"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Начар"</item>
-    <item msgid="2032262610626057081">"Орто"</item>
-    <item msgid="3859756017461098953">"Жакшы"</item>
-    <item msgid="1521103743353335724">"Эң жакшы"</item>
+    <item msgid="7683058295076342057">"Начар"</item>
+    <item msgid="1639222824821660744">"Орто"</item>
+    <item msgid="1838705897358163300">"Жакшы"</item>
+    <item msgid="6067166649320533751">"Эң жакшы"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth\'ду күйгүзүү"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth өчүрүлдү"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Мб/ск"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 ГГц"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ГГц"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Тармактын чоо-жайы"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC дареги"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP дарек"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Көмөкчү тармактын маскасы"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 даректери"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Шлюз"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi жеке жөндөөлөрү"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi автоматтык түрдө күйсүн"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Байланыш сигналы күчтүү тармактарга (мисалы, үйдө) жакындаганда, Wi‑Fi автоматтык түрдө күйөт"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Жайгашкан жерди аныктоо өчүрүлгөндүктөн, жеткиликсиз. "<annotation id="link">"Жайгашкан жерди"</annotation>" күйгүзүңүз."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi тармактарын издөөнү күйгүзөсүзбү?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Күйгүзүү"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi\'ды издөө күйгүзүлдү"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Мобилдик Интернетке автоматтык түрдө которулсун"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi аркылуу Интернетке туташуу мүмкүнчүлүгү жок болгондо, мобилдик Интернет колдонулсун. Трафиктин колдонулгандыгы үчүн акы алынышы мүмкүн."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Кеңири маалымат"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Туташууларды башкарып, түзмөк аталышын жана көрүнүү параметрлерин жөндөө"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Компьютер"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Гарнитура"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Телефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Камера"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Гарнитура"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Дайындарды киргизүүчү сырткы түзмөк"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Жупташтырылган түзмөктөр"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Жеткиликтүү түзмөктөр"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Жупташтырылган түзмөктөр жок"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Жеткиликтүү түзмөктөр жок"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Жупташтырылган түзмөк"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Аты"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Төмөнкү үчүн колдонулсун:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth түзмөгүнүн атын өзгөртүү"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Аты жок түзмөк"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Жупташтырылган түзмөктөр"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Жаңы түзмөктү жупташтыруу"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth жупташтыруу үчүн күйгүзүлөт"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Түзмөк ажыратылсынбы?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Унааңыз <xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүнөн ажыратылат."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Унаанын Bluetooth дареги: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Түзмөктүн Bluetooth дареги: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Унаанын Bluetooth аталышы"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Унаанын атын өзгөртүү"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Түзмөктүн атын өзгөртүү"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Аталышын өзгөртүү"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Жеткиликтүү түзмөктөр"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профилдер"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth жупташтыруу өтүнүчү"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Жупташтыруу жана туташтыруу"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth жупташтыруучу коду"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN код тамгаларды же символдорду камтыйт"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Жупташтыруу кодун терип, андан соң \"Артка\" же \"Киргизүү\" баскычын басыңыз"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Адатта, 0000 же 1234 болот"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Жупташтыруу өтүнүчү"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> менен жупташуу үчүн таптап коюңуз."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Тилдер"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Тилдер жана киргизүү ыкмасы"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Баскычтоп"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Баскычтопторду башкаруу"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Кеп синтезатору"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Тандалган каражат"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Учурдагы каражат"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Кеп ылдамдыгы"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Демейки тон"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Баштапкы абалга келтирүү"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Үн"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Шыңгырдын үнү"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Чабыттоонун үнү"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Медиа"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Музыка жана видеолор үчүн үн көлөмүн коюу"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Ойготкуч"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Телефондун рингтону"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Билдирменин демейки үнү"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Ойготкучтун демейки үнү"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Колдонмолор жана билдирмелер"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Бардык колдонмолорду көрсөтүү"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Демейки колдонмолор"</string>
     <string name="applications_settings" msgid="794261395191035632">"Колдонмо тууралуу маалымат"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Мажбурлап токтотуу"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Токтотулсунбу?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Колдонмону мажбурлап токтотсоңуз, ал туура эмес иштеп калышы мүмкүн."</string>
     <string name="disable_text" msgid="4358165448648990820">"Өчүрүү"</string>
     <string name="enable_text" msgid="1794971777861881238">"Иштетүү"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Чыгарып салуу"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Эгер бул колдонмону өчүрсөңүз, Android жана башка колдонмолор талаптагыдай иштебей калышы мүмкүн."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Колдонмону өчүрүү"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Уруксаттар"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Версиясы: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Бир да уруксат берилген жок"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Бир да уруксат суралган жок"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Дайындардын колдонулушу"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Колдонмолордун трафиги"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Мажбурлап токтотуу"</string>
     <string name="computing_size" msgid="5791407621793083965">"Эсептелүүдө…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> кошумча уруксат берилди</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> кошумча уруксат берилди</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Жардамчы жана үн менен киргизүү"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Көмөкчү колдонмо"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Экрандагы текстти колдонуу"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Көмөкчү колдонмого экрандагы текстти колдонууга уруксат берүү"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Скриншотту колдонуу"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Көмөкчү колдонмого экрандагы сүрөттү колдонууга уруксат берүү"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Автотолтуруу кызматы"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Жок"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Тандалды"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Жардамчы тутумуңузда иштеп жаткан колдонмолор тууралуу маалыматтарды, анын ичинде экраныңызда көрүнүп турган же колдонмолордо жеткиликтүү болгон маалыматты окуй алат."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Бул колдонмо ишенимдүү экенин тактаңыз&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; экрандагы нерселерди аныктап, автоматтык түрдө толтурууга боло турган талааларды табат."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Кызмат кошуу"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Жайгашкан жер"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Жакында изделген жерлер"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Жакында изделген жерлер жок"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Колдонмонун уруксаттары"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Издөө"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Жайгашкан жерди аныктоо кызматтары"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi тармактарын издөө"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi-Fi өчүп турса да, колдонмолор менен кызматтарга Wi-Fi тармактарын издегенге уруксат бересиз. Бул параметр менен жайгашкан жерди тагыраак аныктоого болот."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth түзмөктөрүн издөө"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Bluetooth өчүп турса да, колдонмолор менен кызматтарга жакын жердеги түзмөктөрдү издегенге уруксат бересиз. Бул параметр менен жайгашкан жерди тагыраак аныктоого болот."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Тутум"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Тутум жаңыртуулары"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Тутум жаңыртуулары"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android версиясы"</string>
     <string name="security_patch" msgid="4794276590178386903">"Коопсуздук тутумунун жаңыртуусу:"</string>
     <string name="model_info" msgid="4966408071657934452">"Үлгү"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Байланыш модулунун версиясы"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Өзөктүн версиясы"</string>
     <string name="build_number" msgid="3997326631001009102">"Курама номери"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth дареги"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Жеткиликтүү эмес"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Абалы"</string>
     <string name="device_status" msgid="267298179806290920">"Абалы"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Автордук укук"</string>
     <string name="license_title" msgid="936705938435249965">"Уруксаттама"</string>
     <string name="terms_title" msgid="5201471373602628765">"Шарттар жана жоболор"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"WebView тутум уруксаттамасы"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"WebView тутум уруксаттамалары"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тушкагаздар"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Спутниктик сүрөттөр:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Үчүнчү тараптын уруксаттамалары"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Уруксаттамалар жүктөлүп жатканда көйгөй келип чыкты."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Жүктөлүүдө…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Сиздин иштеп чыгуучу болушуңузга <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кадам калды.</item>
+      <item quantity="one">Сиздин иштеп чыгуучу болушуңузга <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> кадам калды.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Сиз иштеп чыгуучу болдуңуз!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Кереги жок, сиз иштеп чыгуучуболгонсуз."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Иштеп чыгуучунун параметрлери"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Кайра коюу опциялары"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Тармактын, колдонмолордун же түзмөктүн жөндөөлөрүн кайра коюу"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Тармакты баштапкы абалга келтирүү"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ушуну менен тармак жөндөөлөрүнүн баары баштапкы абалга келтирилет, анын ичинде:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобилдик Интернет"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Унаадагы бардык eSIM-карталар тазалансын"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Байланыш операторуңуздун тарифтик планы жокко чыгарылбайт."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM-карталар кайра коюлган жок"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Тармак тандоо"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Жөндөөлөрдү кайра коюу"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Баштапкы абалга келтирилсинби?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Тармак жөндөөлөрүнүн баары баштапкы абалга келтирилсинби? Бул аракетти кайра кайтара албайсыз!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Жөндөөлөрдү кайра коюу"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Тармак жөндөөлөрү кайра коюлду"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Колдонмонун жөндөөлөрүн баштапкы абалга келтирүү"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Ушуну менен төмөнкүлөр үчүн бардык жөндөөлөр баштапкы абалына келтирилет:\n\n"<li>"Өчүрүлгөн колдонмолор"</li>\n<li>"Өчүрүлгөн колдонмолордун билдирмелери"</li>\n<li>"Демейки колдонмолордун аракеттери"</li>\n<li>"Колдонмолордун Фондук режиминдеги чектөөлөрү"</li>\n<li>"Бардык уруксаттарды чектөөлөрs"</li>\n\n"Колдонмонун бардык дайындары сакталып калат."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Баштапкы абалга келтирүү"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Колдонмонун жөндөөлөрү баштапкы абалга келтирилди"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Бардык дайындарды тазалоо"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Унааңыздын негизги тутумундагы бардык маалымат өчүрүлөт, тактап айтканда:\n\n"<li>"Google аккаунтуңуз"</li>\n<li>"Тутумдун жана колдонмолордун жөндөөлөрү жана дайындары"</li>\n<li>"Жүктөлүп алынган колдонмолор"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Учурда төмөнкү аккаунттарга кирип турасыз:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Бул унаада башка колдонуучулар бар."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Унааны баштапкы абалга келтирүү"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Баштапкы абалга келтирилсинби?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Бардык жеке маалыматтарыңыз жана жүктөп алынган колдонмолоруңуз тазалансынбы? Бул аракетти кайра кайтара албайсыз!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Баарын тазалоо"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Тазаланууда"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Күтө туруңуз…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Күн жана убакыт"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Күндү жана убакытты жөндөө"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Күндү, убакытты, убакыт алкагын, жана форматтарды жөндөө"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Убакыт алкагы боюнча иргөө"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Күн"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Убакыт"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Колдонуучу кошуу"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Аккаунт кошуу"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Колдонуучуну жок кылуу"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Жаңы колдонуучу"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Конок"</string>
     <string name="user_admin" msgid="1535484812908584809">"Админ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Администратор катары кирдиңиз"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Администратордун бардык уруксаттары"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Админ кылуу"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Колдонуучу башка Админдерди жана колдонуучуларды өчүрүп, тутумду баштапкы жөндөөлөргө кайтара алат."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Бул аракетти кайтарууга болбойт."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ооба, админ кылуу"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Жаңы колдонуучуларды түзүү"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Телефон чалуу"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Унаадагы Интернет аркылуу жазышуу"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Жаңы колдонмолорду орнотуу"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Колдонмолорду чыгарып салуу"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Колдонуучу кошуу"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Жаңы колдонуучу"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Колдонуучуну кошосузбу?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Жаңы колдонуучу кошулганда, ал өзүнүн профилин жөндөп алышы керек."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Колдонмолорду бир колдонуучу калган бардык колдонуучулар үчүн да жаңырта алат."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Дагы колдонуучу кошууга болбойт"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> колдонуучуга чейин кошууга болот.</item>
+      <item quantity="one">Бир колдонуучуну гана кошууга болот.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Жаңы колдонуучу кошулбай калды"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Бул колдонуучу өчүрүлсүнбү?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Бардык колдонмолор жана дайындар жок кылынат."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Колдонуучу өчүрүлгөн жок."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Четке кагуу"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Кайталоо"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Акыркы колдонуучу өчүрүлсүнбү?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Бул унаанын жалгыз колдонуучусун өчүргөндөн кийин, жаңы администратордун профили түзүлөт."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Бул колдонуучуга байланышкан бардык дайындар, жөндөөлөр жана колдонмолор өчүрүлөт. Тутумду кайрадан жөндөшүңүз керек болот."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Жаңы администраторду тандоо"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Жок дегенде бир администраторуңуз болушу керек. Бул администраторду өчүрүү үчүн, биринчиден ордуна башка бирөөнү тандаңыз."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Администраторду тандоо"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Конок"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Конок"</string>
     <string name="user_switch" msgid="6544839750534690781">"Которуштуруу"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Сиз (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Колдонуучунун аты"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Түзүлгөн жок"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Колдонуучунун атын түзөтүү"</string>
     <string name="users_list_title" msgid="770764290290240909">"Колдонуучулар"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Төмөнкү колдонуучунун уруксаттары: %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Аккаунттар"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Колдонуучу"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Аккаунт кошуу"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Бир да аккаунт кошулган эмес"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> аттуу колдонуучунун аккаунттары"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Дайындарды автоматтык түрдө шайкештирүү"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Колдонмолордун дайындары автоматтык түрдө жаңырып турат"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Автошайкештирүү жандырылсынбы?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Желеден аккаунтуңузга кандайдыр бир өзгөртүүлөр киргизилгенде, алардын баары телефонуңузга автоматтык түрдө көчүрүлөт.\n\nАйрым учурларда телефонуңуздагы өзгөртүүлөр автоматтык түрдө желеге көчүрүлүшү мүмкүн. Кыскасы, Google аккаунту ушундай жол менен иштейт."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Автошайкештирүү токтотулсунбу?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Ушуну менен трафикти үнөмдөөгө болот. Бирок маалыматты жаңыртып туруу үчүн ар бир аккаунтту кол менен шайкештирип чыгуу керек. Бул учурда жаңыртуулар тууралуу билдирмелер алынбайт."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Аккаунт тууралуу маалымат"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Аккаунт кошуу"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Аккаунт кошуу"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Аккаунтту алып салуу"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Аккаунт өчүрүлсүнбү?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Бул аккаунт өчүрүлсө, ага байланыштуу бардык билдирүүлөр, байланыштар жана башка дайындар түзмөктөн өчүрүлөт!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Мындай өзгөртүүгө администраторуңуз тыюу салган"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Колдонуучуну өчүрөсүзбү?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Бардык колдонмолор жана дайындар жок кылынат."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Колдонуучу өчүрүлгөн жок."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Дагы аракет кыласызбы?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Жабуу"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Кайталоо"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Колдонуучуну кошосузбу?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Жаңы колдонуучу кошулганда, ал өзүнүн профилин жөндөп алышы керек."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Колдонмолорду бир колдонуучу калган бардык колдонуучулар үчүн да жаңырта алат."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Аккаунт өчүрүлгөн жок."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Аккаунтту шайкештирүү"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Шайкештирүү <xliff:g id="ID_2">%2$d</xliff:g> нерсенин ичинен <xliff:g id="ID_1">%1$d</xliff:g> үчүн күйүк"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Шайкештирүү бардык нерселер үчүн күйүк"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Шайкештирүү бардык нерселер үчүн өчүк"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Шайкештирүү ӨЧҮК"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Шайкештирүүдө ката кетти"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Акыркы жолу шайкештирилген убакыт: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Азыр шайкештештирилүүдө…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Азыр шайкештирүү үчүн таптап коюуңуз<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Азыр шайкештирүү"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Шайкештирүүнү жокко чыгаруу"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Учурда шайкештирүү көйгөйгө дуушар болууда. Ал бир аздан кийин калыбына келет."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Коопсуздук"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Экран кулпусу"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Жок"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN код"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Сырсөз"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Кулпулоо түрүн тандоо"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Экранды кулпулоо ыкмалары"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Кулпулоо параметрлери"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Графикалык ачкычты киргизиңиз"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Ырастоо"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Кайра тартуу"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Экран кулпусун коюп алыңыз"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN кодуңузду тандаңыз"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Графикалык ачкычты тандаңыз"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Сырсөзүңүздү тандаңыз"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Сырсөзүңүздү тандаңыз"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Учурдагы экран кулпусу"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Коопсуздук үчүн графикалык ачкыч коюңуз"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Тазалоо"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Жөнөкөй сырсөздөрү коюу IT администраторуңуз тарабынан бөгөттөлгөн. Татаалыраак сырсөздү коюп көрүңүз."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Сандар чоңойгон, кичирейген же кайталанган ыраатта болбошу керек."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Экранды кулпулоо ыкмалары"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> күн мурун"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Ишенимдүү түзмөк кошуу"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Ишенимдүү түзмөктөр"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> түзмөк</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> түзмөк</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> түзмөгүңүз туташып турганда, унаанын кулпусун ачат. Эгер <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> түзмөгү кимдир бирөөнүн колуна тийсе, ал ушул түзмөктү да ача алат"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Ырастоо"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Ишенимдүү түзмөктү өчүрүү"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Бүттү"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Ишенимдүү түзмөктү жөндөө үчүн, коштомо колдонмону пайдаланыңыз. Жөндөлгөндөн кийин, унаа телефонуңузду аныктаганда, колдонуучу профилиңиздин кулпусун ачсаңыз болот"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Телефонуңузга коштомо колдонмону жүктөп алыңыз"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Түзмөктөрдү жупташтыруу үчүн, телефонуңуздан <xliff:g id="CAR_NAME">%1$s</xliff:g> унаасын тандаңыз"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock бул түзмөктүн коопсуздук функцияларын аныктай албай жатат. Унааңызды коргоо максатында, унаанын кулпусун өзүңүз ачкан болсоңуз, ишенимдүү түзмөк аны кулпулабайт. Ишенимдүү түзмөк жакын жерде болгондо (түзмөктү башка бирөө кармап турса дагы), унааңыз кулпуланбайт."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүн ишенимдүү түзмөк катары кошуу"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ишенимдүү түзмөк катары кошулду"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> катталган жок"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ишенимдүү түзмөктү кошууда аутентификация ыкмасын кошуу талап кылынат. Эгер ишенимдүү түзмөк жаныңызда болбосо, профилге кирүү үчүн аутентификациядан өтүү керек болот."</string>
     <string name="forget" msgid="3971143908183848527">"Унутулсун"</string>
+    <string name="connect" msgid="5861699594602380150">"Туташтыруу"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Ажыратуу"</string>
     <string name="delete_button" msgid="5840500432614610850">"Жок кылуу"</string>
     <string name="remove_button" msgid="6664656962868194178">"Алып салуу"</string>
     <string name="cancel" msgid="750286395700355455">"Жокко чыгаруу"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Демо режимден чыгасызбы?"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ушуну менен демо аккаунт жок кылынып, тутум кайра башынан жөндөлөт. Колдонуучунун бардык дайындары өчүрүлөт."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Демо режимден чыгуу"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"жөндөөнү бүтүрүү"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"азыр эмес"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ЧЕТКЕ КАГУУ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Унаа айдаганда бул функция жеткиликтүү эмес."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Унаа айдап баратканда колдонуучуну кошууга болбойт."</string>
 </resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 93c3706..6b5899b 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ໜ້າຈໍມືດລົງ, ໜ້າຈໍສຳຜັດ, ແບັດເຕີຣີ"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ໜ້າຈໍມືດລົງ, ກາງຄືນ, ສີອ່ອນ"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"ໂໝດກາງຄືນ"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"ເຄືອຂ່າຍມືຖື"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"ອິນເຕີເນັດມືຖື"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ເຂົ້າເຖິງອິນເຕີເນັດໂດຍໃຊ້ເຄືອຂ່າຍມືຖື"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"ປິດອິນເຕີເນັດມືຖືບໍ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ການໃຊ້ຂໍ້ມູນ"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ຄຳເຕືອນ ແລະ ຂີດຈຳກັດອິນເຕີເນັດ"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ຮອບການນຳໃຊ້ຂໍ້ມູນແອັບ"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ຕັ້ງຄ່າການເຕືອນອິນເຕີເນັດ"</string>
+    <string name="data_warning" msgid="116776633806885370">"ຄຳເຕືອນອິນເຕີເນັດ"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ຕັ້ງຄ່າຂີດຈຳກັດອິນເຕີເນັດ"</string>
+    <string name="data_limit" msgid="227338836292511425">"ຂີດຈຳກັດອິນເຕີເນັດ"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ການຈຳກັດການໃຊ້ອິນເຕີເນັດ"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ລະບົບເຄື່ອງສຽງຂອງລົດທ່ານຈະປິດອິນເຕີເນັດມືຖື ເມື່ອມັນຮອດຂີດຈຳກັດທີ່ທ່ານຕັ້ງໄວ້.\n\nເພາະວ່າການໃຊ້ອິນເຕີເນັດຖືກວັດແທກໂດຍລະບົບເຄື່ອງສຽງ ແລະ ຜູ້ໃຫ້ບໍລິການອາດວັດແທກການໃຊ້ອິນເຕີເນັດແຕກຕ່າງກັນ, ສະນັ້ນ ກະລຸນາພິຈາລະນາກຳນົດຂີດຈຳກັດໂດຍເຜື່ອຈຳນວນໄວ້ນຳ."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ຕັ້ງຄ່າ ແລະ ຈັດການຈຸດການເຂົ້າໃຊ້ລະບົບໄຮ້ສາຍ"</string>
     <string name="wifi_starting" msgid="473253087503153167">"ກຳລັງເປີດ Wi-Fi..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"ກຳລັງປິດ Wi-Fi..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"ກຳລັງໂຫຼດລາຍການ Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"ປິດນຳໃຊ້ Wi‑Fi ແລ້ວ"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ລືມເຄືອຂ່າຍບໍ່ສຳເລັດ"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ເຊື່ອມຕໍ່ເຄືອຂ່າຍບໍ່ສຳເລັດ"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"ເພີ່ມເຄືອຂ່າຍ"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"ປິດນຳໃຊ້ Wi‑Fi ແລ້ວ"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"ເຊື່ອມຕໍ່"</string>
     <string name="wifi_password" msgid="5565632142720292397">"ລະຫັດຜ່ານ"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"ສະແດງລະຫັດຜ່ານ"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ຊື່ເຄືອຂ່າຍ"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"ປ້ອນ SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"ຄວາມປອດໄພ"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"ຄວາມແຮງສັນຍານ"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"ຄວາມແຮງສັນຍານ"</string>
     <string name="wifi_status" msgid="5688013206066543952">"ສະຖານະ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"ຄວາມໄວລິ້ງ"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ຄວາມຖີ່"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"ທີ່ຢູ່ IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"ສະແດງລະຫັດຜ່ານ"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ປ້ອນຊື່ເຄືອຂ່າຍ"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"ປ້ອນລະຫັດຜ່ານ"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ອ່ອນ"</item>
-    <item msgid="2032262610626057081">"ພໍໃຊ້"</item>
-    <item msgid="3859756017461098953">"ດີ"</item>
-    <item msgid="1521103743353335724">"ດີເລີດ"</item>
+    <item msgid="7683058295076342057">"ອ່ອນ"</item>
+    <item msgid="1639222824821660744">"ພໍໃຊ້"</item>
+    <item msgid="1838705897358163300">"ດີ"</item>
+    <item msgid="6067166649320533751">"ດີເລີດ"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ເປີດ Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ປິດນຳໃຊ້ Bluetooth ແລ້ວ"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ລາຍລະອຽດເຄືອຂ່າຍ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"ທີ່ຢູ່ MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"ທີ່ຢູ່ IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet Mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"ທີ່ຢູ່ IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ເກດເວ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ການຕັ້ງຄ່າ Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"ເປີດ Wi‑Fi ໂດຍອັດຕະໂນມັດ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi ຈະກັບມາເປີດໃໝ່ອີກເມື່ອຢູ່ໃກ້ເຄືອຂ່າຍຄຸນນະພາບສູງທີ່ບັນທຶກໄວ້ ເຊັ່ນ: ເຄືອຂ່າຍເຮືອນ"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"ບໍ່ສາມາດໃຊ້ໄດ້ເນື່ອງຈາກສະຖານທີ່ປິດຢູ່. ກະລຸນາເປີດ "<annotation id="link">"ສະຖານທີ່"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"ເປີດການສະແກນ Wi‑Fi ບໍ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ເປີດ"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"ເປີດການສະແກນ Wi‑Fi ແລ້ວ"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"ປ່ຽນໄປໃຊ້ອິນເຕີເນັດມືຖືໂດຍອັດຕະໂນມັດ"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"ໃຊ້ອິນເຕີເນັດມືຖືເມື່ອ Wi-Fi ຂາດການເຊື່ອມຕໍ່ອິນເຕີເນັດ. ອາດມີການຮຽກເກັບຄ່າບໍລິການ."</string>
+    <string name="learn_more" msgid="8214605928933358604">"ສຶກສາເພີ່ມເຕີມ"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"ຈັດການການເຊື່ອມຕໍ່, ຕັ້ງຊື່ອຸປະກອນ ແລະ ການຊອກເຫັນ"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"ຄອມພິວເຕີ"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ຊຸດຫູຟັງ"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ໂທລະສັບ"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ຮູບພາບ"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ຫູຟັງ"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ອຸປະກອນພ່ວງອິນພຸດ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"ອຸປະກອນທີ່ຈັບຄູ່ແລ້ວ"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ອຸປະກອນທີ່ສາມາດໃຊ້ໄດ້"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ບໍ່ມີອຸປະກອນທີ່ຈັບຄູ່ແລ້ວ"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"ບໍ່ມີອຸປະກອນທີ່ສາມາດໃຊ້ໄດ້"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"ອຸປະກອນທີ່ຈັບຄູ່ແລ້ວ"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"ຊື່"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"ໃຊ້ສຳລັບ"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"ປ່ຽນຊື່ຂອງອຸປະກອນ Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"ອຸປະກອນທີ່ບໍ່ມີຊື່"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"ອຸປະກອນທີ່ຈັບຄູ່ແລ້ວ"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"ຈັບຄູ່ອຸປະກອນໃໝ່"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth ຈະເປີດເພື່ອຈັບຄູ່"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ຕັດການເຊື່ອມຕໍ່ອຸປະກອນຫຼືບໍ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"ພາຫານະຂອງທ່ານຈະຕັດການເຊື່ອມຕໍ່ຈາກ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"ທີ່ຢູ່ Bluetooth ຂອງພາຫານະ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ທີ່ຢູ່ Bluetooth ຂອງອຸປະກອນ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ຊື່ພາຫານະ"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ປ່ຽນຊື່ພາຫານະນີ້"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ປ່ຽນຊື່ອຸປະກອນ"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"ປ່ຽນຊື່"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ອຸປະກອນທີ່ສາມາດໃຊ້ໄດ້"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"ໂປຣໄຟລ໌"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ຄຳຂໍຈັບຄູ່ Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ຈັບຄູ່ ແລະ ເຊື່ອມຕໍ່"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ລະຫັດຈັບຄູ່ Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN ປະກອບມີຕົວອັກສອນ ຫຼື ສັນຍາລັກ"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"ພິມລະຫັດຈັບຄູ່ ແລ້ວກົດປຸ່ມ Return ຫຼື Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ປົກກະຕິແລ້ວໃຊ້ 0000 ຫຼື 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"ຄຳຂໍຈັບຄູ່"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"ແຕະເພື່ອຈັບຄູ່ກັບ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ພາສາ"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ພາສາ ແລະ ການປ້ອນຂໍ້ມູນ"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"​ແປ້ນ​ພິມ"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"ຈັດການແປ້ນພິມ"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"ການປ່ຽນຂໍ້ຄວາມເປັນສຽງ"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ລະບົບທີ່ຕ້ອງການ"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"ລະບົບປັດຈຸບັນ"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"ອັດຕາການເວົ້າ"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"ລະດັບສຽງ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ຣີເຊັດ"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ສຽງ"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"ລະດັບສຽງໂທລະສັບ"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"ລະດັບສຽງການນຳທາງ"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"ສື່"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"ຕັ້ງຄ່າລະດັບສຽງສຳລັບເພງ ແລະ ວິດີໂອ"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"ໂມງປຸກ"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ຣິງໂທນໂທລະສັບ"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ສຽງການແຈ້ງເຕືອນເລີ່ມຕົ້ນ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ສຽງ​ໂມງ​ປຸກ​ຕາມຄ່າເລີ່ມຕົ້ນ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ແອັບ ແລະ ການແຈ້ງເຕືອນ"</string>
+    <string name="all_applications" msgid="7798210477486822168">"ສະແດງແອັບທັງໝົດ"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ແອັບເລີ່ມຕົ້ນ"</string>
     <string name="applications_settings" msgid="794261395191035632">"ຂໍ້ມູນແອັບ"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ບັງຄັບຢຸດ"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"ບັງຄັບປິດບໍ?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"ຖ້າທ່ານບັງຄັບປິດແອັບໃດໜຶ່ງ, ມັນອາດເຮັດວຽກຜິດປົກກະຕິໄດ້."</string>
     <string name="disable_text" msgid="4358165448648990820">"ປິດນຳໃຊ້"</string>
     <string name="enable_text" msgid="1794971777861881238">"ເປິດນຳໃຊ້"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"ຖອນການຕິດຕັ້ງ"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ຖ້າທ່ານປິດນຳໃຊ້ແອັບນີ້, Android ແລະ ແອັບອື່ນອາດບໍ່ເຮັດວຽກຕາມທີ່ຖືກອອກແບບມາໄດ້."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ປິດນຳໃຊ້ແອັບ"</string>
     <string name="permissions_label" msgid="2701446753515612685">"ການອະນຸຍາດ"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ເວີຊັນ: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ບໍ່ໄດ້ໃຫ້ການອະນຸຍາດໃດ"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ບໍ່ມີການຮ້ອງຂໍການອະນຸຍາດໃດ"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ການໃຊ້ຂໍ້ມູນ"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ການໃຊ້ຂໍ້ມູນແອັບ"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ບັງຄັບຢຸດ"</string>
     <string name="computing_size" msgid="5791407621793083965">"ກຳລັງຄຳນວນ..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ການອະນຸຍາດເພີ່ມເຕີມ</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ການອະນຸຍາດເພີ່ມເຕີມ</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ການຊ່ວຍເຫຼືອ ແລະ ການປ້ອນຂໍ້ມູນດ້ວຍສຽງ"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"ແອັບຜູ້ຊ່ວຍ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ໃຊ້ຂໍ້ຄວາມຈາກໜ້າຈໍ"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"ອະນຸຍາດໃຫ້ແອັບຜູ້ຊ່ວຍເຂົ້າເຖິງເນື້ອຫາໃນໜ້າຈໍທີ່ເປັນຂໍ້ຄວາມ"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ໃຊ້ພາບໜ້າຈໍ"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"ອະນຸຍາດໃຫ້ແອັບຜູ້ຊ່ວຍເຂົ້າເຖິງຮູບພາບຂອງໜ້າຈໍ"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ການບໍລິການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ບໍ່ມີ"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"ເລືອກແລ້ວ"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ຜູ້ຊ່ວຍຈະສາມາດອ່ານຂໍ້ມູນກ່ຽວກັບແອັບທີ່ໃຊ້ໃນລະບົບຂອງທ່ານ ຮວມທັງຂໍ້ມູນທີ່ເບິ່ງເຫັນໄດ້ໃນໜ້າຈໍຂອງທ່ານ ຫຼື ເຂົ້າເຖິງໄດ້ພາຍໃນແອັບນັ້ນ."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ກວດໃຫ້ແນ່ໃຈວ່າທ່ານເຊື່ອຖືແອັບນີ້&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; ຈະໃຊ້ສິ່ງທີ່ຢູ່ໃນໜ້າຈໍຂອງທ່ານເພື່ອກຳນົດວ່າຈະຕື່ມຂໍ້ມູນຫຍັງແດ່ໂດຍອັດຕະໂນມັດ."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"ເພີ່ມການບໍລິການ"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ສະຖານທີ່"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ຄຳຂໍຂໍ້ມູນສະຖານທີ່ຫຼ້າສຸດ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ບໍ່ມີຄຳຂໍຂໍ້ມູນສະຖານທີ່ຫຼ້າສຸດ"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ການອະນຸຍາດລະດັບແອັບ"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"ການສະແກນ"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"ການບໍລິການສະຖານທີ່"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"ການສະແກນ Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"ອະນຸຍາດໃຫ້ແອັບ ແລະ ການບໍລິການຕ່າງໆສະແກນຫາເຄືອຂ່າຍ Wi-Fi ໄດ້ທຸກເມື່ອ, ເຖິງແມ່ນໃນເວລາທີ່ Wi-Fi ປິດຢູ່ກໍຕາມ. ສາມາດໃຊ້ຄຸນສົມບັດນີ້ເພື່ອປັບປຸງຄຸນສົມບັດ ແລະ ການບໍລິການຕ່າງໆທີ່ອີງໃສ່ສະຖານທີ່ໄດ້."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ການສະແກນ Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ອະນຸຍາດໃຫ້ແອັບ ແລະ ການບໍລິການຕ່າງໆສະແກນຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງໄດ້ທຸກເມື່ອ, ເຖິງແມ່ນໃນເວລາທີ່ Bluetooth ປິດຢູ່ກໍຕາມ. ສາມາດໃຊ້ຄຸນສົມບັດນີ້ເພື່ອປັບປຸງຄຸນສົມບັດ ແລະ ການບໍລິການຕ່າງໆທີ່ອີງໃສ່ສະຖານທີ່ໄດ້."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"ລະບົບ"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"ການອັບເດດລະບົບ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"ການອັບເດດລະບົບ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"ເວີຊັນ Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"ລະດັບໂປຣແກຣມແກ້ໄຂຄວາມປອດໄພ Android"</string>
     <string name="model_info" msgid="4966408071657934452">"ລຸ້ນ"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ເວີຊັນເບສແບນ"</string>
     <string name="kernel_version" msgid="7327212934187011508">"ເວີຊັນ Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"ເລກທີລຸ້ນ"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ທີ່ຢູ່ Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"ບໍ່ສາມາດໃຊ້ໄດ້"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"ສະຖານະ"</string>
     <string name="device_status" msgid="267298179806290920">"ສະຖານະ"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"ລິຂະສິດ"</string>
     <string name="license_title" msgid="936705938435249965">"ລິຂະສິດ"</string>
     <string name="terms_title" msgid="5201471373602628765">"ຂໍ້ກຳນົດ ແລະ ເງື່ອນໄຂ"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"ໃບອະນຸຍາດ WebView ຂອງລະບົບ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"ໃບອະນຸຍາດ WebView ຂອງລະບົບ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ພາບພື້ນຫຼັງ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ຜູ້ໃຫ້ພາບຖ່າຍດາວທຽມ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ໃບອະນຸຍາດພາກສ່ວນທີສາມ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ເກີດບັນຫາໃນການໂຫລດໃບອະນຸຍາດ."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"ກຳລັງໂຫລດ..."</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">ຕອນນີ້ທ່ານຍັງອີກ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ຂັ້ນຕອນກໍຈະເປັນຜູ້ພັດທະນາແລ້ວ.</item>
+      <item quantity="one">ຕອນນີ້ທ່ານຍັງອີກ <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ຂັ້ນຕອນກໍຈະເປັນຜູ້ພັດທະນາແລ້ວ.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ຕອນນີ້ທ່ານເປັນຜູ້ພັດທະນາແລ້ວ!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"ບໍ່ຈຳເປັນ, ທ່ານເປັນຜູ້ພັດທະນາຢູ່ແລ້ວ."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ຕົວເລືອກຜູ້ພັດທະນາ"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ຕົວເລືອກການຣີເຊັດ"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ຣີເຊັດເຄືອຂ່າຍ, ແອັບ ຫຼື ອຸປະກອນ"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ຣີເຊັດເຄືອຂ່າຍ"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ນີ້ຈະຣີເຊັດການຕັ້ງຄ່າເຄືອຂ່າຍທັງໝົດ ຮວມທັງ:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"ອິນເຕີເນັດມືຖື"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"ລຶບ eSIM ໃນລົດທັງໝົດ"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ນີ້ຈະບໍ່ຍົກເລີກແພັກເກດການບໍລິການຂອງທ່ານ."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"ບໍ່ສາມາດຣີເຊັດ eSIM ໄດ້"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ເລືອກເຄືອຂ່າຍ"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ຣີເຊັດການຕັ້ງຄ່າ"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"ຣີເຊັດບໍ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"ຣີການຕັ້ງຄ່າເຄືອຂ່າຍທັງໝົດບໍ? ທ່ານບໍ່ສາມາດຍົກເລີກການກະທຳນີ້ໄດ້!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ຣີເຊັດການຕັ້ງຄ່າ"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ຣີເຊັດການຕັ້ງຄ່າເຄືອຂ່າຍແລ້ວ"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ຣີເຊັດການຕັ້ງຄ່າແອັບ"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ນີ້ຈະຣີເຊັດການຕັ້ງຄ່າທັງໝົດສຳລັບ:\n\n"<li>"ແອັບທີ່ປິດນຳໃຊ້"</li>\n<li>"ການແຈ້ງເຕືອນແອັບທີ່ປິດນຳໃຊ້"</li>\n<li>"ແອັບພລິເຄຊັນເລີ່ມຕົ້ນສຳລັບຄຳສັ່ງຕ່າງໆ"</li>\n<li>"ການຈຳກັດຂໍ້ມູນໃນພື້ນຫຼັງສຳລັບແອັບ"</li>\n<li>"ການຈຳກັດການອະນຸຍາດຕ່າງໆ"</li>\n\n"ທ່ານຈະບໍ່ເສຍຂໍ້ມູນແອັບໃດໆ."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ຣີເຊັດແອັບ"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ຣີເຊັດການຕັ້ງຄ່າແອັບແລ້ວ"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ລຶບຂໍ້ມູນທັງໝົດ (ຣີເຊັດເປັນຄ່າຈາກໂຮງງານ)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ນີ້ຈະລຶບຂໍ້ມູນທັງໝົດອອກຈາກລະບົບເຄື່ອງສຽງໃນພາຫານະຂອງທ່ານ, ຮວມທັງ:\n\n"<li>"ບັນຊີ Google ຂອງທ່ານ"</li>\n<li>"ຂໍ້ມູນ ແລະ ການຕັ້ງຄ່າຂອງລະບົບ ແລະ ແອັບ"</li>\n<li>"ແອັບທີ່ດາວໂຫຼດ"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"ປັດຈຸບັນທ່ານຢູ່ໃນລະບົບບັນຊີຕໍ່ໄປນີ້:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ມີຜູ້ໃຊ້ອື່ນປາກົດໃນພາຫານະນີ້."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"ຣີເຊັດພາຫານະ"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"ຣີເຊັດບໍ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"ລຶບຂໍ້ມູນສ່ວນຕົວ ແລະ ແອັບທີ່ດາວໂຫຼດມາທັງໝົດຂອງທ່ານບໍ? ທ່ານບໍ່ສາມາດຍົກເລີກຄຳສັ່ງນີ້ໄດ້!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ລຶບທຸກຢ່າງ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"ກຳລັງລຶບ"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"ກະລຸນາລໍຖ້າ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"ວັນທີ ແລະ ເວລາ"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"ຕັ້ງວັນທີ ແລະ ເວລາ"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"ຕັ້ງວັນທີ, ເວລາ, ເຂດ ແລະ ຮູບແບບເວລາ"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"ລຽງລຳດັບຕາມເຂດເວລາ"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"ວັນທີ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"ເວລາ"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"ເພີ່ມຜູ້ໃຊ້"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"ເພີ່ມບັນຊີ"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ລຶບຜູ້ໃຊ້"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"ຜູ້ໃຊ້ໃໝ່"</string>
-    <string name="user_guest" msgid="3465399481257448601">"ແຂກ"</string>
     <string name="user_admin" msgid="1535484812908584809">"ຜູ້ເບິ່ງແຍງລະບົບ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"ເຂົ້າສູ່ລະບົບເປັນຜູ້ເບິ່ງແຍງລະບົບ"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"ການອະນຸຍາດຂອງຜູ້ເບິ່ງແຍງລະບົບທັງໝົດ"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"ຕັ້ງໃຫ້ເປັນຜູ້ເບິ່ງແຍງລະບົບ"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ຜູ້ໃຊ້ນີ້ຈະສາມາດລຶບຜູ້ໃຊ້ອື່ນ ຮວມທັງຜູ້ເບິ່ງແຍງລະບົບອື່ນ ແລະ ຣີເຊັດລະບົບເປັນຄ່າໂຮງງານໄດ້."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ຄຳສັ່ງນີ້ບໍ່ສາມາດຍົກເລີກໄດ້."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ແມ່ນ, ຕັ້ງໃຫ້ເປັນຜູ້ເບິ່ງແຍງລະບົບ"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"ສ້າງຜູ້ໃຊ້ໃໝ່"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ໂທລະສັບ"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"ການຮັບສົ່ງຂໍ້ຄວາມຜ່ານອິນເຕີເນັດມືຖືຂອງລົດ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"ຕິດຕັ້ງແອັບໃໝ່"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ຖອນຕິດຕັ້ງແອັບ"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ເພີ່ມຜູ້ໃຊ້"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"ຜູ້ໃຊ້ໃໝ່"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"ເພີ່ມຜູ້ໃຊ້ໃໝ່ບໍ?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ບຸກຄົນນັ້ນຈຳເປັນຕ້ອງຕັ້ງຄ່າພື້ນທີ່ຂອງເຂົາເຈົ້າ."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ຜູ້ໃຊ້ຕ່າງໆສາມາດອັບເດດແອັບສຳລັບຜູ້ໃຊ້ອື່ນທັງໝົດໄດ້."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"ຮອດຂີດຈຳກັດຜູ້ໃຊ້ແລ້ວ"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">ທ່ານສາມາດສ້າງຜູ້ໃຊ້ໄດ້ບໍ່ເກີນ <xliff:g id="COUNT">%d</xliff:g> ຄົນ.</item>
+      <item quantity="one">ສາມາດສ້າງຜູ້ໃຊ້ໄດ້ໜຶ່ງຄົນເທົ່ານັ້ນ.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"ສ້າງຜູ້ໃຊ້ໃໝ່ບໍ່ສຳເລັດ"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ລຶບຜູ້ໃຊ້ນີ້ບໍ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"ແອັບ ແລະ ຂໍ້ມູນທັງໝົດຈະຖືກລຶບ."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ລຶບຜູ້ໃຊ້ບໍ່ສຳເລັດ."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ປິດໄວ້"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ລອງໃໝ່"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"ລຶບຜູ້ໃຊ້ສຸດທ້າຍບໍ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ຫຼັງຈາກລຶບຜູ້ໃຊ້ທີ່ຍັງເຫຼືອໜຶ່ງດຽວສຳລັບລົດນີ້ອອກ, ຜູ້ໃຊ້ທີ່ເປັນຜູ້ເບິ່ງແຍງລະບົບໃໝ່ຈະຖືກສ້າງຂຶ້ນ."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ຂໍ້ມູນ, ການຕັ້ງຄ່າ ແລະ ແອັບທັງໝົດທີ່ກ່ຽວຂ້ອງກັບຜູ້ໃຊ້ນີ້ຈະຖືກລຶບ. ທ່ານຈະຈຳເປັນຕ້ອງຕັ້ງຄ່າລະບົບອີກຄັ້ງ."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"ເລືອກຜູ້ເບິ່ງແຍງລະບົບໃໝ່"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"ທ່ານຈຳເປັນຕ້ອງມີຜູ້ເບິ່ງແຍງລະບົບຢ່າງໜ້ອຍໜຶ່ງຄົນ. ເພື່ອລຶບຜູ້ເບິ່ງແຍງລະບົບນີ້ອອກ, ກະລຸນາເລືອກຜູ້ປ່ຽນແທນກ່ອນ."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"ເລືອກຜູ້ເບິ່ງແຍງລະບົບ"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ແຂກ"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ແຂກ"</string>
     <string name="user_switch" msgid="6544839750534690781">"ສະຫຼັບ"</string>
     <string name="current_user_name" msgid="3813671533249316823">"ທ່ານ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"ຊື່"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ບໍ່ໄດ້ຕັ້ງຄ່າ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ແກ້ໄຊຊື່ຜູ້ໃຊ້"</string>
     <string name="users_list_title" msgid="770764290290240909">"ຜູ້ໃຊ້"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"ໃຫ້ການອະນຸຍາດແກ່ %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"ບັນຊີ"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ຜູ້ໃຊ້"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"ເພີ່ມບັນຊີ"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ບໍ່ໄດ້ເພີ່ມບັນຊີໃດ"</string>
     <string name="account_list_title" msgid="7631588514613843065">"ບັນຊີສຳລັບ <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ຊິ້ງຂໍ້ມູນອັດຕະໂນມັດ"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ໃຫ້ແອັບໂຫຼດຂໍ້ມູນຄືນໃໝ່ໂດຍອັດຕະໂນມັດ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ເປີດການຊິ້ງຂໍ້ມູນອັດຕະໂນມັດບໍ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ລະບົບຈະສຳເນົາການ​ປ່ຽນ​ແປງຕ່າງໆ​ທີ່​ທ່ານ​ເຮັດກັບ​ບັນ​ຊີ​ຂອງ​ທ່ານ​ໃນ​ເວັບ​ໄວ້ໃນອຸປະກອນຂອງທ່ານ​ໂດຍ​ອັດ​ຕະ​ໂນ​ມັດ.\n\nບາງ​ບັນ​ຊີ​ອາດ​ຈະສຳ​ເນົາ​ການ​ປ່ຽນ​ແປງ​ຕ່າງໆທີ່ທ່ານເຮັດ​ໃນ​ໂທ​ລະ​ສັບ​ໄວ້​ໃນ​ເວັບ​​ໂດຍ​ອັດ​ຕະ​ໂນ​ມັດ. ​ບັນ​ຊີ Google ເຮັດ​ວຽກໃນແບບນີ້."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ປິດການຊິ້ງຂໍ້ມູນອັດຕະໂນມັດບໍ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ນີ້ຈະປະຢັດອິນເຕີເນັດ, ແຕ່ທ່ານຈະຈຳເປັນຕ້ອງຊິ້ງຂໍ້ມູນແຕ່ລະບັນຊີດ້ວຍຕົນເອງເພື່ອເກັບກຳຂໍ້ມູນຫຼ້າສຸດ. ແລະ ທ່ານຈະບໍ່ໄດ້ຮັບການແຈ້ງເຕືອນເມື່ອມີການອັບເດດ."</string>
     <string name="account_details_title" msgid="7529571432258448573">"ຂໍ້ມູນບັນຊີ"</string>
     <string name="add_account_title" msgid="5988746086885210040">"ເພີ່ມບັນຊີ"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ເພີ່ມບັນຊີ"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"ລຶບບັນຊີອອກ"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"ລຶບບັນຊີອອກບໍ?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ການລຶບບັນຊີນີ້ຈະລຶບຂໍ້ຄວາມ, ລາຍຊື່ຜູ້ຕິດຕໍ່ ແລະ ຂໍ້ມູນອື່ນທັງໝົດຂອງມັນອອກຈາກອຸປະກອນ!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ປ່ຽນແປງສິ່ງນີ້"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ລຶບຜູ້ໃຊ້ນີ້ອອກບໍ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"ແອັບ ແລະ ຂໍ້ມູນທັງໝົດຈະຖືກລຶບ."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"ລຶບຜູ້ໃຊ້ບໍ່ສຳເລັດ."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"ລອງອີກຄັ້ງບໍ?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"ປິດໄວ້"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ລອງໃໝ່"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"ເພີ່ມຜູ້ໃຊ້ໃໝ່ບໍ?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ເມື່ອທ່ານເພີ່ມຜູ້ໃຊ້ໃໝ່, ບຸກຄົນນັ້ນຈຳເປັນຕ້ອງຕັ້ງຄ່າພື້ນທີ່ຂອງເຂົາເຈົ້າ."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ຜູ້ໃຊ້ຕ່າງໆສາມາດອັບເດດແອັບສຳລັບຜູ້ໃຊ້ອື່ນທັງໝົດໄດ້."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"ລຶບບັນຊີອອກບໍ່ສຳເລັດ."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ການຊິ້ງຂໍ້ມູນບັນຊີ"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"ເປີດຊິ້ງຂໍ້ມູນສຳລັບ <xliff:g id="ID_1">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="ID_2">%2$d</xliff:g> ລາຍການ"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"ເປີດການຊິ້ງຂໍ້ມູນສຳລັບທຸກລາຍການ"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"ປິດການຊິ້ງຂໍ້ມູນສຳລັບທຸກລາຍການ"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"ການຊິ້ງຂໍ້ມູນປິດຢູ່"</string>
+    <string name="sync_error" msgid="6698021343089247914">"ການຊິ້ງຂໍ້ມູນຜິດພາດ"</string>
+    <string name="last_synced" msgid="4745124489150101529">"ຊິ້ງຂໍ້ມູນຫຼ້າສຸດ <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ກຳລັງຊິ້ງຂໍ້ມູນ..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ແຕະເພື່ອຊິ້ງຂໍ້ມູນດຽວນີ້<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ຊິ້ງຂໍ້ມູນດຽວນີ້"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ຍົກເລີກການຊິ້ງຂໍ້ມູນ"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ການຊິ້ງຂໍ້ມູນກຳລັງປະສົບບັນຫາຢູ່ໃນປັດຈຸບັນ. ມັນຈະກັບມາໃຊ້ໄດ້ໃນໄວໆນີ້."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ຄວາມປອດໄພ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ການລັອກໜ້າຈໍ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ບໍ່ມີ"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"ລະຫັດຜ່ານ"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"ເລືອກປະເພດການລັອກ"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"ຕົວເລືອກໜ້າຈໍລັອກ"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ຕົວເລືອກການລັອກ"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"ໃສ່ຮູບແບບປົດລັອກຂອງທ່ານ"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"ຢືນຢັນ"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ແຕ້ມໃໝ່"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"ຕັ້ງຄ່າໜ້າຈໍລັອກ"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"ເລືອກ PIN ຂອງທ່ານ"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"ເລືອກຮູບແບບຂອງທ່ານ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"ເລືອກລະຫັດຜ່ານຂອງທ່ານ"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"ເລືອກລະຫັດຜ່ານຂອງທ່ານ"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"ການລັອກໜ້າຈໍປັດຈຸບັນ"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ເພື່ອຄວາມປອດໄພ, ກະລຸນາຕັ້ງຮູບແບບປົດລັອກ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"ລຶບ"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ລະຫັດຜ່ານທີ່ມັກໃຊ້ທົ່ວໄປຖືກບລັອກໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບໄອທີຂອງທ່ານ. ກະລຸນາລອງໃຊ້ລະຫັດອື່ນ."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ຊຸດຕົວເລກລຽງກັນແຕ່ນ້ອຍຫາໃຫຍ່, ໃຫຍ່ຫານ້ອຍ ຫຼື ຊຸດຕົວເລກຊ້ຳກັນ."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"ຕົວເລືອກການລັອກໜ້າຈໍ"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ມື້ກ່ອນ"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"ເພີ່ມອຸປະກອນທີ່ເຊື່ອຖືໄດ້"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"ອຸປະກອນທີ່ເຊື່ອຖືໄດ້"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ອຸປະກອນ</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ອຸປະກອນ</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ຂອງທ່ານຈະປົດລັອກລົດນີ້ ເມື່ອມັນເຊື່ອມຕໍ່. ຖ້າຄົນອື່ນເອົາ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> ຂອງທ່ານ, ພວກເຂົາຈະສາມາດເຂົ້າເຖິງອຸປະກອນນີ້ໄດ້"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"ຢືນຢັນ"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"ລຶບອຸປະກອນທີ່ເຊື່ອຖືໄດ້ອອກ"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ແລ້ວໆ"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"ໃຊ້ແອັບຊ່ວຍເຫຼືອເພື່ອຕັ້ງຄ່າອຸປະກອນທີ່ເຊື່ອຖືໄດ້. ເມື່ອຕັ້ງຄ່າແລ້ວ, ທ່ານຈະສາມາດປົດລັອກໂປຣໄຟລ໌ຜູ້ໃຊ້ຂອງທ່ານ ເມື່ອພາຫາລະກວດພົບໂທລະສັບຂອງທ່ານ"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ດາວໂຫຼດແອັບຊ່ວຍເຫຼືອໃນໂທລະສັບຂອງທ່ານ"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. ເລືອກ <xliff:g id="CAR_NAME">%1$s</xliff:g> ໃນໂທລະສັບຂອງທ່ານເພື່ອຈັບຄູ່ອຸປະກອນ"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ບໍ່ສາມາດກວດພົບຄຸນສົມບັດຄວາມປອດໄພຂອງອຸປະກອນນີ້. ເພື່ອຊ່ວຍປົກປ້ອງລົດຂອງທ່ານ, ອຸປະກອນທີ່ເຊື່ອຖືໄດ້ຈະສາມາດຮັກສາໃຫ້ລົດຂອງທ່ານປົດລັອກຄ້າງໄວ້ ເມື່ອທ່ານປົດລັອກມັນແລ້ວເທົ່ານັ້ນ. ອຸປະກອນທີ່ເຊື່ອຖືໄດ້ສາມາດຮັກສາໃຫ້ລົດຂອງທ່ານປົດລັອກຄ້າງໄວ້ເມື່ອມັນຢູ່ໃກ້ຄຽງ, ເຖິງແມ່ນວ່າຄົນອື່ນກຳລັງຖືມັນໄວ້ຢູ່ກໍຕາມ."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"ເພີ່ມ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ເປັນອຸປະກອນທີ່ເຊື່ອຖືໄດ້"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"ເພີ່ມ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ເປັນອຸປະກອນທີ່ເຊື່ອຖືໄດ້ສຳເລັດແລ້ວ"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"ການລົງທະບຽນ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ບໍ່ສຳເລັດ"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"ການເພີ່ມອຸປະກອນທີ່ເຊື່ອຖືໄດ້ກຳນົດໃຫ້ທ່ານຕ້ອງຕັ້ງຄ່າວິທີການກວດຮັບຮອງຄວາມຖືກຕ້ອງເປັນຂັ້ນຕອນຕໍ່ໄປ. ຖ້າທ່ານບໍ່ມີອຸປະກອນທີ່ເຊື່ອຖືໄດ້ຢູ່ນຳທ່ານ, ຈໍາເປັນຕ້ອງມີການກວດຮັບຮອງຄວາມຖືກຕ້ອງເພື່ອເຂົ້າເຖິງໂປຣໄຟລ໌ຂອງທ່ານ."</string>
     <string name="forget" msgid="3971143908183848527">"ລືມ"</string>
+    <string name="connect" msgid="5861699594602380150">"ເຊື່ອມຕໍ່"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ຕັດການເຊື່ອມຕໍ່"</string>
     <string name="delete_button" msgid="5840500432614610850">"ລຶບ"</string>
     <string name="remove_button" msgid="6664656962868194178">"ລຶບອອກ"</string>
     <string name="cancel" msgid="750286395700355455">"ຍົກເລີກ"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ອອກຈາກໂໝດສາທິດ"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ນີ້ຈະລຶບບັນຊີສາທິດ ແລະ ຣີເຊັດລະບົບເປັນຂໍ້ມູນໂຮງງານ. ຂໍ້ມູນຜູ້ໃຊ້ທັງໝົດຈະເສຍໄປ."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ອອກຈາກໂໝດສາທິດ"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ສຳເລັດການຕັ້ງຄ່າ"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ບໍ່ແມ່ນຕອນນີ້"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ປິດໄວ້"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ຄຸນສົມບັດບໍ່ສາມາດໃຊ້ໄດ້ໃນເວລາຂັບລົດ."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ບໍ່ສາມາດເພີ່ມຜູ້ໃຊ້ໃນຂະນະທີ່ຂັບລົດໄດ້."</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index d59b035..1697fb5 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"pritemdyti ekraną, jutiklinis ekranas, akumuliatorius"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"pritemdyti ekraną, įjungti nakties rodinį, suteikti atspalvį"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Naktinis režimas"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Tinklas ir internetas"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobiliojo ryšio tinklas"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiliojo ryšio duomenys"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Prieiga prie duomenų naud. mobiliojo ryšio tinklą"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Išjungti mobiliojo ryšio duomenis?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Duomenų naudojimas"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Įspėjimas dėl duomenų ir apribojimas"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Programų duomenų naudojimo ciklas"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Nustatyti įspėjimą dėl duomenų"</string>
+    <string name="data_warning" msgid="116776633806885370">"Įspėjimas dėl duomenų"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Nust. duomenų apribojimą"</string>
+    <string name="data_limit" msgid="227338836292511425">"Duomenų apribojimas"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Duomenų naudojimo ribojimas"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Pasiekus nustatytą apribojimą pagrindiniame transporto priemonės įtaise bus išjungti mobiliojo ryšio duomenys.\n\nKadangi sunaudoti duomenys skaičiuojami pagal pagrindinį transporto priemonės įtaisą ir operatorius gali apskaičiuoti kitaip, apsvarstykite galimybę nustatyti mažesnį apribojimą."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Nustatyti ir tvarkyti belaidės prieigos taškus"</string>
     <string name="wifi_starting" msgid="473253087503153167">"„Wi-Fi“ įjungiama…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"„Wi-Fi“ išjungiama…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Įkeliamas „Wi‑Fi“ sąrašas"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"„Wi-Fi“ išjungtas"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Ištrinant tinklą įvyko klaida."</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Jungiantis prie tinklo įvyko klaida."</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Pridėti tinklą"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"„Wi-Fi“ išjungtas"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Prisijungti"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Slaptažodis"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Rodyti slaptažodį"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Tinklo pavadinimas"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Įveskite SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sauga"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signalo stiprumas"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signalo stiprumas"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Būsena"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Susiejimo sparta"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Dažnis"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP adresas"</string>
+    <string name="show_password" msgid="2074628020371139240">"Rodyti slaptažodį"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Įveskite tinklo pavadinimą"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Įveskite slaptažodį"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Prastas"</item>
-    <item msgid="2032262610626057081">"Neblogas"</item>
-    <item msgid="3859756017461098953">"Geras"</item>
-    <item msgid="1521103743353335724">"Puikus"</item>
+    <item msgid="7683058295076342057">"Prastas"</item>
+    <item msgid="1639222824821660744">"Neblogas"</item>
+    <item msgid="1838705897358163300">"Geras"</item>
+    <item msgid="6067166649320533751">"Puikus"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Įjungti „Bluetooth“"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"„Bluetooth“ išjungta"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Išsami tinklo informacija"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC adresas"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP adresas"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Potinklio kaukė"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"„IPv6“ adresai"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Tinklų sietuvas"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"„Wi‑Fi“ nuostatos"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Automatiškai įjungti „Wi‑Fi“"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"„Wi‑Fi“ bus vėl įj., esant šalia išs. aukštos kok. tinklų, pvz., namų tinklo"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nepasiekiama, nes vietovės parinktis išj. Įjunkite "<annotation id="link">"vietovę"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Įjungti „Wi‑Fi“ nuskaitymą?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Įjungti"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"„Wi‑Fi“ nuskaitymas įjungtas"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatiškai perjungti į mobiliojo ryšio duomenis"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Naudoti mobiliojo ryšio duomenis, kai „Wi-Fi“ tinkle nėra interneto ryšio. Galite būti apmokestinti už naudojamus duomenis."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Sužinoti daugiau"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Tvarkyti ryšius, nustatyti įrenginio pavadinimą ir aptinkamumą"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Kompiuteris"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Virtualiosios realybės įrenginys"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefonas"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Vaizdavimo įrenginys"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Ausinės"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Išorinis įvesties įrenginys"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Susieti įrenginiai"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Pasiekiami įrenginiai"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Susietų įrenginių nėra"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Pasiekiamų įrenginių nėra"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Susietas įrenginys"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Pavadinimas"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Naudoti"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Keiskite „Bluetooth“ įreng. pavad."</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Įrenginys be pavadinimo"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Susieti įrenginiai"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Susieti naują įrenginį"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bus įjungtas „Bluetooth“, kad būtų galima susieti"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Atjungti įrenginį?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Jūsų transporto priemonė bus atjungta nuo „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“ įrenginio."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Transporto priemonės „Bluetooth“ adresas: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Įrenginio „Bluetooth“ adresas: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Transporto priem. pavadinimas"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Pervardyti šią transporto pr."</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Pervardyti įrenginį"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Pervardyti"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Pasiekiami įrenginiai"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiliai"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"„Bluetooth“ susiejimo užklausa"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Susieti ir jungti"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"„Bluetooth“ susiejimo kodas"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN kodą sudaro raidės arba simboliai"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Įveskite susiejimo kodą, tada paspauskite „Grįžti“ arba „Enter“"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Paprastai 0000 arba 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Susiejimo užklausa"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Palieskite, kad susietumėte su „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Kalbos"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Kalbos ir įvestis"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatūra"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Tvarkyti klaviatūras"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Teksto į kalbą išvestis"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Pageidaujamas variklis"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Dabartinis variklis"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Kalbėjimo sparta"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Garso aukštis"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Nustatyti iš naujo"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Garsas"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Skambučio garsumas"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigacijos garsumas"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Medija"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Nustatyti muzikos ir vaizdo įrašų garsumą"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Signalas"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefono skambėjimo tonas"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Numatytasis pranešimo garsas"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Numatytasis signalo garsas"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Programos ir pranešimai"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Rodyti visas programas"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Numatytosios programos"</string>
     <string name="applications_settings" msgid="794261395191035632">"Programų informacija"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Priverstinai sustabdyti"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Priverstinai sustabdyti?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Jei priverstinai sustabdysite programą, ji gali neveikti tinkamai."</string>
     <string name="disable_text" msgid="4358165448648990820">"Išjungti"</string>
     <string name="enable_text" msgid="1794971777861881238">"Įgalinti"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Pašalinti"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Jei išjungsite šią programą, „Android“ ir kitos programos gali neveikti, kaip numatyta."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Išjungti programą"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Leidimai"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versija: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nėra suteiktų leidimų"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nėra užklausų dėl leidimų"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Duomenų naudojimas"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Progr. duomenų naudojimas"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Priverstinai sustabdyti"</string>
     <string name="computing_size" msgid="5791407621793083965">"Skaičiuojama…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> papildomas leidimas</item>
@@ -117,15 +168,39 @@
       <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> papildomo leidimo</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> papildomų leidimų</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pagalb. progr. ir įvest. balsu"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Pagalbinė programa"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Naudoti tekstą iš ekrano"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Leisti pagalbinei programai pasiekti ekrano turinį kaip tekstą"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Naudoti ekrano kopiją"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Leisti pagalbinei programai pasiekti ekrano vaizdą"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Automatinio pildymo paslauga"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nėra"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Pasirinkta"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Pagalbinė programa galės skaityti informaciją apie sistemoje naudojamas programas, įskaitant ekrane matomą ar programose pasiekiamą informaciją."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Įsitikinkite, kad pasitikite šia programa&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=„Google“ automatinis pildymas&gt;%1$s&lt;/xliff:g&gt; naudodamas informaciją ekrane nustato, ką gali užpildyti automatiškai."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Pridėti paslaugą"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Vietovė"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Pastarosios vietovės užklausos"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nėra jokių pastarųjų vietovių užklausų"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Programos lygio leidimai"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Nuskaitymas"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Vietovės paslaugos"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"„Wi‑Fi“ nuskaitymas"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Leisti programoms ir paslaugoms bet kuriuo metu nuskaityti ieškant „Wi‑Fi“ tinklų, net kai „Wi‑Fi“ išjungtas. Tai galima naudoti norint, pvz., tobulinti pagal vietovę teikiamas funkcijas ir paslaugas."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"„Bluetooth“ nuskaitymas"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Leisti programoms ir paslaugoms bet kuriuo metu nuskaityti ieškant netoliese esančių įrenginių, net kai „Bluetooth“ išjungtas. Tai galima naudoti norint, pvz., tobulinti pagal vietovę teikiamas funkcijas ir paslaugas."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Sistemos naujiniai"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Sistemos naujiniai"</string>
     <string name="firmware_version" msgid="8491753744549309333">"„Android“ versija"</string>
     <string name="security_patch" msgid="4794276590178386903">"„Android“ saugos pataisos lygis"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelis"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Nemoduliuotų signalų įrangos versija"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Branduolio versija"</string>
     <string name="build_number" msgid="3997326631001009102">"Versijos numeris"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"„Bluetooth“ adresas"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nepasiekiama"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Būsena"</string>
     <string name="device_status" msgid="267298179806290920">"Būsena"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Autorių teisės"</string>
     <string name="license_title" msgid="936705938435249965">"Licencija"</string>
     <string name="terms_title" msgid="5201471373602628765">"Taisyklės ir nuostatos"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Sistemos „WebView“ licencija"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Sist. žiniatinklio rod. licencijos"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ekrano fonai"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Palydovinių vaizdų teikėjai:\n© CNES / „Astrium“, „DigitalGlobe“, „Bluesky“, 2014 m."</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Trečiųjų šalių licencijos"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Įkeliant licencijas iškilo problema."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Įkeliama..."</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmą ir būsite kūrėjas.</item>
+      <item quantity="few">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmus ir būsite kūrėjas.</item>
+      <item quantity="many">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmo ir būsite kūrėjas.</item>
+      <item quantity="other">Liko atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmų ir būsite kūrėjas.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Dabar esate kūrėjas!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nereikia, jūs jau esate kūrėjas."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Kūrėjo parinktys"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Parinkčių nustatymas iš naujo"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Tinklo, programos ar įrenginio nustatymas iš naujo"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Iš naujo nustatyti tinklą"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Bus iš naujo nustatyti visi tinklo nustatymai, įskaitant:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobiliojo ryšio duomenys"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Ištrinti visas transp. priemonės „eSIM“ korteles"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Tai atlikus paslaugų planas nebus atšauktas."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Nepavyko nustatyti „eSIM“ kortelių iš naujo"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Tinklo pasirinkimas"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Nustatyti iš naujo"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Nustatyti iš naujo?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Iš naujo nustatyti visus tinklo nustatymus? Šio veiksmo negalėsite anuliuoti!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Nustatyti iš naujo"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Tinklo nustatymai nustatyti iš naujo"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Iš naujo nustatyti programų nuostatas"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Bus iš naujo nustatytos visos nurodytų elementų nuostatos:\n\n"<li>"išjungtos programos;"</li>\n<li>"išjungti programų pranešimai;"</li>\n<li>"numatytosios veiksmų programos;"</li>\n<li>"programų foninių duomenų apribojimai;"</li>\n<li>"visi leidimų apribojimai."</li>\n\n"Neprarasite jokių programų duomenų."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Iš naujo nustatyti programas"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Programų nuostatos nustatytos iš naujo"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Ištr. visus duom. (atk. gamykl. duom.)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Tai atlikus bus ištrinti visi duomenys iš pagrindinio transporto priemonės įtaiso, įskaitant:\n\n"<li>"„Google“ paskyrą;"</li>\n<li>"sistemos ir programų duomenis bei nustatymus;"</li>\n<li>"atsisiųstas programas."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Šiuo metu esate prisijungę prie toliau nurodytų paskyrų."</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Šioje transporto priemonėje yra kitų naudotojų."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Nustatyti tr. priem. iš naujo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Nustatyti iš naujo?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Ištrinti visą asmens informaciją ir atsisiųstas programas? Šio veiksmo negalėsite anuliuoti!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Ištrinti viską"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Ištrinama"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Palaukite..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data ir laikas"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Nustatyti datą ir laiką"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Nustatyti datą, laiką, laiko juostą ir formatus"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Rūšiuoti pagal laiko juostą"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Laikas"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Pridėti naudotoją"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Pridėti paskyrą"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Naudotojo ištrynimas"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Naujas naudotojas"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Svečias"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administratorius"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Esate prisij. kaip administrator."</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Visi administratoriaus leidimai"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Nustatyti kaip administratorių"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Naudotojas galės ištrinti naudotojus, įskaitant administratorius, ir atkurti gamyklinius sistemos duomenis."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Šio veiksmo atšaukti negalima."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Taip, nustatyti kaip administratorių"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Kurti naujus naudotojus"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Skambinti"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Susir. naud. automob. mob. r. duom."</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Įdiegti naujas programas"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Pašalinti programas"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Pridėti naudotoją"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Naujas naudotojas"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Pridėti naują naudotoją?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo vietą."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Bet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Pasiekta naudotojų riba"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Galite sukurti iki <xliff:g id="COUNT">%d</xliff:g> naudotojo.</item>
+      <item quantity="few">Galite sukurti iki <xliff:g id="COUNT">%d</xliff:g> naudotojų.</item>
+      <item quantity="many">Galite sukurti iki <xliff:g id="COUNT">%d</xliff:g> naudotojo.</item>
+      <item quantity="other">Galite sukurti iki <xliff:g id="COUNT">%d</xliff:g> naudotojų.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Nepavyko sukurti naujo naudotojo"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Ištrinti šį naudotoją?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Visos programos ir duomenys bus ištrinti."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Nepavyko ištrinti naudotojo."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Atsisakyti"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Bandyti dar kartą"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Ištrinti pask. naudotoją?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Ištrynus vienintelį likusį šio automobilio naudotoją, bus sukurtas naujas administratoriaus teises turintis naudotojas."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Visi su šiuo naudotoju susiję duomenys, nustatymai ir programos bus ištrinti. Turėsite nustatyti sistemą iš naujo."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Naujo administratoriaus pasirinkimas"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Jums reikalingas bent vienas administratorius. Kad galėtumėte ištrinti šį, pirmiausia pasirinkite kitą administratorių."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Pasir. administratorių"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Svečias"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Svečias"</string>
     <string name="user_switch" msgid="6544839750534690781">"Jungiklis"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Jūs (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Vardas"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nenustatyta"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Naudotojo vardo redagavimas"</string>
     <string name="users_list_title" msgid="770764290290240909">"Naudotojai"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Leidimai suteikti naudot. %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Paskyros"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Naudotojas"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Pridėti paskyrą"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nepridėta jokių paskyrų"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Paskyros (<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>)"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatiškai sinchronizuoti duomenis"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Leisti programoms automatiškai atnaujinti duomenis"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Įjungti autom. sinchronizavimą?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Bet kokie paskyrų pakeitimai, kuriuos atliekate žiniatinklyje, bus automatiškai nukopijuoti į jūsų įrenginį.\n\nIš kai kurių paskyrų į žiniatinklį gali būti automatiškai kopijuojami visi telefone atlikti pakeitimai. Taip veikia „Google“ paskyra."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Išjungti autom. sinchronizavimą?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Tai atlikus duomenys bus naudojami saikingai, tačiau, jei norėsite surinkti naujausią informaciją, turėsite sinchronizuoti kiekvieną paskyrą neautomatiškai. Be to, negausite pranešimų, kai atsiras naujinių."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Paskyros informacija"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Paskyros pridėjimas"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Paskyros pridėjimas"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Pašalinti paskyrą"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Pašalinti paskyrą?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Pašalinus šią paskyrą iš įrenginio bus ištrinti visi pranešimai, kontaktai ir kiti duomenys."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Administratorius neleidžia atlikti šio pakeitimo"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Pašalinti šį naudotoją?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Visos programos ir duomenys bus ištrinti."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Nepavyko pašalinti naudotojo."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Bandyti dar kartą?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Atsisakyti"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Bandyti dar kartą"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Pridėti naują naudotoją?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo vietą."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Bet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Nepavyko pašalinti paskyros."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Paskyros sinchronizavimas"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Įjungtas elementų sinchronizavimas: <xliff:g id="ID_1">%1$d</xliff:g> iš <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Įjungtas visų elementų sinchronizavimas"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Išjungtas visų elementų sinchronizavimas"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinchronizav. IŠJUNGTAS"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sinchronizavimo klaida"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Pastarąjį kartą sinchronizuota <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinchronizuojama dabar…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Palieskite, kad sinchronizuotumėte dabar (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinchronizuoti dabar"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Atšaukti sinchronizavimą"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Šiuo metu iškilo sinchronizavimo problemų. Greitai jis vėl veiks."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sauga"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekrano užraktas"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nėra"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN kodas"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Slaptažodis"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Rinkitės užrakto tipą"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Ekrano užrakto parinktys"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Užrakto parinktys"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Nupieškite atrakinimo piešinį"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Patvirtinti"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Nustatyti iš naujo"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ekrano užrakto nustatymas"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Pasirinkite PIN kodą"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Pasirinkite piešinį"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Pasirinkite slaptažodį"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Pasirinkite slaptažodį"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Esamas ekrano užraktas"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Nustatykite saugumo atrakinimo piešinį"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Išvalyti"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Dažnai naudojamus slaptažodžius užblokavo IT administratorius. Bandykite naudoti kitą slaptažodį."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Didėjanti, mažėjanti ar pasikartojanti skaitmenų seka neleidžiama."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Ekrano užrakto parinktys"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: prieš <xliff:g id="NUM_DAYS">%3$s</xliff:g> d."</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Pridėti patikimą įrenginį"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Patikimi įrenginiai"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> įrenginys</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> įrenginiai</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> įrenginio</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> įrenginių</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"„<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g>“ įrenginys atrakins šį automobilį, kai šis bus prijungtas. Jei koks nors asmuo paims „<xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>“ įrenginį, jis galės pasiekti šį įrenginį"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Patvirtinti"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Pašalinti patikimą įrenginį"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Atlikta"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Naudokite papildomą programą, kad nustatytumėte patikimą įrenginį. Nustatę galėsite atrakinti naudotojo profilį, kai transporto priemonė aptiks telefoną"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Atsisiųskite papildomą programą telefone"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Pasirinkite automobilį „<xliff:g id="CAR_NAME">%1$s</xliff:g>“ telefone, kad susietumėte įrenginius"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"„Smart Lock“ negali aptikti šio įrenginio saugos funkcijų. Automobilio saugos sumetimais patikimas įrenginys galės laikyti atrakintą automobilį, tik kai jį jau būsite atrakinę. Patikimas įrenginys negali laikyti atrakinto automobilio, kai jis yra netoliese, net jei įrenginį laiko kažkas kitas."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Pridėti „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“kaip patikimą įrenginį"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"„<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“ įrenginys sėkmingai pridėtas kaip patikimas"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"„<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“ įrenginio registracija nepavyko"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Pridėję patikimą įrenginį, paskui turėsite nustatyti autentifikavimo metodą. Jei su savimi patikimo įrenginio neturite, autentifikavimas bus būtinas norint pasiekti profilį."</string>
     <string name="forget" msgid="3971143908183848527">"Pamiršti"</string>
+    <string name="connect" msgid="5861699594602380150">"Prisijungti"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Atsijungti"</string>
     <string name="delete_button" msgid="5840500432614610850">"Ištrinti"</string>
     <string name="remove_button" msgid="6664656962868194178">"Pašalinti"</string>
     <string name="cancel" msgid="750286395700355455">"Atšaukti"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Išeiti iš demonstrac. režimo"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Tai atlikus bus ištrinta demonstracinė paskyra ir atkurti gamykliniai sistemos duomenys. Visi naudotojo duomenys bus prarasti."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Išeiti iš dem. režimo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"užbaigti sąranką"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ne dabar"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ATSISAKYTI"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkcija nepasiekiama vairuojant."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Negalima pridėti naudotojo vairuojant."</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 4d74066..32ef61d 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"aptumšot ekrānu, skārienekrāns, akumulators"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"aptumšot ekrānu, nakts, tonējums"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nakts režīms"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Tīkls un internets"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilais tīkls"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilie dati"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Piekļuve datiem, izmantojot mobilo tīklu"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vai izslēgt mobilos datus?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Datu lietojums"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Datu brīdinājums un ierobežojums"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Lietotnes datu lietojuma cikls"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Iestatīt datu brīdinājumu"</string>
+    <string name="data_warning" msgid="116776633806885370">"Datu brīdinājums"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Iestatīt datu ierobežojumu"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datu ierobežojums"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Datu lietojuma ierobežošana"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Kad transportlīdzekļa sistēmas panelī būs sasniegts jūsu iestatītais ierobežojums, mobilie dati tiks izslēgti.\n\nTā kā datu lietojums tiek noteikts sistēmas panelī un jūsu mobilo sakaru operators var citādi uzskaitīt datu lietojumu, ieteicams iestatīt pārdomātu ierobežojumu."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Iestatīt un pārvaldīt bezvadu piekļuves punktu"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Notiek Wi-Fi ieslēgšana…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Notiek Wi-Fi izslēgšana…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Notiek Wi‑Fi saraksta ielāde"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi atspējots"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Neizdevās aizmirst tīklu."</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Neizdevās izveidot savienojumu ar tīklu."</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Pievienot tīklu"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi atspējots"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Savienot"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Parole"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Rādīt paroli"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Tīkla nosaukums"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Ievadiet SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Drošība"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signāla stiprums"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signāla stiprums"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Statuss"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Saites izveides ātrums"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvence"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP adrese"</string>
+    <string name="show_password" msgid="2074628020371139240">"Rādīt paroli"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Ievadiet tīkla nosaukumu"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Ievadiet paroli"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Vājš"</item>
-    <item msgid="2032262610626057081">"Viduvējs"</item>
-    <item msgid="3859756017461098953">"Labs"</item>
-    <item msgid="1521103743353335724">"Teicams"</item>
+    <item msgid="7683058295076342057">"Vājš"</item>
+    <item msgid="1639222824821660744">"Viduvējs"</item>
+    <item msgid="1838705897358163300">"Labs"</item>
+    <item msgid="6067166649320533751">"Teicams"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Ieslēgt Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth atspējots"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Dati par tīklu"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC adrese"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP adrese"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Apakštīkla maska"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 adreses"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Vārteja"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi preferences"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Automātiski ieslēgt Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi tiks ieslēgts netālu no sagl. augstas kval. tīkliem, piem., mājas tīkla."</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nav pieejams, jo atr. vieta ir izsl. Ieslēdziet "<annotation id="link">"atr. vietu"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Vai ieslēgt Wi‑Fi meklēšanu?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Ieslēgt"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi meklēšana ir ieslēgta"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automātiski pārslēgties uz mobilajiem datiem"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Izmantojiet mobilo datu savienojumu, kad Wi‑Fi tīklā nav piekļuves internetam. Var tikt piemērota maksa par datu lietojumu."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Uzzināt vairāk"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Pārvaldīt savienojumus, iestatīt ierīces nosaukumu un uztveramību"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Dators"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Austiņas"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Tālrunis"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Attēlu apstrādes ierīce"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Austiņas"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Ievades ierīce"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Pārī savienotās ierīces"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Pieejamās ierīces"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nav pārī savienotu ierīču"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nav pieejamu ierīču"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Pārī savienota ierīce"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nosaukums"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Izmantošana:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Mainiet Bluetooth ierīces nosaukumu"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Nenosaukta ierīce"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Pārī savienotās ierīces"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Savienošana pārī ar jaunu ierīci"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Tiks ieslēgts Bluetooth savienojums un izveidots savienojums pārī."</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Vai atvienot ierīci?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Jūsu transportlīdzeklis tiks atvienots no ierīces <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Transportlīdzekļa Bluetooth adrese: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Ierīces Bluetooth adrese: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Transportlīdzekļa nosaukums"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Transportlīdzekļa pārdēvēšana"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Ierīces pārdēvēšana"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Pārdēvēt"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Pieejamās ierīces"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profili"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth pieprasījums savienošanai pārī"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Savienot pārī un izveidot savienojumu"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth kods savienošanai pārī"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN ietver burtus vai simbolus"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Ierakstiet kodu savienošanai pārī un pēc tam nospiediet ievadīšanas taustiņu."</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Parasti 0000 vai 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Pieprasījums savienošanai pārī"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Pieskarieties, lai izveidotu savienojumu pārī ar ierīci “<xliff:g id="DEVICE_NAME">%1$s</xliff:g>”."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Valodas"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Valodas un ievade"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastatūra"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Tastatūru pārvaldība"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Teksta pārvēršanas runā izvade"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Vēlamā programma"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Pašreizējā programma"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Runas ātrums"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tonis"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Atiestatīt"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Skaņa"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Zvana skaļums"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigācijas skaļums"</string>
@@ -100,31 +140,66 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Multivide"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Iestatīt mūzikas un videoklipu skaļumu"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Signāls"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Tālruņa zvana signāls"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Paziņojuma noklusējuma skaņa"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Modinātāja noklusējuma skaņa"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Lietotnes un paziņojumi"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Rādīt visas lietotnes"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Noklusējuma lietotnes"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informācija par lietotni"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Veikt piespiedu apturēšanu"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Vai veikt piespiedu apturēšanu?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Piespiedu kārtā apturot lietotnes darbību, var rasties šīs lietotnes darbības traucējumi."</string>
     <string name="disable_text" msgid="4358165448648990820">"Atspējot"</string>
     <string name="enable_text" msgid="1794971777861881238">"Iespējot"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Atinstalēt"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ja atspējosiet šo lietotni, Android un citas lietotnes, iespējams, vairs nedarbosies, kā paredzēts."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Atspējot lietotni"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Atļaujas"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versija: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nav piešķirta neviena atļauja."</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nav pieprasīta neviena atļauja."</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Datu lietojums"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Lietotnes datu lietojums"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Veikt piespiedu apturēšanu"</string>
     <string name="computing_size" msgid="5791407621793083965">"Notiek aprēķināšana…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> papildu atļauju</item>
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> papildu atļauja</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> papildu atļaujas</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistents un balss ievade"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Palīga lietotne"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Izmantot ekrānā redzamo tekstu"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Atļaut palīga lietotnei piekļūt ekrānā redzamajam tekstam"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Izmantot ekrānuzņēmumu"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Atļaut palīga lietotnei piekļūt ekrāna attēlam"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Automātiskā aizpilde"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nav"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Atlasīta"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asistents varēs lasīt informāciju par jūsu sistēmā izmantotajām lietotnēm, tostarp jūsu ekrānā redzamo informāciju vai lietotnēs pieejamo informāciju."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Pārliecinieties, ka šī lietotne ir uzticama&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google automātiskā aizpilde&gt;%1$s&lt;/xliff:g&gt; izmanto ekrānā redzamo saturu, lai noteiktu, kādu informāciju aizpildīt automātiski."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Pievienot pakalpojumu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Atrašanās vieta"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Neseni atrašanās vietu pieprasījumi"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nav nesenu atrašanās vietu pieprasījumu"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Lietotnes līmeņa atļaujas"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Notiek meklēšana"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Atrašanās vietu pakalpojumi"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi meklēšana"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Ļauj lietotnēm un pakalpojumiem meklēt Wi-Fi tīklus vienmēr, pat ja Wi-Fi ir izslēgts. Šo iestatījumu var izmantot, piemēram, lai uzlabotu atrašanās vietas funkcijas un pakalpojumus."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth meklēšana"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Ļauj lietotnēm un pakalpojumiem meklēt tuvumā esošas ierīces vienmēr, pat ja Bluetooth ir izslēgts. Šo iestatījumu var izmantot, piemēram, lai uzlabotu atrašanās vietas funkcijas un pakalpojumus."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistēma"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Sistēmas atjauninājumi"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Sistēmas atjauninājumi"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android versija"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android drošības ielāpa līmenis"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelis"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Pamatjoslas versija"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kodola versija"</string>
     <string name="build_number" msgid="3997326631001009102">"Būvējuma numurs"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth adrese"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nav pieejams"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Statuss"</string>
     <string name="device_status" msgid="267298179806290920">"Statuss"</string>
@@ -141,12 +216,50 @@
     <string name="copyright_title" msgid="4220237202917417876">"Autortiesības"</string>
     <string name="license_title" msgid="936705938435249965">"Licence"</string>
     <string name="terms_title" msgid="5201471373602628765">"Pakalpojumu sniegšanas noteikumi"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Sistēmas WebView licence"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Sistēmas WebView licences"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Fona tapetes"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satelītuzņēmumu nodrošinātāji:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Trešo pušu licences"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ielādējot licences, radās problēma."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Notiek ielāde…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="zero">Lai jūs kļūtu par izstrādātāju, atlikušas <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbības.</item>
+      <item quantity="one">Lai jūs kļūtu par izstrādātāju, atlikusi <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbība.</item>
+      <item quantity="other">Lai jūs kļūtu par izstrādātāju, atlikušas <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbības.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Tagad jūs esat izstrādātājs!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nav nepieciešams, ja jau esat izstrādātājs."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opcijas izstrādātājiem"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Atiestatīšanas opcijas"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Tīkla, lietotņu vai ierīces atiestatīšana"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Atiestatīt tīklu"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Tiks atiestatīti visi tīkla iestatījumu, tostarp tālāk norādītie iestatījumi."</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobilie dati"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Dzēst visas transportlīdzekļa eSIM kartes"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Šī darbība neatcels jūsu pakalpojumu plānu."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Nevar atiestatīt eSIM kartes"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Tīkla atlase"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Atiestatīt iestatījumus"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Vai atiestatīt?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Vai atiestatīt visus tīkla iestatījumus? Šo darbību nevarēs atsaukt."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Atiestatīt iestatījumus"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Tīkla iestatījumi ir atiestatīti."</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Atiestatīt lietotņu preferences"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Šādi tiks atiestatītas visas preferences, kas saistītas ar:\n\n"<li>"atspējotām lietotnēm;"</li>\n<li>"atspējotu lietotņu paziņojumiem;"</li>\n<li>"darbībām paredzētām noklusējuma lietojumprogrammām;"</li>\n<li>"lietotņu fona datu ierobežojumiem;"</li>\n<li>"visiem atļauju ierobežojumiem."</li>\n\n"Jūs nezaudēsiet lietotņu datus."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Atiestatīt lietotnes"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Lietotņu preferences ir atiestatītas"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Notīrīt visus datus (atiestatīt ierīci)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Tādējādi tiks izdzēsti visi transportlīdzekļa sistēmas panelī esošie dati, tostarp:\n\n"<li>"jūsu Google konts;"</li>\n<li>"sistēmas un lietotņu dati un iestatījumi;"</li>\n<li>"lejupielādētās lietotnes."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Jūs pašlaik esat pierakstījies šādos kontos:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Šo transportlīdzekli izmanto vēl citi lietotāji."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Atiestatīt transportlīdzekli"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vai atiestatīt?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Vai dzēst visu jūsu personisko informāciju un lejupielādētās lietotnes? Šo darbību nevarēs atsaukt."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Dzēst visu"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Notiek dzēšana"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Lūdzu, uzgaidiet…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datums un laiks"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Datuma un laika iestatīšana"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Iestatīt datumu, laiku, laika joslu un formātus"</string>
@@ -166,23 +279,60 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Kārtot pēc laika joslas"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datums"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Laiks"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Lietotāja pievienošana"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Pievienot kontu"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Dzēst lietotāju"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Jauns lietotājs"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Viesis"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrators"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Pierakstījies kā administrators"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Visas administratora atļaujas"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Iestatīt kā administratoru"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Attiecīgais lietotājs varēs dzēst lietotājus, tostarp citus administratorus, kā arī veikt sistēmas rūpnīcas datu atiestatīšanu."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Šī darbība ir neatgriezeniska."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Jā, iestatīt kā administratoru"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Jaunu lietotāju izveide"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Tālruņa zvanu veikšana"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Ziņojumi, lietojot auto mob. datus"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Jaunu lietotņu instalēšana"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Lietotņu atinstalēšana"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Lietotāja pievienošana"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Jauns lietotājs"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Jauns lietotājs"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Ikviens lietotājs var atjaunināt lietotnes citu lietotāju vietā."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Sasniegts lietotāju ierobežojums"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="zero">Var izveidot ne vairāk kā <xliff:g id="COUNT">%d</xliff:g> lietotājus.</item>
+      <item quantity="one">Var izveidot ne vairāk kā <xliff:g id="COUNT">%d</xliff:g> lietotāju.</item>
+      <item quantity="other">Var izveidot ne vairāk kā <xliff:g id="COUNT">%d</xliff:g> lietotājus.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Neizdevās izveidot jaunu lietotāju"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Vai dzēst šo lietotāju?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Tiks dzēstas visas lietotnes un dati."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Neizdevās izdzēst lietotāju"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Noraidīt"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Mēģināt vēlreiz"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Dzēst pēdējo lietotāju?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Kad šai automašīnai tiks izdzēsts pēdējais atlikušais lietotājs, tiks izveidots jauns administratīvais lietotājs."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Tiks dzēsti visi ar šo lietotāju saistītie dati, iestatījumi un lietotnes. Jums būs vēlreiz jāiestata sistēma."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Jauna administratora izvēle"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Nepieciešams vismaz viens administrators. Lai dzēstu šo administratoru, vispirms izvēlieties aizvietotāju."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Izvēlēties administratoru"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Viesis"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Viesis"</string>
     <string name="user_switch" msgid="6544839750534690781">"Pārslēgt"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Jūs (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Vārds"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nav iestatīts"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Lietotāja vārda rediģēšana"</string>
     <string name="users_list_title" msgid="770764290290240909">"Lietotāji"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Lietotāja %1$s atļaujas"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Konti"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Lietotājs"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Pievienot kontu"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nav pievienots neviens konts"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Lietotāja <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> konti"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automātiski sinhronizēt datus"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Ļaut lietotnēm automātiski atsvaidzināt datus"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Vai ieslēgt datu sinhronizāciju?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Visas jūsu tīmekļa kontos veiktās izmaiņas tiks automātiski kopētas uz jūsu ierīci.\n\nNoteiktiem kontiem visas tālrunī veiktās izmaiņas var arī tikt automātiski kopētas uz tīmekļa kontu. Šādi darbojas arī Google konts."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Vai izslēgt datu sinhronizāciju?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Dati tiks saglabāti, taču jums būs jāsinhronizē katra konta dati manuāli, lai iegūtu jaunāko informāciju. Turklāt jūs nesaņemsiet paziņojumus par atjauninājumiem."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informācija par kontu"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Konta pievienošana"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Konta pievienošana"</string>
@@ -190,16 +340,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Noņemt kontu"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Vai noņemt kontu?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Noņemot šo kontu, no ierīces tiks dzēsti arī visi šajā kontā esošie ziņojumi, kontaktpersonas un citi dati."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Jūsu administrators neļauj veikt šīs izmaiņas."</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Vai noņemt šo lietotāju?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Tiks dzēstas visas lietotnes un dati."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Neizdevās noņemt lietotāju"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Vai mēģināt vēlreiz?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Aizvērt"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Mēģināt vēlreiz"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Jauns lietotājs"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Ikviens lietotājs var atjaunināt lietotnes citu lietotāju vietā."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Neizdevās noņemt kontu"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Konta sinhronizācija"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinhronizācija ieslēgta <xliff:g id="ID_1">%1$d</xliff:g> no <xliff:g id="ID_2">%2$d</xliff:g> vienumiem"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinhronizācija ieslēgta visiem vienumiem"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinhronizācija izslēgta visiem vienumiem"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinhronizācija IZSLĒGTA"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sinhronizācijas kļūda"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Pēdējoreiz sinhronizēts: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Pašlaik notiek sinhronizācija…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Pieskarieties, lai sinhronizētu tūlīt (pēdējoreiz sinhronizēts: <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhronizēt tūlīt"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Atcelt sinhronizāciju"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Pašlaik ir sinhronizācijas problēmas. Drīz šī darbība atkal būs pieejama."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Drošība"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekrāna bloķēšana"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nav"</string>
@@ -207,7 +361,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Parole"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Bloķēšanas veids"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Ekrāna bloķēšanas opcijas"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Bloķēšanas iespējas"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Ievadiet savu kombināciju"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Apstiprināt"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Atkārtoti zīmēt"</string>
@@ -217,7 +371,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ekrāna bloķēšanas iestatīšana"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Izvēlieties PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Kombinācijas izvēle"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Izvēlieties paroli"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Izvēlieties paroli"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Pašreizējais ekrāna bloķēšanas veids"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Drošības nolūkos iestatiet kombināciju."</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Notīrīt"</string>
@@ -295,7 +449,29 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Jūsu IT administrators ir bloķējis pārāk vienkāršas paroles. Izmēģiniet sarežģītāku paroli."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Nav atļauta augoša, dilstoša vai atkārtota ciparu secība."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Ekrāna bloķēšanas opcijas"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: pirms <xliff:g id="NUM_DAYS">%3$s</xliff:g> dienām"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Pievienot uzticamu ierīci"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Uzticamas ierīces"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> ierīču</item>
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ierīce</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ierīces</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Jūsu ierīce <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> atbloķēs šo automašīnu, ja ierīcei būs izveidots savienojums ar to. Ja kāda persona paņem jūsu ierīci <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, šī persona var piekļūt jūsu ierīcei."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Apstiprināt"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Noņemt uzticamo ierīci"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Gatavs"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Izmantojiet palīglietotni, lai iestatītu uzticamu ierīci. Pēc iestatīšanas varēsiet atbloķēt savu lietotāja profilu, kad transportlīdzeklī tiks konstatēts jūsu tālrunis."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Lejupielādējiet palīglietotni savā tālrunī."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Tālrunī atlasiet automašīnas nosaukumu (<xliff:g id="CAR_NAME">%1$s</xliff:g>), lai ierīces savienotu pārī."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Sistēma Smart Lock nevar noteikt šīs ierīces drošības funkcijas. Lai palīdzētu aizsargāt jūsu automašīnu, uzticamā ierīce varēs neļaut bloķēt automašīnu tikai tad, kad to jau būsiet atbloķējis. Jūsu uzticamā ierīce var neļaut bloķēt automašīnu, kad tā atrodas tuvumā, pat ja ierīci tur cita persona."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Uzticamas ierīces (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>) pievienošana"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Ierīce <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ir sekmīgi pievienota kā uzticama ierīce."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Neizdevās reģistrēt ierīci <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Pievienojot uzticamu ierīci, jums ir jāiestata arī autentifikācijas metode. Autentifikācija būs nepieciešama, lai jūs varētu piekļūt savam profilam, ja jums nebūs līdzi jūsu uzticamā ierīce."</string>
     <string name="forget" msgid="3971143908183848527">"Aizmirst"</string>
+    <string name="connect" msgid="5861699594602380150">"Izveidot savienojumu"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Atvienot"</string>
     <string name="delete_button" msgid="5840500432614610850">"Dzēst"</string>
     <string name="remove_button" msgid="6664656962868194178">"Noņemt"</string>
     <string name="cancel" msgid="750286395700355455">"Atcelt"</string>
@@ -305,8 +481,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Iziešana no demonstr. režīma"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Tādējādi tiks dzēsts demonstrācijas konts un sistēmā tiks atiestatīti rūpnīcas dati. Visi lietotāja dati tiks zaudēti."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Iziet no demonstr. režīma"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"pabeigt iestatīšanu"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"vēlāk"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"NERĀDĪT"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkcija nav pieejama braukšanas laikā."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Nevar pievienot lietotāju braukšanas laikā."</string>
 </resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 2d5542b..097b55e 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"затемни екран, екран на допир, батерија"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"затемнет екран, ноќ, обојување"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Ноќен режим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Мрежа и интернет"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобилна мрежа"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилен интернет"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Пристап на интернет преку мобилната мрежа"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Да се исклучи мобилниот интернет?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Потрошен сообраќај"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Предупредување/ограничување на интернет"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Циклус на потрошен сообраќај од апликац."</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Поставете предупр. за интернет"</string>
+    <string name="data_warning" msgid="116776633806885370">"Предупредување за интернетот"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Поставете огранич. на интернет"</string>
+    <string name="data_limit" msgid="227338836292511425">"Ограничување на интернетот"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ограничување на потрошениот сообраќај"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Главната единица на возилото ќе го исклучи мобилниот интернет откако ќе се достигне ограничувањето што сте го поставиле.\n\nСо оглед на тоа дека главната единица го мери потрошениот сообраќај, а операторот може да го мери поинаку, размислете за поставување пониско ограничување."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Постави и управувај со безжични пристапни точки"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Вклучување Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Исклучување Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Се вчитува списокот со Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi е оневозможено"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Не успеа да се заборави мрежата"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Не успеа да се поврзе со мрежата"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Додај мрежа"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi е оневозможено"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Поврзи"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Лозинка"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Прикажи ја лозинката"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Име на мрежата"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Внеси SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Безбедност"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Јачина на сигнал"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Јачина на сигнал"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Статус"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Брзина на врска"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Зачестеност"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-адреса"</string>
+    <string name="show_password" msgid="2074628020371139240">"Прикажи ја лозинката"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Внесете име на мрежа"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Внесете лозинка"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Слаб"</item>
-    <item msgid="2032262610626057081">"Умерен"</item>
-    <item msgid="3859756017461098953">"Добар"</item>
-    <item msgid="1521103743353335724">"Одличен"</item>
+    <item msgid="7683058295076342057">"Слаб"</item>
+    <item msgid="1639222824821660744">"Умерен"</item>
+    <item msgid="1838705897358163300">"Добар"</item>
+    <item msgid="6067166649320533751">"Одличен"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Вклучи Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth е оневозможен"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Детали за мрежа"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-адреса"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-адреса"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Маска на подмрежа"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-адреси"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Мрежен мост"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Поставки за Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Вклучувај Wi‑Fi автоматски"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi ќе се вклучува на зачувани мрежи со висок квалитет во близина, како на пр., домашната мрежа"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Недостапно, локацијата е исклучена. Вклучете ја "<annotation id="link">"локацијата"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Да се вклучи скенирањето Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Вклучи"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Скенирањето Wi‑Fi е вклучено"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Автоматски префрли се на мобилен интернет"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Користете мобилен интернет кога Wi‑Fi нема пристап до интернет. Може да ви се наплати за потрошениот сообраќај."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Дознајте повеќе"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Управувај со конекции, подеси име и откривливост на уредот"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Компјутер"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Слушалки"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Телефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Слики"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Слушалка"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Периферен влез"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Спарени уреди"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Достапни уреди"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Нема спарени уреди"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Нема достапни уреди"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Спарен уред"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Име"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Користи за"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Сменете го името на Bluetooth-уредот"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Неименуван уред"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Спарени уреди"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Спарете нов уред"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth ќе се вклучи за спарување"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Да прекине врската со уредот?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Вашето возило е исклучено од <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Адреса на Bluetooth на возилото: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Адреса на Bluetooth на уредот: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Име на возилото"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Преименувајте го возилово"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Преименувајте го уредот"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Преименувај"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Достапни уреди"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профили"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Барање за спарување преку Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Спари и поврзи"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Код за спарување на Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN-от содржи букви или симболи"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Внесете го кодот за спарување, а потоа притиснете Врати или Внеси"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Обично 0000 или 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Барање за спарување"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Допрете за да се спари со <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Јазици"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Јазици и внесување"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Тастатура"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Управување со тастатури"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Излез „од текст во говор“"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Претпочитан софтвер"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Тековен софтвер"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Брзина на говор"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Висина на глас"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Ресетирај"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Звук"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Јачина на звук на ѕвонење"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Јачина на звук на навигацијата"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Аудиовиз. содржини"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Постави јачина на звук за музика и видеа"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Аларм"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Мелодија на телефонот"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Стандарден звук за известување"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Стандарден звук за аларм"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Апликации и известувања"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Прикажи ги сите апликации"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Стандардни апликации"</string>
     <string name="applications_settings" msgid="794261395191035632">"Информации за апликациите"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Исклучи присилно"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Исклучи присилно?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ако присилно запрете апликација, таа може да не се однесува правилно."</string>
     <string name="disable_text" msgid="4358165448648990820">"Оневозможи"</string>
     <string name="enable_text" msgid="1794971777861881238">"Овозможи"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Деинсталирај"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ако ја оневозможите оваа апликација, Android и другите апликации можеби веќе нема да функционираат како што треба."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Оневозможете ја апликацијата"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Дозволи"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Верзија %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Не се доделени дозволи"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Не се побарани дозволи"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Потрошен сообраќај"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Сообраќај на апликациите"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Исклучи присилно"</string>
     <string name="computing_size" msgid="5791407621793083965">"Пресметување…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дополнителна дозвола</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дополнителни дозволи</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помош и гласовен запис"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Апликација за помош"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Користи го текстот од екранот"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Дозволи апликацијата за помош да пристапи до содржините на екранот како текст"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Користи ја сликата од екранот"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Дозволи апликацијата за помош да пристапи до слика од екранот"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Услуга за автоматско пополнување"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Нема"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Избрана"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Помошникот ќе може да чита информации за апликациите што се користат во системот, вклучувајќи ги информациите што се видливи на екранот или до коишто може се пристапи во апликациите."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Проверете дали е ова апликација на која ѝ верувате&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=„Автоматско пополнување на Google“&gt;%1$s&lt;/xliff:g&gt; го користи она што е на екранот за да утврди што може автоматски да се пополни."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Додај услуга"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Локација"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Последни барања за локација"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Нема неодамнешни барања за локација"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дозволи на ниво на апликација"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Скенирање"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Услуги според локација"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Скенирање на Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Дозволете апликациите и услугите да скенираат Wi-Fi мрежи во секое време, дури и кога Wi-Fi е исклучено. Ова може да се користи, на пример, за да се подобрат функциите и услугите базирани на локација."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Скенирање на Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Дозволете апликациите и услугите да скенираат уреди во близина во секое време, дури и кога Bluetooth е исклучен. Ова може да се користи, на пример, за да се подобрат функциите и услугите базирани на локација."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Систем"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Ажурирања на системот"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Ажурирања на системот"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Верзија на Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ниво на безбедносна лепенка на Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Модел"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Верзија со основен појас на фреквенција"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Верзија на кернел"</string>
     <string name="build_number" msgid="3997326631001009102">"Број на верзија"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Адреса на Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Не се достапни"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Статус"</string>
     <string name="device_status" msgid="267298179806290920">"Статус"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Авторско право"</string>
     <string name="license_title" msgid="936705938435249965">"Лиценца"</string>
     <string name="terms_title" msgid="5201471373602628765">"Правила и услови"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Системска лиценца за WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Системски лиценци за WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Тапети"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Даватели на сателитски снимки:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лиценци на трети лица"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Постои проблем при вчитување на лиценците."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Се вчитува…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Сега сте на <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> чекор поблиску да станете програмер.</item>
+      <item quantity="other">Сега сте на <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> чекори поблиску да станете програмер.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Сега сте програмер!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Нема потреба, веќе сте програмер."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Опции за програмери"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Опции за ресетирање"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Мрежа, апликации или ресетирање на уредот"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Ресетирај ја мрежата"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ова ќе ги ресетира сите мрежни поставки, вклучувајќи:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобилен интернет"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Избриши ги сите eSIM-картички на возилото"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Ова нема да го откаже вашиот пакет со услуги."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Не може да се ресетираат eSIM-картичките"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Изберете мрежа"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Ресетирај поставки"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Ресетирај?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Да се ресетираат сите мрежни поставки? Не може да се врати ова дејство!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Ресетирај поставки"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Мрежните поставки се ресетирани"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Ресетирај ги поставките за апликациите"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Со ова ќе се ресетираат сите поставки за:\n\n"<li>"оневозможените апликации;"</li>\n<li>"оневозможените известувања за апликации;"</li>\n<li>"стандардните апликации за дејства;"</li>\n<li>"ограничувањата за податоци од заднина за апликациите;"</li>\n<li>"сите ограничувања за дозволите."</li>\n\n"Нема да изгубите никакви податоци на апликациите."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Ресетирај апликации"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Параметрите за апликацијата се ресетирани"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Избриши ги сите податоци"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Ова ќе ги избрише сите податоци од уредот за на глава на возилото, заедно со:\n\n"<li>"вашата сметка на Google;"</li>\n<li>"податоците и поставките на системот и апликациите;"</li>\n<li>"преземените апликации."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Моментално сте најавени на следниве сметки:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Присутни се и други корисници на возилово."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Ресетирај го возилото"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Ресетирај?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Дали да се избришат сите ваши лични податоци и преземени апликации? Не може да го вратите ова дејство!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Избриши сѐ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Се брише"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Почекајте…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Датум и време"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Постави датум и време"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Постави датум, време, временска зона и формати"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Подреди по временска зона"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Датум"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Време"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Додај корисник"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Додај сметка"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Избриши корисник"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Нов корисник"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Гостин"</string>
     <string name="user_admin" msgid="1535484812908584809">"Администратор"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Најавени сте како администратор"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Сите администраторски дозволи"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Направи го администратор"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Корисникот ќе може да брише други корисници (вклучително и други администратори) и фабрички да го ресетира системот."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ова дејство не може да се врати."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Да, направи го администратор"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Создавање нови корисници"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Телефонирање"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Пораки преку интернет на автомобил"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Инсталирање нови апликации"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Деинсталирање апликации"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Додај корисник"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Нов корисник"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Да се додаде нов корисник?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Кога додавате нов корисник, тоа лице треба да го постави својот простор."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Секој корисник може да ажурира апликации за сите други корисници."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Достигнато ограничување на корисник"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Може да создадете најмногу <xliff:g id="COUNT">%d</xliff:g> корисник.</item>
+      <item quantity="other">Може да создадете најмногу <xliff:g id="COUNT">%d</xliff:g> корисници.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Не успеа да создаде нов корисник"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Избриши го корисникот?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Ќе се избришат сите апликации и податоци."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Не успеа да се избрише корисникот."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Отфрли"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Повторно"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Избриши последен корисник?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"По бришењето на единствениот преостанат корисник за автомобилов, ќе се создаде нов корисник-администратор."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Ќе се избришат сите податоци, поставки и апликации поврзани со корисников. Ќе треба повторно да го поставите системот."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Избирање нов администратор"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Треба да имате најмалку еден администратор. За да го избришете постоечкиот, прво изберете замена."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Изберете администратор"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Гостин"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Гостин"</string>
     <string name="user_switch" msgid="6544839750534690781">"Префрли"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Вие (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Име"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не е поставен"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Изменување на корисничкото име"</string>
     <string name="users_list_title" msgid="770764290290240909">"Корисници"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Дадени се дозволи на %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Сметки"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Корисник"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Додај сметка"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Нема додадени сметки"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Сметки за <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Автоматска синхронизација на податоци"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Дозволи апликациите автоматски да ги освежуваат податоците"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Вклучи авто синхрон. на подат.?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Сите промени што ќе ги направите на вашите сметки на интернет автоматски ќе се ископираат на уредот.\n\nНекои сметки можеби автоматски ќе ги ископираат и промените што ги правите на телефонот на интернет. Сметката на Google го прави тоа."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Исклучи авто синхрон. на подат.?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Ова ќе ви заштеди интернет, но ќе треба да ја синхронизирате секоја сметка рачно за да се соберат најновите информации. Освен тоа, нема да добивате известувања за ажурирања."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Информации за сметката"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Додај сметка"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Додај сметка"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Отстрани сметка"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Да се отстрани сметката?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Со отстранување на оваа сметка ќе се избришат сите нејзини пораки, контакти и другите податоци од уредот!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Администраторот не ја дозволува промената"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Да се отстрани корисникот?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Ќе се избришат сите апликации и податоци."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Не успеавме да го отстраниме корисникот"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Повторен обид?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Отфрли"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Повторно"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Да се додаде нов корисник?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Кога додавате нов корисник, тоа лице треба да го постави својот простор."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Секој корисник може да ажурира апликации за сите други корисници."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Не успеа да се отстрани сметката."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Синхронизирање сметка"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Синхронизацијата е вклучена за <xliff:g id="ID_1">%1$d</xliff:g> од <xliff:g id="ID_2">%2$d</xliff:g> ставки"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Синхронизацијата е вклучена за сите ставки"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Синхронизацијата е исклучена за сите ставки"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Синхронизирање ИСКЛУЧЕНО"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Грешка при синхронизирање"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Последно синхронизирање <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Се синхронизира сега…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Допрете да се синхронизира сега <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизирај сега"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Откажи синхронизација"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Синхронизацијата има проблеми во моментов. Ќе се врати наскоро."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безбедност"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Заклучување екран"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Нема"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Лозинка"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Избери тип заклучување"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Опции за заклучување на екранот"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Опции за заклучување"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Внесете ја шемата"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Потврди"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Измени"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Поставете заклучување екран"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Изберете PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Изберете шема"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Изберете лозинка"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Изберете ја вашата лозинка"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Тековно заклучување на екранот"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"За безбедност, поставете шема"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Исчисти"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Обичните лозинки се блокирани од вашиот IT-администратор. Обидете се со друга лозинка."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Не е дозволена низа на цифри со растечки, опаѓачки или повторлив редослед."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Опции за заклучување на екранот"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: пред <xliff:g id="NUM_DAYS">%3$s</xliff:g> дена"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Додај доверлив уред"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Доверливи уреди"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> уред</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> уреди</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Вашиот <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ќе го отклучува автомобилов кога е поврзан. Ако некој ви го земе <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, ќе може да пристапува до уредов"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Потврди"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Отстрани доверлив уред"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Готово"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Употребете ја придружната апликација за да поставите доверлив уред. Откако ќе го поставите, ќе може да го отклучите корисничкиот профил кога возилото ќе го открие вашиот телефон"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Преземете ја придружната апликација на телефонот"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Изберете <xliff:g id="CAR_NAME">%1$s</xliff:g> на телефонот за да ги спарите уредите"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock не може да ги открие безбедносните функции на уредов. За да помогне да се заштити автомобилот, доверливиот уред ќе може да го чува автомобилот отклучен само откако вие ќе го отклучите. Вашиот доверлив уред може да го чува автомобилот отклучен кога е во близина, дури и ако некој друг го држи."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Додајте го <xliff:g id="DEVICE_NAME">%1$s</xliff:g> како доверлив уред"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> е успешно додаден како доверлив уред"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Регистрацијата на <xliff:g id="DEVICE_NAME">%1$s</xliff:g> не успеа"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ако додадете доверлив уред, ќе треба да поставите метод на проверка во следниот чекор. Ако доверливиот уред не ви е при рака, ќе ви биде потребна проверка за да пристапите до профилот."</string>
     <string name="forget" msgid="3971143908183848527">"Избриши го"</string>
+    <string name="connect" msgid="5861699594602380150">"Поврзи"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Исклучи"</string>
     <string name="delete_button" msgid="5840500432614610850">"Избриши"</string>
     <string name="remove_button" msgid="6664656962868194178">"Да"</string>
     <string name="cancel" msgid="750286395700355455">"Откажи"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Излез од демо-режим"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ова ќе ја избрише демо-сметката и ќе ги ресетира фабричките податоци на системот. Сите податоци на корисникот ќе се изгубат."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Излези од демо-режим"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"заврши со поставување"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"не сега"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ОТФРЛИ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Функцијата не е достапна при возење."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Не може да се додаде корисник додека возите."</string>
 </resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index f69d432..be6753a 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"മങ്ങിയ സ്‌ക്രീൻ, ടച്ച്‌സ്‌ക്രീൻ, ബാറ്ററി"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"മങ്ങിയ സ്ക്രീൻ, രാത്രി, ടിന്റ്"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"നൈറ്റ് മോഡ്"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"നെറ്റ്‌വർക്കും ഇന്റർനെറ്റും"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"മൊബൈൽ നെറ്റ്‌വർക്ക്"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"മൊബൈൽ ഡാറ്റ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"മൊബൈൽ നെറ്റ്‌വർക്ക് ഉപയോഗിച്ച് ഡാറ്റ ആക്‌സസ് ചെയ്യുക"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"മൊബൈൽ ഡാറ്റ ഓഫാക്കണോ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ഡാറ്റ ഉപയോഗം"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ഡാറ്റാ മുന്നറിയിപ്പും പരിധിയും"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ആപ്പ് ഡാറ്റാ ഉപയോഗ സൈക്കിൾ"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ഡാറ്റാ മുന്നറിയിപ്പ് സജ്ജീകരിക്കുക"</string>
+    <string name="data_warning" msgid="116776633806885370">"ഡാറ്റാ മുന്നറിയിപ്പ്"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ഡാറ്റാ പരിധി സജ്ജീകരിക്കുക"</string>
+    <string name="data_limit" msgid="227338836292511425">"ഡാറ്റാ പരിധി"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ഡാറ്റാ ഉപയോഗം നിയന്ത്രിക്കുന്നു"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"നിങ്ങൾ സജ്ജീകരിച്ചിരിക്കുന്ന പരിധി എത്തുമ്പോൾ നിങ്ങളുടെ വാഹനത്തിൻ്റെ ഹെഡ് യൂണിറ്റ്, മൊബൈൽ ഡാറ്റാ ഓഫാക്കും.\n\nഡാറ്റാ ഉപയോഗം ഹെഡ് യൂണിറ്റിൽ അളക്കുന്നതിനാലും, നിങ്ങളുടെ കാരിയർ വ്യത്യസ്‌ത രീതിയിൽ ഉപയോഗം കണക്കാക്കിയേക്കാം എന്നതിനാലും മിതമായ ഡാറ്റാ പരിധി സജ്ജീകരിക്കാൻ നോക്കുക."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"വൈഫൈ"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"വയർലെസ് ആക്‌സസ് പോയിന്റുകൾ സജ്ജീകരിക്കുക, നിയന്ത്രിക്കുക"</string>
     <string name="wifi_starting" msgid="473253087503153167">"വൈഫൈ ഓണാക്കുന്നു…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"വൈഫൈ ഓഫാക്കുന്നു…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"വൈഫൈ ലിസ്‌റ്റ് ലോഡ് ചെയ്യുന്നു"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"വൈഫൈ പ്രവർത്തനരഹിതമാക്കി"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"നെറ്റ്‌വർക്ക് നിരസിക്കുന്നത് പരാജയപ്പെട്ടു"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"നെറ്റ്‌വർക്കിൽ കണക്‌റ്റ് ചെയ്യുന്നത് പരാജയപ്പെട്ടു"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"നെറ്റ്‌വർക്ക് ചേർക്കുക"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"വൈഫൈ പ്രവർത്തനരഹിതമാക്കി"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"കണക്റ്റ് ചെയ്യൂ"</string>
     <string name="wifi_password" msgid="5565632142720292397">"പാസ്‌വേഡ്"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"പാസ്‌വേഡ് കാണിക്കുക"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"നെറ്റ്‌വർക്കിന്‍റെ പേര്"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID നൽകുക"</string>
     <string name="wifi_security" msgid="158358046038876532">"സുരക്ഷ"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"സിഗ്‌നൽ ശക്തി"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"സിഗ്‌നൽ ശക്തി"</string>
     <string name="wifi_status" msgid="5688013206066543952">"സ്റ്റാറ്റസ്"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"ലിങ്ക് വേഗത"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ആവൃത്തി"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP വിലാസം"</string>
+    <string name="show_password" msgid="2074628020371139240">"പാസ്‌വേഡ് കാണിക്കുക"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"നെറ്റ്‌വർക്കിന്‍റെ പേര് നൽകുക"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"പാസ്‌വേഡ് നൽകുക"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"മോശം"</item>
-    <item msgid="2032262610626057081">"തൃപ്‌തികരം"</item>
-    <item msgid="3859756017461098953">"നല്ലത്"</item>
-    <item msgid="1521103743353335724">"മികച്ചത്"</item>
+    <item msgid="7683058295076342057">"മോശം"</item>
+    <item msgid="1639222824821660744">"തൃപ്‌തികരം"</item>
+    <item msgid="1838705897358163300">"നല്ലത്"</item>
+    <item msgid="6067166649320533751">"മികച്ചത്"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth ഓണാക്കുക"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth പ്രവർത്തനരഹിതമാക്കി"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"നെറ്റ്‌വർക്ക് വിശദാംശങ്ങൾ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC വിലാസം"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP വിലാസം"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"സബ്‌നെറ്റ് മാസ്‌ക്"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 വിലാസങ്ങൾ"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ഗേറ്റ്‌വേ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"വൈഫൈ മുൻഗണനകൾ"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"വൈഫൈ സ്വയമേവ ഓണാക്കുക"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"നിങ്ങളുടെ വീട്ടിലെ നെറ്റ്‌വർക്ക് പോലെയുള്ള, ഉയർന്ന നിലവാരമുള്ള സംരക്ഷിത നെറ്റ്‍വർക്കുകൾക്ക് അരികിലായിരിക്കുമ്പോൾ വൈഫൈ തിരികെ ഓണാകും"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"ലൊക്കേഷൻ ഓഫായതിനാലാണ് ലഭ്യമല്ലാത്തത്. "<annotation id="link">"ലൊക്കേഷൻ"</annotation>" ഓണാക്കുക."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"വൈഫൈ സ്‌കാനിംഗ് ഓണാക്കണോ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ഓണാക്കുക"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"വൈഫൈ സ്‌കാനിംഗ് ഓണാക്കി"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"മൊബൈൽ ഡാറ്റയിലേക്ക് സ്വയമേവ മാറുക"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"വൈഫൈയിൽ നിന്നുള്ള ഇന്‍റർനെറ്റ് ആക്‌സ‌സ് ഇല്ലാത്തപ്പോൾ മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കുക. ഡാറ്റാ ഉപയോഗ നിരക്കുകൾ ബാധകമായേക്കാം."</string>
+    <string name="learn_more" msgid="8214605928933358604">"കൂടുതലറിയുക"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"കണ‌ക്ഷനുകൾ നിയന്ത്രിച്ച് ഉപകരണത്തിന്റെ പേരും കണ്ടെത്തൽ ക്ഷമതയും സജ്ജീകരിക്കുക"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"കമ്പ്യൂട്ടർ"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ഹെഡ്‌സെറ്റ്"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ഫോൺ"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ഇമേജിംഗ്"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ഹെഡ്ഫോൺ"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ഇൻപുട്ട് പെരിഫറൽ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"ജോടിയാക്കിയ ഉപകരണങ്ങൾ"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ലഭ്യമായ ഉപകരണങ്ങൾ"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ജോടിയാക്കിയ ഉപകരണങ്ങളൊന്നുമില്ല"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"ലഭ്യമായ ഉപകരണങ്ങളൊന്നുമില്ല"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"ജോടിയാക്കിയ ഉപകരണം"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"പേര്"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"ഇതിന് ഉപയോഗിക്കുക"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth ഉപകരണത്തിന്റെ പേര് മാറ്റുക"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"പേരിടാത്ത ഉപകരണം"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"ജോടിയാക്കിയ ഉപകരണങ്ങൾ"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"പുതിയ ഉപകരണവുമായി ജോടിയാക്കുക"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"ജോടിയാക്കുന്നതിന്, Bluetooth ഓണാകും"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ഉപകരണം വിച്‌ഛേദിക്കണോ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ വാഹനം വിച്ഛേദിക്കും."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"വാഹനത്തിന്റെ Bluetooth വിലാസം: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ഉപകരണത്തിന്റെ Bluetooth വിലാസം: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"വാഹനത്തിന്റെ Bluetooth പേര്"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ഈ വാഹനത്തിന്റെ പേര് മാറ്റുക"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ഉപകരണത്തിന്റെ പേര് മാറ്റുക"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"പേര് മാറ്റുക"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ലഭ്യമായ ഉപകരണങ്ങൾ"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"പ്രൊഫൈലുകള്‍‌"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth ജോടിയാക്കൽ അഭ്യർത്ഥന"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ജോടിയാക്കി കണ‌ക്‌റ്റ് ചെയ്യുക"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth ജോടിയാക്കൽ കോഡ്"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"പിന്നിൽ അക്ഷരങ്ങളോ ചിഹ്നങ്ങളോ അടങ്ങിയിരിക്കുന്നു"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"ജോടിയാക്കൽ കോഡ് ടൈപ്പ് ചെയ്യുക തുടർന്ന് \'മടങ്ങുക\' അല്ലെങ്കിൽ \'എന്റർ\' അമർത്തുക"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"സാധാരണ 0000 അല്ലെങ്കിൽ 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"ജോടിയാക്കൽ അഭ്യർത്ഥന"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്ന ഉപകരണവുമായി ജോടിയാക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ഭാഷകൾ"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ഭാഷകളും ഇൻപുട്ടും"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"കീബോർഡ്"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"കീബോർഡുകൾ മാനേജ് ചെയ്യുക"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"ടെക്‌സ്‌റ്റ് ടു സ്‌പീച്ച് ഔട്ട്‌പുട്ട്"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"തിരഞ്ഞെടുത്ത എഞ്ചിൻ"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"നിലവിലെ എഞ്ചിൻ"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"സംഭാഷണത്തിന്റെ റേറ്റ്"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"പിച്ച്"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"പുനഃസജ്ജീകരിക്കുക"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ശബ്‌ദം"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"റിംഗ് വോളിയം"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"നാവിഗേഷൻ വോളിയം"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"മീഡിയ"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"സംഗീതത്തിനും വീഡിയോകൾക്കുമായി വോളിയം സജ്ജീകരിക്കുക"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"അലാറം"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ഫോണിന്റെ റിംഗ്ടോൺ"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ഡിഫോൾട്ടായ അറിയിപ്പ് ശബ്‌ദം"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ഡിഫോൾട്ടായ അലാറം ശബ്‌ദം"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ആപ്പുകളും അറിയിപ്പുകളും"</string>
+    <string name="all_applications" msgid="7798210477486822168">"എല്ലാ ആപ്പുകളും കാണിക്കൂ"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ഡിഫോൾട്ട് ആപ്പുകൾ"</string>
     <string name="applications_settings" msgid="794261395191035632">"ആപ്പ് വിവരം"</string>
+    <string name="force_stop" msgid="2153183697014720520">"നിർബന്ധിതമായി നിർത്തുക"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"നിർബന്ധിതമായി നിർത്തണോ?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"നിങ്ങൾ ഒരു ആപ്പ് നിർബന്ധിതമായി നിർത്തിയാൽ, അത് ശരിയായി പ്രവർത്തിക്കാനിടയില്ല."</string>
     <string name="disable_text" msgid="4358165448648990820">"പ്രവർത്തനരഹിതമാക്കുക"</string>
     <string name="enable_text" msgid="1794971777861881238">"പ്രവർത്തനക്ഷമമാക്കുക"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"അൺഇൻസ്‌റ്റാൾ ചെയ്യുക"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"നിങ്ങൾ ഈ ആപ്പ് പ്രവർത്തനരഹിതമാക്കിയാൽ, Android-ഉം മറ്റ് ആപ്പുകളും ഇനി ഉദ്ദേശിച്ചത് പോലെ പ്രവർത്തിച്ചേക്കില്ല."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ആപ്പ് പ്രവർത്തനരഹിതമാക്കുക"</string>
     <string name="permissions_label" msgid="2701446753515612685">"അനുമതികൾ"</string>
     <string name="application_version_label" msgid="8556889839783311649">"പതിപ്പ്: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"അനുമതികളൊന്നും അനുവദിച്ചില്ല"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"അനുമതികളൊന്നും അഭ്യർത്ഥിച്ചില്ല"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ഡാറ്റ ഉപയോഗം"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ആപ്പ് ഡാറ്റ ഉപയോഗം"</string>
-    <string name="force_stop" msgid="2153183697014720520">"നിർബന്ധിതമായി നിർത്തുക"</string>
     <string name="computing_size" msgid="5791407621793083965">"കണക്കാക്കുന്നു…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> അധിക അനുമതികൾ</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> അധിക അനുമതി</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"അസിസ്‌റ്റും വോയ്‌സ് ഇൻപുട്ടും"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"സഹായ ആപ്പ്"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"സ്ക്രീനിലെ ടെക്‌സ്‌റ്റ് ഉപയോഗിക്കുക"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"ടെക്‌സ്‌റ്റ് ആയി സ്ക്രീൻ ഉള്ളടക്കങ്ങൾ ആക്‌സസ് ചെയ്യാൻ, സഹായ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"സ്ക്രീൻഷോട്ട് ഉപയോഗിക്കുക"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"സ്ക്രീനിലെ ഒരു ചിത്രം ആക്‌സസ് ചെയ്യാൻ, സഹായ ആപ്പിനെ അനുവദിക്കുക"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"സ്വയമേവ പൂരിപ്പിക്കൽ സേവനം"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ഒന്നുമില്ല"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"തിരഞ്ഞെടുത്തു"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആപ്പുകൾക്കുള്ളിൽ ആക്‌സസ് ചെയ്യാവുന്നതോ ആയ വിവരങ്ങൾ ഉൾപ്പെടെ, നിങ്ങളുടെ സിസ്‌റ്റത്തിൽ ഉപയോഗത്തിലുള്ള ആപ്പുകളെ കുറിച്ചുള്ള വിവരങ്ങൾ വായിക്കാൻ അസിസ്‌റ്റൻന്റിനാവും."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;നിങ്ങൾ ഈ ആപ്പിനെ വിശ്വസിക്കുന്നുണ്ടെന്ന് ഉറപ്പുവരുത്തുക&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; സ്വയമേവ പൂരിപ്പിക്കേണ്ടത് എന്താണെന്ന് നിർണ്ണയിക്കുന്നതിന് നിങ്ങളുടെ സ്‌ക്രീനിൽ ഉള്ളത് ഉപയോഗിക്കുന്നു."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"സേവനം ചേർക്കുക"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ലൊക്കേഷൻ"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"അടുത്തിടെയുള്ള ലൊക്കേഷൻ അഭ്യർത്ഥനകൾ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"അടുത്തിടെയുള്ള ലൊക്കേഷൻ അഭ്യർത്ഥനകളൊന്നുമില്ല"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ആപ്പ്-തല അനുമതികൾ"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"സ്‌കാൻ ചെയ്യുന്നു"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"ലൊക്കേഷൻ സേവനങ്ങൾ"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"വൈഫൈ സ്‌കാനിംഗ്"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"വൈഫൈ ഓഫാണെങ്കിൽ പോലും, ഏതുസമയത്തും വൈഫൈ നെറ്റ്‌വർക്കുകൾ സ്‌കാൻ ചെയ്യാൻ ആപ്പുകളെയും സേവനങ്ങളെയും അനുവദിക്കുക. ഉദാഹരണത്തിന്, ലൊക്കേഷൻ‌ അടിസ്ഥാനമാക്കിയുള്ള ഫീച്ചറുകളും സേവനങ്ങളും മെച്ചപ്പെടുത്താൻ ഇത് ഉപയോഗിക്കാം."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth സ്‌കാനിംഗ്"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Bluetooth ഓഫാണെങ്കിൽ പോലും, ഏതുസമയത്തും അടുത്തുള്ള ഉപകരണങ്ങൾ സ്‌കാൻ ചെയ്യാൻ ആപ്പുകളെയും സേവനങ്ങളെയും അനുവദിക്കുക. ഉദാഹരണത്തിന്, ലൊക്കേഷൻ‌ അടിസ്ഥാനമാക്കിയുള്ള ഫീച്ചറുകളും സേവനങ്ങളും മെച്ചപ്പെടുത്താൻ ഇത് ഉപയോഗിക്കാം."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"സിസ്റ്റം"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"സി‌സ്‌റ്റം അപ്‌ഡേറ്റുകൾ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"സി‌സ്‌റ്റം അപ്‌ഡേറ്റുകൾ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android പതിപ്പ്"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android സുരക്ഷാ പാച്ച് നില"</string>
     <string name="model_info" msgid="4966408071657934452">"മോഡല്‍"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ബെയ്‌സ്‌ബാൻഡ് പതിപ്പ്"</string>
     <string name="kernel_version" msgid="7327212934187011508">"പ്രധാന പതിപ്പ്"</string>
     <string name="build_number" msgid="3997326631001009102">"ബിൽഡ് നമ്പർ"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth വിലാസം"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"ലഭ്യമല്ല"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"സ്റ്റാറ്റസ്"</string>
     <string name="device_status" msgid="267298179806290920">"സ്റ്റാറ്റസ്"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"പകർപ്പവകാശം"</string>
     <string name="license_title" msgid="936705938435249965">"ലൈസന്‍സ്"</string>
     <string name="terms_title" msgid="5201471373602628765">"നിബന്ധനകളും വ്യവസ്ഥകളും"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"സിസ്‌റ്റം WebView ലൈസൻസ്"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"സിസ്‌റ്റം WebView ലൈസൻസുകൾ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"വാൾപേപ്പറുകൾ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ഉപഗ്രഹ ഇമേജറി ദാതാക്കൾ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"മൂന്നാം കക്ഷി ലൈസൻസുകൾ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ലൈസൻസുകൾ ലോഡ് ചെയ്യുന്നതിൽ ഒരു പ്രശ്നമുണ്ട്."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"ലോഡ് ചെയ്യുന്നു…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ചുവടുകൾ അകലെയാണ് നിങ്ങളിപ്പോൾ.</item>
+      <item quantity="one">ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ചുവട് അകലെയാണ് നിങ്ങളിപ്പോൾ.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"നിങ്ങൾ ഇപ്പോൾ ഒരു ഡവലപ്പറാണ്!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"ആവശ്യമില്ല, നിങ്ങൾ മുമ്പേ ഒരു ഡവലപ്പറാണ്."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ഡെവലപ്പർ ഓപ്‌ഷനുകൾ"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ഓപ്‌ഷനുകള്‍ പുനഃക്രമീകരിക്കുക"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"നെറ്റ്‌വർക്ക്, ആപ്പുകൾ, അല്ലെങ്കിൽ ഉപകരണം പുനഃക്രമീകരിക്കുക"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"നെറ്റ്‌വർക്ക് പുനഃസജ്ജീകരിക്കുക"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ഇനിപ്പറയുന്നത് ഉൾപ്പെടെ, എല്ലാ നെറ്റ്‌വർക്ക് ക്രമീകരണവും ഇത് പുനഃസജ്ജീകരിക്കും:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"വൈഫൈ"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"മോബൈൽ ഡാറ്റ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"എല്ലാ വാഹന ഇ-സിമ്മുകളും മായ്ക്കുക"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ഇത് നിങ്ങളുടെ സേവന പ്ലാൻ റദ്ദാക്കില്ല."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"ഇ-സിമ്മുകൾ പുനഃസജ്ജീകരിക്കാനാവില്ല"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"നെറ്റ്‌വർക്ക് തിരഞ്ഞെടുക്കുക"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ക്രമീകരണം പുനഃസജ്ജീകരിക്കുക"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"പുനഃസജ്ജീകരിക്കണോ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"എല്ലാ നെറ്റ്‌വർക്കിംഗ് ക്രമീകരണവും പുനഃസജ്ജീകരിക്കണോ? നിങ്ങൾക്ക് ഈ പ്രവർത്തനം പഴയപടിയാക്കാനാവില്ല!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ക്രമീകരണം പുനഃസജ്ജീകരിക്കുക"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"നെറ്റ്‌വർക്ക് ക്രമീകരണം പുനഃസജ്ജീകരിച്ചു"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ആപ്പ് മുൻഗണനകൾ പുനഃസജ്ജീകരിക്കുക"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ഇത് ഇനിപ്പറയുന്നവയ്‌ക്കുള്ള എല്ലാ മുൻഗണനകളും പുനഃസജ്ജീകരിക്കും:\n\n"<li>"പ്രവർത്തനരഹിതമാക്കിയ ആപ്പുകൾ"</li>\n<li>"പ്രവർത്തനരഹിതമാക്കിയ ആപ്പ് അറിയിപ്പുകൾ"</li>\n<li>"പ്രവർത്തനങ്ങൾക്കുള്ള ഡിഫോൾട്ട് ആപ്പുകൾ"</li>\n<li>"ആപ്പുകൾക്കുള്ള പശ്ചാത്തല ഡാറ്റാ നിയന്ത്രണങ്ങൾ"</li>\n<li>"ഏതെങ്കിലും അനുമതി നിയന്ത്രണങ്ങൾ"</li>\n\n"നിങ്ങൾക്ക് ഏതെങ്കിലും ആപ്പ് ഡാറ്റ നഷ്‌ടമാവില്ല."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ആപ്പുകൾ പുനഃസജ്ജീകരിക്കുക"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ആപ്പ് മുൻഗണനകൾ പുനഃസജ്ജീകരിച്ചു"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"എല്ലാ ഡാറ്റയും മായ്‌ക്കുക (ഫാക്‌ടറി റീസെറ്റ്)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ഇവയുൾപ്പെടെ നിങ്ങളുടെ വാഹനത്തിൻ്റെ ഹെഡ് യൂണിറ്റിൽ നിന്നുള്ള എല്ലാ ഡാറ്റയും ഇത് മായ്‌ക്കും:\n\n"<li>"നിങ്ങളുടെ Google അക്കൗണ്ട്"</li>\n<li>"സിസ്‌റ്റത്തിൻ്റെയും ആപ്പിൻ്റെയും ഡാറ്റയും ക്രമീകരണവും"</li>\n<li>"ഡൗൺലോഡ് ചെയ്‌ത ആപ്പുകൾ"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"നിലവിൽ നിങ്ങൾ ഇനിപ്പറയുന്ന അക്കൗണ്ടുകളിലേക്ക് സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്നു:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ഈ വാഹനത്തിൽ മറ്റ് ഉപയോക്താക്കളുണ്ട്."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"വാഹനത്തിലെ ക്രമീകരണം പുനഃസജ്ജീകരിക്കുക"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"പുനഃസജ്ജീകരിക്കണോ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"നിങ്ങളുടെ എല്ലാ വ്യക്തിഗത വിവരവും ഡൗൺലോഡ് ചെയ്‌ത ആപ്പുകളും മായ്‌ക്കണോ? നിങ്ങൾക്ക് ഈ പ്രവർത്തനം പഴയപടിയാക്കാനാകില്ല!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"എല്ലാം മായ്ക്കുക"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"മായ്‌ക്കുന്നു"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"കാത്തിരിക്കുക..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"തീയതിയും സമയവും"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"തീയതിയും സമയവും സജ്ജമാക്കുക"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"തീയതി, സമയം, സമയ മേഖല, ഫോർമാറ്റുകൾ എന്നിവ സജ്ജീകരിക്കുക"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"സമയ മേഖലയനുസരിച്ച് അടുക്കുക"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"തീയതി"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"സമയം"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"ഉപയോക്താവിനെ ചേര്‍ക്കുക"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"അക്കൗണ്ട് ചേർക്കുക"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ഉപയോക്താവിനെ ഇല്ലാതാക്കുക"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"പുതിയ ഉപയോക്താവ്"</string>
-    <string name="user_guest" msgid="3465399481257448601">"അതിഥി"</string>
     <string name="user_admin" msgid="1535484812908584809">"അഡ്‌മിന്‍"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"അഡ്‌മിൻ ആയി സൈൻ ഇൻ ചെയ്‌തു"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"എല്ലാ അഡ്‌മിൻ അനുമതികളും"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"അഡ്‌മിൻ അനുമതി നൽകുക"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ഉപയോക്താവിന് മറ്റ് അഡ്‌മിനുകൾ ഉൾപ്പെടെയുള്ള ഉപയോക്താക്കളെ ഇല്ലാതാക്കാനും സിസ്‌റ്റത്തിന്റെ ഫാക്‌ടറി പുനഃസജ്ജീകരിക്കാനും കഴിയും."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ഈ പ്രവൃത്തി പഴയപടിയാക്കാനാവില്ല."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ഉവ്വ്, അഡ്‌മിൻ അനുമതി നൽകുക"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"പുതിയ ഉപയോക്താക്കളെ സൃഷ്‌ടിക്കുക"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ഫോൺ കോളുകൾ വിളിക്കുക"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"കാറിന്റെ മൊബൈൽ ഡാറ്റ വഴി സന്ദേശമയയ്ക്കലും സ്വീകരിക്കലും"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"പുതിയ ആപ്പുകൾ ഇൻസ്‌റ്റാൾ ചെയ്യുക"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ആപ്പുകൾ അൺ ഇൻസ്‌റ്റാൾ ചെയ്യുക"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ഉപയോക്താവിനെ ചേര്‍ക്കുക"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"പുതിയ ഉപയോക്താവ്"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"നിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തി സ്വന്തം ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ഏതൊരു ഉപയോക്താവിനും മറ്റെല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാനാവും."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"ഉപയോക്തൃ പരിധി എത്തി"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">നിങ്ങൾക്ക് <xliff:g id="COUNT">%d</xliff:g> ഉപയോക്താക്കളെ വരെ സൃഷ്‌ടിക്കാനാവും.</item>
+      <item quantity="one">ഒരു ഉപയോക്താവിന് മാത്രമേ സൃഷ്‌ടിക്കാനാവൂ.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"പുതിയ ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാനായില്ല"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ഈ ഉപയോക്താവിനെ ഇല്ലാതാക്കണോ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"എല്ലാ ആപ്പുകളും ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ഉപയോക്താവിനെ ഇല്ലാതാക്കാനായില്ല."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ഡിസ്‌മിസ്സ് ചെയ്യുക"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"വീണ്ടും ശ്രമിക്കുക"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"അവസാന ഉപയോക്താവിനെ ഇല്ലാതാക്കണോ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ഈ കാറിന്റെ ബാക്കിയുള്ള ഒരേയൊരു ഉപയോക്താവിനെ ഇല്ലാതാക്കിയ ശേഷം, ഒരു പുതിയ അഡ്‌മിൻ ഉപയോക്താവിനെ സൃഷ്‌ടിക്കും."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ഈ ഉപയോക്താവുമായി ബന്ധപ്പെട്ട എല്ലാ ഡാറ്റയും ക്രമീകരണവും ആപ്പുകളും ഇല്ലാതാക്കപ്പെടും. നിങ്ങൾ സിസ്‌റ്റം വീണ്ടും സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"പുതിയ അഡ്‌മിനെ തിരഞ്ഞെടുക്കുക"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"ഒരു അഡ്‌മിൻ എങ്കിലും നിങ്ങൾക്ക് ആവശ്യമുണ്ട്. ഇത് ഇല്ലാതാക്കാൻ, നിലവിലുള്ളതിന്റെ ഒരു മാറ്റി സ്ഥാപിക്കൽ ആദ്യം തിരഞ്ഞെടുക്കുക."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"അഡ്‌മിനെ തിരഞ്ഞെടുക്കുക"</string>
+    <string name="user_guest" msgid="3465399481257448601">"അതിഥി"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"അതിഥി"</string>
     <string name="user_switch" msgid="6544839750534690781">"മാറുക"</string>
     <string name="current_user_name" msgid="3813671533249316823">"നിങ്ങൾ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"പേര്"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"സജ്ജീകരിച്ചിട്ടില്ല"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ഉപയോക്തൃ നാമം എഡിറ്റ് ചെയ്യുക"</string>
     <string name="users_list_title" msgid="770764290290240909">"ഉപയോക്താക്കള്‍"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s-ന് അനുമതികൾ നൽകി"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"അക്കൗണ്ടുകൾ"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ഉപയോക്താവ്"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"അക്കൗണ്ട് ചേർക്കുക"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"അക്കൗണ്ടുകളൊന്നും ചേർത്തില്ല"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> എന്ന ഉപയോക്താവിന്റെ അക്കൗണ്ടുകൾ"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ഡാറ്റ സ്വയമേവ സമന്വയിപ്പിക്കുക"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ഡാറ്റ സ്വയമേവ പുതുക്കിയെടുക്കാൻ ആപ്പുകളെ അനുവദിക്കുക"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ഡാറ്റാ സ്വയം സമന്വയം ഓണാക്കണോ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"വെബിൽ നിങ്ങളുടെ അക്കൗണ്ടുകളിൽ വരുത്തുന്ന മാറ്റങ്ങളെല്ലാം ഉപകരണത്തിലേക്ക് സ്വയമേവ പകർത്തും.\n\nഫോണിൽ വരുത്തുന്ന മാറ്റങ്ങളെല്ലാം ചില അക്കൗണ്ടുകൾ സ്വയമേവ വെബ്ബിലേക്കും പകർത്തിയേക്കാം. ഇങ്ങനെയാണ് Google അക്കൗണ്ട് പ്രവർത്തിക്കുന്നത്."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ഡാറ്റാ സ്വയം സമന്വയം ഓഫാക്കണോ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ഇത് ഡാറ്റ ലാഭിക്കും, എന്നാൽ അടുത്തിടെയുള്ള വിവരം ശേഖരിക്കാൻ, നിങ്ങൾ ഓരോ അക്കൗണ്ടും നേരിട്ട് സമന്വയിപ്പിക്കേണ്ടിവരും. അപ്‌ഡേറ്റുകൾ നടക്കുമ്പോൾ അറിയിപ്പുകൾ ലഭിക്കുകയുമില്ല."</string>
     <string name="account_details_title" msgid="7529571432258448573">"അക്കൗണ്ട് വിവരം"</string>
     <string name="add_account_title" msgid="5988746086885210040">"അക്കൗണ്ട് ചേർക്കുക"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ഒരു അക്കൗണ്ട് ചേർക്കുക"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"അക്കൗണ്ട് നീക്കം ചെയ്യുക"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"അക്കൗണ്ട് നീക്കം ചെയ്യണോ?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ഈ അക്കൗണ്ട് നീക്കം ചെയ്യുന്നതിലൂടെ, അതുമായി ബന്ധപ്പെട്ട എല്ലാ സന്ദേശങ്ങളും കോൺടാക്റ്റുകളും മറ്റ് വിവരങ്ങളും ഉപകരണത്തിൽ നിന്ന് ഇല്ലാതാക്കപ്പെടും!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ഈ മാറ്റം നിങ്ങളുടെ അഡ്‌മിൻ അനുവദിക്കുന്നില്ല"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ഈ ഉപയോക്താവിനെ നീക്കണോ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"ആപ്പുകളും ഡാറ്റയുമെല്ലാം ഇല്ലാതാക്കും."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"ഉപയോക്താവിനെ നീക്കംചെയ്യാനായില്ല."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"വീണ്ടും ശ്രമിക്കണോ?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"ഡിസ്‌മിസ് ചെയ്യുക"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"വീണ്ടും ശ്രമിക്കുക"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"നിങ്ങളൊരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തി സ്വന്തം ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ഏതൊരു ഉപയോക്താവിനും മറ്റെല്ലാ ഉപയോക്താക്കൾക്കുമായി ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാനാവും."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"അക്കൗണ്ട് നീക്കാനായില്ല."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"അക്കൗണ്ട് സമന്വയം"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>-ൽ, <xliff:g id="ID_1">%1$d</xliff:g> ഇനങ്ങൾക്ക് സമന്വയിപ്പിക്കൽ ഓണാക്കിയിരിക്കുന്നു"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"എല്ലാ ഇനങ്ങൾക്കും സമന്വയിപ്പിക്കൽ ഓണാക്കിയിരിക്കുന്നു"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"എല്ലാ ഇനങ്ങൾക്കും സമന്വയിപ്പിക്കൽ ഓഫാക്കിയിരിക്കുന്നു"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"സമന്വയം ഓഫാണ്"</string>
+    <string name="sync_error" msgid="6698021343089247914">"സമന്വയ പിശക്"</string>
+    <string name="last_synced" msgid="4745124489150101529">"അവസാനം സമന്വയിപ്പിച്ചത്, <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ഇപ്പോൾ സമന്വയിപ്പിക്കുന്നു…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>, ഇപ്പോൾ സമന്വയിപ്പിക്കുന്നതിന് ടാപ്പ് ചെയ്യുക"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ഇപ്പോൾ സമന്വയിപ്പിക്കുക"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"സമന്വയിപ്പിക്കൽ റദ്ദാക്കുക"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"സമന്വയം നിലവിൽ പ്രശ്‌നങ്ങൾ നേരിടുകയാണ്. ഇത് ഉടൻ ശരിയാകും."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"സുരക്ഷ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"സ്ക്രീൻ ലോക്ക്"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ഒന്നുമില്ല"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"പിൻ"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"പാസ്‌വേഡ്"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"ഒരു ലോക്ക് ടൈപ്പ് തിരഞ്ഞെടുക്കുക"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"സ്‌ക്രീൻ ലോക്ക് ഓപ്ഷനുകള്‍"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ലോക്ക് ചെയ്യൽ ഓപ്ഷനുകൾ"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"നിങ്ങളുടെ പാറ്റേൺ നൽകുക"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"സ്ഥിരീകരിക്കുക"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"വീണ്ടും വരയ്ക്കുക"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"ഒരു സ്‌ക്രീൻ ലോക്ക് സജ്ജീകരിക്കുക"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"പിൻ തിരഞ്ഞെടുക്കുക"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"പാറ്റേൺ തിരഞ്ഞെടുക്കൂ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"നിങ്ങളുടെ പാസ്‌വേഡ് തിരഞ്ഞെടുക്കുക"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"പാസ്‌വേഡ് തിരഞ്ഞെടുക്കുക"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"നിലവിലെ സ്‌ക്രീൻ ലോക്ക്"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"സുരക്ഷയ്‌ക്കായി, പാറ്റേൺ സജ്ജീകരിക്കുക"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"മായ്ക്കുക"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"നിങ്ങളുടെ IT അഡ്‌മിൻ സാധാരണ പാസ്‍വേഡുകൾ ബ്ലോക്ക് ചെയ്‌തിട്ടുണ്ട്. മറ്റൊരു പാസ്‍വേഡ് പരീക്ഷിക്കുക."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"അക്കങ്ങൾ ആരോഹണ ക്രമത്തിലോ അവരോഹണ ക്രമത്തിലോ അനുക്രമമായോ നൽകുന്നത് അനുവദനീയമല്ല."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"സ്‌ക്രീൻ ലോക്ക് ഓപ്ഷനുകള്‍"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ദിവസം മുമ്പ്"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"വിശ്വസ്‌ത ഉപകരണം ചേർക്കുക"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"വിശ്വസ്‌ത ഉപകരണങ്ങൾ"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ഉപകരണങ്ങൾ</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ഉപകരണം</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"നിങ്ങളുടെ <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> കണക്റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ അത് ഈ കാർ അൺലോക്ക് ചെയ്യും. ആരെങ്കിലും നിങ്ങളുടെ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> എടുക്കുകയാണെങ്കിൽ അവർക്ക് ഈ ഉപകരണം ആക്‌സസ് ചെയ്യാനായേക്കും"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"സ്ഥിരീകരിക്കുക"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"വിശ്വസ്‌ത ഉപകരണം നീക്കം ചെയ്യുക"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ചെയ്‌തു"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"ഒരു വിശ്വസ്‌ത ഉപകരണം സജ്ജീകരിക്കാൻ, സഹകാരി ആപ്പ് ഉപയോഗിക്കുക. ഒരിക്കൽ സജ്ജീകരിച്ചാൽ, വാഹനം നിങ്ങളുടെ ഫോണിനെ കണ്ടെത്തിയാൽ നിങ്ങളുടെ ഉപയോക്തൃ പ്രൊഫൈൽ അൺലോക്ക് ചെയ്യാനാവും."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. നിങ്ങളുടെ ഫോണിൽ സഹകാരി ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. ഉപകരണങ്ങൾ ജോഡിയാക്കാൻ നിങ്ങളുടെ ഫോണിൽ <xliff:g id="CAR_NAME">%1$s</xliff:g> തിരഞ്ഞെടുക്കുക"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock-ന് ഈ ഉപകരണത്തിന്റെ സുരക്ഷാ ഫീച്ചറുകൾ തിരിച്ചറിയാനാവുന്നില്ല. നിങ്ങളുടെ കാർ പരിരക്ഷിക്കാൻ സഹായിക്കുന്നതിന്, നിങ്ങൾ മുമ്പേ തന്നെ അൺലോക്ക് ചെയ്‌തെങ്കിൽ മാത്രമേ ഉപകരണത്തിന് കാർ അൺലോക്ക് ചെയ്‌ത് നിലനിർത്താനാകൂ. നിങ്ങളുടെ കാർ മറ്റാരുടെയെങ്കിലും പക്കൽ ആണെങ്കിൽ പോലും, അത് സമീപത്തുണ്ടെങ്കിൽ നിങ്ങളുടെ വിശ്വസ്‌ത ഉപകരണത്തിന് അത് അൺലോക്ക് ചെയ്‌ത് നിലനിർത്താനാകും."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിനെ ഒരു വിശ്വസ്‌ത ഉപകരണമായി ചേർക്കുക"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിനെ വിശ്വസ്‌ത ഉപകരണമായി ചേർത്തു"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> എൻറോൾമെന്റ് പരാജയപ്പെട്ടു"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"ഒരു വിശ്വസ്‌ത ഉപകരണം ചേർക്കുന്നതിന്, അടുത്തതായി ഒരു പരിശോധിച്ചുറപ്പിക്കൽ രീതി നിങ്ങൾ സജ്ജീകരിക്കേണ്ടതുണ്ട്. വിശ്വസ്‌ത ഉപകരണം നിങ്ങളുടെ കൈവശമില്ലെങ്കിൽ, നിങ്ങളുടെ പ്രൊഫൈൽ ആക്‌സസ് ചെയ്യാൻ പരിശോധിച്ചുറപ്പിക്കൽ ആവശ്യമാണ്."</string>
     <string name="forget" msgid="3971143908183848527">"മറക്കുക"</string>
+    <string name="connect" msgid="5861699594602380150">"കണക്റ്റ് ചെയ്യുക"</string>
+    <string name="disconnect" msgid="6140789953324820336">"വിച്ഛേദിക്കുക"</string>
     <string name="delete_button" msgid="5840500432614610850">"ഇല്ലാതാക്കുക"</string>
     <string name="remove_button" msgid="6664656962868194178">"നീക്കം ചെയ്യുക"</string>
     <string name="cancel" msgid="750286395700355455">"റദ്ദാക്കുക"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ഡെമോ മോഡിൽ നിന്ന് പുറത്തുകടക്കുക"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ഇത് ഡെമോ അക്കൗണ്ട് ഇല്ലാതാക്കുകയും സിസ്‌റ്റം ഫാക്‌ടറി ഡാറ്റ പുനഃക്രമീകരിക്കുകയും ചെയ്യും. എല്ലാ ഉപയോക്തൃ ഡാറ്റയും നഷ്‌ടമാവും."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ഡെമോയിൽ നിന്ന് പുറത്തുകടക്കുക"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"സജ്ജീകരണം പൂർത്തിയാക്കുക"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ഇപ്പോൾ വേണ്ട"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ഡിസ്‌മിസ് ചെയ്യുക"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ഡ്രൈവ് ചെയ്യുമ്പോൾ ഫീച്ചർ ലഭ്യമല്ല."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ഡ്രൈവ് ചെയ്യുമ്പോൾ ഉപയോക്താവിനെ ചേർക്കാനാവില്ല."</string>
 </resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index b34bef6..3da0352 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"бүдэг гэрэлтэй дэлгэц, мэдрэмтгий дэлгэц, батерей"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"бүдэг гэрэлтэй дэлгэц, шөнө, уусгалт"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Шөнийн горим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Сүлжээ &amp; интернэт"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобайл сүлжээ"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобайл дата"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Мобайл сүлжээг ашиглан датад хандах"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Мобайл датаг унтраах уу?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Дата ашиглалт"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Дата ашиглалтын сануулга болон хязгаарлалт"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Аппын дата ашиглалтын мөчлөг"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Дата ашиглалтын сануулга тавих"</string>
+    <string name="data_warning" msgid="116776633806885370">"Дата ашиглалтын сануулга"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Дата ашиглалтын хязгаарлалт тогтоох"</string>
+    <string name="data_limit" msgid="227338836292511425">"Дата ашиглалтын хязгаарлалт"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Дата ашиглалтыг хязгаарлаж байна"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Таны тээврийн хэрэгслийн хөгжим тоглуулагч таны тогтоосон хязгаарлалтыг дуусмагц мобайл датаг унтраана.\n\nДата ашиглалтыг хөгжим тоглуулагч хэмждэг бөгөөд таны оператор компани ашиглалтыг өөрөөр тооцоолж магадгүй тул хязгаарлалтыг болгоомжтой тогтооно уу."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Утасгүй сүлжээний хандалтын цэгүүдийг тохируулах &amp; удирдах"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi-г асааж байна…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi-г унтрааж байна…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi жагсаалтыг ачаалж байна"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi-г идэвхгүй болгосон"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Сүлжээг мартаж чадсангүй"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Сүлжээнд холбогдож чадсангүй"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Сүлжээ нэмэх"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi-г идэвхгүй болгосон"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Холбох"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Нууц үг"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Нууц үгийг харуулах"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Сүлжээний нэр"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID-г оруулна уу"</string>
     <string name="wifi_security" msgid="158358046038876532">"Нууцлал"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Дохионы хүч"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Дохионы хүч"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Төлөв"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Холбоосны хурд"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Давтамж"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP хаяг"</string>
+    <string name="show_password" msgid="2074628020371139240">"Нууц үгийг харуулах"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Сүлжээний нэр оруулах"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Нууц үг оруулах"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Муу"</item>
-    <item msgid="2032262610626057081">"Дундаж"</item>
-    <item msgid="3859756017461098953">"Сайн"</item>
-    <item msgid="1521103743353335724">"Маш сайн"</item>
+    <item msgid="7683058295076342057">"Муу"</item>
+    <item msgid="1639222824821660744">"Дундаж"</item>
+    <item msgid="1838705897358163300">"Сайн"</item>
+    <item msgid="6067166649320533751">"Маш сайн"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth-г асаах"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth-г идэвхгүй болгосон"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 Гц"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 Гц"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Сүлжээний дэлгэрэнгүй"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC хаяг"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP хаяг"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Дэд сүлжээний маск"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 хаяг"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Гэйтвэй"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi тохиргоо"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi-г автоматаар асаах"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi таны гэрийн сүлжээ зэрэг ойролцоох хадгалсан өндөр чанартай сүлжээнд буцаж асах болно."</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Байршил унтраалттай тул боломжгүй байна. "<annotation id="link">"Байршлыг"</annotation>" асаана уу."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi хайлтыг асаах уу?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Асаах"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi хайлтыг асаасан"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Мобайл дата руу автоматаар шилжүүлэх"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi-н интернет холболт тасарсан үед мобайл дата ашиглана уу. Дата ашиглалтын төлбөр гарж болзошгүй."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Нэмэлт мэдээлэл авах"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Холболтуудыг удирдах, төхөөрөмжийн нэр &amp; илрэх байдлыг тохируулах"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Компьютер"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Чихэвч"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Утас"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Зураглал"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Чихэвч"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Нэмэлт оролт"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Хослуулсан төхөөрөмжүүд"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Боломжтой төхөөрөмжүүд"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Хослуулсан төхөөрөмжүүд алга"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Боломжтой төхөөрөмжүүд алга"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Хослуулсан төхөөрөмж"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Нэр"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Дараахад ашиглах"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth төхөөрөмжийн нэрийг өөрчлөх"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Нэргүй төхөөрөмж"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Хослуулсан төхөөрөмжүүд"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Шинэ төхөөрөмж хослуулах"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Хослуулахын тулд Bluetooth асна"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Төхөөрөмж салгах уу?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Таны тээврийн хэрэгсэл <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-с сална."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Тээврийн хэрэгслийн Bluetooth хаяг: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Төхөөрөмжийн Bluetooth хаяг: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Тээврийн хэрэгслийн нэр"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Энэ тээврийн хэрэгслийн нэрийг өөрчлөх"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Төхөөрөмжийн нэрийг өөрчлөх"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Нэр өөрчлөх"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Боломжтой төхөөрөмжүүд"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профайлууд"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth-г хослуулах хүсэлт"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Хослуулах &amp; холбох"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-н хослуулах код"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ПИН нь үсэг эсвэл дүрс тэмдэгт агуулдаг"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Хослуулах кодыг бичээд Буцах эсвэл Оруулах товчлуурыг дарна уу"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Ихэвчлэн 0000 эсвэл 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Хослуулах хүсэлт"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-тай хослуулахын тулд товшино уу."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Хэл"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Хэл &amp; оролт"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Гар"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Гарыг удирдах"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Текстийг яриа болгох гаралт"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Давуу хөдөлгүүр"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Одоогийн хөдөлгүүр"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Ярианы түвшин"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Авиа"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Шинэчлэх"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Дуу"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Хонх дуугаргах түвшин"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Шилжүүлгийн түвшин"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Медиа"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Хөгжим болон видеоны дууны түвшнийг тохируулах"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Сэрүүлэг"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Утасны хонхны ая"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Мэдэгдлийн өгөгдмөл ая"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Сэрүүлгийн өгөгдмөл ая"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Апп ба мэдэгдэл"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Бүх аппыг харуулах"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Өгөгдмөл апп"</string>
     <string name="applications_settings" msgid="794261395191035632">"Аппын мэдээлэл"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Хүчээр зогсоох"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Хүчээр зогсоох уу?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Та аппыг хүчээр зогсоосон тохиолдолд энэ нь буруу ажиллаж болзошгүй."</string>
     <string name="disable_text" msgid="4358165448648990820">"Идэвхгүй болгох"</string>
     <string name="enable_text" msgid="1794971777861881238">"Идэвхжүүлэх"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Устгах"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Та энэ аппыг идэвхгүй болгосон тохиолдолд Андройд болон бусад аппын хэвийн ажиллагаа тасалдаж болзошгүй."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Aппыг идэвхгүй болгох"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Зөвшөөрлүүд"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Хувилбар: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Зөвшөөрөл олгоогүй байна"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Хүссэн зөвшөөрөл алга"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Дата ашиглалт"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Аппын дата ашиглалт"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Хүчээр зогсоох"</string>
     <string name="computing_size" msgid="5791407621793083965">"Тооцоолж байна…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">Нэмэлт <xliff:g id="COUNT_1">%d</xliff:g> зөвшөөрөл</item>
       <item quantity="one">Нэмэлт <xliff:g id="COUNT_0">%d</xliff:g> зөвшөөрөл</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Туслах ба дуугаар оруулах"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Туслах апп"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Дэлгэцийн текстийг ашиглах"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Туслах аппад дэлгэцийн контентод текстээр хандахыг зөвшөөрөх"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Дэлгэцээс дарсан зургийг ашиглах"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Туслах аппад дэлгэцийн зурагт хандахыг зөвшөөрөх"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Автоматаар бөглөх үйлчилгээ"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Апп алга"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Сонгосон"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Туслах таны дэлгэцэд харагддаг эсвэл аппуудаас хандах боломжтой мэдээлэл зэрэг таны системд ашиглагддаг аппуудын талаарх мэдээллийг унших боломжтой болно."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Энэ аппад итгэдэг эсэхээ шалгана уу&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google-н Автоматаар бөглөх хэсэг&gt;%1$s&lt;/xliff:g&gt; автоматаар бөглөх боломжтой зүйлийг тодорхойлохын тулд таны дэлгэц дээрх зүйлийг ашигладаг."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Үйлчилгээ нэмэх"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Байршил"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Саяхны байршлын хүсэлтүүд"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Саяхны байршлын хүсэлт алга"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Аппын түвшний зөвшөөрөл"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Скан хийж байна"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Байршлын үйлчилгээ"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi скан хийх"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Апп болон үйлчилгээнд Wi‑Fi унтраалттай үед ч Wi‑Fi сүлжээг хүссэн үедээ скан хийхийг зөвшөөрнө үү. Үүнийг байршилд суурилсан онцлогууд болон үйлчилгээнүүд зэрэгт ашиглах боломжтой."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth скан хийх"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Апп болон үйлчилгээнд Bluetooth унтраалттай үед ч ойролцоох төхөөрөмжийг хүссэн үедээ скан хийхийг зөвшөөрнө үү. Үүнийг байршилд суурилсан онцлогууд болон үйлчилгээнүүд зэрэгт ашиглах боломжтой."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Систем"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Системийн шинэчлэлтүүд"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Системийн шинэчлэлт"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Андройд хувилбар"</string>
     <string name="security_patch" msgid="4794276590178386903">"Андройдын аюулгүй байдлын patch-н түвшин"</string>
     <string name="model_info" msgid="4966408071657934452">"Загвар"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Долгион баригчийн хувилбар"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Кернел хувилбар"</string>
     <string name="build_number" msgid="3997326631001009102">"Хийцийн дугаар"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth хаяг"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Боломжгүй"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Төлөв"</string>
     <string name="device_status" msgid="267298179806290920">"Төлөв"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Зохиогчийн эрх"</string>
     <string name="license_title" msgid="936705938435249965">"Лиценз"</string>
     <string name="terms_title" msgid="5201471373602628765">"Ерөнхий нөхцөлүүд"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Системийн WebView-н лиценз"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Системийн WebView-н лиценз"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ханын зураг"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Хиймэл дагуулын зураглал нийлүүлэгчид:\n© 2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Гуравдагч талын лиценз"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Лицензүүдийг ачаалах явцад алдаа гарлаа."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Ачаалж байна..."</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Танд хөгжүүлэгч болоход одоо <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> алхам дутуу байна.</item>
+      <item quantity="one">Танд хөгжүүлэгч болоход одоо <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> алхам дутуу байна.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Та одоо хөгжүүлэгч боллоо!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Та аль хэдийн хөгжүүлэгч болсон тул шаардлагагүй."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Хөгжүүлэгчийн тохиргоо"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Сонголтыг шинэчлэх"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Сүлжээ, апп эсвэл төхөөрөмжийг шинэчлэх"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Сүлжээг шинэчлэх"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Энэ нь сүлжээний бүх тохиргоог шинэчлэх бөгөөд үүнд дараах багтана:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобайл дата"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Бүх тээврийн хэрэгслийн eSIMs-г устгах"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Энэ таны үйлчилгээний төлөвлөгөөг цуцлахгүй."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM-г шинэчлэх боломжгүй байна"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Сүлжээг сонгох"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Тохиргоог шинэчлэх"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Шинэчлэх үү?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Сүлжээний бүх тохиргоог шинэчлэх үү? Та энэ үйлдлийг буцаах боломжгүй!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Тохиргоог шинэчлэх"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Сүлжээний тохиргоог шинэчиллээ"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Аппын тохиргоог шинэчлэх"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Энэ нь бүх тохиргоог шинэчлэх болно:\n\n"<li>" Идэвхгүй болгосон аппууд"</li>" \n"<li>"Идэвхгүй болгосон аппын мэдэгдлүүд "</li>\n" "<li>" Үйлдлийн өгөгдмөл аппууд"</li>\n<li>" Аппуудын арын датаны хязгаарлалт"</li>\n<li>" Дурын зөвшөөрлийн хязгаарлалт"</li>\n\n"Та аппын ямар ч өгөгдөл алдахгүй."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Аппуудыг шинэчлэх"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Аппын тохиргоог шинэчиллээ"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Бүх өгөгдлийг устгах (үйлдвэрийн тохиргоо руу шинэчлэх)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Энэ нь таны тээврийн хэрэгслийн үндсэн нэгжээс\n\n"<li>"таны Google бүртгэл"</li>",\n"<li>"Систем, аппын өгөгдөл болон тохиргоо"</li>",\n"<li>"татаж авсан аппууд"</li>" зэрэг бүх өгөгдлийг устгана"</string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Та одоогоор дараах бүртгэлд нэвтэрсэн байна:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Энэ тээврийн хэрэгсэл дээр өөр хэрэглэгч байна."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Тээврийн хэрэгслийг дахин тохируулах"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Дахин тохируулах уу?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Бүх хувийн мэдээллээ болон татаж авсан аппаа устгах уу? Та энэ үйлдлийг буцаах боломжгүй!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Бүгдийг устгах"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Устгаж байна"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Түр хүлээнэ үү..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Огноо &amp; цаг"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Огноо болон цагийг тохируулах"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Огноо, цаг, цагийн бүс &amp; форматуудыг тохируулах"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Цагийн бүсээр эрэмбэлэх"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Огноо"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Цаг"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Хэрэглэгч нэмэх"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Бүртгэл нэмэх"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Хэрэглэгчийг устгах"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Шинэ хэрэглэгч"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Зочин"</string>
     <string name="user_admin" msgid="1535484812908584809">"Админ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Админаар нэвтэрсэн"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Бүх админы зөвшөөрөл"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Админ болгоно уу"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Тус хэрэглэгч бусад Aдмин зэрэг хэрэглэгчдийг устгах болон системийг үйлдвэрийн тохиргоонд шинэчлэх боломжтой болно."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Энэ үйлдлийг буцаах боломжгүй."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Тийм, админ болгоно уу"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Шинэ хэрэглэгчид үүсгэх"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Утасны дуудлагууд хийх"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Машины утасны датанаас мессеж бичих"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Шинэ аппууд суулгах"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Аппууд устгах"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Хэрэглэгч нэмэх"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Шинэ хэрэглэгч"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Шинэ хэрэглэгч нэмэх үү?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Таныг шинэ хэрэглэгч нэмэх үед тухайн хэрэглэгч хувийн орон зайгаа тохируулах шаардлагатай."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Бусад бүх хэрэглэгчийн аппуудыг дурын хэрэглэгч шинэчлэх боломжтой."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Хэрэглэгчийн хязгаарт хүрсэн"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Та <xliff:g id="COUNT">%d</xliff:g> хүртэлх хэрэглэгч үүсгэх боломжтой.</item>
+      <item quantity="one">Зөвхөн нэг хэрэглэгч үүсгэх боломжтой.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Шинэ хэрэглэгч үүсгэж чадсангүй"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Энэ хэрэглэгчийг устгах уу?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Бүх апп болон өгөгдлийг устгах болно."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Хэрэглэгчийг устгаж чадсангүй."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Үл хэрэгсэх"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Дахин оролдох"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Сүүлийн хэрэглэгчийг устгах уу?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Энэ машинд үлдсэн хэрэглэгчийг устгасны дараа шинэ админ хэрэглэгч үүсгэх болно."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Энэ хэрэглэгчтэй холбоотой бүх өгөгдөл, тохиргоо болон аппыг устгах болно. Та системийг дахин тохируулах шаардлагатай болно."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Шинэ админ сонгох"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Танд хамгийн багадаа нэг админ шаардлагатай. Үүнийг устгахын тулд эхлээд орлуулалтыг сонгоно уу."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Админ сонгох"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Зочин"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Зочин"</string>
     <string name="user_switch" msgid="6544839750534690781">"Сэлгэх"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Та (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Нэр"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Тохируулаагүй"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Хэрэглэгчийн нэрийг засах"</string>
     <string name="users_list_title" msgid="770764290290240909">"Хэрэглэгчид"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Зөвшөөрлийг %1$s-д олгосон"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Бүртгэл"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Хэрэглэгч"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Бүртгэл нэмэх"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Нэмсэн бүртгэл алга"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>-н бүртгэл"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Өгөгдлийг автоматаар синк хийх"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Өгөгдлийг автоматаар сэргээхийг аппад зөвшөөрөх"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Өгөгдлийг автоматаар синк хийхийг асаах уу?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Таны вэб дээрээс бүртгэлдээ оруулсан аливаа өөрчлөлтийг таны төхөөрөмжид автоматаар хуулах болно.\n\nЗарим бүртгэл нь таны утсан дээрээ оруулсан аливаа өөрчлөлтийг вэб рүү автоматаар хуулж болзошгүй. Google бүртгэл ингэж ажилладаг."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Өгөгдлийг автоматаар синк хийхийг унтраах уу?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Энэ нь датаг хэмнэх боловч та сүүлийн үеийн мэдээллийг цуглуулахын тулд бүртгэл бүрийг гараар синк хийх шаардлагатай болно. Мөн шинэчлэлтийг хийх үед та мэдэгдэл хүлээн авахгүй."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Бүртгэлийн мэдээлэл"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Бүртгэл нэмэх"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Бүртгэл нэмэх"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Бүртгэл хасах"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Бүртгэлийг устгах уу?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Энэ бүртгэлийг устгаснаар үүний бүх зурвас, харилцагч болон бусад өгөгдлийг төхөөрөмжөөс устгана!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Энэ өөрчлөлтийг таны админ зөвшөөрөөгүй байна"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Энэ хэрэглэгчийг устгах уу?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Бүх апп болон өгөгдлийг устгах болно."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Хэрэглэгчийг устгаж чадсангүй."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Дахин оролдох уу?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Үл хэрэгсэх"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Дахин оролдох"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Шинэ хэрэглэгч нэмэх үү?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Таныг шинэ хэрэглэгч нэмэх үед тухайн хэрэглэгч хувийн орон зайгаа тохируулах шаардлагатай."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Бусад бүх хэрэглэгчийн аппуудыг дурын хэрэглэгч шинэчлэх боломжтой."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Бүртгэлийг хасаж чадсангүй."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Бүртгэл синк хийх"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>-с <xliff:g id="ID_1">%1$d</xliff:g> зүйлд синк асаалттай"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Бүх зүйлд синк асаалттай"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Бүх зүйлд синкийг унтраасан"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Синк хийх УНТРААЛТТАЙ байна"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Синк хийхэд алдаа гарлаа"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Хамгийн сүүлд <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>-д синк хийсэн"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Одоо синк хийж байна..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Одоо <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>-д синк хийхийн тулд товших"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Одоо синк хийх"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Синк хийхийг цуцлах"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Одоогоор синк хийхэд асуудал үүсээд байна. Удахгүй зүгээр болно."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Нууцлал"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Дэлгэцийн түгжээ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Байхгүй"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"ПИН"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Нууц үг"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Түгжих төрлийг сонгох"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Дэлгэцийн түгжээний сонголт"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Түгжих сонголтууд"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Хээгээ оруулна уу"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Баталгаажуулах"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Дахин зурах"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Дэлгэцийн түгжээ тохируулах"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Пин кодоо сонгоно уу"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Хээгээ сонгоно уу"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Нууц үгээ сонгоно уу"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Нууц үгээ сонгох"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Одоогийн дэлгэцийн түгжээ"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Аюулгүй байдлын үүднээс загвар тохируулах"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Устгах"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Таны IT админ түгээмэл нууц үгийг блоклосон байна. Өөр нууц үг оруулна уу."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Өсөж буй, буурч буй эсвэл давхардсан цифрийг зөвшөөрдөггүй."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Дэлгэцийн түгжээний сонголтууд"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> өдрийн өмнө"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Итгэмжлэгдсэн төхөөрөмж нэмэх"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Итгэмжлэгдсэн төхөөрөмжүүд"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> төхөөрөмж</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> төхөөрөмж</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Таны <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> холбогдсон үедээ энэ машины түгжээг тайлна. Таны <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>-г хэн нэгэн авсан тохиолдолд энэ төхөөрөмжид хандах боломжтой байж болзошгүй"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Баталгаажуулах"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Итгэмжлэгдсэн төхөөрөмжийг устгах"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Болсон"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Итгэмжлэгдсэн төхөөрөмжийг тохируулахын тулд дэмжигч аппыг ашиглана уу. Тохируулсны дараа тээврийн хэрэгсэл таны утсыг илрүүлсэн үед та хэрэглэгчийн профайлынхаа түгжээг тайлах боломжтой болно"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Утсандаа дэмжигч аппыг татаж авна уу"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Төхөөрөмжүүдийг хослуулахын тулд утаснаасаа <xliff:g id="CAR_NAME">%1$s</xliff:g>-г сонгоно уу"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock энэ төхөөрөмжийн аюулгүй байдлын онцлогуудыг илрүүлэх боломжгүй. Итгэмжлэгдсэн төхөөрөмж танд машинаа хамгаалахад туслах зорилгоор таныг машиныхаа түгжээг тайлсны дараа түгжээгүй байлгах боломжтой болно. Таны итгэмжлэгдсэн төхөөрөмж ойролцоо байх үед, үүнийг хэн нэгэн барьж байсан ч гэсэн таны машиныг түгжээгүй байлгах боломжтой."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г итгэмжлэгдсэн төхөөрөмжөөр нэмэх"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г итгэмжлэгдсэн төхөөрөмжөөр амжилттай нэмлээ"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г бүртгүүлж чадсангүй"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Итгэмжлэгдсэн төхөөрөмж нэмснээр танаас дараа нь нотолгооны хэлбэр тохируулахыг шаарддаг. Хэрэв та итгэмжлэгдсэн төхөөрөмжөө өөртөө авч яваагүй бол нотлохын тулд профайлдаа хандахыг шаардана."</string>
     <string name="forget" msgid="3971143908183848527">"Мартах"</string>
+    <string name="connect" msgid="5861699594602380150">"Холбох"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Салгах"</string>
     <string name="delete_button" msgid="5840500432614610850">"Устгах"</string>
     <string name="remove_button" msgid="6664656962868194178">"Устгах"</string>
     <string name="cancel" msgid="750286395700355455">"Цуцлах"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Туршилтын горимоос гарах"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Энэ нь туршилтын бүртгэлийг устгах бөгөөд системийг үйлдвэрээс гарсан төлөвт шинэчилнэ. Хэрэглэгчийн бүх өгөгдөл устах болно."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Туршилтаас гарах"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"тохиргоог дуусгах"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"одоо биш"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ҮЛ ХЭРЭГСЭХ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Энэ онцлог жолоо барьж байх үед боломжгүй."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Жолоо барьж байх үед хэрэглэгч нэмэх боломжгүй."</string>
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 621c03b..27bad78 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"मंद स्क्रीन, टचस्क्रीन, बॅटरी"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"मंद स्क्रीन, रात्र, रंगछटा"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"नाइट मोड"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"नेटवर्क आणि इंटरनेट"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"मोबाइल नेटवर्क"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"मोबाइल डेटा"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"मोबाइल नेटवर्क वापरून डेटा अॅक्सेस करा"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"मोबाइल डेटा बंद करायचा आहे का?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"डेटा वापर"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"डेटा चेतावणी आणि मर्यादा"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"अ‍ॅप डेटा वापर सायकल"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"डेटा चेतावणी सेट करा"</string>
+    <string name="data_warning" msgid="116776633806885370">"डेटा चेतावणी"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"डेटा मर्यादा सेट करा"</string>
+    <string name="data_limit" msgid="227338836292511425">"डेटा मर्यादा"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"डेटा वापर मर्यादित करत आहे"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"मोबाइल डेटाने तुम्ही सेट केलेली मर्यादा गाठल्यानंतर तुमच्या वाहनाचे मुख्य युनिट मोबाइल डेटा बंद करेल.\n\n मोबाइल डेटाचा वापर मुख्य युनिटमध्ये मोजला जात असल्यामुळे आणि तुमचा वाहक भिन्नपणे वापर लक्षात घेत असल्यामुळे, संवर्धन मर्यादा सेटिंग वापरण्याचा विचार करा."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"वाय-फाय"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"वायरलेस अ‍ॅक्सेस बिंदू सेट करा आणि व्यवस्थापित करा"</string>
     <string name="wifi_starting" msgid="473253087503153167">"वाय-फाय चालू करत आहे…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"वाय-फाय बंद करत आहे…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"वाय-फाय सूची लोड करत आहे"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"वाय-फाय बंद केले"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"नेटवर्क विसरता आले नाही"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"नेटवर्कशी कनेक्‍ट करता आले नाही"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"नेटवर्क जोडा"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"वाय-फाय बंद केले"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"कनेक्ट करा"</string>
     <string name="wifi_password" msgid="5565632142720292397">"पासवर्ड"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"पासवर्ड दाखवा"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"नेटवर्कचे नाव"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID एंटर करा"</string>
     <string name="wifi_security" msgid="158358046038876532">"सुरक्षितता"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"सिग्नल सामर्थ्य"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"सिग्नल सामर्थ्य"</string>
     <string name="wifi_status" msgid="5688013206066543952">"स्थिती"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"लिंक गती"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"किती वेळा"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"आयपी अॅड्रेस"</string>
+    <string name="show_password" msgid="2074628020371139240">"पासवर्ड दाखवा"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"नेटवर्कचे नाव एंटर करा"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"पासवर्ड एंटर करा"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"खराब"</item>
-    <item msgid="2032262610626057081">"चांगले"</item>
-    <item msgid="3859756017461098953">"उत्तम"</item>
-    <item msgid="1521103743353335724">"उत्कृष्ट"</item>
+    <item msgid="7683058295076342057">"खराब"</item>
+    <item msgid="1639222824821660744">"चांगली"</item>
+    <item msgid="1838705897358163300">"उत्तम"</item>
+    <item msgid="6067166649320533751">"उत्कृष्ट"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ब्लुटूथ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ब्लूटूथ चालू करा"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ब्लुटूथ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ब्लूटूथ बंद केले"</string>
-    <string name="bluetooth_settings_title" msgid="3794688574569688649">"ब्लुटूथ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"कनेक्शन व्यवस्थापित करा, डिव्हाइस नाव आणि शोधसुलभता सेट करा"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"कॉंप्युटर"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"हेडसेट"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"फोन"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"इमेज"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"हेडफोन"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"इनपुट पेरिफरल"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ब्लुटूथ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"पेअर केलेले डिव्हाइस"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"उपलब्ध डिव्हाइस"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"कोणतेही पेअर केलेले डिव्हाइस नाहीत"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"डिव्‍हाइस उपलब्‍ध नाही"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"पेअर केलेले डिव्हाइस"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"नाव"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"यासाठी वापरा"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"ब्लुटूथ डिव्हाइसचे नाव बदला"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"नेटवर्क तपशील"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC अॅड्रेस"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"आयपी अॅड्रेस"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"सबनेट मास्क"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 अॅड्रेस"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"गेटवे"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"वाय-फाय प्राधान्ये"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"वाय-फाय आपोआप सुरू करा"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"तुमच्या होम नेटवर्कसारख्या उच्च दर्जाच्या सेव्ह केलेल्या नेटवर्कजवळ वाय-फाय आपोआप परत चालू होईल"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"स्थान बंद केल्यामुळे उपलब्ध नाही. "<annotation id="link">"स्थान"</annotation>" सुरू करा."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"वाय-फाय स्कॅनिंग सुरू करायचे का?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"सुरू करा"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"वाय फाय स्कॅनिंग सुरू केले आहे"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"मोबाइल डेटावर आपोआप स्विच करा"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"वाय-फायवरून इंटरनेट अॅक्सेस नसताना मोबाइल डेटा वापरा. डेटा वापर शुल्क लागू शकते."</string>
+    <string name="learn_more" msgid="8214605928933358604">"अधिक जाणून घ्या"</string>
+    <string name="bluetooth_settings_title" msgid="3794688574569688649">"ब्लूटूथ"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"निनावी डिव्हाइस"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"पेअर केलेले डिव्हाइस"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"नवीन डिव्हाइस पेअर करा"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"पेअर करण्यासाठी ब्लूटूथ सुरू होईल"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"डिव्हाइस डिस्‍कनेक्‍ट करायचे?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"तुमचे डिव्हाइस <xliff:g id="DEVICE_NAME">%1$s</xliff:g>वरून डिस्कनेक्ट होईल."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"वाहनाचा ब्लूटूथ अ‍ॅड्रेस: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"डिव्हाइसचा ब्लूटूथ अ‍ॅड्रेस: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"वाहनाचे नाव"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"वाहनाचे नाव बदला"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"डिव्हाइसचे नाव बदला"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"नाव बदला"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"उपलब्ध डिव्हाइस"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"प्रोफाइल"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ब्लूटूथ पेअरींग विनंती"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"पेअर करा आणि कनेक्ट करा"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ब्लुटूथ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ब्लूटूथ पेअरींग कोड"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"पिन मध्ये अक्षरे किंवा चिन्हे आहेत"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"पेअरींग कोड टाइप करा नंतर परत या किंवा Enter दाबा"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"सामान्यतः ०००० किंवा १२३४"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"पेअरींग विनंती"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> सह जोडण्यासाठी टॅप करा."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"भाषा"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"भाषा आणि इनपुट"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"कीबोर्ड"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"कीबोर्ड व्यवस्थापित करा"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"टेक्स्ट-टू-स्पीच आउटपुट"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"प्राधान्य असलेले इंजिन"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"वर्तमान इंजिन"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"स्पीच रेट"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"पिच"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"रीसेट करा"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ध्वनी"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"रिंग आवाज"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"नेव्हिगेशन आवाज"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"मीडिया"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"संगीत आणि व्हिडिओंसाठी व्हॉल्यूम सेट करा"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"अलार्म"</string>
-    <string name="applications_settings" msgid="794261395191035632">"अॅप माहिती"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"फोनची रिंगटोन"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"सूचनेचा डीफॉल्ट आवाज"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"अलार्मचा डीफॉल्ट आवाज"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"अ‍ॅप्स आणि सूचना"</string>
+    <string name="all_applications" msgid="7798210477486822168">"सर्व अ‍ॅप्स दाखवा"</string>
+    <string name="default_applications" msgid="1558183275638697087">"डीफॉल्ट अ‍ॅप्स"</string>
+    <string name="applications_settings" msgid="794261395191035632">"ॲप माहिती"</string>
+    <string name="force_stop" msgid="2153183697014720520">"सक्तीने थांबवा"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"सक्तीने थांबवायचे आहे का?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"तुम्ही सक्तीने अ‍ॅप थांबवल्यास, ते गैरवर्तन करू शकते."</string>
     <string name="disable_text" msgid="4358165448648990820">"बंद करा"</string>
     <string name="enable_text" msgid="1794971777861881238">"चालू करा"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"अनइंस्टॉल करा"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"तुम्ही हे अ‍ॅप बंद केल्यास, Android आणि इतर अ‍ॅप्स कदाचित यापुढे अपेक्षेप्रमाणे कार्य करू शकणार नाहीत."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"अ‍ॅप बंद करा"</string>
     <string name="permissions_label" msgid="2701446753515612685">"परवानग्या"</string>
     <string name="application_version_label" msgid="8556889839783311649">"आवृत्त्या: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"कोणत्याही परवानग्यांना मंजूरी दिली नाही"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"कोणत्याही परवानग्यांची विनंती केली नाही"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"डेटा वापर"</string>
-    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"अॅप डेटा वापर"</string>
-    <string name="force_stop" msgid="2153183697014720520">"सक्तीने थांबवा"</string>
+    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ॲप डेटा वापर"</string>
     <string name="computing_size" msgid="5791407621793083965">"गणना करत आहे…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त परवानगी</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त परवानग्या</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"साहाय्य आणि व्हॉइस इनपुट"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"साहाय्य अ‍ॅप"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"स्क्रीनवरील मजकूर वापरा"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"साहाय्यक अ‍ॅपला स्क्रीन आशय मजकूर म्हणून अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"स्क्रीनशॉट वापरा"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"साहाय्यक अ‍ॅपला स्क्रीनची इमेज अ‍ॅक्सेस करण्याची अनुमती द्या"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ऑटोफिल सेवा"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"काहीही नाही"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"निवडले"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"तुमच्या स्क्रीनवर दृश्‍यमान असलेल्या माहितीच्या किंवा अ‍ॅप्समध्ये अ‍ॅक्सेस करता येणाऱ्या माहितीच्या समावेशासह असिस्टंट तुमच्या सिस्टिमध्ये वापरल्या जाणाऱ्या अ‍ॅप्सबद्दलची माहिती वाचू शकेल."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;तुम्हाला अ‍ॅपवर विश्वास असल्याची खात्री करा&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; ऑटोफिल काय होऊ शकते हे ठरवण्यासाठी तुमच्या स्क्रीनवर काय आहे याचा वापर करते."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"सेवा जोडा"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"स्थान"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"अलीकडील स्थान विनंत्या"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"अलीकडील कोणत्याही स्थान विनंत्या नाहीत"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ॲप पातळी परवानग्या"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"स्कॅन करत आहे"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"स्‍थान सेवा"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"वाय-फाय स्कॅन करत आहे"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"वाय-फाय बंद असले तरीही अ‍ॅप्स आणि सेवांना वाय-फाय नेटवर्क कधीही स्कॅन करण्याची अनुमती द्या. याचा वापर स्थान आधारित वैशिष्ट्ये आणि सेवा सुधारणे अशा कामांसाठी केला जाऊ शकतो."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ब्लूटूथ स्कॅन करत आहे"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ब्लूटूथ बंद असले, तरीही अ‍ॅप्स आणि सेवांना जवळपासची डिव्हाइस कधीही स्कॅन करण्याची अनुमती द्या. याचा वापर उदाहरणार्थ, स्थान आधारित वैशिष्ट्ये आणि सेवा सुधारण्यासाठी केला जाऊ शकतो."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"सिस्टम"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"सिस्टम अपडेट"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"सिस्टम अपडेट"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android आवृत्ती"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android सुरक्षितता पॅच पातळी"</string>
     <string name="model_info" msgid="4966408071657934452">"मॉडेल"</string>
     <string name="baseband_version" msgid="2370088062235041897">"बेसबँड आवृत्ती"</string>
     <string name="kernel_version" msgid="7327212934187011508">"कर्नेल आवृत्ती"</string>
     <string name="build_number" msgid="3997326631001009102">"बिल्ड नंबर"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ब्लूटूथ पत्ता"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"उपलब्ध नाही"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"स्थिती"</string>
     <string name="device_status" msgid="267298179806290920">"स्थिती"</string>
@@ -133,19 +208,56 @@
     <string name="about_summary" msgid="5374623866267691206">"Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
     <string name="about_settings_summary" msgid="7975072809083281401">"कायदेशीर माहिती, स्थिती, सॉफ्टवेअर आवृत्ती पहा"</string>
     <string name="legal_information" msgid="1838443759229784762">"कायदेशीर माहिती"</string>
-    <string name="contributors_title" msgid="7698463793409916113">"योगदानकर्ते"</string>
+    <string name="contributors_title" msgid="7698463793409916113">"कंट्रिब्युटर्स"</string>
     <string name="manual" msgid="4819839169843240804">"मॅन्युअल"</string>
     <string name="regulatory_labels" msgid="3165587388499646779">"नियामक लेबले"</string>
     <string name="safety_and_regulatory_info" msgid="1204127697132067734">"सुरक्षा आणि नियामक मॅन्युअल"</string>
     <string name="copyright_title" msgid="4220237202917417876">"कॉपीराइट"</string>
     <string name="license_title" msgid="936705938435249965">"परवाना"</string>
     <string name="terms_title" msgid="5201471373602628765">"अटी आणि नियम"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"सिस्टम WebView परवाना"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"सिस्टम वेबदृश्य परवाने"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"वॉलपेपर"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"उपग्रह इमेजरी पुरवठादार:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"तृतीय-पक्ष परवाने"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"परवाने लोड करताना समस्या आली."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"लोड करत आहे…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">आता तुम्ही डेव्हलपर होण्यापासून <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> पायरी लांब आहात.</item>
+      <item quantity="other">आता तुम्ही डेव्हलपर होण्यापासून <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> पायऱ्या लांब आहात.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"आता तुम्ही एक डेव्हलपर आहात!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"आवश्यकता नाही, तुम्ही आधीपासून डेव्हलपर आहात."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"डेव्‍हलपर पर्याय"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"रीसेट पर्याय"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"नेटवर्क, अॅप्स किंवा डिव्हाइस रीसेट"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"नेटवर्क रीसेट करा"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"हे सर्व नेटवर्क सेटिंग्ज रीसेट करेल, यामध्ये याचा समावेश आहे:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"वाय-फाय "</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"मोबाइल डेटा"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ब्लूटूथ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"सर्व वाहन eSIMs काढून टाका"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"तुमचा सेवा प्लॅन रद्द होणार नाही."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM रीसेट करू शकत नाही"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"नेटवर्क निवडा"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"सेटिंग्ज रीसेट करा"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"रीसेट करायचे?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"सर्व नेटवर्क सेटिंग्ज रीसेट करायच्या? तुम्ही ही क्रिया पूर्ववत करू शकत नाही!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"सेटिंग्ज रीसेट करा"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"नेटवर्क सेटिंग्ज रीसेट केल्या आहेत"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ॲप प्राधान्ये रीसेट करा"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"हे यासाठी सर्व प्राधान्ये रीसेट करेल:\n\n"<li>"बंद केलेली अ‍ॅप्स"</li>\n<li>"बंद केलेल्या अ‍ॅप्स सूचना"</li>\n<li>"क्रियांसाठी डीफॉल्ट अ‍ॅप्लिकेशन्स"</li>\n<li>"अ‍ॅप्ससाठी बॅकग्राउंड डेटा प्रतिबंध"</li>\n<li>"कोणतेही परवानगी प्रतिबंध"</li>\n\n"तुम्ही कोणताही अ‍ॅप डेटा गमावणार नाही."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"अॅप्स रीसेट करा"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ॲप प्राधान्ये रीसेट केली गेली आहेत"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"सर्व डेटा मिटवा (फॅक्टरी रीसेट)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"हे तुमच्या डिव्‍हाइसच्या मुख्य युनिटसह पुढील सर्व डेटा मिटवेल:\n\n"<li>"तुमचे Google खाते"</li>\n<li>"सिस्टम आणि अ‍ॅप डेटा आणि सेटिंग्ज"</li>\n<li>"डाउनलोड केलेली अ‍ॅप्स"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"तुम्ही खालील खात्यांवर सध्या साइन इन केले आहे:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"या डिव्‍हाइसवर इतर वापरकर्ते उपस्‍थित आहेत."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"डिव्हाइस रीसेट करा"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"रीसेट करायचे?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"तुमची सर्व वैयक्तिक माहिती आणि डाउनलोड केलेली अ‍ॅप्स मिटवायची का? तुम्ही ही क्रिया पूर्ववत करू शकत नाही!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"प्रत्येक गोष्ट मिटवा"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"मिटवत आहे"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"कृपया वाट पाहा…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"तारीख आणि वेळ"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"तारीख आणि वेळ सेट करा"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"तारीख, वेळ, टाइम झोन आणि फॉरमॅट सेट करा"</string>
@@ -153,7 +265,7 @@
     <string name="date_time_auto_summary" msgid="3311706425095342759">"नेटवर्कने-प्रदान केलेली वेळ वापरा"</string>
     <string name="zone_auto" msgid="3701878581920206160">"आपोआप टाइम झोन"</string>
     <string name="zone_auto_summary" msgid="4345856882906981864">"नेटवर्कने-प्रदान केलेला टाइम झोन वापरा"</string>
-    <string name="date_time_24hour_title" msgid="3025576547136168692">"24‑तास फॉरमॅट"</string>
+    <string name="date_time_24hour_title" msgid="3025576547136168692">"२४‑तास फॉरमॅट"</string>
     <string name="date_time_24hour" msgid="1137618702556486913">"२४-तास फॉरमॅट वापरा"</string>
     <string name="date_time_set_time_title" msgid="5884883050656937853">"वेळ"</string>
     <string name="date_time_set_time" msgid="6449555153906058248">"वेळ सेट करा"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"टाइम झोन नुसार क्रमवारी लावा"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"तारीख"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"वेळ"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"वापरकर्ता जोडा"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"खाते जोडा"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"वापरकर्ता हटवा"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"नवीन वापरकर्ता"</string>
-    <string name="user_guest" msgid="3465399481257448601">"अतिथी"</string>
     <string name="user_admin" msgid="1535484812908584809">"प्रशासक"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"प्रशासक म्हणून साइन इन केले आहे"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"सर्व प्रशासकीय परवानग्या"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"प्रशासक करा"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"वापरकर्ता इतर प्रशासकांसह वापरकर्त्यांना हटवू शकेल आणि सिस्टीम फॅक्टरी रीसेट करू शकेल."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ही क्रिया परत उलट करता येणार नाही."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"होय, प्रशासक करा"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"नवीन वापरकर्ते तयार करा"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"फोन कॉल करा"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"कारच्या मोबाइल डेटाद्वारे मेसेजिंग"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"नवीन अॅप्स इंस्टॉल करा"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"अॅप्स अनइंस्टॉल करा"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"वापरकर्ता जोडा"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"नवीन वापरकर्ता"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"नवीन वापरकर्ता जोडायचा?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"तुम्ही नवीन वापरकर्त्याला जोडल्यावर, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"कोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अपडेट करू शकतो."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"वापरकर्ता मर्यादा गाठली"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">तुम्ही <xliff:g id="COUNT">%d</xliff:g> वापरकर्ता तयार करू शकता.</item>
+      <item quantity="other">तुम्ही <xliff:g id="COUNT">%d</xliff:g> वापरकर्ते तयार करू शकता.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"नवीन वापरकर्ता तयार करता आला नाही"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"हा वापरकर्ता हटवायचा?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"सर्व अॅप्स आणि डेटा हटवला जाईल."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"वापरकर्ता हटवता आला नाही."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"डिसमिस करा"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"पुन्हा प्रयत्न करा"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"शेवटचा वापरकर्ता हटवायचा?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"या कारसाठी फक्त उर्वरित वापरकर्ता हटवल्यानंतर नवीन प्रशासक तयार होईल."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"या वापरकर्त्याशी संबंधित सर्व डेटा, सेटिंग्ज आणि अॅप्स हटवले जातील. तुम्हाला पुन्हा सिस्टम सेट करण्याची आवश्यकता असेल"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"नवीन प्रशासक निवडा"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"तुमच्याकडे किमान एक प्रशासक आवश्यक आहे. हे हटवण्यासाठी, पहिले बदली निवडा."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"प्रशासक निवडा"</string>
+    <string name="user_guest" msgid="3465399481257448601">"अतिथी"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"अतिथी"</string>
     <string name="user_switch" msgid="6544839750534690781">"स्विच"</string>
     <string name="current_user_name" msgid="3813671533249316823">"तुम्ही (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"नाव"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"सेट केलेले नाही"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"वापरकर्ता नाव संपादित करा"</string>
     <string name="users_list_title" msgid="770764290290240909">"वापरकर्ते"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ला परवानग्या मंजूर केल्या"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"खाती"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"वापरकर्ता"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"खाते जोडा"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"खाती जोडली नाहीत"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> साठी खाती"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"डेटा आपोआप सिंक करा"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"अ‍ॅप्सना डेटा आपोआप रिफ्रेश करू द्या"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"डेटाचे ऑटो सिंक सुरू करायचे?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"तुम्ही वेबवरून तुमच्या खात्यामध्ये कोणतेही बदल करता ते तुमच्या फोनवर आपोआप कॉपी केले जातील.\n\nकाही खाती तुम्ही फोनवर केलेले कोणतेही बदल आपोआप वेबवर देखील कॉपी करू शकतात. Google खाते याप्रकारे कार्य करते."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"डेटाचे ऑटो सिंक बंद करायचे?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"हे डेटा वाचवेल, पण तुम्हाला अलीकडील माहिती गोळा करण्यासाठी तुम्ही प्रत्येक खाते मॅन्युअली सिंक करणे आवश्यक असेल. आणि अपडेट आल्यावर तुम्हाला सूचना मिळणार नाही."</string>
     <string name="account_details_title" msgid="7529571432258448573">"खाते माहिती"</string>
     <string name="add_account_title" msgid="5988746086885210040">"खाते जोडा"</string>
     <string name="add_an_account" msgid="1072285034300995091">"खाते जोडा"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"खाते काढा"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"खाते काढायचे?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"हे खाते काढल्याने त्याचे सर्व संदेश, संपर्क आणि डिव्हाइसवरील इतर डेटा हटवला जाईल!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"या बदलास तुमच्या प्रशासकाने अनुमती नाही"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"हा वापरकर्ता काढायचा?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"सर्व अॅप्स आणि डेटा हटवला जाईल."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"वापरकर्ता काढता आला नाही."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"पुन्हा प्रयत्न करायचा?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"डिसमिस करा"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"पुन्हा प्रयत्न करा"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"नवीन वापरकर्ता जोडायचा?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"तुम्ही नवीन वापरकर्त्याला जोडल्यावर, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"कोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अपडेट करू शकतो."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"खाते काढता आले नाही"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"खाते सिंक करा"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> पैकी <xliff:g id="ID_1">%1$d</xliff:g> आयटम सिंक करणे सुरू आहे"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"सर्व आयटम सिंक करणे चालू करा"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"सर्व आयटम सिंक करणे बंद करा"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"सिंक बंद आहे"</string>
+    <string name="sync_error" msgid="6698021343089247914">"सिंक एरर"</string>
+    <string name="last_synced" msgid="4745124489150101529">"<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g> रोजी शेवटचे सिंक केले"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"आता सिंक करत आहे…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>आता सिंक करण्यासाठी टॅप करा"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"आता सिंक करा"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"सिंक रद्द करा"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"संकालनास सध्या समस्या येत आहेत. हे लवकरच परत येईल."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"सुरक्षितता"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"स्क्रीन लॉक"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"काहीही नाही"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"पिन"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"पासवर्ड"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"लॉक प्रकार निवडा"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"स्क्रीन लॉक पर्याय"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"लॉक पर्याय"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"तुमचा पॅटर्न एंटर करा"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"खात्री करा"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"पुन्हा रेखाटा"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"स्क्रीन लॉक सेट करा"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"तुमचा पिन निवडा"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"तुमचा पॅटर्न निवडा"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"तुमचा पासवर्ड निवडा"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"तुमचा पासवर्ड निवडा"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"सध्‍याचा स्क्रीन लॉक"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"सुरक्षिततेसाठी, एक पॅटर्न सेट करा"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"साफ करा"</string>
@@ -225,8 +377,8 @@
     <string name="lockpattern_recording_intro_header" msgid="7864149726033694408">"अनलॉक पॅटर्न रेखाटा"</string>
     <string name="lockpattern_recording_inprogress" msgid="1575019990484725964">"पूर्ण झाल्यावर बोट काढा"</string>
     <string name="lockpattern_pattern_entered" msgid="6103071005285320575">"पॅटर्न रेकॉर्ड झाला"</string>
-    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"पुष्टी करण्यासाठी पुन्हा रेखांकित करा"</string>
-    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"किमान ४ बिंदू कनेक्ट करा. पुन्हा प्रयत्न करा."</string>
+    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"निश्चित करण्यासाठी पुन्हा रेखांकित करा"</string>
+    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"किमान ४ बिंदू जोडा. पुन्हा प्रयत्न करा."</string>
     <string name="lockpattern_pattern_wrong" msgid="929223969555399363">"चुकीचा पॅटर्न"</string>
     <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"अनलॉक पॅटर्न कसा काढावा"</string>
     <string name="error_saving_lockpattern" msgid="2933512812768570130">"पॅटर्न सेव्ह करताना एरर आली"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"सामान्यत: वापरले जाणारे पासवर्ड तुमच्या IT प्रशासनाने ब्लॉक केलेले आहेत. दुसरा एखादा पासवर्ड वापरून पहा."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"अंकांच्या चढत्या, उतरत्या किंवा पुनरावृत्त क्रमाला अनुमती नाही."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"स्क्रीन लॉक पर्याय"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> दिवसांपूर्वी"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"विश्वसनीय डिव्हाइस जोडा"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"विश्वसनीय डिव्हाइस"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> डिव्हाइस</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> डिव्हाइस</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"ते कनेक्ट केलेले असते तेव्‍हा <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> तुमची कार अनलॉक करेल. एखाद्याने तुमचे <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> घेतल्यास, tकदाचित ते डिव्हाइस अ‍ॅक्सेस करू शकतील"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"खात्री करा"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"विश्वसनीय डिव्हाइस काढून टाका"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"पूर्ण झाले"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"विश्वसनीय डिव्हाइस सेट करण्यासाठी सहयोगी अ‍ॅप वापरा. एकदा सेट केल्यानंतर, वाहनाने तुमचा फोन शोधल्यावर तुम्ही तुमची वापरकर्ता प्रोफाईल अनलॉक करू शकाल"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"१. तुमच्या फोनवर सहयोगी अ‍ॅप डाउनलोड करा"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"२. डिव्हाइस पेअर करण्यासाठी तुमच्या फोनवर <xliff:g id="CAR_NAME">%1$s</xliff:g> निवडा"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"स्मार्ट लॉक या डिव्हाइसची सुरक्षितता वैशिष्ट्ये शोधू शकत नाही. तुमच्या कारचे संरक्षण करण्यात मदत करण्यासाठी, तुम्ही तुमची कार आधीपासून अनलॉक केल्यानंतर विश्वसनीय डिव्हाइस ती अनलॉक करू शकेल. तुमचे विश्वसनीय डिव्हाइस दुसऱ्या कोणाच्या हातात असताना देखील ते तुमची कार ती जवळपास असताना अनलॉक करू शकते."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> हे विश्वसनीय डिव्हाइस म्हणून जोडा"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> हे विश्वसनीय डिव्हाइस म्हणून यशस्वीरित्या जोडले आहे"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ची नोंदणी करता आली नाही"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"विश्वासू डिव्हाइस जोडण्यााठी तुम्हाला यापुढे ऑथेंटिकेशन सेट करण्याची आवश्यकता आहे. तुमच्याजवळ तुमचे विश्वासू डिव्हाइस नसल्यास, ऑथेंटिकेशनला तुमची प्रोफाइल अॅक्सेस करण्याची आवश्यकता असेल."</string>
     <string name="forget" msgid="3971143908183848527">"विसरा"</string>
+    <string name="connect" msgid="5861699594602380150">"कनेक्ट करा"</string>
+    <string name="disconnect" msgid="6140789953324820336">"डिस्कनेक्ट करा"</string>
     <string name="delete_button" msgid="5840500432614610850">"हटवा"</string>
     <string name="remove_button" msgid="6664656962868194178">"काढा"</string>
     <string name="cancel" msgid="750286395700355455">"रद्द करा"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"डेमो मोडमधून बाहेर पडा"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"हे डेमो खाते हटवेल आणि फॅक्टरी डेटा सिस्टम रीसेट करेल. सर्व वापरकर्ता डेटा गमावेल."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"डेमो मोडमधून बाहेर पडा"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"सेटअप समाप्त करा"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"आता नाही"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"डिसमिस करा"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ड्राइव्ह करताना वैशिष्ट्य उपलब्ध नाही."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ड्राइव्ह करत असताना वापरकर्त्याला जोडू शकत नाही."</string>
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index e89e2b6..cb052f0 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"malapkan skrin, skrin sentuh, bateri"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"malapkan skrin, malam, seri warna"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Mod malam"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Rangkaian &amp; Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Rangkaian mudah alih"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Data mudah alih"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Akses data menggunakan rangkaian mudah alih"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Matikan data mudah alih?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Penggunaan data"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Amaran data &amp; had"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Kitaran penggunaan data apl"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Tetapkan amaran data"</string>
+    <string name="data_warning" msgid="116776633806885370">"Amaran data"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Tetapkan had data"</string>
+    <string name="data_limit" msgid="227338836292511425">"Had data"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Mengehadkan penggunaan data"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Unit kepala kenderaan anda akan mematikan data mudah alih setelah mencapai had yang anda tetapkan.\n\nMemandangkan penggunaan data diukur oleh unit kepala dan pembawa anda mungkin mengira penggunaan secara berbeza, anda disyorkan supaya menetapkan had yang konservatif."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Sediakan &amp; urus titik capaian wayarles"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Menghidupkan Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Mematikan Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Memuatkan senarai Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi dilumpuhkan"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Gagal melupakan rangkaian"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Gagal menyambung ke rangkaian"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Tambah rangkaian"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi dilumpuhkan"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Sambung"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Kata Laluan"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Tunjukkan kata laluan"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nama rangkaian"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Masukkan SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Keselamatan"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Kekuatan isyarat"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Kekuatan isyarat"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Kelajuan sambungan"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekuensi"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Alamat IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Tunjukkan kata laluan"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Masukkan nama rangkaian"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Masukkan kata laluan"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Lemah"</item>
-    <item msgid="2032262610626057081">"Sederhana"</item>
-    <item msgid="3859756017461098953">"Bagus"</item>
-    <item msgid="1521103743353335724">"Sangat baik"</item>
+    <item msgid="7683058295076342057">"Lemah"</item>
+    <item msgid="1639222824821660744">"Sederhana"</item>
+    <item msgid="1838705897358163300">"Baik"</item>
+    <item msgid="6067166649320533751">"Sangat baik"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Hidupkan Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth dilumpuhkan"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Butiran rangkaian"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Alamat MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Alamat IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Topeng subnet"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Alamat IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Get laluan"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Pilihan Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Hidupkan Wi-Fi secara automatik"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi akan dihidupkan berdekatan rangkaian disimpan berkualiti, spt rangkaian rmh"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Tidak tersedia kerana lokasi dimatikan. Hidupkan "<annotation id="link">"lokasi"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Hidupkan pengimbasan Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Hidupkan"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Pengimbasan Wi‑Fi dihidupkan"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Beralih kepada data mudah alih secara automatik"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Gunakan data mudah alih apabila Wi-Fi tiada akses Internet. Caj penggunaan data mungkin dikenakan."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Ketahui lebih lanjut"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Urus sambungan, tetapkan nama peranti &amp; kebolehtemuan"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Komputer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Set kepala"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Pengimejan"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Fon kepala"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Persisian Input"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Peranti gandingan"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Peranti yang tersedia"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Tiada peranti digandingkan"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Tiada peranti yang tersedia"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Peranti digandingkan"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nama"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Gunakan untuk"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Tukar nama peranti Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Peranti tidak bernama"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Peranti gandingan"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Gandingkan peranti baharu"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth akan dihidupkan untuk bergandingan"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Putuskan sambungan peranti?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Kenderaan anda akan diputuskan sambungannya daripada <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Alamat Bluetooth kenderaan: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Alamat Bluetooth peranti: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nama kenderaan"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Namakan semula kenderaan ini"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Namakan semula peranti"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Namakan semula"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Peranti yang tersedia"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profil"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Permintaan penggandingan Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Gandingkan &amp; sambung"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Kod penggandingan Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN mengandungi huruf atau simbol"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Taip kod berpasangan kemudian tekan Return atau Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Biasanya 0000 atau 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Permintaan penggandingan"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Sentuh untuk berganding dengan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Bahasa"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Bahasa &amp; input"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Papan kekunci"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Urus papan kekunci"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Output teks ke pertuturan"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Enjin pilihan"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Enjin semasa"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Kadar Pertuturan"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Pic"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Tetapkan semula"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Bunyi"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Kelantangan deringan"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Kelantangan navigasi"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Tetapkan kelantangan untuk muzik dan video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Penggera"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Nada dering telefon"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Bunyi pemberitahuan lalai"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Bunyi penggera lalai"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apl &amp; pemberitahuan"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Tunjukkan semua apl"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Apl lalai"</string>
     <string name="applications_settings" msgid="794261395191035632">"Maklumat apl"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Henti paksa"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Henti paksa?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Jika anda menghentikan apl secara paksa, fungsinya mungkin terganggu."</string>
     <string name="disable_text" msgid="4358165448648990820">"Lumpuhkan"</string>
     <string name="enable_text" msgid="1794971777861881238">"Dayakan"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Nyahpasang"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Jika anda melumpuhkan apl ini, Android dan apl lain mungkin tidak berfungsi seperti yang dimaksudkan lagi."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Lumpuhkan apl"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Kebenaran"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versi: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Tiada kebenaran diberikan"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Tiada kebenaran diminta"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Penggunaan data"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Penggunaan data apl"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Henti paksa"</string>
     <string name="computing_size" msgid="5791407621793083965">"Mengira…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kebenaran tambahan</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kebenaran tambahan</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Bantu &amp; input suara"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Apl Bantu"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Gunakan teks daripada skrin"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Benarkan apl bantu mengakses kandungan skrin sebagai teks"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Gunakan tangkapan skrin"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Benarkan apl bantu mengakses imej skrin"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Perkhidmatan autolengkap"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Tiada"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Dipilih"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Pembantu akan dapat membaca maklumat tentang apl yang sedang digunakan pada sistem anda, termasuk maklumat yang kelihatan pada skrin atau yang dapat diakses dalam apl."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Pastikan anda mempercayai apl ini&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; menggunakan item yang terdapat pada skrin anda untuk menentukan perkara yang boleh dilengkapkan secara automatik."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Tambahkan perkhidmatan"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokasi"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Permintaan Lokasi Terbaharu"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Tiada permintaan lokasi terbaharu"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Kebenaran tahap apl"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Mengimbas"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Perkhidmatan Lokasi"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Pengimbasan Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Benarkan apl dan perkhidmatan mengimbas untuk mengesan rangkaian Wi-Fi pada bila-bila masa, meskipun apabila Wi-Fi dimatikan. Ini dapat digunakan, contohnya, untuk meningkatkan ciri dan perkhidmatan berasaskan lokasi."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Pengimbasan Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Benarkan apl dan perkhidmatan mengimbas untuk mengesan peranti berdekatan pada bila-bila masa, meskipun apabila Bluetooth dimatikan. Ini dapat digunakan, contohnya, untuk meningkatkan ciri dan perkhidmatan berasaskan lokasi."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Kemas kini sistem"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Kemas kini sistem"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versi Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Tahap tampung keselamatan Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versi jalur dasar"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versi inti"</string>
     <string name="build_number" msgid="3997326631001009102">"Nombor binaan"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Alamat Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Tidak tersedia"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Hak cipta"</string>
     <string name="license_title" msgid="936705938435249965">"Lesen"</string>
     <string name="terms_title" msgid="5201471373602628765">"Terma dan syarat"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Lesen Paparan Web Sistem"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Lesen Paparan Web Sistem"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Kertas dinding"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Pembekal imej satelit:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Lesen pihak ketiga"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Terdapat masalah memuatkan lesen."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Memuatkan…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Anda kini <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> langkah daripada menjadi seorang pembangun.</item>
+      <item quantity="one">Anda kini <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> langkah daripada menjadi seorang pembangun.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Anda kini seorang pembangun!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Tidak perlu, anda sudah pun menjadi seorang pembangun."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Pilihan pembangun"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Pilihan tetapan semula"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Tetapan semula rangkaian, apl atau peranti"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Tetapkan semula rangkaian"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ini akan menetapkan semula semua tetapan rangkaian, termasuk:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Data mudah alih"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Padamkan semua eSIM kenderaan"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Tindakan ini tidak akan membatalkan pelan perkhidmatan anda."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Tidak dapat menetapkan semula eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Pilih rangkaian"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Tetapkan semula tetapan"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Tetapkan semula?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Tetapkan semula semua tetapan rangkaian? Anda tidak boleh membuat asal tindakan ini!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Tetapkan semula tetapan"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Tetapan rangkaian telah ditetapkan semula"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Tetapkan semula pilihan apl"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Tindakan ini akan menetapkan semula semua pilihan untuk:\n\n"<li>"Apl dilumpuhkan"</li>\n<li>"Pemberitahuan apl dilumpuhkan"</li>\n<li>"Aplikasi lalai untuk tindakan"</li>\n<li>"Sekatan data latar belakang untuk apl"</li>\n<li>"Sebarang sekatan kebenaran"</li>\n\n"Anda tidak akan kehilangan sebarang data apl."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Tetapkan semula apl"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Pilihan apl telah ditetapkan semula"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Padamkan semua data (ttpn semula kilang)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Tindakan ini akan memadamkan semua data daripada unit kepala kenderaan anda, termasuk:\n\n"<li>"Akaun Google anda"</li>\n<li>"Data dan tetapan sistem dan apl"</li>\n<li>"Apl yang dimuat turun"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Pada masa ini, anda telah dilog masuk ke akaun berikut:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Terdapat pengguna lain pada kenderaan ini."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Tetapkan semula kenderaan"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Tetapkan semula?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Padamkan semua maklumat peribadi anda dan aplikasi yang dimuat turun? Anda tidak boleh membuat asal tindakan ini!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Padamkan semua"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Memadam"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Sila tunggu..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Tarikh &amp; masa"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Tetapkan tarikh dan masa"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Tetapkan tarikh, masa, zon waktu &amp; format"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Isih mengikut zon waktu"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Tarikh"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Masa"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Tambah pengguna"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Tambah akaun"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Padamkan pengguna"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Pengguna baharu"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Tetamu"</string>
     <string name="user_admin" msgid="1535484812908584809">"Pentadbir"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Dilog masuk sebagai pentadbir"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Semua kebenaran pentadbir"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Jadikan Pentadbir"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Pengguna tersebut dapat memadamkan pengguna, termasuk Pentadbir lain, dan membuat tetapan semula kilang pada sistem."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Tindakan ini tidak boleh diterbalikkan."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ya, jadikan pentadbir"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Buat pengguna baharu"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Buat panggilan telefon"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Pmsjn melalui data mdh alih kereta"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Pasang apl baharu"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Nyahpasang apl"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Tambah pengguna"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Pengguna baharu"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Tambah pengguna baharu?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Apabila anda menambahkan pengguna baharu, orang itu perlu menyediakan ruang mereka."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Mana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Had pengguna dicapai"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Anda boleh membuat hingga <xliff:g id="COUNT">%d</xliff:g> pengguna.</item>
+      <item quantity="one">Hanya satu pengguna yang boleh dibuat.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Gagal membuat pengguna baharu"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Padamkan pengguna ini?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Semua apl dan data akan dipadamkan."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Gagal memadamkan pengguna."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ketepikan"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Cuba semula"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Padamkan pengguna terakhir?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Selepas memadamkan satu-satunya pengguna yang tinggal untuk kereta ini, pengguna pentadbir baharu akan dibuat."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Semua data, tetapan dan apl yang dikaitkan dengan pengguna ini akan dipadamkan. Anda perlu menyediakan sistem sekali lagi."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Pilih pentadbir baharu"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Anda memerlukan sekurang-kurangnya satu pentadbir. Untuk memadamkan pentadbir ini, pilih pengganti dahulu."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Pilih pentadbir"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Tetamu"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Tetamu"</string>
     <string name="user_switch" msgid="6544839750534690781">"Tukar"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Anda (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nama"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Tidak disediakan"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edit nama pengguna"</string>
     <string name="users_list_title" msgid="770764290290240909">"Pengguna"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Kebenaran diberikan kpd %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Akaun"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Pengguna"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Tambah akaun"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Tiada akaun yang ditambahkan"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Akaun untuk <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Segerakkan data secara automatik"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Benarkan apl memuatkan semula data secara automatik"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Hidupkan autosegerak data?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Sebarang perubahan yang anda buat pada akaun anda di web akan disalin secara automatik ke peranti anda.\n\nSesetengah akaun juga boleh menyalin secara automatik sebarang perubahan yang anda buat pada telefon ke web. Akaun Google berfungsi dengan cara ini."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Matikan autosegerak data?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Tindakan ini akan menjimatkan data tetapi anda perlu menyegerakkan setiap akaun secara manual untuk mengumpul maklumat terbaharu. Anda juga tidak akan menerima pemberitahuan apabila kemas kini terjadi."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Maklumat akaun"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Tambah akaun"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Tambah akaun"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Alih keluar akaun"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Alih keluar akaun?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Pengalihan keluar akaun ini akan memadamkan semua mesej, kenalan dan data lain daripada peranti!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Perubahan ini tidak dibenarkan oleh pentadbir anda"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Alih keluar pengguna ini?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Semua apl dan data akan dipadamkan."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Gagal mengalih keluar pengguna."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Cuba lagi?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ketepikan"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Cuba semula"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Tambah pengguna baharu?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Apabila anda menambahkan pengguna baharu, orang itu perlu menyediakan ruang mereka."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Mana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Gagal mengalih keluar iklan."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Penyegerakan akaun"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Penyegerakan dihidupkan untuk <xliff:g id="ID_1">%1$d</xliff:g> daripada <xliff:g id="ID_2">%2$d</xliff:g> item"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Penyegerakan dihidupkan untuk semua item"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Penyegerakan dimatikan untuk semua item"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Segerak DIMATIKAN"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Ralat penyegerakan"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Terakhir disegerakkan <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Menyegerak sekarang…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Ketik untuk menyegerak sekarang<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Segerakkan sekarang"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Batalkan penyegerakan"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Penyegerakan sedang mengalami masalah. Ciri ini akan kembali sebentar lagi."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Keselamatan"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kunci skrin"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Tiada"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Kata Laluan"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Pilih jenis kunci"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Pilihan kunci skrin"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Pilihan kunci"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Masukkan corak anda"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Sahkan"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Lukis semula"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Tetapkan kunci skrin"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Pilih PIN anda"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Pilih corak anda"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Pilih kata laluan anda"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Pilih kata laluan anda"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Kunci skrin semasa"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Untuk keselamatan, tetapkan corak"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Kosongkan"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Kata laluan lazim disekat oleh pentadbir IT anda. Cuba kata laluan yang lain."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Angka menaik, menurun atau jujukan berulang tidak dibenarkan."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Pilihan kunci skrin"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> hari lalu"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Tambah peranti dipercayai"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Peranti dipercayai"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> peranti</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> peranti</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> anda akan membuka kunci kereta ini apabila disambungkan. Jika seseorang mengambil <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> anda, orang itu mungkin dapat mengakses peranti ini"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Sahkan"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Alih keluar peranti yang dipercayai"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Selesai"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Gunakan apl rakan untuk menyediakan peranti yang dipercayai. Setelah peranti disediakan, anda akan dapat membuka kunci profil pengguna anda apabila telefon anda dikesan oleh kenderaan"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Muat turun apl rakan pada telefon anda"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Pilih <xliff:g id="CAR_NAME">%1$s</xliff:g> pada telefon anda untuk menggandingkan peranti tersebut"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock tidak dapat mengesan ciri keselamatan peranti ini. Untuk melindungi kereta anda, peranti yang dipercayai hanya dapat memastikan kereta anda kekal tidak berkunci setelah anda membuka kunci kereta anda itu. Peranti yang dipercayai boleh memastikan kereta anda kekal tidak berkunci apabila berada berdekatan, walaupun orang lain yang memegang peranti itu."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Tambahkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> sebagai peranti yang dipercayai"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> berjaya ditambah sebagai peranti yang dipercayai"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Pendaftaran <xliff:g id="DEVICE_NAME">%1$s</xliff:g> gagal"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Penambahan peranti yang dipercayai memerlukan anda menetapkan kaedah pengesahan selepas ini. Jika peranti yang dipercayai tiada dengan anda, pengesahan perlu mengakses profil anda."</string>
     <string name="forget" msgid="3971143908183848527">"Lupakan"</string>
+    <string name="connect" msgid="5861699594602380150">"Sambung"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Putuskan sambungan"</string>
     <string name="delete_button" msgid="5840500432614610850">"Padam"</string>
     <string name="remove_button" msgid="6664656962868194178">"Alih keluar"</string>
     <string name="cancel" msgid="750286395700355455">"Batal"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Keluar drpd mod tunjuk cara"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Tindakan ini akan memadamkan akaun tunjuk cara dan membuat tetapan semula data kilang pada sistem. Semua data pengguna akan hilang."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Keluar drpd Tunjuk Cara"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"selesaikan persediaan"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"bukan sekarang"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"KETEPIKAN"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Ciri tidak tersedia semasa anda memandu."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Tidak dapat menambah pengguna semasa memandu."</string>
 </resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 0395e88..719f276 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,68 +29,109 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"မျက်နှာပြင် မှိန်ရန်၊ ထိတွေ့မှုမျက်နှာပြင်၊ ဘက်ထရီ"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"မျက်နှာပြင်ကို မှိန်ရန်၊ ည၊ အရောင်သန်းခြင်း"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"ညသုံးမုဒ်"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ကွန်ရက်နှင့် အင်တာနက်"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"မိုဘိုင်းကွန်ရက်"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"မိုဘိုင်းဒေတာ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"မိုဘိုင်းကွန်ရက်သုံးပြီး ဒေတာကို ဝင်သုံးခွင့်ပေးပါ"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"မိုဘိုင်းဒေတာ ပိတ်လိုသလား။"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ဒေတာသုံးစွဲမှု"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ဒေတာ သတိပေးချက်နှင့် ကန့်သတ်ချက်"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"အက်ပ်ဒေတာ အသုံးပြုမှု စက်ဝန်း"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ဒေတာသတိပေးချက် သတ်မှတ်ရန်"</string>
+    <string name="data_warning" msgid="116776633806885370">"ဒေတာသတိပေးချက်"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ဒေတာကန့်သတ်ရန်"</string>
+    <string name="data_limit" msgid="227338836292511425">"ဒေတာ အကန့်အသတ်"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ဒေတာအသုံးပြုမှု ကန့်သတ်ခြင်း"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"သင်သတ်မှတ်ထားသည့် ကန့်သတ်ချက်ရောက်သည်နှင့် သင့်ယာဉ်၏ ဦးပိုင်းယူနစ်သည် မိုဘိုင်းဒေတာကို ပိတ်သွားပါမည်။\n\nဒေတာသုံးစွဲမှုကို ဦးပိုင်းယူနစ်က တိုင်းတာခြင်းဖြစ်ပြီး ဖုန်းလိုင်းဝန်ဆောင်မှုပေးသူ၏ တွက်ချက်မှုနှင့် ကွာခြားနိုင်သောကြောင့် ကန့်သတ်ချက်မကျော်လွန်အောင် သတ်မှတ်ပါ။"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ကြိုးမဲ့ချိတ်ဆက်ပွိုင့်များကို စနစ်ထည့်သွင်းခြင်းနှင့် စီမံခြင်း"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi ကို ဖွင့်နေသည်…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi ကို ပိတ်နေသည်…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi စာရင်း ဖွင့်နေသည်"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi ကို ပိတ်ထားသည်"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ကွန်ရက်ကို မေ့ပစ်၍ မရပါ"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ကွန်ရက်သို့ ချိတ်ဆက်၍ မရပါ"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"ကွန်ရက်ထည့်ရန်"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi ကို ပိတ်ထားသည်"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"ချိတ်ရန်"</string>
     <string name="wifi_password" msgid="5565632142720292397">"စကားဝှက်"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"စကားဝှက်ကို ပြရန်"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ကွန်ရက် အမည်"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID ထည့်သွင်းရန်"</string>
     <string name="wifi_security" msgid="158358046038876532">"လုံခြုံရေး"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"လိုင်းဆွဲအား"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"လိုင်းဆွဲအား"</string>
     <string name="wifi_status" msgid="5688013206066543952">"အခြေအနေ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"လိုင်းအမြန်နှုန်း"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ကြိမ်နှုန်း"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP လိပ်စာ"</string>
+    <string name="show_password" msgid="2074628020371139240">"စကားဝှက် ပြရန်"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ကွန်ရက်အမည် ထည့်ပါ"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"စကားဝှက် ထည့်ပါ"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ညံ့သည်"</item>
-    <item msgid="2032262610626057081">"အတင့်အသင့်"</item>
-    <item msgid="3859756017461098953">"ကောင်းသည်"</item>
-    <item msgid="1521103743353335724">"အလွန်ကောင်းသည်"</item>
+    <item msgid="7683058295076342057">"အားနည်းသည်"</item>
+    <item msgid="1639222824821660744">"အတင့်အသင့်"</item>
+    <item msgid="1838705897358163300">"ကောင်းသည်"</item>
+    <item msgid="6067166649320533751">"အလွန်ကောင်းသည်"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ဘလူးတုသ်"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ဘလူးတုသ်ကို ဖွင့်ရန်"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ဘလူးတုသ်"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ဘလူးတုသ် ပိတ်ထားသည်"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"၂.၄ GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"၅ GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ကွန်ရက် အသေးစိတ်များ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC လိပ်စာ"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"အိုင်ပီ လိပ်စာ"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"ကွန်ရက်အခွဲ နံပါတ်"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 လိပ်စာများ"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ဂိတ်ဝ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi သတ်မှတ်ချက်များ"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi-Fi အလိုအလျောက် ဖွင့်ပါ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"နေအိမ်ကွန်ရက်ကဲ့သို့ သိမ်းထားသည့် အဆင့်မြင့်ကွန်ရက်အနီးတွင် Wi‑Fi ပြန်ဖွင့်မည်"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"တည်နေရာကို ပိတ်ထားသောကြောင့် မရနိုင်ပါ။ "<annotation id="link">"တည်နေရာ"</annotation>" ကို ဖွင့်ပါ။"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi ရှာဖွေမှု ဖွင့်လိုသလား။"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ဖွင့်ရန်"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi ရှာဖွေမှု ဖွင့်ထားသည်"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"မိုဘိုင်းဒေတာစနစ်သို့ အလိုအလျောက် ပြောင်းပါ"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi တွင် အင်တာနက် ချိတ်ဆက်မှု မရှိသည့်အခါ မိုဘိုင်းဒေတာကို အသုံးပြုပါ။ ဒေတာသုံးစွဲခများ ကျသင့်နိုင်ပါသည်။"</string>
+    <string name="learn_more" msgid="8214605928933358604">"ပိုမိုလေ့လာရန်"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ဘလူးတုသ်"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"ချိတ်ဆက်မှုများကို စီမံခြင်း၊ စက်ပစ္စည်းအမည်နှင့် ရှာဖွေနိုင်မှုကို သတ်မှတ်ခြင်း"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"ကွန်ပျူတာ"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"မိုက်ခွက်ပါနားကြပ်"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ဖုန်း"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ဓာတ်ပုံဆိုင်ရာ"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"နားကြပ်"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ချိတ်ဆက်အသုံးပြုရသည့် စက်ပစ္စည်းများ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ဘလူးတုသ်"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"တွဲချိတ်ထားသည့် စက်ပစ္စည်းများ"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ရနိုင်သည့် စက်ပစ္စည်းများ"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"တွဲချိတ်ထားသည့် စက်ပစ္စည်းမရှိပါ"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"မည်သည့် စက်ပစ္စည်းမျှ မရှိပါ"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"တွဲချိတ်ထားသည့် စက်ပစ္စည်း"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"အမည်"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"အတွက် သုံးရန်"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"\'ဘလူးတုသ်\' စက် အမည်ကို ပြောင်းပါ"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"အမည်ပေးမထားသော စက်"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"တွဲချိတ်ထားသည့် စက်များ"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"စက်အသစ် တွဲချိတ်ပါ"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"တွဲချိတ်ရန် ဘလူးတုသ်ကို ဖွင့်ပါမည်"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"စက်ကို ချိတ်ဆက်မှုရပ်လိုသလား။"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"သင့်ယာဉ်ကို <xliff:g id="DEVICE_NAME">%1$s</xliff:g> နှင့် ချိတ်ဆက်မှုရပ်လိုက်ပါမည်။"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"ယာဉ်၏ ဘလူးတုသ်လိပ်စာ- <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"စက်၏ ဘလူးတုသ်လိပ်စာ- <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ယာဉ်အမည်"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ဤယာဉ်ကို အမည်ပြောင်းပါ"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"စက် အမည်ပြောင်းပါ"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"အမည်ပြောင်းရန်"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ရနိုင်သည့် စက်များ"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"ပရိုဖိုင်များ"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ဘလူးတုသ်တွဲချိတ်ရန် တောင်းဆိုချက်"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"တွဲချိတ်ရန်နှင့် ချိတ်ဆက်ရန်"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ဘလူးတုသ်"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ဘလူးတုသ် တွဲချိတ်ခြင်းကုဒ်"</string>
-    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ပင်နံပါတ်တွင် စကားလုံးနှင့် သင်္ကေတများပါဝင်သည်"</string>
-    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"တွဲချိတ်ရန်ကုဒ်ကို ထည့်ပြီး \'Return\' သို့မဟုတ် \'Enter\' ကို နှိပ်ပါ"</string>
-    <string name="bluetooth_pairing_request" msgid="4769675459526556801">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်လိုပါသလား။"</string>
+    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ပင်နံပါတ်တွင် စာလုံး သို့မဟုတ် သင်္ကေတများပါဝင်သည်"</string>
+    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"တွဲချိတ်ရန်ကုဒ်ကို ထည့်ပြီး Return သို့မဟုတ် Enter ကို နှိပ်ပါ"</string>
+    <string name="bluetooth_pairing_request" msgid="4769675459526556801">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> နှင့် တွဲချိတ်လိုပါသလား။"</string>
     <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"သင်၏ အဆက်အသွယ်များနှင့် ခေါ်ဆိုမှုမှတ်တမ်းကို <xliff:g id="DEVICE_NAME">%1$s</xliff:g> အား အသုံးပြုခွင့်ပေးပါ"</string>
     <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"ဤပင်နံပါတ်ကို အခြား စက်ပစ္စည်းတွင်လည်း ထည့်သွင်းရန် လိုအပ်နိုင်သည်။"</string>
     <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"ဤလျှို့ဝှက်ကုဒ်ကို အခြား စက်ပစ္စည်းတွင်လည်း ထည့်သွင်းရန် လိုအပ်နိုင်သည်။"</string>
     <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"ဂဏန်း ၁၆ လုံး ရှိရမည်"</string>
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ပုံမှန် ၀၀၀၀ (သို့) ၁၂၃၄"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"တွဲချိတ်ရန် တောင်းဆိုချက်"</string>
-    <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်ရန် တို့ပါ။"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
+    <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> နှင့် တွဲချိတ်ရန် တို့ပါ။"</string>
     <string name="language_settings" msgid="2079258598337245546">"ဘာသာစကားများ"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ဘာသာစကားနှင့် ထည့်သွင်းမှုစနစ်"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"လက်ကွက်"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"လက်ကွက်များ စီမံခန့်ခွဲရန်"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"စာသားမှ စကားပြောသို့ အထွက်"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ဦးစားပေးအင်ဂျင်"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"လက်ရှိ အင်ဂျင်"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"စကားပြောနှုန်း"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"အသံအနိမ့်အမြင့်"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ပြင်ဆင်သတ်မှတ်ရန်"</string>
     <string name="sound_settings" msgid="3072423952331872246">"အသံ"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"ဖုန်းမြည်သံ အတိုးအကျယ်"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"လမ်းညွှန်မှု အသံ"</string>
@@ -100,30 +140,66 @@
     <string name="media_volume_title" msgid="6697416686272606865">"မီဒီယာ"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"တေးဂီတနှင့် ဗီဒီယိုအတွက် အသံချိန်ရန်"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"နှိုးစက်"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ဖုန်းမြည်သံ"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"အကြောင်းကြားချက် မူရင်းအသံ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"မူရင်းနှိုးစက်သံ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"အက်ပ်များနှင့် အကြောင်းကြားချက်များ"</string>
+    <string name="all_applications" msgid="7798210477486822168">"အက်ပ်အားလုံး ပြရန်"</string>
+    <string name="default_applications" msgid="1558183275638697087">"မူရင်း အက်ပ်များ"</string>
     <string name="applications_settings" msgid="794261395191035632">"အက်ပ်အချက်အလက်များ"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ချက်ချင်း ရပ်ရန်"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"မဖြစ်မနေ ရပ်ခိုင်းမလား။"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"အက်ပ်ကို မဖြစ်မနေရပ်ခိုင်းလျှင် ပုံမှန် အလုပ်လုပ်တော့မည် မဟုတ်ပါ။"</string>
     <string name="disable_text" msgid="4358165448648990820">"ပိတ်ရန်"</string>
     <string name="enable_text" msgid="1794971777861881238">"ဖွင့်ရန်"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"ဖြုတ်ရန်"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ဤအက်ပ်ကို ပိတ်လိုက်လျှင် Android နှင့် အခြားအက်ပ်များ ပုံမှန် အလုပ်လုပ်တော့မည် မဟုတ်ပါ။"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"အက်ပ်ကို ပိတ်ရန်"</string>
     <string name="permissions_label" msgid="2701446753515612685">"ခွင့်ပြုချက်များ"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ဗားရှင်း− %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ခွင့်ပြုထားသည့် အရာများ မရှိပါ"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"တောင်းဆိုထားသော ခွင့်ပြုချက်များ မရှိပါ"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ဒေတာသုံးစွဲမှု"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"အက်ပ်ဒေတာ သုံးစွဲမှု"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ချက်ချင်း ရပ်ရန်"</string>
     <string name="computing_size" msgid="5791407621793083965">"တွက်ချက်နေသည်…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">နောက်ထပ် ခွင့်ပြုချက် <xliff:g id="COUNT_1">%d</xliff:g> ခု</item>
       <item quantity="one">နောက်ထပ် ခွင့်ပြုချက် <xliff:g id="COUNT_0">%d</xliff:g> ခု</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"အကူနှင့် အသံဖြင့်စာရိုက်ခြင်း"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"အကူအညီ အက်ပ်"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ဖန်သားပြင်မှ စာသားကိုသုံးခြင်း"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"ဖန်သားပြင်မှအကြောင်းအရာများကို စာသားအဖြစ်ရယူရန် အကူအညီအက်ပ်ကို ခွင့်ပြုသည်"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ဖန်သားပြင်ဓာတ်ပုံ သုံးခြင်း"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"ဖန်သားပြင်၏ပုံ အသုံးပြုရန် အကူအညီအက်ပ်ကို ခွင့်ပြုသည်"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"အော်တိုဖြည့် ဝန်ဆောင်မှု"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"မရှိ"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"ရွေးထားသည်"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ကူညီပေးသူသည် သင်၏ မျက်နှာပြင်ပေါ်တွင် မြင်ရသည့် သို့မဟုတ် အက်ပ်များအထဲတွင် ရယူသုံးနိုင်သည့် အချက်အလက်များအပါအဝင် သင်၏ စနစ်ထဲတွင် သုံးနေသည့် အက်ပ်များအကြောင်း အချက်အလက်များကို ဖတ်ရှုနိုင်မည်။"</string>
+    <!-- syntax error in translation for autofill_confirmation_message (1832984461556991378) org.xmlpull.v1.XmlPullParserException: expected: /string read: xliff:g (position:END_TAG </xliff:g>@1:230 in     <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;သင်သည် ဤအက်ပ်ကို ယုံကြည်ခြင်း ရှိမရှိ စစ်ဆေးပါ&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill>%1$s</xliff:g> သည် သင်၏မျက်နှာပြင်ပေါ်ရှိ အရာများကို အသုံးပြု၍ မည်သည့်အရာများကို အော်တိုဖြည့်နိုင်ကြောင်း သတ်မှတ်သည်။"</string>
+)  -->
+    <string name="autofill_add_service" msgid="6413893366443609951">"ဝန်ဆောင်မှုထည့်ပါ"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"တည်နေရာ"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"လတ်တလော တည်နေရာတောင်းဆိုချက်များ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"လတ်တလော တည်နေရာတောင်းဆိုချက်များ မရှိပါ"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"အက်ပ်အဆင့် ခွင့်ပြုချက်များ"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"စကင်ဖတ်နေသည်"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"တည်နေရာဝန်ဆောင်မှုများ"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi ရှာဖွေနေသည်"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi‑Fi ကို ပိတ်ထားသော်လည်း အနီးအနားရှိ Wi-Fi ကွန်ရက်များကို အချိန်မရွေးရှာဖွေရန် အက်ပ်နှင့် ဝန်ဆောင်မှုများအား ခွင့်ပြုပါ။ ဥပမာအားဖြင့် ၎င်းကို တည်နေရာအခြေပြု လုပ်ဆောင်ချက်နှင့် ဝန်ဆောင်မှုများ တိုးတက်လာစေရန် အသုံးပြုနိုင်ပါသည်။"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ဘလူးတုသ် ရှာဖွေနေသည်"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ဘလူးတုသ်ကို ပိတ်ထားသော်လည်း အနီးအနားရှိ စက်ပစ္စည်းများကို အချိန်မရွေးရှာဖွေရန် အက်ပ်နှင့် ဝန်ဆောင်မှုများအား ခွင့်ပြုပါ။ ဥပမာအားဖြင့် ၎င်းကို တည်နေရာအခြေပြု လုပ်ဆောင်ချက်နှင့် ဝန်ဆောင်မှုများ တိုးတက်လာစေရန် အသုံးပြုနိုင်ပါသည်။"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"စနစ်"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"စနစ်အပ်ဒိတ်များ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"စနစ်အပ်ဒိတ်များ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ဗားရှင်း"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android လုံခြုံရေးပက်ချ်အဆင့်"</string>
     <string name="model_info" msgid="4966408071657934452">"မော်ဒယ်"</string>
     <string name="baseband_version" msgid="2370088062235041897">"baseband ဗားရှင်း"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel ဗားရှင်း"</string>
-    <string name="build_number" msgid="3997326631001009102">"တည်ဆောင်မှုနံပါတ်"</string>
+    <string name="build_number" msgid="3997326631001009102">"တည်ဆောက်မှုနံပါတ်"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ဘလူးတုသ်လိပ်စာ"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"မရနိုင်ပါ"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"အခြေအနေ"</string>
     <string name="device_status" msgid="267298179806290920">"အခြေအနေ"</string>
@@ -131,7 +207,7 @@
     <string name="device_status_summary" product="default" msgid="9130360324418117815">"ဖုန်းနံပါတ်၊ လိုင်းဆွဲအား စသည်။"</string>
     <string name="about_settings" msgid="4329457966672592345">"အကြောင်း"</string>
     <string name="about_summary" msgid="5374623866267691206">"Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
-    <string name="about_settings_summary" msgid="7975072809083281401">"ဥပဒေဆိုင်ရာအချက်အလက်၊ အခြေအနေ၊ ဆော့ဝဲလ်ဗားရှင်ကို ကြည့်ရှုရန်"</string>
+    <string name="about_settings_summary" msgid="7975072809083281401">"ဥပဒေဆိုင်ရာအချက်အလက်၊ အခြေအနေ၊ ဆော့ဝဲလ်ဗားရှင်းကို ကြည့်ရှုရန်"</string>
     <string name="legal_information" msgid="1838443759229784762">"ဥပဒေဆိုင်ရာ အချက်အလက်များ"</string>
     <string name="contributors_title" msgid="7698463793409916113">"ပံ့ပိုးသူများ"</string>
     <string name="manual" msgid="4819839169843240804">"ကိုယ်တိုင်ထည့်သွင်းရန်"</string>
@@ -139,13 +215,50 @@
     <string name="safety_and_regulatory_info" msgid="1204127697132067734">"လုံခြုံရေးနှင့် ထိန်းသိမ်းမှုလမ်းညွှန်"</string>
     <string name="copyright_title" msgid="4220237202917417876">"မူပိုင်ခွင့်"</string>
     <string name="license_title" msgid="936705938435249965">"လိုင်စင်"</string>
-    <string name="terms_title" msgid="5201471373602628765">"စည်းမျဉ်းများနှင့် အခြေအနေများ"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"စနစ် WebView လိုင်စင်"</string>
+    <string name="terms_title" msgid="5201471373602628765">"ဝန်ဆောင်မှုစည်းမျဉ်းများ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"စနစ်၏ ဝဘ်မြင်ကွင်း လိုင်စင်များ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"နောက်ခံပုံများ"</string>
-    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ဂြိုလ်တုဓာတ်ပုံ ဝန်ဆောင်မှုပေးသူများ−\n©2014 CNES / Astrium၊ DigitalGlobe၊ Bluesky"</string>
+    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ဂြိုဟ်တုဓာတ်ပုံ ဝန်ဆောင်မှုပေးသူများ−\n©2014 CNES / Astrium၊ DigitalGlobe၊ Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ပြင်ပကုမ္ပဏီလိုင်စင်များ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"လိုင်စင်များကို ဖွင့်ရာတွင် ပြသနာရှိနေသည်။"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"ဖွင့်နေသည်…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">သင် ဆော့ဖ်ဝဲအင်ဂျင်နီယာ ဖြစ်ရန် အဆင့် <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ဆင့် လိုပါသေးသည်။</item>
+      <item quantity="one">သင် ဆော့ဖ်ဝဲအင်ဂျင်နီယာ ဖြစ်ရန် အဆင့် <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ဆင့် လိုပါသေးသည်။</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"သင် ဆော့ဖ်ဝဲအင်ဂျင်နီယာ ဖြစ်သွားပါပြီ။"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"မလိုပါ၊ သင်က ဆော့ဖ်ဝဲအင်ဂျင်နီယာ ဖြစ်ပြီးသားပါ။"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"တီထွင်သူများရွေးစရာ"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ပြင်ဆင်သတ်မှတ်ရန် ရွေးစရာများ"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ကွန်ရက်၊ အက်ပ်များ (သို့) စက်ပစ္စည်း ပြင်ဆင်သတ်မှတ်ခြင်း"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ကွန်ရက် ပြင်ဆင်သတ်မှတ်ရန်"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"၎င်းသည် အောက်ပါတို့အပါအဝင် ကွန်ရက်ဆက်တင်များအားလုံးကို ပြင်ဆင်သတ်မှတ်လိုက်ပါမည်−"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"မိုဘိုင်းဒေတာ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ဘလူးတုသ်"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"ယာဉ် eSIM အားလုံးကို ဖျက်ပါ"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"၎င်းက သင်၏ ဝန်ဆောင်မှုအစီအစဉ်ကို ပယ်ဖျက်မည်မဟုတ်ပါ။"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM များ ပြင်ဆင်သတ်မှတ်၍မရပါ"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ကွန်ရက် ရွေးပါ"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ဆက်တင်ပြင်ဆင်သတ်မှတ်ရန်"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"ပြင်ဆင်သတ်မှတ်လိုပါသလား။"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"ကွန်ရက်ဆက်တင်များ အားလုံးကို ပြင်ဆင်သတ်မှတ်လိုပါသလား။ ဤလုပ်ဆောင်ချက်ကို ပြန်ပြင်၍ မရပါ။"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ဆက်တင်ပြင်ဆင်သတ်မှတ်ရန်"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ကွန်ရက်ဆက်တင်များကို ပြင်ဆင်သတ်မှတ်ပြီးပါပြီ"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"အက်ပ်သတ်မှတ်ချက်များ ပြင်ဆင်သတ်မှတ်ရန်"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"၎င်းက အောက်ပါတို့အားလုံးကို ပြင်ဆင်သတ်မှတ်ပါမည်-\n\n"<li>" အက်ပ်များ ပိတ်ခြင်း"</li>\n<li>" အက်ပ်အကြောင်းကြားချက်များ ပိတ်ခြင်း"</li>\n<li>" လုပ်ဆောင်ချက်အတွက် မူရင်းအက်ပ် သတ်မှတ်ခြင်း"</li>\n<li>" အက်ပ်များအတွက် နောက်ခံဒေတာအသုံးပြုမှု ကန့်သတ်ခြင်း"</li>\n<li>" ခွင့်ပြုမှု ကန့်သတ်ချက်အားလုံး"</li>\n\n"သင်၏အက်ပ်ဒေတာများကို ဆုံးရှုံးမည်မဟုတ်ပါ။"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"အက်ပ်များ ပြင်ဆင်သတ်မှတ်ရန်"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"အက်ပ်သတ်မှတ်ချက်များ ပြင်ဆင်သတ်မှတ်ပြီးပါပြီ"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ဒေတာအားလုံး ဖျက်ပါ (စက်ရုံထုတ်သတ်မှတ်ပါ)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ဤသို့ပြုလုပ်ခြင်းကြောင့် သင့်စက်ပစ္စည်း၏ ဦးခန်းပိုင်းယူနစ်အတွင်းရှိ- \n\n"<li>"သင့် Google အကောင့်"</li>\n<li>"\'စနစ်\' နှင့် အက်ပ်ဒေတာများနှင့် ဆက်တင်များ"</li>\n<li>"ဒေါင်းလုဒ်လုပ်ထားသော အက်ပ်များ"</li>" အပါအဝင် ဒေတာအားလုံးကို ဖျက်ပါမည်။"</string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"သင်သည် လက်ရှိတွင် အောက်ပါအကောင့်များကို ဝင်ရောက်ထားပါသည်-"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ဤစက်ပစ္စည်းပေါ်တွင် အခြားအသုံးပြုသူများလည်း ရှိသည်။"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"စက်ပစ္စည်း ပြင်ဆင်သတ်မှတ်ရန်"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"ပြင်ဆင်သတ်မှတ်လိုပါသလား။"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"သင့်ကိုယ်ရေးကိုယ်တာအချက်လက်များနှင့် ဒေါင်းလုဒ်ချထားသောအက်ပ်များ အားလုံးကို ဖျက်မည်လား။ ဤလုပ်ဆောင်ချက်ကို တစ်ဆင့် နောက်ပြန်၍ မရပါ။"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"အားလုံးကိုဖျက်ရန်"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"ဖျက်နေသည်"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"ခဏစောင့်ပါ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"ရက်စွဲနှင့် အချိန်"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"ရက်စွဲနှင့် အချိန် သတ်မှတ်ခြင်း"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"ရက်စွဲ၊ အချိန်၊ စံတော်ချိန်နှင့် စနစ်များကို သတ်မှတ်ပါ"</string>
@@ -165,23 +278,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"စံတော်ချိန်အလိုက် စီရန်"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"ရက်စွဲ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"အချိန်"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"အသုံးပြုသူ ထည့်ရန်"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"အကောင့်ထည့်ရန်"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"သုံးစွဲသူကို ဖျက်ရန်"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"အသုံးပြုသူ အသစ်"</string>
-    <string name="user_guest" msgid="3465399481257448601">"ဧည့်သည်"</string>
     <string name="user_admin" msgid="1535484812908584809">"စီမံခန့်ခွဲသူ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"စီမံခန့်ခွဲသူအဖြစ် ဝင်ထားသည်"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"စီမံခန့်ခွဲသူ ခွင့်ပြုချက်အားလုံး"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"စီမံခန့်ခွဲသူ အဖြစ်ပြောင်းရန်"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"အသုံးပြုသူသည် အခြား \'စီမံခန့်ခွဲသူများ\' အပါအဝင် အသုံးပြုသူများကို ဖျက်ခြင်းနှင့် စနစ်ကို ပြင်ဆင်သတ်မှတ်ခြင်း ပြုလုပ်နိုင်ပါမည်။"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ဤလုပ်ရပ်ကို ပြန်ပြင်၍မရပါ။"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"စီမံခန့်ခွဲသူအဖြစ် ပြောင်းရန်"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"အသုံးပြုသူအသစ်များ ပြုလုပ်ရန်"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ဖုန်းခေါ်ဆိုမှုများ ပြုလုပ်ရန်"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"ကား၏ မိုဘိုင်းဒေတာဖြင့် စာပို့ရန်"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"အက်ပ်အသစ်များ ထည့်သွင်းရန်"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"အက်ပ်များ ဖယ်ရှားရန်"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"အသုံးပြုသူ ထည့်ရန်"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"အသုံးပြုသူ အသစ်"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"အသုံးပြုသူအသစ် ထည့်မလား။"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"အသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ နေရာကို စနစ်ထည့်သွင်းရပါမည်။"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"မည်သူမဆို အသုံးပြုသူအားလုံးအတွက် အက်ပ်များကို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"အသုံးပြုသူ အကန့်အသတ် ပြည့်သွားပါပြီ"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">အသုံးပြုသူ <xliff:g id="COUNT">%d</xliff:g> ဦးအထိ သင်ဖန်တီးနိုင်သည်။</item>
+      <item quantity="one">အသုံးပြုသူ တစ်ဦးသာ ထည့်နိုင်သည်။</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"အသုံးပြုသူအသစ် ပြုလုပ်၍မရပါ"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ဤအသုံးပြုသူကို ဖျက်မလား။"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"အက်ပ်နှင့် ဒေတာများ အားလုံးကို ဖျက်လိုက်ပါမည်။"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"အသုံးပြုသူကို ဖျက်၍မရပါ။"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ပယ်ရန်"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ထပ်စမ်းကြည့်ရန်"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"နောက်ဆုံးတစ်ဦး ဖျက်မလား။"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ဤကားအတွက် တစ်ဦးတည်းကျန်ရှိသော အသုံးပြုသူကို ဖျက်ပြီးလျှင် စီမံခန့်ခွဲသည့် အသုံးပြုသူအသစ် ပြုလုပ်ပါမည်။"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ဤအသုံးပြုသူနှင့် ဆက်စပ်နေသော ဒေတာ၊ ဆက်တင်နှင့် အက်ပ်အားလုံးကို ဖျက်ပါမည်။ သင် စနစ်ပြန်လည်ထည့်သွင်းရန် လိုအပ်ပါမည်။"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"စီမံခန့်ခွဲသူအသစ် ရွေးခြင်း"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"အနည်းဆုံး စီမံခန့်ခွဲသူတစ်ဦး လိုအပ်ပါသည်။ လူစား ဦးစွာရွေးချယ်ပြီးမှ ဤတစ်ဦးကိုဖျက်ပါ။"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"စီမံခန့်ခွဲသူ ရွေးရန်"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ဧည့်သည်"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ဧည့်သည်"</string>
     <string name="user_switch" msgid="6544839750534690781">"ပြောင်းရန်"</string>
     <string name="current_user_name" msgid="3813671533249316823">"သင် (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"အမည်"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"စနစ်ထည့်သွင်းထားခြင်း မရှိပါ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"အသုံးပြုသူအမည် တည်းဖြတ်ခြင်း"</string>
     <string name="users_list_title" msgid="770764290290240909">"အသုံးပြုသူများ"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ကိုပေးထားသော ခွင့်ပြုချက်"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"အကောင့်များ"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"အသုံးပြုသူ"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"အကောင့်ထည့်ရန်"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"အကောင့်များ ထည့်မထားပါ"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> အတွက် အကောင့်များ"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ဒေတာ အော်တိုစင့်ခ်လုပ်ရန်"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ဒေတာများကို အလိုအလျောက်ပြန်လည်စတင်ရန် အက်ပ်များကိုခွင့်ပြုပါ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ဒေတာ အော်တိုစင့်ခ်ကို ဖွင့်မလား။"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ဝဘ်ပေါ်တွင် သင်၏ အကောင့်အတွက်လုပ်သည့် အပြောင်းအလဲအားလုံးကို သင့်စက်ပစ္စည်းသို့ အလိုအလျောက် ကူးပေးမည်။ \n\nအချို့အကောင့်များသည် သင့်ဖုန်းအတွင်းပြုလုပ်ထားသည့် အပြောင်းအလဲများကို ဝဘ်ဆီသို့ အလိုအလျောက် ကူးပေးနိုင်ပါသည်။ Google အကောင့်၏ အလုပ်လုပ်ပုံ ဖြစ်ပါသည်။"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ဒေတာ အော်တိုစင့်ခ်ကို ပိတ်မလား။"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"၎င်းသည် ဒေတာများကို ကာကွယ်ထားမည်ဖြစ်သော်လည်း မကြာသေးခင်က အချက်အလက်များကို စုဆောင်းရန် အကောင့်တစ်ခုစီကို ကိုယ်တိုင်စင့်ခ်လုပ်ရပါမည်။ အပ်ဒိတ်ပြုလုပ်နေစဉ် အကြောင်းကြားချက်များ လက်ခံ၍မရပါ။"</string>
     <string name="account_details_title" msgid="7529571432258448573">"အကောင့်အချက်အလက်"</string>
     <string name="add_account_title" msgid="5988746086885210040">"အကောင့်ထည့်ရန်"</string>
     <string name="add_an_account" msgid="1072285034300995091">"အကောင့်တစ်ခု ထည့်ရန်"</string>
@@ -189,24 +338,28 @@
     <string name="remove_account_title" msgid="8840386525787836381">"အကောင့်ကို ဖယ်ရှားရန်"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"အကောင့်ကို ဖယ်ရှားမလား။"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ဤအကောင့်ကို ဖယ်ရှားလိုက်ခြင်းဖြင့် စက်ပစ္စည်းထဲရှိ မက်ဆေ့ဂျ်၊ အဆက်အသွယ်နှင့် အခြားဒေတာများ အားလုံးကို ဖျက်လိုက်ပါမည်။"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ဤပြောင်းလဲမှုကို သင့်စီမံခန့်ခွဲသူက ခွင့်မပြုပါ"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ဤသူကို ဖယ်ရှားလိုပါသလား။"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"အက်ပ်အားလုံးနှင့် ဒေတာများကို ဖျက်လိုက်ပါမည်။"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"အသုံးပြုသူကို ဖယ်ရှား၍ မရပါ။"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"ထပ်စမ်းလိုသလား။"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"ပယ်ရန်"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ထပ်စမ်းကြည့်ရန်"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"အသုံးပြုသူအသစ် ထည့်မလား။"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"အသုံးပြုသူအသစ် ထည့်သည့်အခါ ထိုသူသည် မိမိ၏ နေရာကို စနစ်ထည့်သွင်းရပါမည်။"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"မည်သူမဆို အသုံးပြုသူအားလုံးအတွက် အက်ပ်များကို အပ်ဒိတ်လုပ်နိုင်သည်။"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"အကောင့်ဖယ်ရှား၍ မရပါ။"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"အကောင့် စင့်ခ်လုပ်ရန်"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> ခုအနက်မှ <xliff:g id="ID_1">%1$d</xliff:g> ခုအတွက် စင့်ခ်ဖွင့်ထားသည်"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"အရာအားလုံးအတွက် စင့်ခ်ဖွင့်ထားသည်"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"အရာအားလုံးအတွက် စင့်ခ်ပိတ်ထားသည်"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"စင့်ခ်လုပ်ခြင်းပိတ်ထားသည်"</string>
+    <string name="sync_error" msgid="6698021343089247914">"စင့်ခ်လုပ်ခြင်း အမှား"</string>
+    <string name="last_synced" msgid="4745124489150101529">"<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g> တွင် နောက်ဆုံး စင့်ခ်လုပ်ထားသည်"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ယခု စင့်ခ်လုပ်နေသည်…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ယခုစင့်ခ်လုပ်ရန် တို့ပါ<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ယခု စင့်ခ်လုပ်ရန်"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"စင့်ခ် ပယ်ဖျက်ရန်"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"စင့်ခ်လုပ်ရန် လက်ရှိတွင် ပြဿနာရှိနေပါသည်။ ခဏကြာလျှင် ပြန်လည်ရရှိပါမည်။"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"လုံခြုံရေး"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"မျက်နှာပြင်လော့ခ်"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"မရှိ"</string>
     <string name="security_lock_pattern" msgid="1174352995619563104">"ပုံစံ"</string>
     <string name="security_lock_pin" msgid="4891899974369503200">"ပင်နံပါတ်"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"စကားဝှက်"</string>
-    <string name="lock_settings_picker_title" msgid="6590330165050361632">"လော့ခ်အမျိုးအစား ရွေးပါ"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"မျက်နှာပြင်လော့ခ်ချရန် ရွေးချယ်စရာများ"</string>
+    <string name="lock_settings_picker_title" msgid="6590330165050361632">"လော့ခ်ဖွင့်နည်း ရွေးပါ"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"လော့ခ်ရွေးစရာများ"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"သင့်လော့ခ်ဖွင့်ပုံစံ ထည့်ခြင်း"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"အတည်ပြုရန်"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ပြန်ဆွဲပါ"</string>
@@ -216,7 +369,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"မျက်နှာပြင်လော့ခ်တစ်ခု သတ်မှတ်ခြင်း"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"သင့် PIN နံပါတ် ရွေးချယ်ခြင်း"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"သင့်လော့ခ်ဖွင့်ပုံစံ ရွေးပါ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"သင့်စကားဝှက် ရွေးချယ်ခြင်း"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"သင့်စကားဝှက်ကိုရွေးချယ်ပါ"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"လက်ရှိ မျက်နှာပြင်လော့ခ်"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"လုံခြုံရေးအတွက် ပုံစံတစ်ခု သတ်မှတ်ပါ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"ရှင်းရန်"</string>
@@ -228,7 +381,7 @@
     <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"ပုံစံကိုထပ်ဆွဲပြီး အတည်ပြုရန်"</string>
     <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"အနည်းဆုံးအမှတ် ၄ မှတ်ချိတ်ပါ။ ထပ်လုပ်ပါ။"</string>
     <string name="lockpattern_pattern_wrong" msgid="929223969555399363">"ပုံစံ မှားနေသည်"</string>
-    <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"လော့ခ်ဖွင့်ရန်ပုံစံ ဆွဲရန်နည်းလမ်း"</string>
+    <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"လော့ခ်ဖွင့်ရန်ပုံစံ ဆွဲနည်း"</string>
     <string name="error_saving_lockpattern" msgid="2933512812768570130">"ပုံစံကို သိမ်းရာတွင် အမှားရှိနေသည်"</string>
     <string name="okay" msgid="4589873324439764349">"OK"</string>
     <string name="remove_screen_lock_title" msgid="1234382338764193387">"မျက်နှာပြင်လော့ခ် ဖယ်လိုသလား။"</string>
@@ -260,8 +413,8 @@
     <string name="lockpassword_illegal_character" msgid="1984970060523635618">"၎င်းတွင် မမှန်ကန်သည့် အက္ခရာများ ပါဝင်၍မရပါ။"</string>
     <string name="lockpassword_invalid_password" msgid="1690956113717418430">"စကားဝှက် မမှန်ပါ၊ အနည်းဆုံး အက္ခရာ ၄ လုံး ရှိရမည်။"</string>
     <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
-      <item quantity="other">အနည်းဆုံး စကားလုံး <xliff:g id="COUNT">%d</xliff:g> လုံးပါဝင်ရမည်</item>
-      <item quantity="one">အနည်းဆုံး စကားလုံး ၁ လုံးပါဝင်ရမည်</item>
+      <item quantity="other">အနည်းဆုံး စာလုံး <xliff:g id="COUNT">%d</xliff:g> လုံးပါဝင်ရမည်</item>
+      <item quantity="one">အနည်းဆုံး စာလုံး ၁ လုံးပါဝင်ရမည်</item>
     </plurals>
     <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
       <item quantity="other">အနည်းဆုံး စာလုံးငယ် <xliff:g id="COUNT">%d</xliff:g> လုံးပါဝင်ရမည်</item>
@@ -288,7 +441,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"အသုံးပြုလေ့ရှိသော စကားဝှက်များကို သင်၏ IT စီမံခန့်ခွဲသူက ပိတ်ထားသည်။ အခြား စကားဝှက်တစ်ခုဖြင့် စမ်းကြည့်ပါ။"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"အစဉ်လိုက်ဖြစ်နေသော ဂဏန်း အငယ်မှအကြီး၊ အကြီးမှအငယ် သို့မဟုတ် ထပ်နေသည့် နံပါတ်စဉ်များကို ခွင့်မပြုပါ။"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"မျက်နှာပြင်လော့ခ်ချခြင်း ရွေးချယ်စရာများ"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> - လွန်ခဲ့သော <xliff:g id="NUM_DAYS">%3$s</xliff:g> ရက်"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"ယုံကြည်ရသည့် စက်ကိုထည့်ရန်"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"ယုံကြည်ရသည့် စက်များ"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other">စက်ပစ္စည်း <xliff:g id="COUNT_1">%d</xliff:g> ခု</item>
+      <item quantity="one">စက်ပစ္စည်း <xliff:g id="COUNT_0">%d</xliff:g> ခု</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"ချိတ်ဆက်သည့်အခါ သင့် <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> က ဤကားကို လော့ခ်ဖွင့်ပါမည်။ တစ်စုံတစ်ယောက်က သင့် <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> ကိုယူသွားလျှင် သူသည် ဤကိရိယာကို အသုံးပြုခွင့်ရရှိနိုင်ပါသည်"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"အတည်ပြုရန်"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"ယုံကြည်ရသော ကိရိယာ ဖယ်ရှားရန်"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ပြီးပြီ"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"စိတ်ချရသည့် စက်ပစ္စည်းကို စတင်သတ်မှတ်ရန် တွဲဖက်အက်ပ်ကို သုံးပါ။ သတ်မှတ်ပြီးသည်နှင့် စက်က သင့်ဖုန်းကို တွေ့သည့်အခါ သင့်အသုံးပြုသူ ပရိုဖိုင်ကို ဖွင့်နိုင်ပါမည်"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"၁။ တွဲဖက် အက်ပ်ကို သင့်ဖုန်းတွင် ဒေါင်းလုဒ်လုပ်ပါ"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"၂။ စက်ပစ္စည်းနှင့်အတူ တွဲချိတ်ရန် သင့်ဖုန်းတွင် <xliff:g id="CAR_NAME">%1$s</xliff:g> ကို ရွေးပေးပါ"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock က ဤစက်ပစ္စည်း၏ လုံခြုံရေးဝန်ဆောင်မှုများကို မတွေ့ပါ။ သင့်ကားကို ကာကွယ်ပေးရန် သင် လော့ခ်ဖွင့်ပြီးမှသာ စိတ်ချရသည့် စက်ပစ္စည်းက သင့်ဖုန်းကို လော့ခ်ဖွင့်နိုင်မည်ဖြစ်သည်။ အခြားသူတစ်ဦးက ကိုင်ဆောင်ထားစေကာမူ သင့် စိတ်ချရသည့်စက်ပစ္စည်းက အနီးတဝိုက်တွင် ရှိနေလျှင် သင့်ဖုန်းကို လော့ခ်ဖွင့်ပေးနိုင်ပါသည်။"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ကို ယုံကြည်သည့် စက်ပစ္စည်းအဖြစ် ထည့်ပါ"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ကို စိတ်ချရသည့် စက်ပစ္စည်းအဖြစ် ထည့်ပြီးပါပြီ"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ကို စာရင်းသွင်း၍ မရပါ"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"စိတ်ချရသည့် ကိရိယာတစ်ခုကို ထည့်ပြီးပါက အထောက်အထားစိစစ်ခြင်း နည်းလမ်းတစ်ခုကို သတ်မှတ်ရပါမည်။ သင့်တွင် စိတ်ချရသည့် ကိရိယာ အတူပါမလာပါက သင့်ပရိုဖိုင်ကို ဝင်သုံးခွင့်ရရန် အထောက်အထားစိစစ်ခြင်း လိုအပ်ပါလိမ့်မည်။"</string>
     <string name="forget" msgid="3971143908183848527">"မေ့ပစ်ရန်"</string>
+    <string name="connect" msgid="5861699594602380150">"ချိတ်ရန်"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ချိတ်ဆက်မှု ဖြုတ်ရန်"</string>
     <string name="delete_button" msgid="5840500432614610850">"ဖျက်ရန်"</string>
     <string name="remove_button" msgid="6664656962868194178">"ဖယ်ရှားရန်"</string>
     <string name="cancel" msgid="750286395700355455">"မလုပ်တော့"</string>
@@ -298,8 +472,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"သရုပ်ပြမုဒ်မှ ထွက်ရန်"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"၎င်းက သရုပ်ပြအကောင့်ကို ဖျက်ပြီး စနစ်ကို စက်ရုံထုတ်အခြေအနေပြန်ယူပါမည်။ အသုံးပြုသူ ဒေတာအားလုံး ရှိတော့မည်မဟုတ်ပါ။"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"သရုပ်ပြမှ ထွက်ရန်"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"စနစ်ထည့်သွင်းမှု အပြီးသတ်ရန်"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ယခုမလုပ်ပါ"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ပယ်ရန်"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ကားမောင်းနေစဉ် ဝန်ဆောင်မှု မရနိုင်ပါ။"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ကားမောင်းနေစဉ် အသုံးပြုသူကို ထည့်၍မရပါ။"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 259de29..a881e93 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"dim skjermen, berøringsskjerm, batteri"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"dim skjermen, natt, fargetone"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nattmodus"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Nettverk og internett"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilnettverk"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobildata"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Bruk data via mobilnettverket"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vil du slå av mobildata?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Databruk"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Datavarsel og -grense"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Syklus for appdatabruk"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Angi varsel om databruk"</string>
+    <string name="data_warning" msgid="116776633806885370">"Varsel om databruk"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Angi datagrense"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datagrense"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Begrensning av databruk"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Kjøretøyets hovedenhet slår av mobildata når den når grensen du angir.\n\nSiden databruken måles av hovedenheten og operatøren din kan beregne bruken annerledes, kan det være lurt å angi en lav grense."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Konfigurer og administrer trådløse tilgangspunkter"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Slår på Wi-Fi …"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Slår av Wi-Fi …"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Laster inn Wi‑Fi-liste"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi er slått av"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Kunne ikke glemme nettverket"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Kunne ikke koble til nettverket"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Legg til nettverk"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi er slått av"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Koble til"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Passord"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Vis passordet"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nettverksnavn"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Skriv inn SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Sikkerhet"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signalstyrke"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signalstyrke"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Tilkoblingshastighet"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvens"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-adresse"</string>
+    <string name="show_password" msgid="2074628020371139240">"Se passordet"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Angi nettverksnavnet"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Skriv inn passordet"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Dårlig"</item>
-    <item msgid="2032262610626057081">"OK"</item>
-    <item msgid="3859756017461098953">"Bra"</item>
-    <item msgid="1521103743353335724">"Utmerket"</item>
+    <item msgid="7683058295076342057">"Dårlig"</item>
+    <item msgid="1639222824821660744">"OK"</item>
+    <item msgid="1838705897358163300">"Bra"</item>
+    <item msgid="6067166649320533751">"Utmerket"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Slå på Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth er slått av"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Nettverksdetaljer"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-adresse"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-adresse"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Nettverksmaske"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-adresser"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi-innstillinger"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Slå på Wi‑Fi automatisk"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi slås på igjen i nærheten av lagrede nettverk av høy kvalitet, for eksempel hjemmenettverket"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Utilgjengelig fordi Posisjon er slått av. Slå på "<annotation id="link">"Posisjon"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Vil du slå på Wi‑Fi-skanning?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Slå på"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi-skanning er slått på"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Bytt til mobildata automatisk"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Bruk mobildata når Wi-Fi ikke har internettilgang. Avgifter for databruk kan påløpe."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Finn ut mer"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Administrer tilkoblinger, angi enhetsnavn og synlighet"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Datamaskin"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Hodetelefoner"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Bildefremviser"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Hodetelefoner"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Ekstern enhet for inndata"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Tilkoblede enheter"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Tilgjengelige enheter"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Ingen tilkoblede enheter"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Ingen tilgjengelige enheter"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Tilkoblet enhet"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Navn"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Bruk for"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Endre navnet til Bluetooth-enheten"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Enhet uten navn"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Tilkoblede enheter"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Koble til en ny enhet"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth slås på for å koble til"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Vil du koble fra enheten?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Kjøretøyet ditt kobles fra <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Kjøretøyets Bluetooth-adresse: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Enhetens Bluetooth-adresse: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Kjøretøynavn"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Gi kjøretøyet nytt navn"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Gi enheten nytt navn"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Gi nytt navn"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Tilgjengelige enheter"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiler"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Forespørsel om Bluetooth-tilkobling"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Koble sammen og koble til"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-tilkoblingskode"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN-koden inneholder bokstaver eller symboler"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Skriv inn sammenkoblingskoden, og trykk på Retur eller Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Vanligvis 0000 eller 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Tilkoblingsforespørsel"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Trykk for å koble til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Språk"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Språk og inndata"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastatur"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Administrer tastaturer"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Tekst til tale-utdata"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Foretrukket motor"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Nåværende motor"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Talehastighet"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Stemmeleie"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Tilbakestill"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Lyd"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Ringevolum"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigasjonsvolum"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Medier"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Volum for musikk og video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefonringelyd"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Standard varsellyd"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Standard alarmlyd"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apper og varsler"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Vis alle apper"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Standardapper"</string>
     <string name="applications_settings" msgid="794261395191035632">"App-info"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Tving til å avslutte"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Vil du tvinge avslutning?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Hvis du tvinger avslutning av en app, kan det oppstå problemer."</string>
     <string name="disable_text" msgid="4358165448648990820">"Slå av"</string>
     <string name="enable_text" msgid="1794971777861881238">"Slå på"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Avinstaller"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Hvis du slår av denne appen, slutter muligens Android og andre apper å fungere som de skal."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Deaktiver appen"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Tillatelser"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versjon: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ingen tillatelser er gitt"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ingen tillatelser er forespurt"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Databruk"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Appens databruk"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Tving til å avslutte"</string>
     <string name="computing_size" msgid="5791407621793083965">"Beregner …"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tillatelser til</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tillatelse til</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistent og taleinndata"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assistentapp"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Bruk teksten fra skjermen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Gi assistentappen tilgang til skjerminnholdet som tekst"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Bruk skjermdumpen"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Gi assistentappen tilgang til et bilde av skjermen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Autofylltjeneste"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ingen"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Valgt"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistenten kan lese informasjon om appene du bruker i systemet ditt, inkludert informasjon som er synlig på skjermen eller tilgjengelig i appene."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Sørg for at appen er pålitelig&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google autofyll&gt;%1$s&lt;/xliff:g&gt; bruker det som er på skjermen, til å fastslå hva som kan fylles ut automatisk."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Legg til tjeneste"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Posisjon"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nylige posisjonsforespørsler"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ingen nylige posisjonsforespørsler"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Tillatelser på appnivå"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Søking"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Posisjonstjenester"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi-skanning"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"La apper og tjenester skanne etter enheter i nærheten når som helst, selv når Wi-Fi er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-skanning"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"La apper og tjenester søke etter enheter i nærheten når som helst, selv når Bluetooth er slått av. Dette kan for eksempel brukes til å forbedre posisjonsbaserte funksjoner og tjenester."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Systemoppdateringer"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Systemoppdateringer"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-versjon"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-sikkerhetsoppdatering"</string>
     <string name="model_info" msgid="4966408071657934452">"Modell"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basisbåndversjon"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kjerneversjon"</string>
     <string name="build_number" msgid="3997326631001009102">"Delversjonsnummer"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-adresse"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ikke tilgjengelig"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Opphavsrett"</string>
     <string name="license_title" msgid="936705938435249965">"Lisens"</string>
     <string name="terms_title" msgid="5201471373602628765">"Vilkår"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Systemets WebView-lisens"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"WebView-lisenser på systemet"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Bakgrunner"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Leverandører av satellittbilder:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Tredjepartslisenser"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Det oppsto et problem ved innlasting av lisensene."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Laster inn …"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Du er nå <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> trinn fra å bli en utvikler.</item>
+      <item quantity="one">Du er nå <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> trinn fra å bli en utvikler.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Du er en utvikler nå!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Det trengs ikke. Du er allerede en utvikler."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Utvikleralternativer"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Alternativer for tilbakestilling"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Tilbakestilling av nettverk, apper eller enhet"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Tilbakestill nettverket"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Dette tilbakestiller alle nettverksinnstillingene, blant annet"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobildata"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Slett alle e-SIM-kortene på kjøretøyet"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Dette kansellerer ikke serviceavtalen din."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Kan ikke tilbakestille e-SIM-kort"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Velg nettverk"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Tilbakestill innstillingene"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Vil du tilbakestille?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Vil du tilbakestille alle nettverksinnstillingene? Du kan ikke angre denne handlingen."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Tilbakestill innstillingene"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Nettverksinnstillingene er tilbakestilt"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Tilbakestill appinnstillingene"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Dette tilbakestiller alle innstillinger for\n\n"<li>"deaktiverte apper"</li>\n<li>"deaktiverte appvarsler"</li>\n<li>"standardapper for handlinger"</li>\n<li>"begrensninger for bakgrunnsdata for apper"</li>\n<li>"eventuelle tillatelsesbegrensninger"</li>\n\n"Du kommer ikke til å miste appdata."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Tilbakestill apper"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Appinnstillingene er tilbakestilt"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Slett alle data (tilbakestill)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Dette sletter alle dataene fra kjøretøyets hovedenhet, inkludert\n\n"<li>"Google-kontoen din"</li>\n<li>"system- og appdata samt innstillinger"</li>\n<li>"nedlastede apper"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Du er for øyeblikket pålogget følgende kontoer:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Andre brukere er til stede i dette kjøretøyet."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Tilbakestill kjøretøyet"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vil du tilbakestille?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Vil du slette den personlige informasjonen din og nedlastede apper? Du kan ikke angre denne handlingen."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Tøm alt"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Tømmer"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Vent litt."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Dato og klokkeslett"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Angi dato og klokkeslett"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Angi dato, klokkeslett, tidssone og formater"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sortér etter tidssone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Dato"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Klokkeslett"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Legg til bruker"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Legg til konto"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Slett bruker"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Ny bruker"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gjest"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Logget på som administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Alle administratortillatelser"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Gjør brukeren til administrator"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Administratorer kan slette brukere, inkludert andre administratorer, og tilbakestille systemet til fabrikkstandard."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Denne handlingen kan ikke angres."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ja, gjør brukeren til administrator"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Opprett nye brukere"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Ring"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Meldinger via bilens mobildata"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Installer nye apper"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Avinstaller apper"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Legg til bruker"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Ny bruker"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Vil du legge til denne brukeren?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Alle brukere kan oppdatere apper for alle andre brukere."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Grensen for antall brukere er nådd"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Du kan opprette opptil <xliff:g id="COUNT">%d</xliff:g> brukere.</item>
+      <item quantity="one">Du kan bare opprette én bruker.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Kunne ikke opprette noen ny bruker"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Vil du slette brukeren?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Alle appene og dataene slettes."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Kunne ikke slette brukeren."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Avvis"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Prøv på nytt"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Slett den siste brukeren?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Når du har slettet den eneste gjenværende brukeren for bilen, blir en ny administratorbruker opprettet."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Alle dataene, innstillingene og appene som er knyttet til bruken, blir slettet. Du må konfigurere systemet på nytt."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Velg en ny administrator"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Du trenger minst én administrator. For å slette denne administratoren må du først finne en erstatter."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Velg en administrator"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gjest"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gjest"</string>
     <string name="user_switch" msgid="6544839750534690781">"Bytt"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Deg (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Navn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Ikke konfigurert"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Endre brukernavnet"</string>
     <string name="users_list_title" msgid="770764290290240909">"Brukere"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Tillatelse er gitt til %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Kontoer"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Bruker"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Legg til konto"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Ingen kontoer er lagt til"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Kontoer for <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Synkroniser data automatisk"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"La apper oppdatere data automatisk"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Slå på auto-synkronisering?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Alle endringene du gjør i kontoene dine på nettet, kopieres automatisk til enheten din.\n\nNoen kontoer kan også automatisk kopiere endringer du gjør på telefonen, til nettet. Google-kontoer fungerer på denne måten."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Slå av auto-synkronisering?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Dette gir lavere databruk, men du må synkronisere hver konto manuelt for å samle inn ny informasjon. Og du mottar ikke varsler ved oppdateringer."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Kontoinformasjon"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Legg til konto"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Legg til en konto"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Fjern kontoen"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Vil du fjerne kontoen?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Hvis du fjerner denne kontoen, slettes alle tilhørende e-poster, kontakter og andre data fra enheten."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Denne endringen er ikke tillatt av administratoren"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Vil du fjerne brukeren?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Alle apper og data slettes."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Kunne ikke fjerne brukeren."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Vil du prøve på nytt?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Avvis"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Prøv på nytt"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Legg til en ny bruker?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Alle brukere kan oppdatere apper for alle andre brukere."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Kunne ikke fjerne kontoen."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Kontosynkronisering"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synkronisering er slått på for <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g> elementer"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synkronisering er slått på for alle elementene"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synkronisering er slått av for alle elementene"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synkronisering er av"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Synkroniseringsfeil"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Sist synkronisert <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synkroniserer nå …"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Trykk for å synkronisere nå<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkroniser nå"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Avbryt synkroniseringen"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Det er midlertidige problemer med synkroniseringen. Vent litt."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Sikkerhet"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skjermlås"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Ingen"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-kode"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Passord"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Velg låsen du vil bruke"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Alternativer for skjermlås"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Låsealternativer"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Skriv inn mønsteret ditt"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Bekreft"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Tegn på nytt"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Angi en skjermlås"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Velg PIN-koden din"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Velg mønster"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Velg passordet ditt"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Velg passordet ditt"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Gjeldende skjermlås"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Angi et mønster for sikkerheten"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Fjern"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Vanlige passord er blokkert av IT-administratoren din. Prøv et annet passord."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"En sekvens av stigende, synkende eller like sifre er ikke tillatt."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Alternativer for skjermlås"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : for <xliff:g id="NUM_DAYS">%3$s</xliff:g> dager siden"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Legg til en pålitelig enhet"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Pålitelige enheter"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> enheter</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> enhet</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> låser opp denne bilen når den er tilkoblet. Hvis noen tar <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, får vedkommende tilgang til denne enheten."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Bekreft"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Fjern pålitelig enhet"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Ferdig"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Bruk følgeappen for å konfigurere en pålitelig enhet. Når den er konfigurert, kan du låse opp brukerprofilen din når telefonen din oppdages av kjøretøyet."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Last ned følgeappen på telefonen din"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Velg <xliff:g id="CAR_NAME">%1$s</xliff:g> på telefonen for å koble til enhetene"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock kan ikke registrere sikkerhetsfunksjoner på denne enheten. For å beskytte bilen din kan pålitelige enheter bare holde bilen din ulåst når den allerede er låst opp av deg. Den pålitelige enheten din kan holde bilen din ulåst når den er i nærheten – selv om noen andre holder den."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Legg til <xliff:g id="DEVICE_NAME">%1$s</xliff:g> som en pålitelig enhet"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> er lagt til som en pålitelig enhet"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Kunne ikke registrere <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Hvis du legger til en pålitelig enhet, må du angi en autentiseringsmetode. Hvis du ikke har den pålitelige enheten din med deg, kreves autentisering for å få tilgang til profilen din."</string>
     <string name="forget" msgid="3971143908183848527">"Glem"</string>
+    <string name="connect" msgid="5861699594602380150">"Koble til"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Koble fra"</string>
     <string name="delete_button" msgid="5840500432614610850">"Slett"</string>
     <string name="remove_button" msgid="6664656962868194178">"Fjern"</string>
     <string name="cancel" msgid="750286395700355455">"Avbryt"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Avslutt demomodus"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Dette sletter demokontoen og tilbakestiller systemet til fabrikkstandard. Alle brukerdataene går tapt."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Avslutt demomodus"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"fullfør konfigureringen"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ikke nå"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"AVVIS"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funksjonen er ikke tilgjengelig når du kjører."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Du kan ikke legge til en bruker mens du kjører."</string>
 </resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 2d0a64e..2fac200 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,58 +29,91 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"मधुरो स्क्रिन, टचस्क्रिन, ब्याट्री"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"मधुरो स्क्रिन, रात, हल्का रङ"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"रात्रि मोड"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"नेटवर्क र इन्टरनेट"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"मोबाइल नेटवर्क"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"मोबाइल डेटा"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"मोबाइल नेटवर्क प्रयोग गरी डेटामाथि पहुँच राख्नु…"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"डेटाको प्रयोग"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"डेटासम्बन्धी चेतावनी तथा सीमा"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"अनुप्रयोगको डेटा प्रयोगको चक्र"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"डेटासम्बन्धी चेतावनी सेट गर्नु"</string>
+    <string name="data_warning" msgid="116776633806885370">"डेटासम्बन्धी चेतावनी"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"डेटाको सीमा सेट गर्नुहोस्"</string>
+    <string name="data_limit" msgid="227338836292511425">"डेटाको सीमा"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"डेटाको प्रयोग सीमित गर्दै"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"तपाईंले सेट गर्नुभएको अधिकतम डेटा प्रयोगको सीमामा पुगेपछि तपाईंको सवारी साधनको मुख्य भागले मोबाइल डेटालाई निष्क्रिय पार्ने छ।\n\nतपाईंको सवारी साधनको मुख्य भागले र तपाईंको सेवा प्रदायकले फरक तरिकाले डेटा प्रयोगको मापन गर्ने हुनाले विवेकपूर्ण तरिकाले यसको सीमा सेट गर्ने कुराबारे विचार गर्नुहोस्।"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ताररहित पहुँच बिन्दुहरू सेटअप र प्रबन्ध गर्नुहोस्"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi सक्रिय गरिँदै…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi निष्क्रिय पारिँदै…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi को सूची लोड गर्दै"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi असक्षम पारिएको छ"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"नेटवर्कलाई बिर्सन सकिएन"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"नेटवर्कमा जडान गर्न सकिएन"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"नेटवर्क थप्नुहोस्"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi असक्षम पारिएको छ"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"जडान गर्ने"</string>
     <string name="wifi_password" msgid="5565632142720292397">"पासवर्ड"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"पासवर्ड देखाउनुहोस्"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"नेटवर्कको नाम"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID प्रविष्टि गर्नुहोस्"</string>
     <string name="wifi_security" msgid="158358046038876532">"सुरक्षा"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"सिग्नलको क्षमता"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"सिङ्केतको क्षमता"</string>
     <string name="wifi_status" msgid="5688013206066543952">"स्थिति"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"लिङ्कको गति"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"आवृत्ति"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP ठेगाना"</string>
+    <string name="show_password" msgid="2074628020371139240">"पासवर्ड देखाउनुहोस्"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"नेटवर्कको नाम प्रविष्टि गर्नुहोस्"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"पासवर्ड प्रविष्टि गर्नुहोस्"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"कमजोर"</item>
-    <item msgid="2032262610626057081">"ठिकै"</item>
-    <item msgid="3859756017461098953">"राम्रो"</item>
-    <item msgid="1521103743353335724">"उत्कृष्ट"</item>
+    <item msgid="7683058295076342057">"कमजोर"</item>
+    <item msgid="1639222824821660744">"ठिकठाक"</item>
+    <item msgid="1838705897358163300">"राम्रो"</item>
+    <item msgid="6067166649320533751">"उत्कृष्ट"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ब्लुटुथ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ब्लुटुथ सक्रिय गर्नुहोस्"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ब्लुटुथ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ब्लुटुथ असक्षम गरियो"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"२.४ GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"५ GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"नेटवर्कसम्बन्धी विवरणहरू"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ठेगाना"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ठेगाना"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"सबनेट मास्क"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ठेगानाहरू"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"गेटवे"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi का प्राथमिकताहरू"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi स्वतः सक्रिय गर्नुहोस्"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"तपाईंको घरको नेटवर्क जस्ता सुरक्षित गरिएका उच्च गुणस्तरका नेटवर्कहरू नजिक हुँदा Wi‑Fi फेरि सक्रिय हुने छ"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"स्थान निष्क्रिय पारिएको हुनाले उपलब्ध छैन। "<annotation id="link">"स्थान"</annotation>" सक्रिय गर्नुहोस्।"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi स्क्यान गर्ने सुविधा सक्रिय गर्ने हो?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"सक्रिय गर्नुहोस्"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi स्क्यान गर्ने सेवा सक्रिय छ"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Wi-Fi  बाट बदलेर स्वतः मोबाइल डेटा प्रयोग गर्नुहोस्"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi मार्फत इन्टरनेट उपलब्ध नभएको बेलामा मोबाइल डेटाको प्रयोग गर्नुहोस्। डेटा प्रयोगको शुल्क लाग्न सक्छ।"</string>
+    <string name="learn_more" msgid="8214605928933358604">"थप जान्नुहोस्"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ब्लुटुथ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"जडानहरूको व्यवस्थापन गर्नुहोस्, यन्त्रको नाम तथा भेटिने क्षमता नामक सेवा सेट गर्नुहोस्"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"कम्प्युटर"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"हेडसेट"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"फोन"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"इमेजिङ"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"हेडफोन"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"इनपुटसम्बन्धी परिधीय यन्त्र"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ब्लुटुथ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"जोडा बनाइएका यन्त्रहरू"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"उपलब्ध यन्त्रहरू"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"जोडा बनाइएका कुनै यन्त्रहरू छैनन्"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"कुनै पनि उपलब्ध ब्लुटुथ यन्त्रहरू छैनन्"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"जोडा बनाइएको यन्त्र"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"नाम"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"यसका लागि प्रयोग गर्नुहोस्"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth यन्त्रको नाम परिवर्तन गर्नुहोस्"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"बेनामी यन्त्र"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"जोडा बनाइएका यन्त्रहरू"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"नयाँ यन्त्रलाई जोडा बनाउनुहोस्"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"जोडा बनाउनका लागि ब्लुटुथ सक्रिय हुने छ"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"यन्त्र विच्छेद गर्ने हो?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"तपाईंको यन्त्र <xliff:g id="DEVICE_NAME">%1$s</xliff:g> बाट विच्छेद हुने छ।"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"सवारी साधनको ब्लुटुथ ठेगाना: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"यन्त्रको ब्लुटुथ ठेगाना: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"यन्त्रको नाम"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"यो सवारी साधनको पुनः नामकरण गर्नुहोस्"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"यन्त्रको पुनः नामकरण गर्नुहोस्"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"पुनः नामकरण गर्नुहोस्"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"उपलब्ध यन्त्रहरू"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"प्रोफाइलहरू"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ब्लुटुथसँग जोडा बनाउने अनुरोध"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"जोडा बनाउनुहोस् र जडान गर्नुहोस्"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ब्लुटुथ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ब्लुटुथसँग जोडा बनाउने कोड"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN मा अक्षर वा प्रतीकहरू समाविष्ट हुन्छन्"</string>
-    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"जोडा मिलाउने कोड टाइप गर्नुहोस् त्यसपछि फिर्ता गर्नुहोस् वा प्रविष्ट गर्नुहोस् नामक बटन थिच्नुहोस्"</string>
+    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"जोडा मिलाउने कोड टाइप गर्नुहोस् त्यसपछि फिर्ता गर्नुहोस् वा प्रविष्टि गर्नुहोस् नामक बटन थिच्नुहोस्"</string>
     <string name="bluetooth_pairing_request" msgid="4769675459526556801">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> सँग जोडा बनाउने हो?"</string>
     <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>लाई तपाईंका सम्पर्क ठेगानाहरू र फोन सम्पर्कको इतिहासमाथि पहुँच गर्न अनुमति दिनुहोस्"</string>
     <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"तपाईंले अर्को यन्त्रमा पनि यो PIN टाइप गर्नु पर्ने हुन सक्छ।"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"सामान्यतया ०००० वा १२३४"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"जोडा बनाउनका लागि गरिएको अनुरोध"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>सँग जोडा बनाउन ट्याप गर्नुहोस्।"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"भाषाहरू"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"भाषा र इनपुट"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"किबोर्ड"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"किबोर्डहरू व्यवस्थित गर्नुहोस्"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"पाठवाचकको आउटपुट"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"रुचाइएको इन्जिन"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"हालको इन्जिन"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"वाणीको दर"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"पिच"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"रिसेट गर्नुहोस्"</string>
     <string name="sound_settings" msgid="3072423952331872246">"आवाज"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"घन्टीको भोल्युम"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"नेभिगेसन भोल्युम"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"मिडिया"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"सङ्गीत र भिडियोहरूका लागि भोल्युम सेट गर्नुहोस्"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"अलार्म"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"फोनको रिङटोन"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"सूचनाको पूर्वनिर्धारित ध्वनि"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"अलार्मको पूर्वनिर्धारित ध्वनि"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"अनुप्रयोग तथा सूचनाहरू"</string>
+    <string name="all_applications" msgid="7798210477486822168">"सबै अनुप्रयोगहरू देखाउनुहोस्"</string>
+    <string name="default_applications" msgid="1558183275638697087">"पूर्वनिर्धारित अनुप्रयोगहरू"</string>
     <string name="applications_settings" msgid="794261395191035632">"अनुप्रयोगसम्बन्धी जानकारी"</string>
+    <string name="force_stop" msgid="2153183697014720520">"जबर्जस्ती रोक्नुहोस्"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"जबरजस्ती रोक्ने हो?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"तपाईंले कुनै अनुप्रयोगलाई जबरजस्ती रोक्नुभयो भने त्यसले सही तरिकाले काम नगर्न सक्छ।"</string>
     <string name="disable_text" msgid="4358165448648990820">"असक्षम पार्नुहोस्"</string>
     <string name="enable_text" msgid="1794971777861881238">"सक्षम पार्नुहोस्"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"स्थापना रद्द गर्नुहोस्"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"तपाईंले यो अनुप्रयोगलाई असक्षम पार्नुभयो भने Android र अन्य अनुप्रयोगहरूले अब उप्रान्त अपेक्षाअनुसार कार्य नगर्न सक्छन्।"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"अनुप्रयोगलाई असक्षम पार्नुहोस्"</string>
     <string name="permissions_label" msgid="2701446753515612685">"अनुमतिहरू"</string>
     <string name="application_version_label" msgid="8556889839783311649">"संस्करण: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"कुनै पनि अनुमति प्रदान गरिएको छैन"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"कुनै पनि अनुमतिका लागि अनुरोध गरिएको छैन"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"डेटाको प्रयोग"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"अनुप्रयोगको डेटाको प्रयोग"</string>
-    <string name="force_stop" msgid="2153183697014720520">"जबर्जस्ती रोक्नुहोस्"</string>
     <string name="computing_size" msgid="5791407621793083965">"गणना गरिँदै…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> अतिरिक्त अनुमतिहरू</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> अतिरिक्त अनुमति</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"सहायक र आवाज संलग्न इनपुट"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"सहायक अनुप्रयोग"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"स्क्रिनमा रहेको पाठ प्रयोग गर्नुहोस्"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"सहायक अनुप्रयोगलाई स्क्रिनमा रहेको कुनै सामग्रीमाथि पाठका रूपमा पहुँच राख्ने अनुमति दिनुहोस्"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"स्क्रिसट प्रयोग गर्नुहोस्"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"सहायक अनुप्रयोगलाई स्क्रिनमा रहेको कुनै छविमाथि पहुँच राख्ने अनुमति दिनुहोस्"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"स्वतः भरण सेवा"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"कुनै पनि होइन"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"चयन गरिएको"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"सहायकले तपाईंको स्क्रिनमा देख्न सकिने वा अनुप्रयोगहरूभित्र पहुँच राख्न सकिने जानकारीलगायत तपाईंको प्रणालीमा प्रयोगमा रहेका अनुप्रयोगहरूबारे जानकारी पढ्न सक्ने छ।"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;तपाईं यो अनुप्रयोगमाथि भरोसा गर्नुहुन्छ भन्ने कुरा सुनिश्चित गर्नुहोस्&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; यस अनुप्रयोगले स्वतः भर्न सकिने कुराहरूको निर्धारण गर्न तपाईंको स्क्रिनमा भएका वस्तुहरूको प्रयोग गर्छ।"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"सेवा थप्नुहोस्"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"स्थान"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"हालका स्थानसम्बन्धी अनुरोधहरू"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"हालसालैका स्थानसम्बन्धी कुनै पनि अनुरोध छैन"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"अनुप्रयोग स्तरीय अनुमति"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"स्क्यान गर्दै"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"स्थानसम्बन्धी सेवाहरू"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi स्क्यान हुँदै"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"अनुप्रयोग र सेवाहरूलाई जुनसुकै बेला (Wi‑Fi निष्क्रिय भएको बेलामा पनि) वरपरका Wi-Fi नेटवर्कहरू स्क्यान गर्न अनुमति दिनुहोस्। यसलाई स्थानमा आधारित सुविधा तथा सेवाहरू सुधार गर्ने जस्ता कार्यहरू गर्नाका लागि प्रयोग गर्न सकिन्छ।"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ब्लुटुथ स्क्यान हुँदै"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"अनुप्रयोग तथा सेवाहरूलाई जुनसुकै बेला (ब्लुटुथ निष्क्रिय भएको बेलामा पनि) वरपरका यन्त्रहरू स्क्यान गर्न अनुमति दिनुहोस्‌। यसलाई स्थानमा आधारित सुविधा तथा सेवाहरू सुधार गर्ने जस्ता कार्यहरू गर्नाका लागि प्रयोग गर्न सकिन्छ।"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"प्रणाली"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"प्रणालीसम्बन्धी अद्यावधिकहरू"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"प्रणालीसम्बन्धी अद्यावधिकहरू"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android संस्करण"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android सुरक्षा प्याचको चरण"</string>
     <string name="model_info" msgid="4966408071657934452">"मोडेल"</string>
     <string name="baseband_version" msgid="2370088062235041897">"बेसब्यान्ड संस्करण"</string>
     <string name="kernel_version" msgid="7327212934187011508">"कर्नेल संस्करण"</string>
     <string name="build_number" msgid="3997326631001009102">"बिल्डको नम्बर"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ब्लुटुथ ठेगाना"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"उपलब्ध छैन"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"स्थिति"</string>
     <string name="device_status" msgid="267298179806290920">"स्थिति"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"प्रतिलिपि अधिकार"</string>
     <string name="license_title" msgid="936705938435249965">"इजाजतपत्र"</string>
     <string name="terms_title" msgid="5201471373602628765">"सेवाका सर्तहरू"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"प्रणालीको WebView इजाजतपत्र"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"प्रणालीका WebView इजाजतपत्रहरू"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"वालपेपरहरू"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"स्याटेलाइटमार्फत इमेजरी प्रदायकहरू:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"तेस्रो पक्षीय इजाजतपत्रहरू"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"इजाजतपत्रहरू लोड गर्दा समस्या भयो।"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"लोड गर्दै…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">तपाईं अब एउटा विकासकर्ता हुनबाट <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>चरण टाढा हुनुहुन्छ।</item>
+      <item quantity="one">तपाईं अब एउटा विकासकर्ता हुनबाट <xliff:g id="STEP_COUNT_0">%1$d</xliff:g>चरण टाढा हुनुहुन्छ।</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"तपाईं अब एउटा विकासकर्ता हुनुहुन्छ!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"आवश्यक छैन, तपाईं आफैँ नै एउटा विकासकर्ता हुनुहुन्छ।"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"विकासकर्ताका विकल्पहरू"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"रिसेटका विकल्पहरू"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"नेटवर्क, अनुप्रयोग वा यन्त्रको रिसेटसम्बन्धी विकल्प"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"नेटवर्क रिसेट गर्नुहोस्"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"यस कार्यले निम्नलगायत नेटवर्कसम्बन्धी सम्पूर्ण सेटिङहरू रिसेट गर्ने छ:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"मोबाइल डेटा"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ब्लुटुथ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"सबै सवारीका eSIM हरू मेट्नुहोस्‌"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"यस कार्यले तपाईंको सेवाको योजना रद्द गर्ने छैन।"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM हरू रिसेट गर्न सकिएन"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"नेटवर्क चयन गर्नुहोस्"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"सेटिङहरू रिसेट गर्नुहोस्"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"रिसेट गर्ने हो?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"नेटवर्कसम्बन्धी सबै सेटिङहरू रिसेट गर्ने हो? तपाईं यो कार्य अन्डू गर्न सक्नुहुन्न!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"सेटिङहरू रिसेट गर्नुहोस्"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"नेटवर्कसम्बन्धी सेटिङहरू रिसेट गरिएको छ"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"अनुप्रयोगका प्राथमिकताहरू रिसेट गर्नुहोस्"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"यस कार्यले निम्न सुविधाहरूका सबै प्राथमिकताहरूलाई रिसेट गर्ने छ:\n\n"<li>"असक्षम पारिएका अनुप्रयोगहरू"</li>\n<li>"असक्षम पारिएका अनुप्रयोगका सूचनाहरू"</li>\n<li>"कारबाहीका लागि पूर्वनिर्धारित अनुप्रयोगहरू"</li>\n<li>"अनुप्रयोगका लागि पृष्ठभूमिका डेटासम्बन्धी बन्देजहरू"</li>\n<li>"अनुमतिसम्बन्धी सबै बन्देजहरू"</li>\n\n"तपाईं अनुप्रयोगको कुनै पनि डेटा गुमाउनु हुने छैन।"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"अनुप्रयोगहरू रिसेट गर्नुहोस्"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"अनुप्रयोगका प्राथमिकताहरू रिसेट गरिएको छ"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"सबै डेटा मेटाउनुहोस् (फ्याक्ट्री रिसेट गर्नुहोस्)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"यस कार्यले तपाईंको सवारी साधनाको मुख्य भागबाट सम्पूर्ण डेटा मेटाउने छ, जसमा निम्न कुराहरू पर्दछन्:\n\n"<li>"तपाईंको Google खाता"</li>\n<li>"प्रणाली र अनुप्रयोगका डेटा तथा सेटिङहरू"</li>\n<li>"डाउनलोड गरिएका अनुप्रयोगहरू"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"तपाईं अहिले निम्न खाताहरूमा साइन इन हुनुहुन्छ:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"यस सवारी साधनमा अन्य प्रयोगकर्ताहरू छन्।"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"सवारी साधन रिसेट गर्नुहोस्"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"रिसेट गर्ने हो?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"तपाईंका सबै व्यक्तिगत जानकारी र डाउनलोड गरिएका अनुप्रयोगहरू मेट्ने हो? तपाईं यो कार्य अन्डू गर्न सक्नुहुन्न!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"सबै कुरा मेटाउनुहोस्"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"मेटाउँदै"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"कृपया प्रतीक्षा गर्नुहोला..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"मिति र समय"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"मिति र समय सेट गर्नुहोस्"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"मिति, समय, समय क्षेत्र र प्रारूपहरू सेट गर्नुहोस्"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"समय क्षेत्रका आधारमा क्रमबद्ध गर्नुहोस्"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"मिति"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"समय"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"प्रयोगकर्ता थप्नुहोस्"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"खाता थप्नुहोस्"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"प्रयोगकर्ता मेटाउनुहोस्"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"नयाँ प्रयोगकर्ता"</string>
-    <string name="user_guest" msgid="3465399481257448601">"अतिथि"</string>
     <string name="user_admin" msgid="1535484812908584809">"प्रशासक"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"प्रशासकका रूपमा साइन इन गरियो"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"सबै प्रशासकीय अनुमति"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"व्यवस्थापक बनाउनुहोस्"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"उक्त प्रयोगकर्ता अन्य प्रशासकहरू लगायतका प्रयोगकर्ताहरूलाई मेट्न र प्रणालीलाई फ्याक्ट्री रिसेट गर्न सक्ने छन्।"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"यो कारबाही उल्टाउन मिल्दैन।"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"हो, व्यवस्थापक बनाउनुहोस्"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"नयाँ प्रयोगकर्ताहरू सिर्जना गर्नु…"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"फोन कल गर्नुहोस्"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"कारको मोबाइल डेटामार्फत सन्देश पठाउँदै"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"नयाँ अनुप्रयोगहरू स्थापना गर्नुहोस्"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"अनुप्रयोग स्थापना रद्द गर्नुहोस्"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"प्रयोगकर्ता थप्नुहोस्"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"नयाँ प्रयोगकर्ता"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"नयाँ प्रयोगकर्ता थप्ने?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"तपाईंले नयाँ प्रयोगकर्ता थप्दा, ती व्यक्तिले आफ्नो स्थान सेटअप गर्नु पर्नेे हुन्छ।"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"कुनै पनि प्रयोगकर्ताले अन्य सबै प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्नुहुन्छ।"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"प्रयोगकर्ताको सीमा पुग्यो"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">तपाईं अधिकतम <xliff:g id="COUNT">%d</xliff:g> प्रयोगकर्ताहरू सिर्जना गर्न सक्नुहुन्छ।</item>
+      <item quantity="one">एउटा प्रयोगकर्ता मात्र सिर्जना गर्न सकिन्छ।</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"कुनै नयाँ प्रयोगकर्ता सिर्जना गर्न सकिएन"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"यस प्रयोगकर्तालाई हटाउने हो?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"सबै अनुप्रयोग र डेटा मेटाइने छन्।"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"प्रयोगकर्ता मेटाउन सकिएन।"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"खारेज गर्नुहोस्"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"पुनः प्रयास गर्नुहोस्"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"पछिल्लो प्रयोगकर्ता मेटाउने हो?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"यो कारको बाँकी रहेको प्रयोगकर्ता मेटाए पछि नयाँ प्रशासक प्रयोगकर्ता सिर्जना गरिने छ।"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"यो प्रयोगकर्तासँग सम्बन्धित सबै डेटा, सेटिङ र अनुप्रयोगहरू मेटिने छन्। तपाईंले प्रणाली फेरि सेट अप गर्न पर्ने छ।"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"नयाँ प्रशासक छनौट गर्नुहोस्‌"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"तपाईंलाई कम्तिमा एक प्रशासक चाहिन्छ। यो मेट्न पहिले प्रतिस्थापन छनौट गर्नुहोस्‌।"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"प्रशासक छनौट गर्नुहोस्‌"</string>
+    <string name="user_guest" msgid="3465399481257448601">"अतिथि"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"अतिथि"</string>
     <string name="user_switch" msgid="6544839750534690781">"बदल्नुहोस्‌"</string>
     <string name="current_user_name" msgid="3813671533249316823">"तपाईं (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"नाम"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"सेटअप गरिएको छैन"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"प्रयोगकर्ताको नाम सम्पादन गर्नु…"</string>
     <string name="users_list_title" msgid="770764290290240909">"प्रयोगकर्ताहरू"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s लाई अनुमति प्रदान गरियो"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"खाताहरू"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"प्रयोगकर्ता"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"खाता थप्नुहोस्"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"कुनै पनि खाता थपिएन"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> को खाता"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"डेटा स्वतः सिंक गर्नुहोस्"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"अनुप्रयोगहरूलाई डेटा स्वतः पुनः ताजा गर्न दिनुहोस्"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"डेटा स्वतः सिंक गर्ने कार्य सक्रिय गर्ने हो?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"तपाईंले वेबमार्फत आफ्नो खातामा गर्ने सबै परिवर्तनहरू स्वतः तपाईंको यन्त्रमा प्रतिलिपि गरिने छन्।\n\nकेही खाताहरूले तपाईंले फोनमा गर्ने सबै परिवर्तनहरूलाई वेबमा स्वतः प्रतिलिपि गर्न पनि सक्छन्। Google खाताले यसरी काम गर्दछ।"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"डेटा स्वतः सिंक गर्ने कार्य निष्क्रिय पार्ने हो?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"यस कार्यले डेटाको बचत गर्ने छ तर तपाईंले हालसालको जानकारी सङ्कलन गर्न प्रत्येक खातालाई म्यानुअल तरिकाले सिंक गर्नु पर्ने हुन्छ। यसका अतिरिक्त, अद्याविधिक हुँदा तपाईं सूचना प्राप्त गर्नु हुने छैन।"</string>
     <string name="account_details_title" msgid="7529571432258448573">"खातासम्बन्धी जानकारी"</string>
     <string name="add_account_title" msgid="5988746086885210040">"खाता थप्नुहोस्"</string>
     <string name="add_an_account" msgid="1072285034300995091">"खाता थप्नुहोस्"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"खाता हटाउनुहोस्"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"खाता हटाउने हो?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"यो खातालाई हटाउनुले यस यन्त्रबाट यस खातामा रहेका सम्पूर्ण सन्देश, सम्पर्कहरू र अन्य डेटा मेटाउने छ!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"तपाईंका प्रशासकले यो परिवर्तनलाई अनुमति दिनुहुन्न"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"यो प्रयोगकर्ता हटाउने हो?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"सबै अनुप्रयोगहरू र डेटा मेटाइने छन्।"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"प्रयोगकर्ता हटाउन सकिएन"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"फेरि प्रयास गर्ने हो?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"खारेज गर्नुहोस्"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"पुनः प्रयास गर्नुहोस्"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"नयाँ प्रयोगकर्ता थप्ने?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"तपाईंले नयाँ प्रयोगकर्ता थप्दा, ती व्यक्तिले आफ्नो स्थान सेटअप गर्नु पर्नेे हुन्छ।"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"कुनै पनि प्रयोगकर्ताले अन्य सबै प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्नुहुन्छ।"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"खाता हटाउन सकिएन।"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"खाताको सिंक"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> मध्ये <xliff:g id="ID_1">%1$d</xliff:g> वस्तुहरूका लागि सिंक गर्ने सेवा सक्रिय छ"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"सबै वस्तुहरूका लागि सिंक गर्ने सेवा सक्रिय छ"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"सबै वस्तुहरूका लागि सिंक गर्ने सेवा निष्क्रिय छ"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"सिंक निष्क्रिय छ"</string>
+    <string name="sync_error" msgid="6698021343089247914">"सिंकसम्बन्धी त्रुटि"</string>
+    <string name="last_synced" msgid="4745124489150101529">"पछिल्लो पटक सिंक गरिएको मिति: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"अहिले सिंक गर्दै..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"अहिले सिंक गर्न ट्याप गर्नुहोस् <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"अहिले नै सिंक गर्नुहोस्"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"सिंक गर्ने कार्य रद्द गर्नु…"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"सिंक गर्ने प्रक्रियामा हाल समस्याहरू आइरहेको छन्। यसले छिट्टै काम गर्ने छ।"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"सुरक्षा"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"स्क्रिन लक"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"कुनै पनि होइन"</string>
@@ -206,8 +358,8 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"पासवर्ड"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"लकको प्रकार चयन गर्ने"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"स्क्रिन लकका विकल्पहरू"</string>
-    <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"आफ्नो ढाँचा प्रविष्ट गर्नुहोस्"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"लक गर्ने विकल्पहरू"</string>
+    <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"आफ्नो ढाँचा प्रविष्टि गर्नुहोस्"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"पुष्टि गर्नुहोस्"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"पुनः चित्रण गर्नुहोस्"</string>
     <string name="continue_button_text" msgid="5129979170426836641">"जारी राख्नुहोस्"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"स्क्रिन लक सेट गर्नुहोस्"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"आफ्नो PIN छनौट गर्नुहोस्"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"आफ्नो ढाँचा छनौट गर्नुहोस्"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"आफ्नो पासवर्ड छनौट गर्नुहोस्"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"आफ्नो पासवर्ड छनौट गर्नुहोस्"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"हालको स्क्रिन लक"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"सुरक्षाका लागि ढाँचा सेट गर्नुहोस्"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"खाली गर्नुहोस्"</string>
@@ -233,10 +385,10 @@
     <string name="okay" msgid="4589873324439764349">"ठिक छ"</string>
     <string name="remove_screen_lock_title" msgid="1234382338764193387">"स्क्रिन लक हटाउने हो?"</string>
     <string name="remove_screen_lock_message" msgid="6675850371585564965">"यस कार्यले जुनसुकै व्यक्तिलाई तपाईंको खातामाथि पहुँच राख्न दिने छ"</string>
-    <string name="lock_settings_enter_pin" msgid="1669172111244633904">"आफ्नो PIN प्रविष्ट गर्नुहोस्"</string>
-    <string name="lock_settings_enter_password" msgid="2636669926649496367">"आफ्नो पासवर्ड प्रविष्ट गर्नुहोस्"</string>
+    <string name="lock_settings_enter_pin" msgid="1669172111244633904">"आफ्नो PIN प्रविष्टि गर्नुहोस्"</string>
+    <string name="lock_settings_enter_password" msgid="2636669926649496367">"आफ्नो पासवर्ड प्रविष्टि गर्नुहोस्"</string>
     <string name="choose_lock_pin_message" msgid="2963792070267774417">"सुरक्षाका ला‍गि एउटा PIN सेट गर्नुहोस्"</string>
-    <string name="confirm_your_pin_header" msgid="9096581288537156102">"आफ्नो PIN पुन: प्रविष्ट गर्नुहोस्"</string>
+    <string name="confirm_your_pin_header" msgid="9096581288537156102">"आफ्नो PIN पुन: प्रविष्टि गर्नुहोस्"</string>
     <string name="choose_lock_pin_hints" msgid="7362906249992020844">"PIN कम्तीमा ४ अङ्कको हुनै पर्ने"</string>
     <string name="lockpin_invalid_pin" msgid="2149191577096327424">"Pin अमान्य छ, यसमा अनिवार्य रूपमा कम्तीमा ४ अङ्क हुनु पर्छ।"</string>
     <string name="confirm_pins_dont_match" msgid="4607110139373520720">"PIN हरू मेल खाँदैनन्"</string>
@@ -244,7 +396,7 @@
     <string name="lockscreen_wrong_pin" msgid="4922465731473805306">"गलत PIN"</string>
     <string name="lockscreen_wrong_password" msgid="5757087577162231825">"गलत पासवर्ड"</string>
     <string name="choose_lock_password_message" msgid="6124341145027370784">"सुरक्षाका लागि पासवर्ड सेट गर्नुहोस्"</string>
-    <string name="confirm_your_password_header" msgid="7052891840366724938">"आफ्नो पासवर्ड पुन: प्रविष्ट गर्नुहोस्"</string>
+    <string name="confirm_your_password_header" msgid="7052891840366724938">"आफ्नो पासवर्ड पुन: प्रविष्टि गर्नुहोस्"</string>
     <string name="confirm_passwords_dont_match" msgid="7300229965206501753">"पासवर्डहरू मेल खाँदैनन्"</string>
     <string name="lockpassword_clear_label" msgid="6363680971025188064">"खाली गर्नुहोस्"</string>
     <string name="lockpassword_cancel_label" msgid="5791237697404166450">"रद्द गर्नुहोस्"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"तपाईंका IT व्यवस्थापकले धेरै प्रयोग हुने पासवर्डहरूमाथि रोक लगाउनु भएको छ। कुनै फरक पासवर्ड प्रयोग गरी हेर्नुहोस्।"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"अङ्कहरूको बढ्दो, घट्दो वा दोहोरिएको अनुक्रम निषेध गरिएको छ।"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"स्क्रिन लकका विकल्पहरू"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> दिनअघि"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"विश्वसनीय यन्त्र थप्नुहोस्"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"विश्वसनीय यन्त्रहरू"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> यन्त्रहरू</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> यन्त्र</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"तपाईंको <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> जडान भएका बेला यसले यो कार अनलक गर्ने छ कुनै व्यक्तिले तपाईंको <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> लैजानुभयो भने उहाँले यो यन्त्रमाथि पहुँच राख्न सक्ने सम्भावना छ।"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"पुष्टि गर्नुहोस्"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"विश्वसनीय यन्त्रलाई हटाउनुहोस्"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"सम्पन्न भयो"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"कुनै विश्वसनीय यन्त्र सेटअप गर्न सहयोगी अनुप्रयोग प्रयोग गर्नुहोस्। सेटअप भएपछि, सवारी साधनले तपाईंको फोन पत्ता लागाएपछि तपाईं आफ्नो प्रयोगकर्ता प्रोफाइल अनलक गर्न सक्नु हुने छ"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"१. आफ्नो फोनमा सहयोगी अनुप्रयोग डाउनलोड गर्नुहोस्"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"२. यन्त्रहरूको जोडा बनाउन आफ्नो फोनमा <xliff:g id="CAR_NAME">%1$s</xliff:g> चयन गर्नुहोस्"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ले यस यन्त्रका सुरक्षासम्बन्धी सुविधाहरू पत्ता लगाउन सक्दैन। तपाईंको कारलाई सुरक्षित राख्न मद्दत गर्नका लागि विश्वसनीय यन्त्रले तपाईंले अनलक गरेपछि मात्र तपाईंको कार अनलक अवस्थामा राख्न सक्ने छ। तपाईंको विश्वसनीय यन्त्र जोसुकैका हातमा भए तापनि त्यसले तपाईंको कार वरपर हुँदा त्यसलाई अनलक अवस्थामा राख्न सक्छ।"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> लाई विश्वसनीय यन्त्रका रूपमा थप्नुहोस्"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> लाई सफलतापूर्वक कुनै विश्वसनीय यन्त्रका रूपमा थपियो"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> दर्ता गर्न सकिएन"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"कुनै विश्वसनीय यन्त्र थप्दा तपाईंले यसपछिको चरणमा प्रमाणीकरण विधि सेट गर्नु पर्छ। तपाईंसँग आफ्नो विश्वसनीय यन्त्र छैन भने तपाईंको प्रोफाइलमाथि पहुँच राख्न प्रमाणीकरणको आवश्यकता पर्ने छ।"</string>
     <string name="forget" msgid="3971143908183848527">"बिर्सनुहोस्"</string>
+    <string name="connect" msgid="5861699594602380150">"जडान गर्नुहोस्"</string>
+    <string name="disconnect" msgid="6140789953324820336">"विच्छेद गर्नुहोस्"</string>
     <string name="delete_button" msgid="5840500432614610850">"मेट्नुहोस्"</string>
     <string name="remove_button" msgid="6664656962868194178">"हटाउनुहोस्"</string>
     <string name="cancel" msgid="750286395700355455">"रद्द गर्नुहोस्"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"डेमो मोडबाट बाहिरिनुहोस्"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"यस कार्यले डेमो खाता मेटाउनुका साथै प्रणालीमा फ्याक्ट्रीको डेटा रिसेट गर्दछ। प्रयोगकर्ताका सबै डेटा गुम्ने छन्।"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"डेमो मोडबाट बाहिरिनुहोस्"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"सेटअप सम्पन्न गर्नुहोस्"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"अहिले होइन"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"खारेज गर्नुहोस्"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"सवारी साधन चलाइरहेको बेला यो सुविधा उपलब्ध छैन।"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"सवारी साधन चलाइरहेको बेला प्रयोगकर्तालाई थप्न सकिँदैन।"</string>
 </resources>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
deleted file mode 100644
index be2c363..0000000
--- a/res/values-night/colors.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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.
--->
-<resources>
-    <color name="toggle_bg_disabled">@color/car_grey_800</color>
-    <color name="toggle_icon_disabled">@color/car_grey_400</color>
-    <color name="google_blue_600">@color/google_blue_600_light</color>
-
-    <color name="car_user_switcher_add_user_background_color">@color/car_dark_blue_grey_600</color>
-    <color name="car_user_switcher_current_user_color">@color/car_teal_200</color>
-</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index dde4565..1e178e3 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"scherm dimmen, touchscreen, batterij"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"scherm dimmen, nacht, tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nachtmodus"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Netwerk en internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobiel netwerk"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobiele data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Datatoegang via mobiel netwerk"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobiele data uitschakelen?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Datagebruik"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Datawaarschuwing- en limiet"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Gebruikscyclus app-data"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Datawaarschuwing instellen"</string>
+    <string name="data_warning" msgid="116776633806885370">"Datawaarschuwing"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Datalimiet instellen"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datalimiet"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Datagebruik beperken"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"De hoofdeenheid van je voertuig schakelt mobiele data uit zodra je de ingestelde limiet bereikt.\n\nAangezien het datagebruik wordt gemeten door de hoofdeenheid en je provider het gebruik op een andere manier kan berekenen, kun je overwegen een conservatieve limiet in te stellen."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wifi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Draadloze toegangspunten instellen en beheren"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wifi inschakelen…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wifi uitschakelen…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wifi-lijst laden…"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wifi uitgeschakeld"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Vergeten van netwerk is mislukt"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Kan geen verbinding maken met het netwerk"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Netwerk toevoegen"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wifi uitgeschakeld"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Connect"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Wachtwoord"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Wachtwoord weergeven"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Netwerknaam"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Geef de SSID op"</string>
     <string name="wifi_security" msgid="158358046038876532">"Beveiliging"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signaalsterkte"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signaalsterkte"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Linksnelheid"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequentie"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-adres"</string>
+    <string name="show_password" msgid="2074628020371139240">"Wachtwoord weergeven"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Netwerknaam opgeven"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Wachtwoord opgeven"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Slecht"</item>
-    <item msgid="2032262610626057081">"OK"</item>
-    <item msgid="3859756017461098953">"Goed"</item>
-    <item msgid="1521103743353335724">"Uitstekend"</item>
+    <item msgid="7683058295076342057">"Slecht"</item>
+    <item msgid="1639222824821660744">"OK"</item>
+    <item msgid="1838705897358163300">"Goed"</item>
+    <item msgid="6067166649320533751">"Uitstekend"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth inschakelen"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth uitgeschakeld"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Netwerkgegevens"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-adres"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-adres"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnetmasker"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-adressen"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wifi-voorkeuren"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wifi automatisch inschakelen"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wifi schakelt in bij opgeslagen kwaliteitsnetwerken, zoals je thuisnetwerk"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Niet beschikbaar: locatie uitgeschakeld. Schakel "<annotation id="link">"locatie"</annotation>" in."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wifi-scannen inschakelen?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Inschakelen"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wifi-scannen ingeschakeld"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatisch overschakelen naar mobiele data"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Mobiele data gebruiken wanneer er geen internettoegang via wifi is. Er kunnen kosten voor datagebruik in rekening worden gebracht."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Meer informatie"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Verbindingen beheren, apparaatnaam en vindbaarheid instellen"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefoon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Replicatieapparaat"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Hoofdtelefoon"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Randapparaat voor invoer"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Gekoppelde apparaten"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Beschikbare apparaten"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Geen gekoppelde apparaten"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Geen beschikbare apparaten"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Gekoppeld apparaat"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Naam"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Gebruiken voor"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Naam van Bluetooth-apparaat wijzigen"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Naamloos apparaat"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Gekoppelde apparaten"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Nieuw apparaat koppelen"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth wordt ingeschakeld om te koppelen"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Apparaat ontkoppelen?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Je voertuig wordt ontkoppeld van <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth-adres van voertuig: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth-adres van apparaat: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Naam van voertuig"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Naam van dit voertuig wijzigen"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Naam van apparaat wijzigen"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Naam wijzigen"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Beschikbare apparaten"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profielen"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth-koppelingsverzoek"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Koppelen en verbinden"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth-koppelingscode"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Pincode bevat letters of symbolen"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Typ de koppelingscode en druk op Return of Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Meestal 0000 of 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Koppelingsverzoek"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tik om te koppelen met <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Talen"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Talen en invoer"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Toetsenbord"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Toetsenborden beheren"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Tekst-naar-spraak-uitvoer"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Voorkeursengine"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Huidige engine"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Spreeksnelheid"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Hoogte"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Resetten"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Geluid"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Beltoonvolume"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigatievolume"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Volume voor muziek en video\'s instellen"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Beltoon telefoon"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Standaard meldingsgeluid"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Standaard wekkergeluid"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps en meldingen"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Alle apps weergeven"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Standaard-apps"</string>
     <string name="applications_settings" msgid="794261395191035632">"App-info"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Gedwongen stoppen"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Gedwongen stoppen?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Als je een app gedwongen stopt, kan deze onverwacht gedrag vertonen."</string>
     <string name="disable_text" msgid="4358165448648990820">"Uitschakelen"</string>
     <string name="enable_text" msgid="1794971777861881238">"Inschakelen"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Verwijderen"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Als je deze app uitschakelt, werken Android en andere apps mogelijk niet meer zoals bedoeld."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"App uitschakelen"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Machtigingen"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versie: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Geen machtigingen verleend"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Geen machtigingen aangevraagd"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Datagebruik"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Gegevensgebruik van app"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Gedwongen stoppen"</string>
     <string name="computing_size" msgid="5791407621793083965">"Berekenen…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aanvullende rechten</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aanvullend recht</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"De Assistent en spraakinvoer"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"App voor assistentie"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Tekst van scherm gebruiken"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Toestaan dat de app voor assistentie toegang krijgt tot de scherminhoud als tekst"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Screenshot gebruiken"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Toestaan dat de app voor assistentie toegang krijgt tot een afbeelding van het scherm"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Service voor automatisch aanvullen"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Geen"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Geselecteerd"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"De Assistent kan informatie over de gebruikte apps in je systeem lezen, waaronder informatie die zichtbaar is op je scherm of toegankelijk is in de apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Zorg dat je deze app vertrouwt&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; maakt gebruik van de content op je scherm om te bepalen wat automatisch kan worden aangevuld."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Service toevoegen"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Locatie"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Recente locatieverzoeken"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Geen recente locatieverzoeken"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Machtigingen op app-niveau"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Scannen"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Locatieservices"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wifi-scannen"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Apps en services toestaan altijd te scannen naar wifi-netwerken in de buurt, zelfs als wifi is uitgeschakeld. Dit kan bijvoorbeeld worden gebruikt om locatiegebaseerde functies en services te verbeteren."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-scannen"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Apps en services toestaan altijd te scannen naar apparaten in de buurt, zelfs als Bluetooth is uitgeschakeld. Dit kan bijvoorbeeld worden gebruikt om locatiegebaseerde functies en services te verbeteren."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Systeem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Systeemupdates"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Systeemupdates"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-versie"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android-beveiligingspatchniveau"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Smalbandversie"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-versie"</string>
     <string name="build_number" msgid="3997326631001009102">"Build-nummer"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-adres"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Niet beschikbaar"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licentie"</string>
     <string name="terms_title" msgid="5201471373602628765">"Algemene voorwaarden"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Systeemlicentie voor webweergave"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Systeemlicenties voor WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Achtergronden"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Providers van satellietbeelden:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenties van derden"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Er is een probleem bij het laden van de licenties."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Laden…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Je moet nog <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> stappen uitvoeren om ontwikkelaar te worden.</item>
+      <item quantity="one">Je moet nog <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> stap uitvoeren om ontwikkelaar te worden.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Je bent nu ontwikkelaar!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Niet nodig, je bent al ontwikkelaar."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Ontwikkelaarsopties"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opties voor resetten"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Netwerk, apps of apparaat resetten"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Netwerk resetten"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Hiermee worden alle netwerkinstellingen gereset, waaronder:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wifi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobiele data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Alle e-simkaarten van voertuig wissen"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Hiermee wordt je abonnement niet opgezegd."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Kan e-simkaarten niet resetten"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Netwerk selecteren"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Instellingen resetten"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Resetten?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Alle netwerkinstellingen resetten? Je kunt deze actie niet ongedaan maken."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Instellingen resetten"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Netwerkinstellingen zijn gereset"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"App-voorkeuren resetten"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Hiermee worden alle voorkeuren gereset voor:\n\n"<li>"Uitgeschakelde apps"</li>\n<li>"Uitgeschakelde app-meldingen"</li>\n<li>"Standaardapps voor acties"</li>\n<li>"Beperkingen voor achtergrondgegevens voor apps"</li>\n<li>"Beperkingen voor machtigingen"</li>\n\n"Je verliest geen app-gegevens."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Apps resetten"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"App-voorkeuren zijn gereset"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Alle gegevens wissen (fabrieksreset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Hiermee worden alle gegevens van de hoofdunit van je voertuig gewist, waaronder:\n\n"<li>"Je Google-account"</li>\n<li>"Gegevens en instellingen van het systeem en de apps"</li>\n<li>"Gedownloade apps"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Je bent momenteel ingelogd op de volgende accounts:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Er zijn andere gebruikers aanwezig in dit voertuig."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Voertuig resetten"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Resetten?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Al je persoonlijke informatie en gedownloade apps verwijderen? Je kunt deze actie niet ongedaan maken."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Alles wissen"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Wissen"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Even geduld..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum en tijd"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Datum en tijd instellen"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Datum, tijd, tijdzone en notaties instellen"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sorteren op tijdzone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Tijd"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Gebruiker toevoegen"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Account toevoegen"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Gebruiker verwijderen"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nieuwe gebruiker"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gast"</string>
     <string name="user_admin" msgid="1535484812908584809">"Beheerder"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Ingelogd als beheerder"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Alle beheerdersrechten"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Beheerder maken"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"De gebruiker kan gebruikers (waaronder andere beheerders) verwijderen en het systeem terugzetten op de fabrieksinstellingen."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Deze actie kan niet ongedaan worden gemaakt."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ja, beheerder maken"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Nieuwe gebruikers maken"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Bellen"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Sms\'en via mobiele data van auto"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Nieuwe apps installeren"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Installatie van apps ongedaan maken"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Gebruiker toevoegen"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nieuwe gebruiker"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Nieuwe gebruiker?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Wanneer je een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Elke gebruiker kan apps updaten voor alle andere gebruikers"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Gebruikerslimiet bereikt"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Je kunt maximaal <xliff:g id="COUNT">%d</xliff:g> gebruikers maken.</item>
+      <item quantity="one">Er kan maar één gebruiker worden gemaakt.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Kan geen nieuwe gebruiker maken"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Deze gebruiker verwijderen?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Alle apps en gegevens worden verwijderd."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Kan gebruiker niet verwijderen."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Sluiten"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Opnieuw proberen"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Laatste gebruiker verwijderen?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Nadat de enige overblijvende gebruiker voor deze auto is verwijderd, wordt er een nieuwe beheerder gemaakt."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Alle gegevens, instellingen en apps die aan deze gebruiker zijn gekoppeld, worden verwijderd. Je moet het systeem opnieuw instellen."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Nieuwe beheerder kiezen"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Je hebt ten minste één beheerder nodig. Als je deze beheerder wilt verwijderen, moet je eerst een vervanger kiezen."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Beheerder kiezen"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gast"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gast"</string>
     <string name="user_switch" msgid="6544839750534690781">"Wijzigen"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Jij (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Naam"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Niet ingesteld"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Gebruikersnaam bewerken"</string>
     <string name="users_list_title" msgid="770764290290240909">"Gebruikers"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Rechten verleend aan %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Accounts"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Gebruiker"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Account toevoegen"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Geen accounts toegevoegd"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Accounts voor <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Gegevens automatisch synchroniseren"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Apps automatisch gegevens laten vernieuwen"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Auto-synchronisatie inschakelen?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Wijzigingen die je op internet aanbrengt in je accounts, worden automatisch naar je apparaat gekopieerd.\n\nBij sommige accounts worden mogelijk ook de wijzigingen die je op de telefoon aanbrengt, naar internet gekopieerd. Dit geldt bijvoorbeeld voor Google-accounts."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Auto-synchr. uitschakelen?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Hiermee bespaar je data. Je moet elk account echter handmatig synchroniseren om recente informatie te verzamelen. Je ontvangt geen meldingen wanneer er updates plaatsvinden."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Accountgegevens"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Account toevoegen"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Een account toevoegen"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Account verwijderen"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Account verwijderen?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Als dit account wordt verwijderd, worden ook alle bijbehorende berichten, contacten en andere gegevens van het apparaat verwijderd."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Deze wijziging is niet toegestaan door je beheerder"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Gebruiker verwijderen?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Alle apps en gegevens worden verwijderd."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Kan gebruiker niet verwijderen."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Opnieuw proberen?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Sluiten"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Opnieuw proberen"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Nieuwe gebruiker?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Wanneer je een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Elke gebruiker kan apps updaten voor alle andere gebruikers"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Kan account niet verwijderen."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Accountsynchronisatie"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synchronisatie is ingeschakeld voor <xliff:g id="ID_1">%1$d</xliff:g> van de <xliff:g id="ID_2">%2$d</xliff:g> items"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synchronisatie is ingeschakeld voor alle items"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synchronisatie is uitgeschakeld voor alle items"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synchroniseren uitgeschakeld"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Fout bij synchroniseren"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Laatst gesynchroniseerd: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Nu synchroniseren…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tik om nu te synchroniseren<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Nu synchroniseren"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Synchronisatie annuleren"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Er zijn momenteel problemen met de synchronisatie. Synchronisatie wordt snel opnieuw uitgevoerd."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Beveiliging"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Schermvergrendeling"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Geen"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Pincode"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Wachtwoord"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Vergrend.type kiezen"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Schermvergrendelingsopties"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Vergrendelingsopties"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Geef je patroon op"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Bevestigen"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Opnieuw tekenen"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Een schermvergrendeling instellen"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Je pincode kiezen"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Je patroon kiezen"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Je wachtwoord kiezen"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Je wachtwoord kiezen"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Huidige schermvergrendeling"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Stel wachtwoord in voor beveiliging"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Wissen"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Veelvoorkomende wachtwoorden worden geblokkeerd door je IT-beheerder. Probeer een ander wachtwoord."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Een oplopende, aflopende of herhaalde reeks cijfers is niet toegestaan."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Schermvergrendelingsopties"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g> dagen geleden"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Vertrouwd apparaat toevoegen"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Vertrouwde apparaten"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apparaten</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> apparaat</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Je <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ontgrendelt deze auto wanneer je apparaat is verbonden. Als iemand je <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> in handen krijgt, kan die persoon mogelijk toegang krijgen tot dit apparaat."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Bevestigen"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Veilig apparaat verwijderen"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Klaar"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Gebruik de bijbehorende app om een vertrouwd apparaat in te stellen. Na het instellen kun je je gebruikersprofiel ontgrendelen wanneer je telefoon wordt gedetecteerd door het voertuig."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Download de bijbehorende app op je telefoon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selecteer <xliff:g id="CAR_NAME">%1$s</xliff:g> op je telefoon om de apparaten te koppelen"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock kan de beveiligingsfuncties van dit apparaat niet detecteren. Ter beveiliging van je auto kan het vertrouwde apparaat je auto alleen ontgrendeld houden nadat je deze zelf al hebt ontgrendeld. Je vertrouwde apparaat kan je auto ontgrendeld houden wanneer het in de buurt is, ook als iemand anders het apparaat vasthoudt."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> toevoegen als vertrouwd apparaat"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> is toegevoegd als vertrouwd apparaat"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Inschrijving van <xliff:g id="DEVICE_NAME">%1$s</xliff:g> mislukt"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Als je een vertrouwd apparaat toevoegt, moet je daarna een verificatiemethode instellen. Als je je vertrouwde apparaat niet bij je hebt, is verificatie vereist voor toegang tot je profiel."</string>
     <string name="forget" msgid="3971143908183848527">"Vergeten"</string>
+    <string name="connect" msgid="5861699594602380150">"Verbinden"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Verbinding verbreken"</string>
     <string name="delete_button" msgid="5840500432614610850">"Verwijderen"</string>
     <string name="remove_button" msgid="6664656962868194178">"Verwijderen"</string>
     <string name="cancel" msgid="750286395700355455">"Annuleren"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Demomodus afsluiten"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Hiermee wordt het demo-account verwijderd en wordt het systeem teruggezet op de fabrieksinstellingen. Alle gebruikersgegevens gaan verloren."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Demo afsluiten"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"instellen voltooien"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"niet nu"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"SLUITEN"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Functie niet beschikbaar tijdens het rijden."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Kan geen gebruikers toevoegen tijdens het rijden."</string>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
new file mode 100644
index 0000000..d41b012
--- /dev/null
+++ b/res/values-or/strings.xml
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+    Copyright 2018 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="settings_label" msgid="5147911978211079839">"ସେଟିଙ୍ଗ"</string>
+    <string name="more_settings_label" msgid="3867559443480110616">"ଅଧିକ"</string>
+    <string name="display_settings" msgid="5325515247739279185">"ଡିସ୍‌ପ୍ଲେ"</string>
+    <string name="brightness" msgid="2919605130898772866">"ଉଜ୍ଜ୍ୱଳତା ସ୍ତର"</string>
+    <string name="auto_brightness_title" msgid="9124647862844666581">"ଅନୁକୂଳ ଉଜ୍ଜ୍ୱଳତା"</string>
+    <string name="auto_brightness_summary" msgid="4741887033140384352">"ଉପଲବ୍ଧ ଆଲୋକ ପାଇଁ ଉଜ୍ଜ୍ୱଳତା ଅନୁକୂଳ କରନ୍ତୁ"</string>
+    <string name="condition_night_display_title" msgid="3777509730126972675">"ରାତି ଆଲୋକ ଅନ୍ ହୋଇଛି"</string>
+    <string name="keywords_display" msgid="3978416985146943922">"ସ୍କ୍ରୀନ୍‌, ଟଚ୍‌ସ୍କ୍ରୀନ୍‌"</string>
+    <string name="keywords_display_brightness_level" msgid="3956411572536209195">"ଡିମ୍‌ ସ୍କ୍ରିନ୍‌, ଟଚ୍‌ସ୍କ୍ରିନ୍‌, ବ୍ୟାଟେରୀ"</string>
+    <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ଡିମ୍‌ ସ୍କ୍ରିନ୍‌, ଟଚ୍‌ସ୍କ୍ରିନ୍‌, ବ୍ୟାଟେରୀ"</string>
+    <string name="keywords_display_night_display" msgid="2922294576679769957">"ଅଳ୍ପ ଆଲୋକ ଥିବା ସ୍କ୍ରୀନ୍‌, ରାତି, ଟିଣ୍ଟ"</string>
+    <string name="night_mode_tile_label" msgid="6603597795502131664">"ନାଇଟ୍ ମୋଡ୍"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ନେଟ୍‌ୱର୍କ ଓ ଇର୍ଣ୍ଟନେଟ୍"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"ମୋବାଇଲ୍‌ ନେଟ୍‌ୱର୍କ"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"ମୋବାଇଲ୍ ଡାଟା"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ମୋବାଇଲ୍ ନେଟ୍‌ୱର୍କକୁ ବ୍ୟବହାରକରି ଡାଟା ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"ମୋବାଇଲ୍‌ ଡାଟା ବନ୍ଦ କରିବେ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ଡାଟାର ବ୍ୟବହାର"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ଡାଟା ଚେତାବନୀ ଓ ସୀମା"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ଆପ୍ ଡାଟା ବ୍ୟବହାର ଚକ୍ର"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ଡାଟା ଚେତାବନୀ ସେଟ୍ କରନ୍ତୁ"</string>
+    <string name="data_warning" msgid="116776633806885370">"ଡାଟା ଚେତାବନୀ"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ଡାଟା ସୀମା ସେଟ୍ କରନ୍ତୁ"</string>
+    <string name="data_limit" msgid="227338836292511425">"ଡାଟା ସୀମା"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ଡାଟା ବ୍ୟବହାର ସୀମିତ କରିବା"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ଡାଟାର ବ୍ୟବହାର ଆପଣ ସେଟ୍ କରିଥିବା ସୀମାରେ ପହଞ୍ଚିଗଲେ, ଆପଣଙ୍କ ବାହାନର ହେଡ୍ ୟୁନିଟ୍ ମୋବାଇଲ୍ ଡାଟାକୁ ବନ୍ଦ କରିଦେବ।\n\nଯେହେତୁ ବାହାନର ହେଡ୍ ୟୁନିଟ୍ ଡାଟା ବ୍ୟବହାରର ହିସାବ ରଖିଥାଏ ଏବଂ ଆପଣଙ୍କ ବାହାକ ଦ୍ୱାରା ରଖାଯାଇଥିବା ହିସାବ ସାମାନ୍ୟ ଭିନ୍ନ ହୋଇପାରେ, ତେଣୁ ମୋବାଇଲ୍ ଡାଟାର ବ୍ୟବହାର କମ୍ ହେବ, ଏକ ରକ୍ଷଣଶୀଳ ସୀମା ସେଟିଂ କରନ୍ତୁ।"</string>
+    <string name="wifi_settings" msgid="7701477685273103841">"ୱାଇ-ଫାଇ"</string>
+    <string name="wifi_starting" msgid="473253087503153167">"ୱାଇ-ଫାଇ ଅନ୍‌ କରୁଛି…"</string>
+    <string name="wifi_stopping" msgid="3534173972547890148">"ୱାଇ-ଫାଇ ବନ୍ଦ‌ ହେଉଛି…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"ୱାଇ-ଫାଇ ତାଲିକା ଲୋଡ୍‍ ହେଉଛି"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"ୱାଇ-ଫାଇ ଅକ୍ଷମ କରାଯାଇଛି"</string>
+    <string name="wifi_failed_forget_message" msgid="121732682699377206">"ନେଟ୍‌ୱର୍କ ଭୁଲିଯିବାରେ ବିଫଳ ହେଲା"</string>
+    <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ନେଟ୍‌ୱର୍କକୁ ସଂଯୋଗ କରିପାରିଲା ନାହିଁ।"</string>
+    <string name="wifi_setup_add_network" msgid="3660498520389954620">"ନେଟ୍‌ୱର୍କ ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="wifi_setup_connect" msgid="3512399573397979101">"ସଂଯୋଗ"</string>
+    <string name="wifi_password" msgid="5565632142720292397">"ପାସୱର୍ଡ"</string>
+    <string name="wifi_show_password" msgid="8423293211933521097">"ପାସ୍‍ୱର୍ଡ ଦେଖାନ୍ତୁ"</string>
+    <string name="wifi_ssid" msgid="488604828159458741">"ନେଟୱାର୍କ ନାମ"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID ଲେଖନ୍ତୁ"</string>
+    <string name="wifi_security" msgid="158358046038876532">"ସୁରକ୍ଷା"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"ସିଗ୍‍ନାଲ୍‌ ଦକ୍ଷତା"</string>
+    <string name="wifi_status" msgid="5688013206066543952">"ସ୍ଥିତି"</string>
+    <string name="wifi_speed" msgid="1650692446731850781">"ଲିଙ୍କର ବେଗ"</string>
+    <string name="wifi_frequency" msgid="8951455949682864922">"ବାରମ୍ଵାରତା"</string>
+    <string name="wifi_ip_address" msgid="3128140627890954061">"IP ଠିକଣା"</string>
+    <string name="show_password" msgid="2074628020371139240">"ପାସ୍‍ୱାର୍ଡ ଦେଖାନ୍ତୁ"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ନେଟ୍‌ୱର୍କର ନାମ ଲେଖନ୍ତୁ"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"ପାସ୍‌ୱର୍ଡ ଲେଖନ୍ତୁ"</string>
+    <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
+  <string-array name="wifi_signals">
+    <item msgid="4897376984576812606">"ଖରାପ"</item>
+    <item msgid="7683058295076342057">"ଖରାପ"</item>
+    <item msgid="1639222824821660744">"ଠିକ୍‍‍ଠାକ୍‍"</item>
+    <item msgid="1838705897358163300">"ଭଲ"</item>
+    <item msgid="6067166649320533751">"ସର୍ବୋତ୍ତମ"</item>
+  </string-array>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ନେଟ୍‍ୱର୍କ ବିବରଣୀ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ଠିକଣା"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ଠିକଣା"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"ସବ୍‌ନେଟ୍‌ ମାସ୍କ"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ଠିକଣା"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ଗେଟ୍‌ୱେ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ୱାଇ-ଫାଇ ଅଗ୍ରାଧିକାରଗୁଡ଼ିକ"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଚାଲୁ କରନ୍ତୁ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"ୱାଇ-ଫାଇ ଆପଣଙ୍କର ମୂଳ ନେଟ୍‌ୱର୍କ ପରି ଉଚ୍ଚ ଗୁଣବତ୍ତାର ସେଭ୍ ହୋଇଥିବା ନେଟ୍‌ୱର୍କରେ ଫେରିଆସିବ"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"ଲୋକେସନ୍ ବନ୍ଦ ଥିବା କାରଣରୁ ଉପଲବ୍ଧ ନାହିଁ। "<annotation id="link">"ଲୋକେସନ୍"</annotation>" ଚାଲୁ କରନ୍ତୁ।"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"ୱାଇ-ଫାଇ ସ୍କାନିଂକୁ ଚାଲୁ କରିବେ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ଚାଲୁ କରନ୍ତୁ"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"ୱାଇ-ଫାଇ ସ୍କାନିଂ ଚାଲୁ ଅଛି"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"ସ୍ୱଚାଳିତ ଭାବେ ମୋବାଇଲ୍ ଡାଟାକୁ ସ୍ୱିଚ୍ କରନ୍ତୁ"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi‑Fiର ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍ ନଥିବା ବେଳେ ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରନ୍ତୁ। ଡାଟା ବ୍ୟବହାର ଦେୟ ଲାଗୁ ହୋଇପାରେ।"</string>
+    <string name="learn_more" msgid="8214605928933358604">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
+    <string name="bluetooth_settings_title" msgid="3794688574569688649">"ବ୍ଲୁଟୁଥ୍‌"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"ନାମହୀନ ଡିଭାଇସ୍‍"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"ପେୟାର୍‌ ହୋଇଥିବା ଡିଭାଇସ୍‌ଗୁଡ଼ିକ"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"ନୂଆ ଡିଭାଇସ୍‌କୁ ପେୟାର୍‌ କରନ୍ତୁ"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"ପେୟାର୍ କରିବାକୁ ବ୍ଲୁ-ଟୂଥ୍‍ ଚାଲୁ ହେବ"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ଡିଭାଇସ୍‌ ବିଚ୍ଛିନ୍ନ କରିବେ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"ଆପଣଙ୍କ ଗାଡି <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ରୁ ବିଚ୍ଛିନ୍ନ ହେବ।"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"ଗାଡିର ବ୍ଲୁ-ଟୂଥ୍‍‌ ଠିକଣା : <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ଡିଭାଇସ୍‌ର ବ୍ଲୁଟୁଥ୍‌ ଠିକଣା: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ଗାଡିର ନାମ"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ଏହି ଗାଡିକୁ ରିନେମ୍‌ କରନ୍ତୁ"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ଡିଭାଇସକୁ ରିନେମ୍‌ କରନ୍ତୁ"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"ରିନେମ୍‌ କରନ୍ତୁ"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ଉପଲବ୍ଧ ଥିବା ଡିଭାଇସ୍"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"ପ୍ରୋଫାଇଲ୍‌ଗୁଡିକ"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
+    <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ବ୍ଲୁଟୂଥ୍‍ ପେୟାର୍ କରିବା ପାଇଁ ଅନୁରୋଧ"</string>
+    <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ପେୟାର୍‌ ଓ ସଂଯୋଗ"</string>
+    <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ବ୍ଲୁଟୂଥ୍‌ ପେୟାରିଂ କୋଡ୍"</string>
+    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ପିନ୍‌ରେ ଅକ୍ଷର କିମ୍ୱା ସଙ୍କେତ ରହିଥାଏ"</string>
+    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"ପେୟାରିଂ କୋଡ୍ ଟାଇପ୍‌ କରନ୍ତୁ ତାପରେ ଫେରନ୍ତୁ କିମ୍ବା ପ୍ରବେଶ ଦବାନ୍ତୁ"</string>
+    <string name="bluetooth_pairing_request" msgid="4769675459526556801">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ପେୟାର୍‌ କରିବେ?"</string>
+    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"ଆପଣଙ୍କ ଯୋଗାଯୋଗ ଓ କଲ୍‌ ହିଷ୍ଟୋରୀକୁ ଆକ୍‌ସେସ୍‌ କରିବାକୁ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"ଆପଣ ଏହି PIN ଅନ୍ୟ ଡିଭାଇସ୍‌ରେ ମଧ୍ୟ ଟାଇପ୍‌ କରିବା ଆବଶ୍ୟକ କରିପାରନ୍ତି।"</string>
+    <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"ଏହି ପାସ୍‌-କୀକୁ ଅନ୍ୟ ଡିଭାଇସ୍‌ରେ ମଧ୍ୟ ଟାଇପ୍‌ କରିବା ଆବଶ୍ୟକ ହୋଇପରେ।"</string>
+    <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"16 ଅଙ୍କ ବିଶିଷ୍ଟ ହେବା ଦରକାର"</string>
+    <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ସାଧାରଣତଃ 0000 କିମ୍ବା 1234"</string>
+    <string name="bluetooth_notif_title" msgid="8374602799367803335">"ପେୟାରିଙ୍ଗ ଅନୁରୋଧ"</string>
+    <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ପେୟାର୍‌ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ"</string>
+    <string name="language_settings" msgid="2079258598337245546">"ଭାଷା"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ଭାଷା ଓ ଇନ୍‌‌ପୁଟ୍‌"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"କୀବୋର୍ଡ"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"କୀବୋର୍ଡଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"ଟେକ୍ସଟ୍‍-ରୁ-ସ୍ପିଚ୍‍ ଆଉଟ୍‍ପୁଟ୍"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ଅଗ୍ରାଧିକାର ଦିଆଯାଇଥିବା ଇଞ୍ଜିନ୍"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"ସାମ୍ପ୍ରତିକ ଇଞ୍ଜିନ୍"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"ସ୍ପୀଚ୍‌ ହାର"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"ପିଚ୍‌"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ରିସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="sound_settings" msgid="3072423952331872246">"ଶବ୍ଦ"</string>
+    <string name="ring_volume_title" msgid="3135241004980719442">"ରିଙ୍ଗ ଭଲ୍ୟୁମ୍"</string>
+    <string name="navi_volume_title" msgid="946292066759195165">"ନେଭିଗେସନ୍‌ ଭଲ୍ୟୁମ୍‌"</string>
+    <string name="incoming_call_volume_title" msgid="6972117872424656876">"ରିଙ୍ଗଟୋନ୍‌"</string>
+    <string name="notification_volume_title" msgid="6749411263197157876">"ବିଜ୍ଞପ୍ତି"</string>
+    <string name="media_volume_title" msgid="6697416686272606865">"ମିଡିଆ"</string>
+    <string name="media_volume_summary" msgid="2961762827637127239">"ମ୍ୟୁଜିକ୍‌ ଓ ଭିଡିଓଗୁଡିକ ପାଇଁ ଭଲ୍ୟୁମ ସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="alarm_volume_title" msgid="840384014895796587">"ଆଲାର୍ମ"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ଫୋନ୍‌ ରିଙ୍ଗଟୋନ୍‌"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ଡିଫଲ୍ଟ ବିଜ୍ଞପ୍ତି ସାଉଣ୍ଡ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ଡିଫଲ୍ଟ ଆଲାର୍ମ ସାଉଣ୍ଡ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ଆପ୍ସ ଓ ବିଜ୍ଞପ୍ତି"</string>
+    <string name="all_applications" msgid="7798210477486822168">"ସମସ୍ତ ଆପ୍ସ ଦେଖାନ୍ତୁ"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ଡିଫଲ୍ଟ ଆପ୍ସ"</string>
+    <string name="applications_settings" msgid="794261395191035632">"ଆପ୍‌ ସୂଚନା"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ବାଧ୍ୟତାର ସହ ବନ୍ଦ କର"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"ଜବରଦସ୍ତି ବନ୍ଦ କରିବେ?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"ଯଦି ଆପଣ ଏକ ଆପ୍ ଜବରଦସ୍ତ ବନ୍ଦ କରନ୍ତି, ତେବେ ଏହା ଅସାମାନ୍ୟ ବ୍ୟବହାର କରିପାରେ।"</string>
+    <string name="disable_text" msgid="4358165448648990820">"ଅକ୍ଷମ"</string>
+    <string name="enable_text" msgid="1794971777861881238">"ସକ୍ଷମ"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"ଅନ୍‍ଇନ୍‍ଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ଯଦି ଆପଣ ଏହି ଆପ୍‌କୁ ନିଷ୍କ୍ରିୟ କରନ୍ତି, ତେବେ Android ଓ ଅନ୍ୟାନ୍ୟ ଆପ୍ସ ଆଉ କାମ ନକରିପାରେ।"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ଆପ୍ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+    <string name="permissions_label" msgid="2701446753515612685">"ଅନୁମତିଗୁଡ଼ିକ"</string>
+    <string name="application_version_label" msgid="8556889839783311649">"ଭର୍ସନ୍‌: %1$s"</string>
+    <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"କୌଣସି ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string>
+    <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"କୌଣସି ଅନୁମତିର ଅନୁରୋଧ କରାଯାଇ ନାହିଁ"</string>
+    <string name="data_usage_summary_title" msgid="4368024763485916986">"ଡାଟାର ବ୍ୟବହାର"</string>
+    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ଆପ୍‌ ଦ୍ୱାରା ଡାଟା ବ୍ୟବହାର"</string>
+    <string name="computing_size" msgid="5791407621793083965">"ଗଣୁଛି…"</string>
+    <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଟି ଅତିରିକ୍ତ ଅନୁମତି</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଟି ଅତିରିକ୍ତ ଅନୁମତି</item>
+    </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ଆସିଷ୍ଟାଣ୍ଟ ଓ ଭଏସ୍‌ ଇନପୁଟ୍‌"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"ସହାୟକ ଆପ୍‌"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ସ୍କ୍ରିନ୍‌ରୁ ଟେକ୍ସଟ୍‌ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"ସ୍କ୍ରିନ୍‌ ବିଷୟବସ୍ତୁଗୁଡ଼ିକୁ ଟେକ୍ସଟ୍‌ ଭଳି ଆକ୍ସେସ୍‌ କରିବା ପାଇଁ ସହାୟକ ଆପ୍‌କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ସ୍କ୍ରିନ୍‌ଶଟ୍‌ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"ସ୍କ୍ରିନ୍‌ର ଛବିକୁ ଆକ୍ସେସ୍‌ କରିବାକୁ ସହାୟକ ଆପ୍‌କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ସ୍ୱତଃପୂରଣ ସେବା"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"କୌଣସିଟି ନୁହେଁ"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"ଚୟନିତ"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"ଏହି ସହାୟକ, ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଦେଉଥିବା କିମ୍ୱା ଆପ୍‌ଗୁଡ଼ିକ ମଧ୍ୟରେ ଆକ୍ସେସ୍ ହୋଇପାରିବା ଭଳି ସୂଚନା ସମେତ ଆପଣଙ୍କ ସିଷ୍ଟମ୍‌ରେ ଥିବା ଆପ୍‌ଗୁଡ଼ିକ ବିଷୟରେ ସୂଚନା ପଢ଼ିପାରିବ।"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ଆପଣ ଏହି ଆପ୍‌କୁ ବିଶ୍ୱାସ କରୁଥିବା ନିଶ୍ଚିତ କରନ୍ତୁ&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google ଅଟୋଫିଲ୍‌&gt;%1$s&lt;/xliff:g&gt; କଣ ଅଟୋଫିଲ୍‌ କରାଯାଇ ପାରିବ ନିର୍ଦ୍ଧାରଣ କରିବାକୁ ଆପଣଙ୍କ ସ୍କ୍ରିନ୍‌ରେ ଯାହା ଥାଏ ତାହା ବ୍ୟବହାର କରେ।"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"ସେବା ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ଲୋକେସନ୍‌"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ସାମ୍ପ୍ରତିକ ଲୋକେସନ୍‌ ଅନୁରୋଧ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"କୌଣସି ନିକଟର ଲୋକେସନ୍‍ ଅନୁରୋଧ ହୋଇନାହିଁ"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ଆପ୍‌-ସ୍ତରୀୟ ଅନୁମତି"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"ସ୍କାନିଂ"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"ଲୋକେସନ୍‌ ସମ୍ପର୍କିତ ସେବା"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"ୱାଇ-ଫାଇ ସ୍କାନିଂ"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"ଏପରିକି ୱାଇ-ଫାଇ ଅଫ୍‌ ଥିଲେ ମଧ୍ୟ, ଆପ୍ ଓ ସେବାଗୁଡ଼ିକୁ ଯେକୌଣସି ସମୟରେ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ ସ୍କାନ୍‍ କରିବାକୁ ଅନୁମତି ଦିଏ। ଏହାକୁ ଲୋକେସନ୍‌ ଆଧାରିତ ଫିଚର୍ ଓ ସେବା ଇତ୍ୟାଦିକୁ ଉନ୍ନତ କରିବା ପାଇଁ ବ୍ୟବହାର କରାଯାଇପାରେ।"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ବ୍ଲୁଟୁଥ୍‍ ସ୍କାନିଂ"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ଏପରିକି ବ୍ଲୁଟୁଥ୍‍‌ ବନ୍ଦ ଥିଲେ ମଧ୍ୟ, ଆପ୍ ଓ ସେବାଗୁଡ଼ିକୁ ଯେକୌଣସି ସମୟରେ ଆଖପାଖରେ ଥିବା ଡିଭାଇସ୍‌ ଖୋଜିବାକୁ ଦିଏ। ଏହାକୁ ଲୋକେସନ୍‌ ଆଧାରିତ ଫିଚର୍ ଓ ସେବା ଇତ୍ୟାଦିକୁ ଉନ୍ନତ କରିବା ପାଇଁ ବ୍ୟବହାର କରାଯାଇପାରେ।"</string>
+    <string name="system_setting_title" msgid="6864599341809463440">"ସିଷ୍ଟମ୍‌"</string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"ସିଷ୍ଟମ୍‌ ଅପ୍‌ଡେଟ୍"</string>
+    <string name="firmware_version" msgid="8491753744549309333">"Android ଭର୍ସନ୍‌"</string>
+    <string name="security_patch" msgid="4794276590178386903">"Android ସୁରକ୍ଷା ପାଚ୍‌ ସ୍ତର"</string>
+    <string name="model_info" msgid="4966408071657934452">"ମଡେଲ୍‌"</string>
+    <string name="baseband_version" msgid="2370088062235041897">"ବେସ୍‌ବ୍ୟାଣ୍ଡ ଭର୍ସନ୍‌"</string>
+    <string name="kernel_version" msgid="7327212934187011508">"କର୍ନେଲ୍‌ ଭର୍ସନ୍‌"</string>
+    <string name="build_number" msgid="3997326631001009102">"ନମ୍ୱ‍ର୍‌ ଗଠନ କରନ୍ତୁ"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ବ୍ଲୁଟୁଥ୍ ଠିକଣା"</string>
+    <string name="device_info_not_available" msgid="2095601973977376655">"ଉପଲବ୍ଧ ନାହିଁ"</string>
+    <string name="device_status_activity_title" msgid="4083567497305368200">"ସ୍ଥିତି"</string>
+    <string name="device_status" msgid="267298179806290920">"ସ୍ଥିତି"</string>
+    <string name="device_status_summary" product="tablet" msgid="600543254608862075">"ବ୍ୟାଟେରୀ, ନେଟ୍‌ୱର୍କର ସ୍ଥିତି ଓ ଅନ୍ୟାନ୍ୟ ସୂଚନା"</string>
+    <string name="device_status_summary" product="default" msgid="9130360324418117815">"ଫୋନ ନମ୍ୱର, ସିଗ୍ନାଲ ଆଦି"</string>
+    <string name="about_settings" msgid="4329457966672592345">"ପରିଚୟ"</string>
+    <string name="about_summary" msgid="5374623866267691206">"Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
+    <string name="about_settings_summary" msgid="7975072809083281401">"ଆଇନଗତ ସୂଚନା, ଷ୍ଟେଟସ୍, ସଫ୍ଟୱେର୍‌ ଭର୍ସନ୍‌ ଦେଖନ୍ତୁ"</string>
+    <string name="legal_information" msgid="1838443759229784762">"ଆଇନ ସୂଚନା"</string>
+    <string name="contributors_title" msgid="7698463793409916113">"ଅବଦାନକାରୀ"</string>
+    <string name="manual" msgid="4819839169843240804">"ମାନୁଆଲ୍‌"</string>
+    <string name="regulatory_labels" msgid="3165587388499646779">"ରେଗୁଲେଟରୀ ଲେବଲ୍ସ"</string>
+    <string name="safety_and_regulatory_info" msgid="1204127697132067734">"ସୁରକ୍ଷା ଓ ନିୟାମକ ପୁସ୍ତିକା"</string>
+    <string name="copyright_title" msgid="4220237202917417876">"କପୀରାଇଟ୍‌"</string>
+    <string name="license_title" msgid="936705938435249965">"ଲାଇସେନ୍ସ"</string>
+    <string name="terms_title" msgid="5201471373602628765">"ନିୟମ ଓ ସର୍ତ୍ତାବଳୀ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"ସିଷ୍ଟମ୍‍ WebView ଲାଇସେନ୍ସ"</string>
+    <string name="wallpaper_attributions" msgid="9201272150014500697">"ୱାଲପେପର୍‌"</string>
+    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ସ୍ୟାଟେଲାଇଟ୍‌ ଇମେଜେରୀ ପ୍ରଦାତା:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="settings_license_activity_title" msgid="8499293744313077709">"ତୃତୀୟ-ପକ୍ଷ ଲାଇସେନ୍ସ"</string>
+    <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ଲାଇସେନ୍ସ ଲୋଡ୍‌ କରିବାରେ ସମସ୍ୟା ହୋଇଛି।"</string>
+    <string name="settings_license_activity_loading" msgid="6163263123009681841">"ଲୋଡ୍ କରୁଛି…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">ଆପଣ ଜଣେ ଡେଭେଲପର୍‍ ହେବାରେ ଆପଣ ବର୍ତ୍ତମାନ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g>ଟି ଷ୍ଟେପ୍‍ ଦୂରରେ ଅଛନ୍ତି।</item>
+      <item quantity="one">ଆପଣ ଜଣେ ଡେଭେଲପର୍‍ ହେବାରେ ଆପଣ ବର୍ତ୍ତମାନ <xliff:g id="STEP_COUNT_0">%1$d</xliff:g>ଟି ଷ୍ଟେପ୍‍ ଦୂରରେ ଅଛନ୍ତି।</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ବର୍ତ୍ତମାନ ଆପଣ ଜଣେ ଡେଭେଲପର୍‌ ଅଟନ୍ତି!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"ଆବଶ୍ୟକତା ନାହିଁ, ଆପଣ ଜଣେ ଡେଭେଲପର୍‍ ଅଟନ୍ତି।"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ଡେଭ୍‌ଲପର୍‌ମାନଙ୍କ ପାଇଁ ବିକଳ୍ପଗୁଡ଼ିକ"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ରିସେଟ୍‌ କରିବାର ବିକଳ୍ପମାନ"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ନେଟ୍‌ୱାର୍କ, ଆପ୍‌, କିମ୍ବା ଡିଭାଇସ୍‌ ରିସେଟ୍‍"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ନେଟ୍‍ୱାର୍କ ରିସେଟ୍‍ କରନ୍ତୁ"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ଏହା ସମସ୍ତ ନେଟ୍‍ୱାର୍କ ସେଟିଂକୁ ରିସେଟ୍‍ କରିବ, ଅନ୍ତର୍ଭୁକ୍ତ ଅଟେ:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"ୱାଇ-ଫାଇ"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"ମୋବାଇଲ୍‍ ଡାଟା"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ବ୍ଲୁଟୁଥ୍‍"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"ସମସ୍ତ ଗାଡି eSIM ଖାଲି କରିଦିଅନ୍ତୁ"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ଏହା ଆପଣଙ୍କ ସେବା ପ୍ଲାନ୍‍ ବାତିଲ୍‌ କରିବ ନାହିଁ।"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM ରିସେଟ୍‌ କରିପାରିବ ନାହିଁ"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ନେଟ୍‍ୱାର୍କ ବାଛନ୍ତୁ"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ସେଟିଂ ରିସେଟ୍‍ କରନ୍ତୁ"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"ରିସେଟ୍‌ କରିବେ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"ସବୁ ନେଟ୍‌ୱାର୍କ ସେଟିଂ ରିସେଟ୍‌ କରିବେ? ଏହାକୁ ଆପଣ ଆଉ ପୂର୍ବବତ୍‍ କରିପାରିବେ ନାହିଁ!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ସେଟିଂ ରିସେଟ୍‍ କରନ୍ତୁ"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ନେଟ୍‌ୱାର୍କ ସେଟିଂ ରିସେଟ୍‌ କରିଦିଆଯାଇଛି"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ଆପ୍‌ ଅଗ୍ରାଧିକାରଗୁଡିକୁ ରିସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ଏହା ପାଇଁ ଏହା ଆପଣଙ୍କ ସମସ୍ତ ଅଗ୍ରାଧିକାରଗୁଡ଼ିକୁ ରିସେଟ୍‍ କରିବ:\n\n"<li>" ଅକ୍ଷମ କରାଯାଇଥିବା ଆପ୍ସ"</li>\n<li>" ଅକ୍ଷମ କରାଯାଇଥିବା ଆପ୍‍ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</li>\n<li>" କାର୍ଯ୍ୟ ପାଇଁ ଡିଫଲ୍ଟ ଆପ୍ଲିକେସନ୍‍"</li>\n<li>" ଆପ୍ସ ପାଇଁ ପୃଷ୍ଠଭୂମି ଡାଟା ପ୍ରତିବନ୍ଧଗୁଡ଼ିିକ"</li>\n<li>" ଯେକୌଣସି ଅନୁମତି ପ୍ରତିବନ୍ଧ"</li>\n\n"ଆପଣ କୌଣସି ଆପ୍‍ ଡାଟା ହରାଇବେ ନାହିଁ।"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ଆପ୍ସ ରିସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ଆପ୍‍ ଅଗ୍ରାଧିକାର ରିସେଟ୍‍ ହୋଇଛି"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ସମସ୍ତ ଡାଟା ଲିଭାନ୍ତୁ (ଫ୍ୟାକ୍ଟୋରୀ ରିସେଟ୍‌)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ଏହା ଆପଣଙ୍କ ବାହାନର ମୁଖ୍ୟ ଭାଗରୁ ସମସ୍ତ ଡାଟା ଖାଲି କରିଦେବ, ଯେପରିକି:\n\n"<li>"ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟ"</li>\n<li>"ସିିିିଷ୍ଟମ୍‍ ଏବଂ ଆପ୍‍ ଡାଟା ଏବଂ ସେଟିଂସ୍‍"</li>\n<li>"ଡାଉନ୍‍‍ଲୋଡ୍‍ କରାଯାଇଥିବା ଆପ୍ସ"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"ଆପଣଙ୍କ ବର୍ତ୍ତମାନ ନିମ୍ନୋକ୍ତ ଆକାଉଣ୍ଟକୁ ସାଇନ୍ ଇନ୍ ହୋଇଛନ୍ତି:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ଏହି ବାହନରେ ଅନ୍ୟ ଉପଯୋଗକର୍ତ୍ତାମାନେ ଅଛନ୍ତି।"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"ବାହାନ ରିସେଟ୍‍ କରନ୍ତୁ"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"ରିସେଟ୍‌ କରିବେ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"ନିଜର ସମସ୍ତ ବ୍ୟକ୍ତିଗତ ସୂଚନା ଏବଂ ଡାଉନ୍‌ଲୋଡ୍‌ କରିଥିବା ଆପ୍‌ଗୁଡ଼ିକୁ ଲିଭାଇ ଦେବେ? ଏହି କାମକୁ ଆପଣ ପୂର୍ବାବସ୍ଥାକୁ ଫେରାଇ ଆଣିପାରିବେ ନାହିଁ!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ସବୁକିଛି ଖାଲି କରିଦିଅନ୍ତୁ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"ଲିଭାଉଛି"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"ଦୟାକରି ଅପେକ୍ଷା କରନ୍ତୁ..."</string>
+    <string name="date_and_time_settings_title" msgid="4058492663544475485">"ତାରିଖ ଓ ସମୟ"</string>
+    <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"ତାରିଖ ଓ ସମୟ ସେଟ କରନ୍ତୁ"</string>
+    <string name="date_and_time_settings_summary" msgid="7669856855390804666">"ତାରିଖ, ସମୟ, ସମୟ ଅଞ୍ଚଳ, ଓ ଫର୍ମାଟ୍‌ ସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="date_time_auto" msgid="3570339569471779767">"ଅଟୋମେଟିକ୍ ତାରିଖ ଓ ସମୟ"</string>
+    <string name="date_time_auto_summary" msgid="3311706425095342759">"ନେଟ୍‌ୱର୍କ ପ୍ରଦତ୍ତ ସମୟ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="zone_auto" msgid="3701878581920206160">"ସ୍ୱଚାଳିତ ସମୟ କ୍ଷେତ୍ର"</string>
+    <string name="zone_auto_summary" msgid="4345856882906981864">"ନେଟ୍‌ୱର୍କ ପ୍ରଦତ୍ତ ସମୟ କ୍ଷେତ୍ର ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="date_time_24hour_title" msgid="3025576547136168692">"24‑ଘଣ୍ଟିଆ ଫର୍ମାଟ୍‌"</string>
+    <string name="date_time_24hour" msgid="1137618702556486913">"24-ଘଣ୍ଟିଆ ଫର୍ମାଟ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+    <string name="date_time_set_time_title" msgid="5884883050656937853">"ସମୟ"</string>
+    <string name="date_time_set_time" msgid="6449555153906058248">"ସମୟ ସେଟ୍ କରନ୍ତୁ"</string>
+    <string name="date_time_set_timezone_title" msgid="3001779256157093425">"ଟାଇମ୍‌ ଜୋନ୍‌"</string>
+    <string name="date_time_set_timezone" msgid="4759353576185916944">"ସମୟ କ୍ଷେତ୍ର ବାଛନ୍ତୁ"</string>
+    <string name="date_time_set_date_title" msgid="6834785820357051138">"ତାରିଖ"</string>
+    <string name="date_time_set_date" msgid="2537494485643283230">"ତାରିଖ ସେଟ୍‍ କରନ୍ତୁ"</string>
+    <string name="zone_list_menu_sort_alphabetically" msgid="7041628618528523514">"ବର୍ଣ୍ଣାନୁକ୍ରମିକ ସର୍ଟ୍ କରନ୍ତୁ"</string>
+    <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"ସମୟ କ୍ଷେତ୍ର ଦ୍ୱାରା କ୍ରମବଦ୍ଧ"</string>
+    <string name="date_picker_title" msgid="1533614225273770178">"ତାରିଖ"</string>
+    <string name="time_picker_title" msgid="7436045944320504639">"ସମୟ"</string>
+    <string name="user_admin" msgid="1535484812908584809">"ଆଡ୍‌ମିନ୍‌"</string>
+    <string name="signed_in_admin_user" msgid="1267225622818673274">"ଆଡ୍‍ମିନ୍‍ ଭାବରେ ସାଇନ୍‍ ଇନ୍‍ କରିଛନ୍ତି"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"ସମସ୍ତ ଆଡ୍‌ମିନ୍‌ ଅନୁମତିଗୁଡିକ"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"ଆଡ୍‍ମିନ୍‍ କରନ୍ତୁ"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ଉପଯୋଗକର୍ତ୍ତାଗଣ ଅନ୍ୟ ଆଡ୍‌ମିନ୍‌, ଏବଂ ଫ୍ୟାକ୍ଟେରୀ ରିସେଟ୍‌ ସିଷ୍ଟମ୍‌ ସହ, ଉପଯୋଗକର୍ତ୍ତାଗଣଙ୍କୁ ଡିଲିଟ୍‌ କରିପାରିବେ।"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ଏହି କାର୍ଯ୍ୟକୁ ଫେରାଇ ନେଇ ହେବ ନାହିଁ।"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ହଁ, ଆଡ୍‍ମି‍ନ୍‍ କରନ୍ତୁ"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରନ୍ତୁ"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ଫୋନ୍ କଲ୍‌ କରନ୍ତୁ"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"କାର୍\'ର ମୋବାଇଲ୍ ଡାଟା ମାଧ୍ୟମରେ ମେସେଜିଂ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"ନୂଆ ଆପ୍ସ ଇନ୍‌ଷ୍ଟଲ୍‌ କରନ୍ତୁ"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ଆପ୍‌ଗୁଡ଼ିକ ଅନ୍‌ଇଷ୍ଟଲ୍‌ କରନ୍ତୁ"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ୟୁଜର୍‍ଙ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"ନୂଆ ୟୁଜର୍‌"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"ନୂତନ ୟୁଜର୍‍ ଯୋଡ଼ିବେ?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ଜଣେ ନୂଆ ୟୁଜର୍‍ଙ୍କୁ ଯୋଡ଼ିବାବେଳେ, ସେହି ବ୍ୟକ୍ତି ତାଙ୍କ ସ୍ଥାନ ସେଟ୍‍ ଅପ୍‌ କରିବା ଆବଶ୍ୟକ କରନ୍ତି।"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ସମସ୍ତ ୟୁଜର୍‌ଙ୍କ ପାଇଁ ଯେକୌଣସି ୟୁଜର୍‌ ଆପ୍‌ ଅପଡେଟ୍‌ କରିପାରିବେ।"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"ଉପଯୋଗକର୍ତ୍ତା ସୀମାରେ ପହଞ୍ଚିଛି"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">ଆପଣ <xliff:g id="COUNT">%d</xliff:g> ଜଣ ପର୍ଯ୍ୟନ୍ତ ବ୍ୟବହାରକାରୀ ତିଆରି କରିହେବ।</item>
+      <item quantity="one">କେବଳ ଜଣେ ବ୍ୟବହାରକାରୀ ତିଆରି କରିହେବ।</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି ହୋଇପାରିଲା ନାହିଁ"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ଏହି ୟୁଜର୍‍ ଡିଲିଟ୍‍ କରିବେ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"ସମସ୍ତ ଏପ୍ସ ଓ ଡାଟା ଡିଲିଟ୍‍ କରିଦିଆ ଯିବ।"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ଉପଯୋଗକର୍ତ୍ତା ଡିଲିଟ୍‍ କରିପାରିଲା ନାହିଁ।"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ଖାରଜ କରନ୍ତୁ"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"ବିଗତ ୟୁଜର୍ ଡିଲିଟ୍‍ କରିବେ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ଏହି କାର୍‍ ପାଇଁ କେବଳ ବାକିରହିଥିବା ଉପଯୋଗକର୍ତ୍ତା ଡିଲିଟ୍‍ କରିବା ପରେ, ଜଣେ ନୂଆ ଆଡ୍‍ମିନ୍‍ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି ହେବ।"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ସମସ୍ତ ଡାଟା, ସେଟିଂସ, ଏବଂ ଆପ୍‍ ଏହି ଉପଯୋଗକର୍ତ୍ତା ସହିତ ସହଭାଗୀ ହୋଇଥିବ ତାହା ଡିଲିଟ୍‍ ହେବ। ଆପଣଙ୍କୁ ପୁଣି ଏକ ସିଷ୍ଟମ୍‍ ସେଟ୍‍ ଅପ୍‍ କରିବା ଆବଶ୍ୟକ ଅଟେ।"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"ନୂଆ ଆଡ୍‌ମିନ୍‌ ବାଛନ୍ତୁ"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"ଆପଣ ଅତିକମ୍‍ରେ ଜଣେ ଆଡ୍‌ମିନ୍‌ ଆବଶ୍ଯକ କରନ୍ତି। ଏହା ଡିଲିଟ୍‍ କରିବାକୁ, ପ୍ରଥମେ ଏକ ପ୍ରତ୍ୟାବର୍ତ୍ତନ ବାଛନ୍ତୁ।"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"ଆଡ୍‌ମିନ୍‌ ବାଛନ୍ତୁ"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ଅତିଥି"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ଅତିଥି"</string>
+    <string name="user_switch" msgid="6544839750534690781">"ବଦଳାନ୍ତୁ"</string>
+    <string name="current_user_name" msgid="3813671533249316823">"ଆପଣ (%1$s)"</string>
+    <string name="user_name_label" msgid="3210832645046206845">"ନାମ"</string>
+    <string name="user_summary_not_set_up" msgid="1473688119241224145">"ସେଟ୍ ହୋଇନାହିଁ"</string>
+    <string name="edit_user_name_title" msgid="6890782937520262478">"ୟୁଜର୍‍ ନାମକୁ ଏଡିଟ୍ କରନ୍ତୁ"</string>
+    <string name="users_list_title" msgid="770764290290240909">"ୟୁଜର୍"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ପାଇଁ ଅନୁମତି ଅନୁମୋଦିତ ହୋଇଛି"</string>
+    <string name="accounts_settings_title" msgid="436190037084293471">"ଆକାଉଣ୍ଟ"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"ଆକାଉଣ୍ଟ ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="no_accounts_added" msgid="5148163140691096055">"କୌଣସି ଆକାଉଣ୍ଟ ଯୋଡ଼ାଯାଇନାହିଁ"</string>
+    <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> ପାଇଁ ଆକାଉଣ୍ଟ"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ସ୍ୱଚାଳିତ ଭାବେ ଡାଟା ସିଙ୍କ ହେଉ"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ଆପ୍‌କୁ ସ୍ୱଚାଳିତ ଭାବେ ଡାଟା ସତେଜ କରିବାକୁ ଦିଅନ୍ତୁ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ସ୍ୱଚାଳିତ-ସିଙ୍କ ଡାଟା ଚାଲୁ କରିବେ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ୱେବ୍‌ରେ ଆପଣ ନିଜ ଆକାଉଣ୍ଟରେ ଯାହାକିଛି ବି ପରିବର୍ତ୍ତନ କରିବେ, ତାହା ଅଟୋମେଟିକାଲୀ ଆପଣଙ୍କ ଡିଭାଇସ୍‌କୁ ଚାଲିଆସିବ।\n\nକେତେକ ଆକାଉଣ୍ଟ, ଫୋନ୍‌ରେ କରାଯାଇଥିବା ପରିବର୍ତ୍ତନକୁ ଅଟୋମେଟିକଲୀ ୱେବ୍‌କୁ ନେଇଯାଆନ୍ତି। ଗୋଟିଏ ଗୁଗଲ୍‌ ଆକାଉଣ୍ଟ, ଏହିପରି କାମ କରିଥାଏ।"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ସ୍ୱଚାଳିତ ଭାବେ ଡାଟା ସିଙ୍କ ହେବାକୁ ଅଫ୍‌ କରିବେ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ଏହା ମୋବାଇଲ୍ ଡାଟା କମ୍ ବ୍ୟବହାର ହେବ, କିନ୍ତୁ ତାଜା ସୂଚନା ସଂଗ୍ରହ କରିବା ପାଇଁ ପ୍ରତ୍ୟେକ ଆକାଉଣ୍ଟକୁ ମାନୁଆଲୀ ସିଙ୍କ କରିବାକୁ ପଡ଼ିବ ଏବଂ ଆପଣ ଅପ୍‌ଡେଟ୍‌ ହେଲେ ଆପଣ ବିଜ୍ଞପ୍ତି ପ୍ରାପ୍ତ କରିବେ ନାହିଁ।"</string>
+    <string name="account_details_title" msgid="7529571432258448573">"ଆକାଉଣ୍ଟ ସୂଚନା"</string>
+    <string name="add_account_title" msgid="5988746086885210040">"ଆକାଉଣ୍ଟ ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="add_an_account" msgid="1072285034300995091">"ଗୋଟିଏ ଆକାଉଣ୍ଟ ଯୋଡ଼ନ୍ତୁ"</string>
+    <string name="user_cannot_add_accounts_message" msgid="6775605884544906797">"ପ୍ରତିବନ୍ଧିତ ପ୍ରୋଫାଇଲ୍‌ଗୁଡ଼ିକ ଆକାଉଣ୍ଟ ଆଡ୍‌ କରିପାରିବ ନାହିଁ"</string>
+    <string name="remove_account_title" msgid="8840386525787836381">"ଆକାଉଣ୍ଟ କାଢ଼ିଦିଅନ୍ତୁ"</string>
+    <string name="really_remove_account_title" msgid="3555164432587924900">"ଆକାଉଣ୍ଟ କାଢ଼ିଦେବେ?"</string>
+    <string name="really_remove_account_message" msgid="4296769280849579900">"ଏହି ଆକାଉଣ୍ଟକୁ କାଢ଼ିଦେଲେ, ଡିଭାଇସ୍‌ରେ ଥିବା ସମସ୍ତ ମେସେଜ୍‌, ଯୋଗାଯୋଗ ଓ ଅନ୍ୟାନ୍ୟ ଡାଟା ଡିଲିଟ୍‌ ହୋଇଯିବ!"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"ଆକାଉଣ୍ଟ କାଢ଼ିହେଲା ନାହିଁ।"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ଆକାଉଣ୍ଟ ସିଙ୍କ୍‍"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>ଟି ମଧ୍ୟରୁ <xliff:g id="ID_1">%1$d</xliff:g>ଟି ଆଇଟମ୍ ପାଇଁ ସିଙ୍କ୍ ଚାଲୁ ଅଛି"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"ସମସ୍ତ ଆଇଟମ୍‌ଗୁଡ଼ିକ ପାଇଁ ସିଙ୍କ୍‌ ଚାଲୁ ଅଛି"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"ସବୁ ଆଇଟମ୍‌ ପାଇଁ ସିଙ୍କ୍‍ ବନ୍ଦ ହୋଇଛି"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"ସିଙ୍କ୍‌ ବନ୍ଦ ଅଛି"</string>
+    <string name="sync_error" msgid="6698021343089247914">"ସିଙ୍କ୍‌ରେ ତ୍ରୁଟି"</string>
+    <string name="last_synced" msgid="4745124489150101529">"ଶେଷଥର <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g> ରେ  ସିଙ୍କ୍‌ ହୋଇଥିଲା"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ଏବେ ସିଙ୍କ୍‌ କରୁଛି…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ବର୍ତ୍ତମାନ <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g> ରେ  ସିଙ୍କ୍‌ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ବର୍ତ୍ତମାନ ସିଙ୍କ କରନ୍ତୁ"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ସିଙ୍କ୍‌ କ୍ୟାନ୍ସଲ୍‌‌ କରନ୍ତୁ"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ସମ୍ପ୍ରତି ସିଙ୍କ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଏହା ଖୁବ୍‌ ଶୀଘ୍ର ଫେରିବ।"</string>
+    <string name="security_settings_title" msgid="6955331714774709746">"ସୁରକ୍ଷା"</string>
+    <string name="security_settings_subtitle" msgid="2244635550239273229">"ସ୍କ୍ରୀନ୍‌ ଲକ୍‌"</string>
+    <string name="security_lock_none" msgid="1054645093754839638">"କିଛି ନାହିଁ"</string>
+    <string name="security_lock_pattern" msgid="1174352995619563104">"ପାଟର୍ନ"</string>
+    <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
+    <string name="security_lock_password" msgid="4420203740048322494">"ପାସୱର୍ଡ"</string>
+    <string name="lock_settings_picker_title" msgid="6590330165050361632">"ଏକ ଲକ୍‌ ପ୍ରକାର ବାଛନ୍ତୁ"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ବିକଳ୍ପ ଲକ୍‍ କରନ୍ତୁ"</string>
+    <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"ଆପଣଙ୍କର ପାଟର୍ନ ଆଙ୍କନ୍ତୁ"</string>
+    <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"ନିଶ୍ଚିତ"</string>
+    <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ପୁନଃଅଙ୍କନ"</string>
+    <string name="continue_button_text" msgid="5129979170426836641">"ଜାରି ରଖନ୍ତୁ"</string>
+    <string name="lockscreen_retry_button_text" msgid="5314212350698701242">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+    <string name="lockscreen_skip_button_text" msgid="3755748786396198091">"ଛାଡ଼ିଦିଅନ୍ତୁ"</string>
+    <string name="set_screen_lock" msgid="5239317292691332780">"ଏକ ସ୍କ୍ରିନ୍‌ ଲକ୍‌ ସେଟ୍ କରନ୍ତୁ"</string>
+    <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"ନିଜ ପିନ୍‌ ନମ୍ବର ବାଛନ୍ତୁ"</string>
+    <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"ନିଜ ପାର୍ଟନ୍‌ ବାଛନ୍ତୁ"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"ଅନ୍‍ଲକ୍‍ ପାଇଁ ନିଜର ପାସ୍‌ୱର୍ଡ ବାଛନ୍ତୁ"</string>
+    <string name="current_screen_lock" msgid="637651611145979587">"ବର୍ତ୍ତମାନର ସ୍କ୍ରୀନ୍‌ ଲକ୍‌"</string>
+    <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ସୁରକ୍ଷା ପାଇଁ ଗୋଟିଏ ପାଟର୍ନ ସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"ଖାଲି କରନ୍ତୁ"</string>
+    <string name="lockpattern_cancel_button_text" msgid="4068764595622381766">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
+    <string name="lockpattern_pattern_confirmed" msgid="5984306638250515385">"ଆପଣଙ୍କର ନୂଆ ଅନ୍‌ଲକ୍‌ ପାଟର୍ନ"</string>
+    <string name="lockpattern_recording_intro_header" msgid="7864149726033694408">"ଏକ ଅନଲକ ପାଟର୍ନ ଆଙ୍କନ୍ତୁ"</string>
+    <string name="lockpattern_recording_inprogress" msgid="1575019990484725964">"ହୋଇଯିବା ପରେ ଆଙ୍ଗୁଠି କାଢ଼ିଦିଅନ୍ତୁ"</string>
+    <string name="lockpattern_pattern_entered" msgid="6103071005285320575">"ପାଟର୍ନ ରେକର୍ଡ ହେଲା"</string>
+    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"ନିଶ୍ଚିତ କରିବାକୁ ପାଟର୍ନ ପୁନଃ ଅଙ୍କନ କରନ୍ତୁ"</string>
+    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"ଅତିକମ୍‌ରେ 4ଟି ଡଟ୍ସ ସହ ସଂଯୋଗ କରନ୍ତୁ। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+    <string name="lockpattern_pattern_wrong" msgid="929223969555399363">"ଭୁଲ ପାଟର୍ନ"</string>
+    <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"ଏକ ଅନ୍‌ଲକ୍‌ ପାଟର୍ନ କିପରି ଅଙ୍କାଯିବ"</string>
+    <string name="error_saving_lockpattern" msgid="2933512812768570130">"ପାଟର୍ନ ସେଭ୍‌ କରିବାରେ ତ୍ରୁଟି"</string>
+    <string name="okay" msgid="4589873324439764349">"ଓକେ"</string>
+    <string name="remove_screen_lock_title" msgid="1234382338764193387">"ସ୍କ୍ରୀନ ଲକ୍ ରିମୁଭ୍‍ କରିବେ କି?"</string>
+    <string name="remove_screen_lock_message" msgid="6675850371585564965">"ଏହା ଯେକୌଣସି ବ୍ୟକ୍ତି ଆପଣଙ୍କ ଆକାଉଣ୍ଟରେ ପ୍ରବେଶ ପାଇଁ ଅନୁମତି ଦେବ"</string>
+    <string name="lock_settings_enter_pin" msgid="1669172111244633904">"ନିଜର PIN ଲେଖନ୍ତୁ"</string>
+    <string name="lock_settings_enter_password" msgid="2636669926649496367">"ନିଜ ପାସ୍‌ୱର୍ଡ ଲେଖନ୍ତୁ"</string>
+    <string name="choose_lock_pin_message" msgid="2963792070267774417">"ସୁରକ୍ଷା ପାଇଁ, ଏକ PIN ସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="confirm_your_pin_header" msgid="9096581288537156102">"ନିଜ PIN ପୁଣି ପ୍ରବେଶ କରନ୍ତୁ"</string>
+    <string name="choose_lock_pin_hints" msgid="7362906249992020844">"PINରେ ଅତିକମ୍‌ରେ 4ଟିଅଙ୍କ ରହିବା ଦରକାର"</string>
+    <string name="lockpin_invalid_pin" msgid="2149191577096327424">"Pin ଅମାନ୍ୟ ଅଟେ, ଅତିକମରେ 4ଟି ସଂଖ୍ୟା ରହିବା ଆବଶ୍ୟକ।"</string>
+    <string name="confirm_pins_dont_match" msgid="4607110139373520720">"PINଗୁଡିକ ମେଳ ଖାଉ ନାହିଁ"</string>
+    <string name="error_saving_lockpin" msgid="9011960139736000393">"PIN ସେଭ୍‌ କରିବାରେ ତ୍ରୁଟି"</string>
+    <string name="lockscreen_wrong_pin" msgid="4922465731473805306">"ଭୁଲ PIN"</string>
+    <string name="lockscreen_wrong_password" msgid="5757087577162231825">"ଭୁଲ ପାସ୍‌ୱର୍ଡ"</string>
+    <string name="choose_lock_password_message" msgid="6124341145027370784">"ସୁରକ୍ଷା ପାଇଁ ଗୋଟିଏ ପାସ୍‌ୱର୍ଡ ସେଟ୍‌ କରନ୍ତୁ"</string>
+    <string name="confirm_your_password_header" msgid="7052891840366724938">"ପାସ୍‌ୱର୍ଡ ପୁନଃ-ପ୍ରବେଶ କରନ୍ତୁ"</string>
+    <string name="confirm_passwords_dont_match" msgid="7300229965206501753">"ପାସ୍‌ୱର୍ଡ ମେଳ ଖାଉନାହିଁ"</string>
+    <string name="lockpassword_clear_label" msgid="6363680971025188064">"ଖାଲି କରନ୍ତୁ"</string>
+    <string name="lockpassword_cancel_label" msgid="5791237697404166450">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
+    <string name="lockpassword_confirm_label" msgid="5918463281546146953">"ନିଶ୍ଚିତ"</string>
+    <string name="choose_lock_password_hints" msgid="3903696950202491593">"ଅତିକମ୍‌ରେ 4 ଅକ୍ଷର ରହିବା ଦରକାର"</string>
+    <string name="lockpassword_password_too_short" msgid="6681218025001328405">"ଅତିକମ୍‌ରେ <xliff:g id="COUNT">%d</xliff:g> ଅକ୍ଷର ରହିବା ଦରକାର"</string>
+    <string name="lockpassword_pin_too_short" msgid="6363004004424904218">"PIN ଅତିକମ୍‌ରେ <xliff:g id="COUNT">%d</xliff:g> ଅଙ୍କ ବିଶିଷ୍ଟ ହେବା ଦରକାର"</string>
+    <string name="lockpassword_password_too_long" msgid="7530214940279491291">"<xliff:g id="NUMBER">%d</xliff:g> ଅକ୍ଷରଠାରୁ କମ୍‌ ହେବା ଦରକାର"</string>
+    <string name="lockpassword_pin_too_long" msgid="62957683396974404">"<xliff:g id="NUMBER">%d</xliff:g> ଅଙ୍କରୁ କମ୍‌ ରହିବା ଦରକାର"</string>
+    <string name="lockpassword_pin_contains_non_digits" msgid="3044526271686839923">"କେବଳ 0-9 ପର୍ଯ୍ୟନ୍ତ ସଂଖ୍ୟା ରହିବା ଦରକାର"</string>
+    <string name="lockpassword_pin_recently_used" msgid="7901918311213276207">"ଏକ ସାମ୍ପ୍ରତିକ ପିନ୍‌ର ବ୍ୟବହାରକୁ ଡିଭାଇସ୍‌ ଆଡ୍‌ମିନ୍‌ ଅନୁମତି ଦେବନାହିଁ"</string>
+    <string name="lockpassword_pin_blacklisted_by_admin" msgid="7412709707800738442">"ସାଧାରଣ PINଗୁଡିକ ଆପଣଙ୍କ IT ଆଡମିନ୍‌ଙ୍କ ଦ୍ୱାରା ଅବରୋଧ କରିଦିଆଯାଇଛି। ଭିନ୍ନ PIN ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+    <string name="lockpassword_illegal_character" msgid="1984970060523635618">"ଏହା ଗୋଟିଏ ଭୁଲ ଅକ୍ଷରକୁ ଯୋଡ଼ିପାରିବନାହିଁ"</string>
+    <string name="lockpassword_invalid_password" msgid="1690956113717418430">"ପାସ୍‍ୱର୍ଡ ଭୁଲ ଅଟେ, ଅତିକମ୍‌ରେ 4 ଅକ୍ଷର ରହିବା ଦରକାର।"</string>
+    <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
+      <item quantity="other">ଅତିକମରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ଅକ୍ଷର ରହିବା ଦରକାର</item>
+      <item quantity="one">ଅତିକମରେ ୧ଟି ଅକ୍ଷର ରହିବା ଦରକାର</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
+      <item quantity="other">ଅତିକମ୍‌ରେ <xliff:g id="COUNT">%d</xliff:g> ଟି ଲୋୱର୍‌କେସ୍‌ ଅକ୍ଷର ରହିବା ଦରକାର</item>
+      <item quantity="one">ଅତିକମ୍‌ରେ 1ଟି ଲୋୱର୍‍କେସ୍ ଅକ୍ଷର ରହିବା ଦରକାର</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
+      <item quantity="other">ଅତିକମ୍‌ରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ବଡ଼ ଅକ୍ଷର ଆବଶ୍ୟକ</item>
+      <item quantity="one"> ଅତିକମ୍‌ରେ 1ଟି ବଡ଼ ଅକ୍ଷର ଆବଶ୍ୟକ</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
+      <item quantity="other">ଅତିକମ୍‌ରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ସଂଖ୍ୟା ନିହାତି ରହିବା ଦରକାର</item>
+      <item quantity="one">ଅତିକମ୍‌ରେ 1ଟି ସଂଖ୍ୟା ନିହାତି ରହିବା ଦରକାର</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
+      <item quantity="other">ଅତିକମ୍‌ରେ <xliff:g id="COUNT">%d</xliff:g> ଟି ବିଶେଷ ସଙ୍କେତ ରହିଥିବା ଜରୁରୀ</item>
+      <item quantity="one">ଅତିକମ୍‌ରେ 1 ବିଶେଷ ସଙ୍କେତ ରହିଥିବା ଜରୁରୀ</item>
+    </plurals>
+    <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
+      <item quantity="other">ଅତିକମ୍‌ରେ <xliff:g id="COUNT">%d</xliff:g>ଟି ବିଶେଷ ଅକ୍ଷର କିମ୍ୱା ସଂଖ୍ୟା ଆବଶ୍ୟକ</item>
+      <item quantity="one">ଅତିକମ୍‌ରେ 1ଟି ବିଶେଷ ଅକ୍ଷର କିମ୍ୱା ସଂଖ୍ୟା ଆବଶ୍ୟକ</item>
+    </plurals>
+    <string name="lockpassword_password_recently_used" msgid="8255729487108602924">"ଏକ ସମ୍ପ୍ରତି ପାସ୍‌ୱର୍ଡ ବ୍ୟବହାର କରିବାକୁ ଡିଭାଇସ୍‌ ଆଡମିନ୍‌ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
+    <string name="error_saving_password" msgid="8334882262622500658">"ପାସୱର୍ଡ ସେଭ୍‌ କରିବାରେ ତ୍ରୁଟି"</string>
+    <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ଆପଣଙ୍କର ଆଇଟି ଆଡ୍‌ମିନ୍‌ ଦ୍ୱାରା ସାଧାରଣ ପାସ୍‌ୱର୍ଡଗୁଡ଼ିକୁ ରୋକିଦିଆଯାଇଛି। ଏକ ଭିନ୍ନ ପାସ୍‌ୱର୍ଡ ଦିଅନ୍ତୁ।"</string>
+    <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ସଂଖ୍ୟାର କ୍ରମବୃଦ୍ଧି, କ୍ରମହ୍ରାସ, କିମ୍ବା କ୍ରମ ଦୋହରାଇବାର ଅନୁମତି ନାହିଁ।"</string>
+    <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"ସ୍କ୍ରୀନ୍‌ ଲକ୍‌ ବିକଳ୍ପମାନ"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ଦିନ ପୂର୍ବେ"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"ବିଶ୍ୱସ୍ତ ଡିଭାଇସ୍‍‍‍ ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"ବିଶ୍ୱସ୍ତ ଡିଭାଇସ୍"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଟି ଡିଭାଇସ୍</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଟିି ଡିିିଭାଇସ୍</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"ଏହା ସଂଯୋଗ ହେଲେ ଆପଣଙ୍କର <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ଏହି କାର୍‍ ଅନ୍‍ଲକ‍ କରିବ। ଯଦି କେହିଜଣେ ଆପଣଙ୍କର <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> ନିଏ, ସେମାନେ ହୁଏତ ଏହି ଡିଭାଇସ୍‍ ଆକ୍ସେସ୍‍ କରିବାକୁ ସକ୍ଷମ ହୋଇପାରନ୍ତି"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"ନିଶ୍ଚିତ କରନ୍ତୁ"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"ବିଶ୍ୱସ୍ତ ଡିଭାଇସ୍ କାଢ଼ିଦିଅନ୍ତୁ"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ହୋଇଗଲା"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"ଏକ ବିଶ୍ବସ୍ତ ଡିଭାଇସ୍ ସେଟ୍‍ ଅପ୍ କରିବାକୁ ସହଯୋଗୀ ଆପ୍ ବ୍ୟବହାର କରନ୍ତୁ। ଥରେ ସେଟ୍‍ ଅପ୍ ହେଲେ, ଗାଡ଼ି ଆପଣଙ୍କର ଫୋନ୍‍କୁ ଚିହ୍ନଟ କଲେ ଆପଣ ଆପଣଙ୍କର ଉପଯୋଗକର୍ତ୍ତା ପ୍ରୋଫାଇଲ୍ ଅନ୍‍ଲକ୍ କରିବାକୁ ସକ୍ଷମ ହେବେ"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ଆପଣଙ୍କର ଫୋନ୍‍‍ରେ ସହଯୋଗୀ ଆପ୍ ଡାଉନ୍‍ଲୋଡ୍ କରନ୍ତୁ"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. ଡିଭାଇସ୍ ପେୟାର୍ କରିବାକୁ ଆପଣଙ୍କ ଫୋନ୍‍‍ରୁ <xliff:g id="CAR_NAME">%1$s</xliff:g> ବାଛନ୍ତୁ"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"ସ୍ମାର୍ଟ ଲକ୍ ଏହି ଡିଭାଇସ୍‍ର ସୁରକ୍ଷା ବୈଶିଷ୍ଟ୍ୟ କରିପାରିବ ନାହିଁ। ଆପଣଙ୍କର କାର୍‍‍ର ସୁରକ୍ଷାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଚିହ୍ନା ଡିଭାଇସ୍ କେବଳ ଆପଣ ପୂର୍ବରୁ ଆପଣଙ୍କ କାର୍ ଥରେ ଅନ୍‍ଲକ୍ କରିଥିଲେ ହିଁ ଆପଣଙ୍କ କାର୍‍କୁ ଅନ୍‍ଲକ୍ କରି ରଖିବ। ଅନ୍ୟ କେହି ଜଣେ ମଧ୍ୟ ତାହା ବ୍ୟବହାର କରୁଥିଲେ ମଧ୍ୟ, ଆପଣଙ୍କର ଚିହ୍ନା ଡିଭାଇସ୍ ନିକଟସ୍ଥ ରହିଥିଲେ ଆପଣଙ୍କ କାର୍‍ ଅନ୍‍ଲକ୍ କରି ରଖିପାରିବ।"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"ଏକ ଚିହ୍ନା ଡିଭାଇସ୍‌‍ଭାବରେ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ଏକ ବିଶ୍ବସ୍ତ ଡିଭାଇସ୍‍ଭାବରେ ସଫଳତାପୂର୍ବକ ଯୋଗ କରାଯାଇଛି"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ନାମାଙ୍କନ ହୋଇପାରିଲା ନାହିଁ"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"ଏହାପରେ ଏକ ବିଶ୍ୱସନୀୟ ଡିଭାଇସ୍‌ ଯୋଗ କରିବାରେ ଆପଣଙ୍କୁ ପ୍ରମାଣିକରଣର ଉପାୟ ସେଟ୍‍ କରିବାକୁ ହେବ। ଯଦି ଆପଣଙ୍କ ପାଖରେ ବିଶ୍ୱସନୀୟ ଡିଭାଇସ୍‌ ନାହିଁ, ତେବେ ଆପଣଙ୍କ ପ୍ରୋଫାଇଲ୍‌ ଆକ୍ସେସ୍‌ କରିବାକୁ ପ୍ରମାଣିକରଣ ଆବଶ୍ୟକ ହେବ।"</string>
+    <string name="forget" msgid="3971143908183848527">"ଭୁଲିଗଲେ"</string>
+    <string name="connect" msgid="5861699594602380150">"ସଂଯୋଗ କରନ୍ତୁ"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ବିଛିନ୍ନ କରନ୍ତୁ"</string>
+    <string name="delete_button" msgid="5840500432614610850">"ଡିଲିଟ୍‍"</string>
+    <string name="remove_button" msgid="6664656962868194178">"କାଢ଼ିଦିଅନ୍ତୁ"</string>
+    <string name="cancel" msgid="750286395700355455">"କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ"</string>
+    <string name="backspace_key" msgid="1545590866688979099">"Backspace କୀ"</string>
+    <string name="enter_key" msgid="2121394305541579468">"କୀ ଦବାନ୍ତୁ"</string>
+    <string name="exit_retail_button_text" msgid="6093240315583384473">"ଡେମୋରୁ ବାହାରିଯା’ନ୍ତୁ"</string>
+    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ଡେମୋ ମୋଡ୍‌ରୁ ବାହାରିଯା’ନ୍ତୁ"</string>
+    <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ଏହା ଡେମୋ ଆକାଉଣ୍ଟକୁ ଡିଲିଟ୍ କରିଦେବ ଏବଂ ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ସିଷ୍ଟମ୍‍କୁ ରିସେଟ୍ କରିବ। ସମସ୍ତ ୟୁଜର୍ ଡାଟା ନଷ୍ଟ ହୋ‍ଇଯିବ।"</string>
+    <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ଡେମୋରୁ ବାହାରିଯା’ନ୍ତୁ"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ଖାରଜ କରନ୍ତୁ"</string>
+    <string name="restricted_while_driving" msgid="6217369093121968299">"ଗାଡ଼ି ଚଲାଇବାବେଳେ ଫିଚର୍ ଉପଲବ୍ଧ ହେବନାହିଁ।"</string>
+    <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ଗାଡ଼ି ଚଲାଇବା ବେଳେ ୟୁଜର୍ ଯୋଡ଼ିପାରିବେ ନାହିଁ।"</string>
+</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 3a2d03f..8b25c95 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ਡਿਮ ਸਕ੍ਰੀਨ, ਟੱਚਸਕ੍ਰੀਨ, ਬੈਟਰੀ"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ਡਿਮ ਸਕ੍ਰੀਨ, ਰਾਤ ਵਾਲਾ ਮੋਡ, ਭਾਹ"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"ਰਾਤ ਵਾਲਾ ਮੋਡ"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"ਮੋਬਾਈਲ ਡਾਟਾ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵਰਤ ਕੇ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"ਕੀ ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ਡਾਟਾ ਵਰਤੋਂ"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ਡਾਟਾ ਚਿਤਾਵਨੀ ਅਤੇ ਸੀਮਾ"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ਐਪ ਦੀ ਡਾਟਾ ਵਰਤੋਂ ਦਾ ਚੱਕਰ"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ਡਾਟਾ ਚਿਤਾਵਨੀ ਸੈੱਟ ਕਰੋ"</string>
+    <string name="data_warning" msgid="116776633806885370">"ਡਾਟਾ ਚਿਤਾਵਨੀ"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ਡਾਟਾ ਸੀਮਾ ਸੈੱਟ ਕਰੋ"</string>
+    <string name="data_limit" msgid="227338836292511425">"ਡਾਟਾ ਸੀਮਾ"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ਡਾਟਾ ਵਰਤੋਂ ਸੀਮਤ ਕਰਨਾ"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ਤੁਹਾਡੇ ਵਾਹਨ ਦੀ ਸਕ੍ਰੀਨ ਤੋਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਸੀਮਾ ਉੱਤੇ ਪਹੁੰਚਣ \'ਤੇ ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ ਕਰ ਦੇਵੇਗਾ।\n\nਕਿਉਂਕਿ ਡਾਟਾ ਵਰਤੋਂ ਤੁਹਾਡੇ ਸਕ੍ਰੀਨ ਵੱਲੋਂ ਮਾਪੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਹਾਡਾ ਕੈਰੀਅਰ ਵਰਤੋਂ ਦਾ ਹਿਸਾਬ ਵੱਖਰੇ ਢੰਗ ਨਾਲ ਲਗਾਵੇ, ਇਸ ਕਰਕੇ ਕੋਈ ਕੰਜੂਸੀਕਾਰੀ ਸੀਮਾ ਸੈੱਟ ਕਰਨ ਬਾਰੇ ਵਿਚਾਰ ਕਰੋ।"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"ਵਾਈ-ਫਾਈ"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ਵਾਇਰਲੈਸ ਪਹੁੰਚ ਬਿੰਦੂਆਂ ਦਾ ਸੈੱਟਅੱਪ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
     <string name="wifi_starting" msgid="473253087503153167">"ਵਾਈ‑ਫਾਈ ਚਾਲੂ ਹੋ ਰਿਹਾ ਹੈ…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"ਵਾਈ‑ਫਾਈ ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"ਵਾਈ-ਫਾਈ ਦੀ ਸੂਚੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"ਵਾਈ-ਫਾਈ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ਨੈੱਟਵਰਕ ਛੱਡਣ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"ਨੈੱਟਵਰਕ ਸ਼ਾਮਲ ਕਰੋ"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"ਵਾਈ-ਫਾਈ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"ਕਨੈਕਟ ਕਰੋ"</string>
     <string name="wifi_password" msgid="5565632142720292397">"ਪਾਸਵਰਡ"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"ਪਾਸਵਰਡ ਦਿਖਾਓ"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ਨੈੱਟਵਰਕ ਦਾ ਨਾਮ"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID ਦਾਖਲ ਕਰੋ"</string>
     <string name="wifi_security" msgid="158358046038876532">"ਸੁਰੱਖਿਆ"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ"</string>
     <string name="wifi_status" msgid="5688013206066543952">"ਸਥਿਤੀ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"ਲਿੰਕ ਸਪੀਡ"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ਬਾਰੰਬਾਰਤਾ"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP ਪਤਾ"</string>
+    <string name="show_password" msgid="2074628020371139240">"ਪਾਸਵਰਡ ਦਿਖਾਓ"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ਨੈੱਟਵਰਕ ਦਾ ਨਾਮ ਦਾਖਲ ਕਰੋ"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ਕਮਜ਼ੋਰ"</item>
-    <item msgid="2032262610626057081">"ਠੀਕ-ਠਾਕ"</item>
-    <item msgid="3859756017461098953">"ਵਧੀਆ"</item>
-    <item msgid="1521103743353335724">"ਸ਼ਾਨਦਾਰ"</item>
+    <item msgid="7683058295076342057">"ਕਮਜ਼ੋਰ"</item>
+    <item msgid="1639222824821660744">"ਠੀਕ-ਠਾਕ"</item>
+    <item msgid="1838705897358163300">"ਵਧੀਆ"</item>
+    <item msgid="6067166649320533751">"ਸ਼ਾਨਦਾਰ"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"ਬਲੂਟੁੱਥ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"ਬਲੂਟੁੱਥ ਚਾਲੂ ਕਰੋ"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"ਬਲੂਟੁੱਥ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"ਬਲੂਟੁੱਥ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ਨੈੱਟਵਰਕ ਵੇਰਵੇ"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ਪਤਾ"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ਪਤਾ"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"ਸਬਨੈੱਟ ਮਾਸਕ"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ਪਤੇ"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"ਗੇਟਵੇ"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ਵਾਈ‑ਫਾਈ ਤਰਜੀਹਾਂ"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਵਾਈ‑ਫਾਈ ਚਾਲੂ ਕਰੋ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"ਘਰੇਲੂ ਨੈੱਟਵਰਕ ਵਰਗੇ ਵਧੀਆ ਰੱਖਿਅਤ ਨੈੱਟਵਰਕਾਂ ਨੇੜੇ ਹੋਣ \'ਤੇ ਵਾਈ-ਫਾਈ ਚਾਲੂ ਹੋਵੇਗਾ"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"ਅਣਉਪਲਬਧ ਕਿਉਂਕਿ ਟਿਕਾਣਾ ਬੰਦ ਹੈ। "<annotation id="link">"ਟਿਕਾਣਾ"</annotation>" ਚਾਲੂ ਕਰੋ।"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"ਕੀ ਵਾਈ-ਫਾਈ ਸਕੈਨ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ਚਾਲੂ ਕਰੋ"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"ਵਾਈ-ਫਾਈ ਸਕੈਨ ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"ਵਾਈ‑ਫਾਈ ਕੋਲ ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਾ ਹੋਣ \'ਤੇ ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ। ਡਾਟਾ ਵਰਤੋਂ ਵਾਸਤੇ ਖਰਚੇ ਲਏ ਜਾ ਸਕਦੇ ਹਨ।"</string>
+    <string name="learn_more" msgid="8214605928933358604">"ਹੋਰ ਜਾਣੋ"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"ਬਲੂਟੁੱਥ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"ਕਨੈਕਸ਼ਨ ਵਿਵਸਥਿਤ ਕਰੋ, ਡੀਵਾਈਸ ਨਾਮ ਅਤੇ ਖੋਜਯੋਗਤਾ ਸੈੱਟ ਕਰੋ"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"ਕੰਪਿਊਟਰ"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ਹੈੱਡਸੈੱਟ"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ਫ਼ੋਨ"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ਚਿੱਤਰ"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ਹੈੱਡਫ਼ੋਨ"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ਇਨਪੁੱਟ ਪੈਰੀਫੈਰਲ"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"ਬਲੂਟੁੱਥ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"ਜੋੜਾਬੱਧ ਕੀਤੇ ਡੀਵਾਈਸ"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"ਉਪਲਬਧ ਡੀਵਾਈਸ"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ਕੋਈ ਜੋੜਾਬੱਧ ਕੀਤੇ ਡੀਵਾਈਸ ਨਹੀਂ ਹਨ"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"ਕੋਈ ਡੀਵਾਈਸ ਉਪਲਬਧ ਨਹੀਂ ਹਨ"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"ਜੋੜਾਬੱਧ ਕੀਤਾ ਡੀਵਾਈਸ"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"ਨਾਮ"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"ਇਸ ਲਈ ਵਰਤੋ"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਦਾ ਨਾਮ ਬਦਲੋ"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"ਬੇਨਾਮ ਡੀਵਾਈਸ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"ਜੋੜਾਬੱਧ ਕੀਤੇ ਡੀਵਾਈਸ"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"ਨਵਾਂ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"ਜੋੜਾਬੱਧ ਕਰਨ ਲਈ ਬਲੂਟੁੱਥ ਚਾਲੂ ਹੋਵੇਗਾ"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"ਕੀ ਡੀਵਾਈਸ ਡਿਸਕਨੈਕਟ ਕਰਨਾ ਹੈ?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"ਤੁਹਾਡਾ ਵਾਹਨ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਤੋਂ ਡਿਸਕਨੈਕਟ ਹੋ ਜਾਵੇਗਾ।"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"ਵਾਹਨ ਦਾ ਬਲੂਟੁੱਥ ਪਤਾ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ਡੀਵਾਈਸ ਦਾ ਬਲੂਟੁੱਥ ਪਤਾ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ਵਾਹਨ ਦਾ ਨਾਮ"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ਇਸ ਵਾਹਨ ਦਾ ਨਾਮ ਬਦਲੋ"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"ਡੀਵਾਈਸ ਦਾ ਨਾਮ ਬਦਲੋ"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"ਨਾਮ ਬਦਲੋ"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"ਉਪਲਬਧ ਡੀਵਾਈਸਾਂ"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"ਪ੍ਰੋਫਾਈਲਾਂ"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"ਬਲੂਟੁੱਥ ਜੋੜਾਬੱਧ ਕਰਨ ਦੀ ਬੇਨਤੀ"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ਜੋੜਾਬੱਧ ਕਰੋ ਅਤੇ ਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"ਬਲੂਟੁੱਥ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"ਬਲੂਟੁੱਥ ਜੋੜਾਬੱਧਕਰਨ ਕੋਡ"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"ਪਿੰਨ ਵਿੱਚ ਅੱਖਰ ਜਾਂ ਚਿੰਨ੍ਹ ਹਨ"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"ਜੋੜਾਬੱਧ ਕਰਨ ਦਾ ਕੋਡ ਟਾਈਪ ਕਰੋ ਫਿਰ \'ਵਾਪਸ ਜਾਓ\' ਜਾਂ \'ਦਾਖਲ ਕਰੋ\' ਨੂੰ ਦਬਾਓ"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ਆਮ ਤੌਰ \'ਤੇ 0000 ਜਾਂ 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"ਜੋੜਾਬੱਧ ਕਰਨ ਦੀ ਬੇਨਤੀ"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਜੋੜਾ ਬਣਾਉਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ਭਾਸ਼ਾਵਾਂ"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁੱਟ"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"ਕੀ-ਬੋਰਡ"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"ਕੀ-ਬੋਰਡਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"ਲਿਖਤ ਤੋਂ ਬੋਲੀ ਆਊਟਪੁੱਟ"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ਤਰਜੀਹੀ ਇੰਜਣ"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"ਮੌਜੂਦਾ ਇੰਜਣ"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"ਬੋਲਣ ਦੀ ਗਤੀ"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"ਪਿੱਚ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ਰੀਸੈੱਟ ਕਰੋ"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ਧੁਨੀ"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"ਰਿੰਗ ਵੌਲਿਊਮ"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"ਨੈਵੀਗੇਸ਼ਨ ਵੌਲਿਊਮ"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"ਮੀਡੀਆ"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"ਸੰਗੀਤ ਅਤੇ ਵੀਡੀਓ ਲਈ ਵੌਲਿਊਮ ਸੈੱਟ ਕਰੋ"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"ਅਲਾਰਮ"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ਫ਼ੋਨ ਦੀ ਰਿੰਗਟੋਨ"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੂਚਨਾ ਧੁਨੀ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਅਲਾਰਮ ਧੁਨੀ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ਐਪਾਂ ਅਤੇ ਸੂਚਨਾਵਾਂ"</string>
+    <string name="all_applications" msgid="7798210477486822168">"ਸਾਰੀਆਂ ਐਪਾਂ ਦਿਖਾਓ"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਐਪਾਂ"</string>
     <string name="applications_settings" msgid="794261395191035632">"ਐਪ ਜਾਣਕਾਰੀ"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰੋ"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"ਕੀ ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰਨਾ ਹੈ?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਠੀਕ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰੇ।"</string>
     <string name="disable_text" msgid="4358165448648990820">"ਬੰਦ ਕਰੋ"</string>
     <string name="enable_text" msgid="1794971777861881238">"ਚਾਲੂ ਕਰੋ"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"ਅਣਸਥਾਪਤ ਕਰੋ"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ਜੇ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ Android ਅਤੇ ਹੋਰ ਐਪਾਂ ਉਸ ਤਰ੍ਹਾਂ ਕੰਮ ਨਾ ਕਰਨ ਜਿਵੇਂ ਇਹਨਾਂ ਤੋਂ ਉਮੀਦ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ਐਪ ਨੂੰ ਬੰਦ ਕਰੋ"</string>
     <string name="permissions_label" msgid="2701446753515612685">"ਇਜਾਜ਼ਤਾਂ"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ਵਰਜਨ: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ਕੋਈ ਇਜਾਜ਼ਤਾਂ ਨਹੀਂ ਦਿੱਤੀਆਂ ਗਈਆਂ"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ਕਿਸੇ ਇਜਾਜ਼ਤਾਂ ਦੀ ਬੇਨਤੀ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ਡਾਟਾ ਵਰਤੋਂ"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ਐਪ ਡਾਟਾ ਵਰਤੋਂ"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਕਰੋ"</string>
     <string name="computing_size" msgid="5791407621793083965">"ਗਣਨਾ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਵਧੀਕ ਇਜਾਜ਼ਤ</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਵਧੀਕ ਇਜਾਜ਼ਤਾਂ</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"\'ਅਸਿਸਟੈਂਟ\' ਅਤੇ ਵੌਇਸ ਇਨਪੁਟ"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"ਸਹਾਇਕ ਐਪ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ਸਕ੍ਰੀਨ ਤੋਂ ਲਿਖਤ ਵਰਤੋ"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"ਸਹਾਇਕ ਐਪ ਨੂੰ ਲਿਖਤ ਵਜੋਂ ਸਕ੍ਰੀਨ ਸਮੱਗਰੀਆਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਵਰਤੋ"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"ਸਹਾਇਕ ਐਪ ਨੂੰ ਸਕ੍ਰੀਨ ਦੇ ਚਿੱਤਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ਆਟੋਫਿਲ ਸੇਵਾ"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ਕੋਈ ਨਹੀਂ"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"ਚੁਣੀ ਗਈ"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"\'ਅਸਿਸਟੈਂਟ\' ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣਯੋਗ ਜਾਂ ਐਪਾਂ ਵਿੱਚ ਪਹੁੰਚਯੋਗ ਜਾਣਕਾਰੀ ਸਮੇਤ ਤੁਹਾਡੇ ਸਿਸਟਮ \'ਤੇ ਵਰਤੋਂ ਵਿੱਚ ਐਪਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਪੜ੍ਹ ਸਕੇਗੀ।"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਇਸ ਐਪ \'ਤੇ ਭਰੋਸਾ ਕਰਦੇ ਹੋ&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; ਐਪ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਮੌਜੂਦ ਆਪਣੇ-ਆਪ ਭਰੀਆਂ ਜਾ ਸਕਣ ਵਾਲੀਆਂ ਥਾਂਵਾਂ ਦਾ ਪਤਾ ਲਗਾਉਂਦੀ ਹੈ।"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"ਸੇਵਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ਟਿਕਾਣਾ"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ਹਾਲੀਆ ਟਿਕਾਣਾ ਬੇਨਤੀਆਂ"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ਕੋਈ ਹਾਲੀਆ ਟਿਕਾਣਾ ਬੇਨਤੀਆਂ ਨਹੀਂ"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ਐਪ-ਪੱਧਰ ਇਜਾਜ਼ਤਾਂ"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"ਟਿਕਾਣਾ ਸੇਵਾਵਾਂ"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"ਵਾਈ‑ਫਾਈ ਸਕੈਨਿੰਗ"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"ਵਾਈ-ਫਾਈ ਬੰਦ ਹੋਣ \'ਤੇ ਵੀ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਨੂੰ ਕਿਸੇ ਵੀ ਵੇਲੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ ਲਈ ਸਕੈਨ ਕਰਨ ਦਿਓ। ਇਸਦੀ ਵਰਤੋਂ ਕਰਕੇ ਟਿਕਾਣਾ-ਆਧਾਰਿਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"ਬਲੂਟੁੱਥ ਸਕੈਨਿੰਗ"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"ਬਲੂਟੁੱਥ ਬੰਦ ਹੋਣ \'ਤੇ ਵੀ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਨੂੰ ਕਿਸੇ ਵੀ ਵੇਲੇ ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ ਲਈ ਸਕੈਨ ਕਰਨ ਦਿਓ। ਇਸਦੀ ਵਰਤੋਂ ਕਰਕੇ ਟਿਕਾਣਾ-ਆਧਾਰਿਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"ਸਿਸਟਮ"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"ਸਿਸਟਮ ਅੱਪਡੇਟ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"ਸਿਸਟਮ ਅੱਪਡੇਟ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ਵਰਜਨ"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android ਸੁਰੱਖਿਆ ਪੈਚ ਪੱਧਰ"</string>
     <string name="model_info" msgid="4966408071657934452">"ਮਾਡਲ"</string>
     <string name="baseband_version" msgid="2370088062235041897">"ਬੇਸਬੈਂਡ ਵਰਜਨ"</string>
     <string name="kernel_version" msgid="7327212934187011508">"ਕਰਨਲ ਵਰਜਨ"</string>
     <string name="build_number" msgid="3997326631001009102">"ਬਿਲਡ ਨੰਬਰ"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ਬਲੂਟੁੱਥ ਪਤਾ"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"ਸਥਿਤੀ"</string>
     <string name="device_status" msgid="267298179806290920">"ਸਥਿਤੀ"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"ਕਾਪੀਰਾਈਟ"</string>
     <string name="license_title" msgid="936705938435249965">"ਲਾਇਸੰਸ"</string>
     <string name="terms_title" msgid="5201471373602628765">"ਨਿਯਮ ਅਤੇ ਸ਼ਰਤਾਂ"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"ਸਿਸਟਮ WebView ਲਾਇਸੰਸ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"ਸਿਸਟਮ WebView ਲਾਇਸੰਸ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"ਵਾਲਪੇਪਰ"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ਸੈਟੇਲਾਈਟ ਇਮੇਜਰੀ ਪ੍ਰਦਾਨਕ:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ਤੀਜੀ-ਧਿਰ ਦੇ ਲਾਇਸੰਸ"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"ਲਾਇਸੰਸ ਲੋਡ ਕਰਨ ਵਿੱਚ ਇੱਕ ਸਮੱਸਿਆ ਹੈ।"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">ਤੁਸੀਂ ਹੁਣ ਇੱਕ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ਕਦਮ ਦੂਰ ਹੋ।</item>
+      <item quantity="other">ਤੁਸੀਂ ਹੁਣ ਇੱਕ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ਕਦਮ ਦੂਰ ਹੋ।</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ਹੁਣ ਤੁਸੀਂ ਇੱਕ ਵਿਕਾਸਕਾਰ ਹੋ!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"ਕੋਈ ਲੋੜ ਨਹੀਂ, ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਇੱਕ ਵਿਕਾਸਕਾਰ ਹੋ।"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ਵਿਕਾਸਕਾਰ ਚੋਣਾਂ"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ਰੀਸੈੱਟ ਵਿਕਲਪ"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ਨੈੱਟਵਰਕ, ਐਪਾਂ ਜਾਂ ਡੀਵਾਈਸ ਰੀਸੈੱਟ"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ਨੈੱਟਵਰਕ ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ਇਹ  ਸਾਰੀਆਂ ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕਰ ਦੇਵੇਗਾ, ਜਿਸ ਵਿੱਚ ਇਹ ਵੀ ਸ਼ਾਮਲ ਹਨ:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"ਵਾਈ-ਫਾਈ"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"ਮੋਬਾਈਲ ਡਾਟਾ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"ਬਲੂਟੁੱਥ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"ਸਾਰੇ ਵਾਹਨ ਈ-ਸਿਮਾਂ ਨੂੰ ਮਿਟਾਓ"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ਇਸ ਨਾਲ ਤੁਹਾਡਾ ਸੇਵਾ ਪਲਾਨ ਰੱਦ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"ਈ-ਸਿਮ ਰੀਸੈੱਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ਨੈੱਟਵਰਕ ਚੁਣੋ"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"ਕੀ ਰੀਸੈੱਟ ਕਰਨੀਆਂ ਹਨ?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"ਕੀ ਸਾਰੀਆਂ ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕਰਨੀਆਂ ਹਨ? ਤੁਸੀਂ ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਅਣਕੀਤਾ ਨਹੀ ਕਰ ਸਕਦੇ!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਰੀਸੈੱਟ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ਐਪ ਤਰਜੀਹਾਂ ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ਇੰਝ ਕਰਨ ਨਾਲ ਇਹ ਇਹਨਾਂ ਲਈ ਸਾਰੀਆਂ ਤਰਜੀਹਾਂ ਰੀਸੈੱਟ ਕਰ ਦੇਵੇਗਾ:\n\n"<li>" ਬੰਦ ਕੀਤੀਆਂ ਐਪਾਂ"</li>\n<li>"ਬੰਦ ਕੀਤੀਆਂ ਐਪ ਸੂਚਨਾਵਾਂ"</li>\n<li>"ਕਾਰਵਾਈਆਂ ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਐਪਲੀਕੇਸ਼ਨਾਂ"</li>\n<li>" ਐਪਾਂ ਲਈ ਬੈਕਗ੍ਰਾਊਂਡ ਡਾਟੇ ਸੰਬੰਧੀ ਪਾਬੰਦੀਆਂ"</li>\n<li>"ਕੋਈ ਵੀ ਇਜਾਜ਼ਤ ਸੰਬੰਧੀ ਪਾਬੰਦੀਆਂ"</li>\n\n"ਤੁਸੀਂ ਕੋਈ ਵੀ ਐਪ ਡਾਟਾ ਨਹੀਂ ਗੁਆਓਗੇ।"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ਐਪਾਂ ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ਐਪ ਤਰਜੀਹਾਂ ਰੀਸੈੱਟ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ਸਭ ਡਾਟਾ ਮਿਟਾਓ (ਫੈਕਟਰੀ ਰੀਸੈੱਟ)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ਇਹ ਤੁਹਾਡੇ ਵਾਹਨ ਦੀ ਸਕ੍ਰੀਨ ਤੋਂ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾ ਦੇਵੇਗਾ, ਇਹਨਾਂ ਸਮੇਤ:\n\n"<li>"ਤੁਹਾਡਾ Google ਖਾਤਾ"</li>\n<li>"ਸਿਸਟਮ ਅਤੇ ਐਪ ਡਾਟਾ ਅਤੇ ਸੈਟਿੰਗਾਂ"</li>\n<li>"ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਐਪਾਂ"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"ਤੁਸੀਂ ਇਸ ਵੇਲੇ ਇਹਨਾਂ ਖਾਤਿਆਂ \'ਤੇ ਸਾਈਨ-ਇਨ ਹੋ:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ਇਸ ਵਾਹਨ \'ਤੇ ਹੋਰ ਵਰਤੋਂਕਾਰ ਮੌਜੂਦ ਨਹੀਂ ਹਨ।"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"ਵਾਹਨ ਰੀਸੈੱਟ ਕਰੋ"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"ਕੀ ਰੀਸੈੱਟ ਕਰਨਾ ਹੈ?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"ਕੀ ਆਪਣੀ ਸਾਰੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਅਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਐਪਾਂ ਮਿਟਾਉਣੀਆਂ ਹਨ? ਤੁਸੀਂ ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਅਣਕੀਤਾ ਨਹੀਂ ਕਰ ਸਕਦੇ!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ਸਭ ਕੁਝ ਮਿਟਾਓ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"ਮਿਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"ਕਿਰਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"ਤਾਰੀਖ ਅਤੇ ਸਮਾਂ ਸੈੱਟ ਕਰੋ"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"ਤਾਰੀਖ, ਸਮਾਂ, ਸਮਾਂ ਖੇਤਰ ਅਤੇ ਵੰਨਗੀ ਸੈੱਟ ਕਰੋ"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"ਸਮਾਂ ਖੇਤਰ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"ਤਾਰੀਖ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"ਸਮਾਂ"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾਓ"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
-    <string name="user_guest" msgid="3465399481257448601">"ਮਹਿਮਾਨ"</string>
     <string name="user_admin" msgid="1535484812908584809">"ਪ੍ਰਸ਼ਾਸਕ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"ਪ੍ਰਸ਼ਾਸਕ ਵਜੋਂ ਸਾਈਨ ਇਨ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"ਸਾਰੀਆਂ ਪ੍ਰਸ਼ਾਸਕ ਇਜਾਜ਼ਤਾਂ"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"ਪ੍ਰਸ਼ਾਸਕ ਬਣਾਓ"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ਵਰਤੋਂਕਾਰ ਹੋਰ ਪ੍ਰਸ਼ਾਸਕਾਂ ਸਮੇਤ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਮਿਟਾ ਸਕੇਗਾ ਅਤੇ ਸਿਸਟਮ ਨੂੰ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਕਰ ਸਕੇਗਾ।"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ਇਹ ਕਾਰਵਾਈ ਪਲਟਾਉਣਯੋਗ ਨਹੀਂ ਹੈ।"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ਹਾਂ, ਪ੍ਰਸ਼ਾਸਕ ਬਣਾਓ"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"ਨਵੇਂ ਵਰਤੋਂਕਾਰ ਬਣਾਓ"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰੋ"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"ਕਾਰ ਦੇ ਮੋਬਾਈਲ ਡਾਟੇ ਰਾਹੀਂ ਸੁਨੇਹਾ ਭੇਜਣਾ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"ਨਵੀਆਂ ਐਪਾਂ ਸਥਾਪਤ ਕਰੋ"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ਐਪਾਂ ਅਣਸਥਾਪਤ ਕਰੋ"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੀਏ?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸੈੱਟਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਸੀਮਾ ਪੂਰੀ ਹੋਈ"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">ਤੁਸੀਂ <xliff:g id="COUNT">%d</xliff:g> ਵਰਤੋਂਕਾਰ ਬਣਾ ਸਕਦੇ ਹੋ।</item>
+      <item quantity="other">ਤੁਸੀਂ <xliff:g id="COUNT">%d</xliff:g> ਵਰਤੋਂਕਾਰ ਬਣਾ ਸਕਦੇ ਹੋ।</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾਈਏ?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤੇ ਜਾਣਗੇ।"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ਵਰਤੋਂਕਾਰ ਮਿਟਾਉਣਾ ਅਸਫਲ ਰਿਹਾ।"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ਖਾਰਜ ਕਰੋ"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"ਪਿਛਲਾ ਵਰਤੋਂਕਾਰ ਮਿਟਾਈਏ?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ਇਸ ਕਾਰ ਦੇ ਇੱਕੋ ਬਚੇ ਹੋਏ ਵਰਤੋਂਕਾਰ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਬਾਅਦ, ਕੋਈ ਨਵਾਂ ਪ੍ਰਸ਼ਾਸਕ ਵਰਤੋਂਕਾਰ ਬਣਾਇਆ ਜਾਵੇਗਾ।"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ਇਸ ਵਰਤੋਂਕਾਰ ਨਾਲ ਸੰਬੰਧਿਤ ਸਾਰੇ ਡਾਟੇ, ਸੈਟਿੰਗਾਂ ਅਤੇ ਐਪਾਂ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਹਾਨੂੰ ਦੁਬਾਰਾ ਸਿਸਟਮ ਸੈੱਟਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ।"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"ਨਵਾਂ ਪ੍ਰਸ਼ਾਸਕ ਚੁਣੋ"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਪ੍ਰਸ਼ਾਸਕ ਦੀ ਲੋੜ ਹੈ। ਇਸ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਇਸਦੇ ਬਦਲੇ ਕੋਈ ਹੋਰ ਚੁਣੋ।"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"ਪ੍ਰਸ਼ਾਸਕ ਚੁਣੋ"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ਮਹਿਮਾਨ"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ਮਹਿਮਾਨ"</string>
     <string name="user_switch" msgid="6544839750534690781">"ਅਦਲਾ-ਬਦਲੀ ਕਰੋ"</string>
     <string name="current_user_name" msgid="3813671533249316823">"ਤੁਸੀਂ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"ਨਾਮ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"ਵਰਤੋਂਕਾਰ ਨਾਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
     <string name="users_list_title" msgid="770764290290240909">"ਵਰਤੋਂਕਾਰ"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ਨੂੰ ਇਜਾਜ਼ਤਾਂ ਦਿੱਤੀਆਂ ਗਈਆਂ"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"ਖਾਤੇ"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ਵਰਤੋਂਕਾਰ"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ਕੋਈ ਖਾਤੇ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤੇ ਗਏ"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> ਦੇ ਖਾਤੇ"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਡਾਟੇ ਦਾ ਸਮਕਾਲੀਕਰਨ ਕਰੋ"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ਐਪਾਂ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਡਾਟਾ ਰਿਫ੍ਰੈਸ਼ ਕਰਨ ਦਿਓ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ਡਾਟੇ ਦਾ ਸਵੈ-ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੀਏ?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"ਤੁਸੀਂ ਵੈੱਬ ਤੇ ਆਪਣੇ ਖਾਤਿਆਂ ਵਿੱਚ ਜੋ ਕੋਈ ਵੀ ਤਬਦੀਲੀ ਕਰਦੇ ਹੋ, ਉਹ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਕਾਪੀ ਕੀਤੀ ਜਾਵੇਗੀ।\n\nਕੁਝ ਖਾਤੇ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਉਹ ਤਬਦੀਲੀ ਕਾਪੀ ਕਰ ਸਕਦੇ ਹਨ ਜੋ ਤੁਸੀਂ ਵੈੱਬ \'ਤੇ ਆਪਣੇ ਫ਼ੋਨ ਵਿੱਚ ਕਰਦੇ ਹੋ। ਇੱਕ Google ਖਾਤਾ ਇਸ ਤਰ੍ਹਾਂ ਕੰਮ ਕਰਦਾ ਹੈ।"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ਡਾਟੇ ਦਾ ਸਵੈ-ਸਮਕਾਲੀਕਰਨ ਬੰਦ ਕਰੀਏ?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ਇੰਝ ਕਰਨ ਨਾਲ ਡਾਟਾ ਬਚੇਗਾ, ਪਰ ਤੁਹਾਨੂੰ ਹਾਲੀਆ ਜਾਣਕਾਰੀ ਇਕੱਤਰ ਕਰਨ ਲਈ ਹਰੇਕ ਖਾਤੇ ਦਾ ਹੱਥੀਂ ਸਮਕਾਲੀਕਰਨ ਕਰਨਾ ਪਵੇਗਾ। ਅਤੇ ਅੱਪਡੇਟ ਹੋਣ \'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਨਾਵਾਂ ਨਹੀਂ ਮਿਲਣਗੀਆਂ।"</string>
     <string name="account_details_title" msgid="7529571432258448573">"ਖਾਤਾ ਜਾਣਕਾਰੀ"</string>
     <string name="add_account_title" msgid="5988746086885210040">"ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"ਖਾਤਾ ਹਟਾਓ"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"ਕੀ ਖਾਤਾ ਹਟਾਉਣਾ ਹੈ?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ਇਸ ਖਾਤੇ ਨੂੰ ਹਟਾਉਣ ਨਾਲ ਡੀਵਾਈਸ ਤੋਂ ਇਸਦੇ ਸਾਰੇ ਸੁਨੇਹੇ, ਸੰਪਰਕ ਅਤੇ ਹੋਰ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਇਸ ਬਦਲਾਅ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ਕੀ ਇਹ ਵਰਤੋਂਕਾਰ ਹਟਾਉਣਾ ਹੈ?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤੇ ਜਾਣਗੇ।"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"ਵਰਤੋਂਕਾਰ ਹਟਾਉਣਾ ਅਸਫਲ ਰਿਹਾ।"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"ਕੀ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨੀ ਹੈ?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"ਖਾਰਜ ਕਰੋ"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੀਏ?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸੈੱਟਅੱਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"ਖਾਤਾ ਹਟਾਉਣਾ ਅਸਫਲ ਰਿਹਾ।"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ਖਾਤਾ ਸਮਕਾਲੀਕਰਨ"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="ID_1">%1$d</xliff:g> ਆਈਟਮਾਂ ਲਈ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਹੈ"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"ਸਾਰੀਆਂ ਆਈਟਮਾਂ ਲਈ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਹੈ"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"ਸਾਰੀਆਂ ਆਈਟਮਾਂ ਲਈ ਸਮਕਾਲੀਕਰਨ ਬੰਦ ਹੈ"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"ਸਮਕਾਲੀਕਰਨ ਬੰਦ ਹੈ"</string>
+    <string name="sync_error" msgid="6698021343089247914">"ਸਿੰਕ ਅਸ਼ੁੱਧੀ"</string>
+    <string name="last_synced" msgid="4745124489150101529">"ਪਿਛਲਾ ਸਮਕਾਲੀਕਰਨ <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ਹੁਣ ਸਮਕਾਲੀਕਰਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ਹੁਣੇ ਸਮਕਾਲੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ਹੁਣ ਸਮਕਾਲੀਕਰਨ ਕਰੋ"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ਸਮਕਾਲੀਕਰਨ ਰੱਦ ਕਰੋ"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ਇਸ ਵੇਲੇ ਸਮਕਾਲੀਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆਵਾਂ ਆ ਰਹੀਆਂ ਹਨ। ਇਹ ਜਲਦੀ ਹੀ ਠੀਕ ਹੋ ਜਾਣਗੀਆਂ।"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ਸੁਰੱਖਿਆ"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ਸਕ੍ਰੀਨ ਲਾਕ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ਕੋਈ ਨਹੀਂ"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"ਪਿੰਨ"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"ਪਾਸਵਰਡ"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"ਕੋਈ ਲਾਕ ਕਿਸਮ ਚੁਣੋ"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"ਸਕ੍ਰੀਨ ਲਾਕ ਦੇ ਵਿਕਲਪ"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ਲਾਕ ਵਿਕਲਪ"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"ਆਪਣਾ ਪੈਟਰਨ ਦਾਖਲ ਕਰੋ"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"ਪੁਸ਼ਟੀ ਕਰੋ"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"ਮੁੜ-ਉਲੀਕੋ"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"ਕੋਈ ਸਕ੍ਰੀਨ ਲਾਕ ਸੈੱਟ ਕਰੋ"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"ਆਪਣਾ ਪਿੰਨ ਚੁਣੋ"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"ਆਪਣਾ ਪੈਟਰਨ ਚੁਣੋ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"ਆਪਣਾ ਪਾਸਵਰਡ ਚੁਣੋ"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"ਆਪਣਾ ਪਾਸਵਰਡ ਚੁਣੋ"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"ਮੌਜੂਦਾ ਸਕ੍ਰੀਨ ਲਾਕ"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ਸੁਰੱਖਿਆ ਲਈ, ਕੋਈ ਪੈਟਰਨ ਸੈੱਟ ਕਰੋ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"ਕਲੀਅਰ ਕਰੋ"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ਆਮ ਪਾਸਵਰਡ ਤੁਹਾਡੇ IT ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬਲਾਕ ਕੀਤੇ ਗਏ ਹਨ। ਕੋਈ ਵੱਖਰਾ ਪਾਸਵਰਡ ਵਰਤੋ।"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ਅੰਕਾਂ ਦਾ ਵਧਦਾ ਕ੍ਰਮ, ਘਟਦਾ ਕ੍ਰਮ, ਜਾਂ ਦੁਹਰਾਈ ਗਈ ਲੜੀ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"ਸਕ੍ਰੀਨ ਲਾਕ ਦੇ ਵਿਕਲਪ"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ਦਿਨ ਪਹਿਲਾਂ"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸਾਂ"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ਡੀਵਾਈਸ</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ਡੀਵਾਈਸਾਂ</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"ਤੁਹਾਡਾ <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ਇਸ ਕਾਰ ਨੂੰ ਅਣਲਾਕ ਕਰ ਦੇਵੇਗਾ, ਜਦੋਂ ਇਹ ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ ਹੋਵੇਗਾ। ਜੇਕਰ ਕੋਈ ਤੁਹਾਡਾ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> ਲੈ ਲੈਂਦਾ ਹੈ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਉਹ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦੇ ਯੋਗ ਹੋ ਜਾਵੇ।"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"ਪੁਸ਼ਟੀ ਕਰੋ"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਹਟਾਓ"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ਹੋ ਗਿਆ"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"ਕਿਸੇ ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਸੰਬੰਧੀ ਐਪ ਵਰਤੋ। ਸੈੱਟਅੱਪ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਵਾਹਨ ਵੱਲੋਂ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦਾ ਪਤਾ ਲਗਾਉਣ \'ਤੇ ਤੁਸੀਂ ਆਪਣੇ ਵਰਤੋਂਕਾਰ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਅਣਲਾਕ ਕਰ ਸਕੋਗੇ"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ਆਪਣੇ ਫ਼ੋਨ \'ਤੇ ਸੰਬੰਧੀ ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. ਡੀਵਾਈਸਾਂ ਨੂੰ ਜੋੜਾਬੱਧ ਕਰਨ ਲਈ ਆਪਣੇ ਫ਼ੋਨ \'ਤੇ <xliff:g id="CAR_NAME">%1$s</xliff:g> ਚੁਣੋ"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"ਸਮਾਰਟ ਲਾਕ ਇਸ ਡੀਵਾਈਸ ਦੀਆਂ ਸੁਰੱਖਿਆ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਪਤਾ ਨਹੀਂ ਲਗਾ ਸਕਦਾ। ਤੁਹਾਡੀ ਕਾਰ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਵਿੱਚ ਮਦਦ ਲਈ, ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਤੁਹਾਡੀ ਕਾਰ ਨੂੰ ਸਿਰਫ਼ ਤਾਂ ਹੀ ਅਣਲਾਕ ਰੱਖ ਸਕੇਗਾ, ਜੇ ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ ਕਾਰ ਨੂੰ ਅਣਲਾਕ ਕੀਤਾ ਹੋਵੇ। ਤੁਹਾਡਾ ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਤੁਹਾਡੀ ਕਾਰ ਨਜ਼ਦੀਕ ਹੋਣ \'ਤੇ ਉਸਨੂੰ ਅਣਲਾਕ ਰੱਖ ਸਕਦਾ ਹੈ, ਭਾਵੇਂ ਡੀਵਾਈਸ ਨੂੰ ਕਿਸੇ ਹੋਰ ਨੇ ਫੜ੍ਹਿਆ ਹੋਵੇ।"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨੂੰ ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਵਜੋਂ ਸ਼ਾਮਲ ਕਰੋ"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨੂੰ ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਵਜੋਂ ਸਫਲਤਾਪੂਰਵਕ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨੂੰ ਦਰਜ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਅੱਗੇ ਤੁਹਾਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਵਿਧੀ ਸੈੱਟ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ। ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਤੁਹਾਡਾ ਭਰੋਸੇਯੋਗ ਡੀਵਾਈਸ ਨਹੀਂ ਹੈ, ਤਾਂ ਤੁਹਾਨੂੰ ਆਪਣੇ ਪ੍ਰੋਫ਼ਾਈਲ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਪ੍ਰਮਾਣੀਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ।"</string>
     <string name="forget" msgid="3971143908183848527">"ਛੱਡੋ"</string>
+    <string name="connect" msgid="5861699594602380150">"ਕਨੈਕਟ ਕਰੋ"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
     <string name="delete_button" msgid="5840500432614610850">"ਮਿਟਾਓ"</string>
     <string name="remove_button" msgid="6664656962868194178">"ਹਟਾਓ"</string>
     <string name="cancel" msgid="750286395700355455">"ਰੱਦ ਕਰੋ"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ਡੈਮੋ ਮੋਡ ਤੋ ਬਾਹਰ ਜਾਓ"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ਇਹ ਡੈਮੋ ਖਾਤੇ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗਾ ਅਤੇ ਸਿਸਟਮ ਦਾ ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਹੋ ਜਾਵੇਗਾ। ਸਾਰਾ ਵਰਤੋਂਕਾਰ ਡਾਟਾ ਗੁੰਮ ਹੋ ਜਾਵੇਗਾ।"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ਡੈਮੋ ਮੋਡ ਤੋ ਬਾਹਰ ਜਾਓ"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ਸੈੱਟਅੱਪ ਪੂਰਾ ਕਰੋ"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ਹੁਣੇ ਨਹੀਂ"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ਖਾਰਜ ਕਰੋ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ਗੱਡੀ ਚਲਾਉਣ ਵੇਲੇ ਵਿਸ਼ੇਸ਼ਤਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ਗੱਡੀ ਚਲਾਉਣ ਦੌਰਾਨ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7a337e2..23230df 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"przyciemnij ekran, ekran dotykowy, bateria"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"przyciemnij ekran, noc, odcień"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Tryb nocny"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Sieć i internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Sieć komórkowa"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilna transmisja danych"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Korzystaj z danych przy użyciu sieci komórkowej"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Wyłączyć mobilną transmisję danych?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Użycie danych"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Dane i limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cykl użycia danych w aplikacjach"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Ustaw próg ostrzegawczy"</string>
+    <string name="data_warning" msgid="116776633806885370">"Ostrzeżenie: użycie danych"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Ustaw limit danych"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limit danych"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ograniczanie użycia danych"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Po osiągnięciu ustawionego przez Ciebie limitu serwer pojazdu wyłączy mobilną transmisję danych.\n\nPonieważ transmisję danych mierzy serwer i może to robić inaczej niż operator, dobrze jest ustawić mniejszy limit."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Konfiguruj punkty dostępu sieci bezprzewodowej i zarządzaj nimi"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Włączam Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wyłączam Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wczytuję listę sieci Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi wyłączone"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Nie udało się zapomnieć sieci"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Nie udało się połączyć z siecią"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj sieć"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi wyłączone"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Połącz"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Hasło"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Pokaż hasło"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nazwa sieci"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Wpisz identyfikator SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Zabezpieczenia"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Siła sygnału"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Siła sygnału"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Stan"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Szybkość łącza"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Częstotliwość"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Adres IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Pokaż hasło"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Wpisz nazwę sieci"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Wpisz hasło"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Słaba"</item>
-    <item msgid="2032262610626057081">"Dostateczna"</item>
-    <item msgid="3859756017461098953">"Dobra"</item>
-    <item msgid="1521103743353335724">"Doskonała"</item>
+    <item msgid="7683058295076342057">"Słaba"</item>
+    <item msgid="1639222824821660744">"Dostateczna"</item>
+    <item msgid="1838705897358163300">"Dobra"</item>
+    <item msgid="6067166649320533751">"Doskonała"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Włącz Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth wyłączony"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Szczegóły sieci"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adres MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Adres IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska podsieci"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adresy IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Brama"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Ustawienia Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Włącz Wi-Fi automatycznie"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi włączy się w pobliżu zapisanych sieci wysokiej jakości, np. Twojej sieci domowej"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Niedostępne, bo lokalizacja jest wyłączona. Włącz "<annotation id="link">"ją"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Włączyć skanowanie Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Włącz"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Skanowanie Wi-Fi włączone"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automatycznie przełączaj na mobilną transmisję danych"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Używaj mobilnej transmisji danych, gdy sieć Wi-Fi nie ma dostępu do internetu. Mogą obowiązywać opłaty za użycie danych."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Więcej informacji"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Zarządzaj połączeniami, ustaw nazwę urządzenia i możliwość wykrycia"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Komputer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Zestaw słuchawkowy"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Obrazowanie"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Słuchawki"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Peryferyjne urządzenie wejściowe"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Sparowane urządzenia"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dostępne urządzenia"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Brak sparowanych urządzeń"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Brak dostępnych urządzeń"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Sparowane urządzenie"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nazwa"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Używaj do:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Zmień nazwę urządzenia Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Urządzenie bez nazwy"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Sparowane urządzenia"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Sparuj nowe urządzenie"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth włączy się, by sparować urządzenia"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Rozłączyć urządzenie?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Pojazd odłączy się od urządzenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adres Bluetooth pojazdu: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adres Bluetooth urządzenia: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nazwa pojazdu"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Zmień nazwę tego pojazdu"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Zmień nazwę urządzenia"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Zmień nazwę"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dostępne urządzenia"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profile"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Prośba o sparowanie Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Sparuj i połącz"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Kod parowania Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Kod PIN zawiera litery lub symbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Wpisz kod parowania i naciśnij Return lub Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Zazwyczaj 0000 lub 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Prośba o sparowanie"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Dotknij, by sparować z: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Języki"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Języki i metody wprowadzania"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klawiatura"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Zarządzaj klawiaturami"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Zamiana tekstu na mowę"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Preferowany mechanizm"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Używany mechanizm"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Szybkość mowy"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Ton"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Resetuj"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Dźwięk"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Głośność dzwonka"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Głośność nawigacji"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Multimedia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Ustaw głośność muzyki i filmów"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Dzwonek telefonu"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Domyślny dźwięk powiadomienia"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Domyślny dźwięk alarmu"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikacje i powiadomienia"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Pokaż wszystkie aplikacje"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplikacje domyślne"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informacje o aplikacji"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Wymuś zatrzymanie"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Wymusić zatrzymanie?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Jeśli wymusisz zatrzymanie aplikacji, może ona zadziałać nieprawidłowo."</string>
     <string name="disable_text" msgid="4358165448648990820">"Wyłącz"</string>
     <string name="enable_text" msgid="1794971777861881238">"Włącz"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Odinstaluj"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Jeśli wyłączysz tę aplikację, Android i inne aplikacje mogą działać nieprawidłowo."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Wyłącz aplikację"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Uprawnienia"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Wersja %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Brak przyznanych uprawnień"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Brak próśb o przyznanie uprawnień"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Użycie danych"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Aplikacja – użycie danych"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Wymuś zatrzymanie"</string>
     <string name="computing_size" msgid="5791407621793083965">"Przetwarzam…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatkowe uprawnienia</item>
@@ -117,15 +168,39 @@
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatkowego uprawnienia</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dodatkowe uprawnienie</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asystent i rozpoznawanie mowy"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplikacja asystująca"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Używanie tekstu na ekranie"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Zezwól aplikacji asystującej na dostęp do tekstowej zawartości ekranu"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Używanie zrzutu ekranu"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Zezwól aplikacji asystującej na dostęp do obrazu ekranu"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Usługa autouzupełniania"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Brak"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Wybrana"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asystent będzie mógł odczytywać informacje o aplikacjach używanych w systemie. Obejmuje to też informacje widoczne na ekranie i dostępne w aplikacjach."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Sprawdź, czy ta aplikacja jest zaufana&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Autouzupełnianie Google&gt;%1$s&lt;/xliff:g&gt; na podstawie zawartości ekranu określa, co można uzupełnić automatycznie."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Dodaj usługę"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokalizacja"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Ostatnie prośby o lokalizację"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Brak ostatnich próśb o lokalizację"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Uprawnienia na poziomie aplikacji"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skanowanie"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Usługi lokalizacyjne"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Skanowanie Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Zezwól na wyszukiwanie urządzeń w pobliżu przez aplikacje i usługi w dowolnym momencie, nawet gdy Wi-Fi jest wyłączone. Może to np. pomóc usprawnić działanie funkcji i usług opartych na lokalizacji."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Skanowanie Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Zezwól na wyszukiwanie urządzeń w pobliżu przez aplikacje i usługi w dowolnym momencie, nawet gdy Bluetooth jest wyłączony. Może to np. pomóc usprawnić działanie funkcji i usług opartych na lokalizacji."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Aktualizacje systemu"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizacje systemu"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Wersja Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Stan aktualizacji zabezpieczeń Androida"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Wersja pasma podstawowego"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Wersja jądra"</string>
     <string name="build_number" msgid="3997326631001009102">"Numer kompilacji"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adres Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Niedostępna"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Stan"</string>
     <string name="device_status" msgid="267298179806290920">"Stan"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Prawa autorskie"</string>
     <string name="license_title" msgid="936705938435249965">"Licencja"</string>
     <string name="terms_title" msgid="5201471373602628765">"Warunki i zasady korzystania"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Systemowa licencja na WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licencje systemowe WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Tapety"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Dostawcy zdjęć satelitarnych:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencje innych firm"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Wystąpił problem z wczytaniem licencji."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Ładuję…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="few">Od zostania programistą dzielą Cię już tylko <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroki.</item>
+      <item quantity="many">Od zostania programistą dzieli Cię już tylko <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroków.</item>
+      <item quantity="other">Od zostania programistą dzieli Cię już tylko <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroku.</item>
+      <item quantity="one">Od zostania programistą dzieli Cię już tylko <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> krok.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Jesteś teraz programistą."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"W porządku, jesteś już programistą."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opcje programisty"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Resetowanie opcji"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Resetowanie ustawień sieci, aplikacji lub urządzenia"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Zresetuj sieć"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Spowoduje to zresetowanie wszystkich ustawień sieci, w tym:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobilna transmisja danych"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Wykasuj dane wszystkich kart eSIM w pojeździe"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Nie anuluje to Twojego abonamentu."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Nie udało się zresetować kart eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Wybieranie sieci"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Zresetuj ustawienia"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Zresetować?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Zresetować wszystkie ustawienia sieci? Tego działania nie można cofnąć."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Zresetuj ustawienia"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Ustawienia sieci zostały zresetowane"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Resetuj ustawienia aplikacji"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Zresetuje to wszystkie ustawienia:\n\n"<li>"wyłączonych aplikacji,"</li>\n<li>"wyłączonych powiadomień z aplikacji,"</li>\n<li>"domyślnych aplikacji dla wybranych czynności,"</li>\n<li>"ograniczeń korzystania przez aplikacje z danych w tle,"</li>\n<li>"wszystkich ograniczeń dotyczących uprawnień."</li>\n\n"Nie stracisz żadnych danych aplikacji."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Resetuj aplikacje"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Ustawienia aplikacji zostały zresetowane"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Wykasuj wszystkie dane"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Zostaną usunięte wszystkie dane z radioodtwarzacza pojazdu, między innymi:\n\n"<li>"Twoje konto Google,"</li>\n<li>"dane i ustawienia aplikacji i systemu,"</li>\n<li>"pobrane aplikacje."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"W tej chwili używasz kont:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"W tym pojeździe są też zapisani inni użytkownicy."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Zresetuj pojazd"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Zresetować?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Wymazać wszystkie Twoje dane osobowe i pobrane aplikacje? Tego działania nie można cofnąć."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Wymaż wszystko"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Wymazuję"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Zaczekaj…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data i godzina"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Ustaw datę i godzinę"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Ustaw datę, godzinę, strefę czasową i formaty."</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sortuj według strefy czasowej"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Czas"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodaj użytkownika"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj konto"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Usuwanie użytkownika"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nowy użytkownik"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gość"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Zalogowano jako administratora"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Wszystkie uprawnienia administratora"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Przyznaj uprawnienia administratora"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Użytkownik będzie mógł usuwać innych użytkowników (również administratorów) i przywracać ustawienia fabryczne systemu."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Tego działania nie można cofnąć."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Tak, przyznaj uprawnienia administratora"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Tworzenie nowych użytkowników"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Dzwonienie"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Wysyłanie SMS-ów przez sieć pojazdu"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalowanie nowych aplikacji"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Odinstalowywanie aplikacji"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodaj użytkownika"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nowy użytkownik"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Dodać nowego użytkownika?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Każdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Osiągnięto limit użytkowników"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="few">Możesz utworzyć maksymalnie <xliff:g id="COUNT">%d</xliff:g> użytkowników.</item>
+      <item quantity="many">Możesz utworzyć maksymalnie <xliff:g id="COUNT">%d</xliff:g> użytkowników.</item>
+      <item quantity="other">Możesz utworzyć maksymalnie <xliff:g id="COUNT">%d</xliff:g> użytkownika.</item>
+      <item quantity="one">Można utworzyć tylko jednego użytkownika.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Nowy użytkownik nie został utworzony"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Usunąć tego użytkownika?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Zostaną usunięte wszystkie aplikacje i dane."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Nie udało się usunąć użytkownika."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Zamknij"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Ponów"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Usunąć użytkownika?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Usunięcie ostatniego aktywnego użytkownika tego samochodu spowoduje utworzenie nowego administratora."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Zostaną usunięte wszystkie dane, ustawienia i aplikacje powiązane z tym użytkownikiem. Konieczne będzie ponowne skonfigurowanie systemu."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Wybierz nowego administratora"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Potrzebujesz co najmniej jednego administratora. Aby usunąć tego, najpierw wybierz jego następcę."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Wybierz administratora"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gość"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gość"</string>
     <string name="user_switch" msgid="6544839750534690781">"Przełącz"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Ty (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nazwa"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nieskonfigurowany"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Edytowanie nazwy użytkownika"</string>
     <string name="users_list_title" msgid="770764290290240909">"Użytkownicy"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Uprawnienia użytkownika %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Konta"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Użytkownik"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj konto"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nie dodano kont"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Konta użytkownika <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automatycznie synchronizuj dane"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Pozwól aplikacjom automatycznie odświeżać dane"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Włączyć autosynchronizację?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Wszystkie zmiany, które wprowadzisz na swoich kontach w internecie, zostaną automatycznie skopiowane na Twoje urządzenie.\n\nNiektóre konta mogą też automatycznie kopiować do wersji internetowej wszystkie zmiany, które wprowadzisz na telefonie. W ten sposób działa właśnie konto Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Wyłączyć autosynchronizację?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Pozwoli to przesyłać mniej danych, ale pobranie najnowszych informacji będzie wymagało ręcznej synchronizacji każdego konta. Nie będziesz też otrzymywać powiadomień o aktualizacjach."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informacje o koncie"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Dodaj konto"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Dodaj konto"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Usuń konto"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Usunąć konto?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Usunięcie tego konta spowoduje usunięcie z urządzenia wszystkich wiadomości, kontaktów i innych danych powiązanych z kontem."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Ta zmiana nie jest dozwolona przez administratora"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Usunąć tego użytkownika?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Wszystkie aplikacje i dane zostaną usunięte."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Nie udało się usunąć użytkownika."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Ponowić?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Zamknij"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Ponów"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Dodać nowego użytkownika?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Każdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Nie udało się usunąć konta."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Synchronizacja konta"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Włącz synchronizację <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g> elementów"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Włącz synchronizację wszystkich elementów"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Wyłącz synchronizację wszystkich elementów"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synchronizacja jest wyłączona"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Błąd synchronizacji"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Ostatnia synchronizacja: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synchronizuję…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Dotknij, by zsynchronizować teraz <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchronizuj teraz"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Anuluj synchronizację"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Podczas synchronizacji wystąpiły problemy. Zostanie ona wkrótce wznowiona."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Zabezpieczenia"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Blokada ekranu"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Brak"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Kod PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Hasło"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Wybierz rodzaj blokady"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opcje blokady ekranu"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opcje blokady"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Narysuj wzór"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Potwierdź"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Narysuj ponownie"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ustawianie blokady ekranu"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Ustaw kod PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Wybierz wzór"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Ustaw hasło"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Wybierz hasło"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Aktualna blokada ekranu"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Ze względów bezpieczeństwa ustaw wzór"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Wyczyść"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Popularne hasła zostały zablokowane przez administratora. Użyj innego hasła."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Ciąg cyfr rosnących, malejących lub powtarzających się jest niedozwolony."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opcje blokady ekranu"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g> dni temu"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Dodaj zaufane urządzenie"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Zaufane urządzenia"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> urządzenia</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> urządzeń</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> urządzenia</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> urządzenie</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> odblokuje ten samochód, gdy się z nim połączy. Jeśli <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> znajdzie się w niepowołanych rękach, taka osoba będzie mogła uzyskać dostęp do tego urządzenia."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Potwierdź"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Usuń zaufane urządzenie"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"OK"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Skonfiguruj zaufane urządzenie w aplikacji towarzyszącej. Dzięki temu Twój profil użytkownika zostanie odblokowany, gdy tylko samochód wykryje Twój telefon."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Pobierz aplikację towarzyszącą na telefon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Na telefonie wybierz <xliff:g id="CAR_NAME">%1$s</xliff:g>, by sparować urządzenia"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock nie może wykryć funkcji zabezpieczeń na tym urządzeniu. Aby chronić Twój samochód, zaufane urządzenie będzie zapobiegać automatycznemu zamknięciu pojazdu tylko wtedy, gdy wcześniej samodzielnie go otworzysz. Zaufane urządzenie zapobiega automatycznemu zamknięciu, gdy znajduje się w pobliżu samochodu, nawet jeśli urządzenie trzyma ktoś inny."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Dodaj urządzenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> jako zaufane"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Dodano urządzenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> jako zaufane"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Nie udało się zarejestrować urządzenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Po dodaniu zaufanego urządzenia musisz wybrać metodę uwierzytelniania. Dzięki niej uzyskasz dostęp do swojego profilu, gdy akurat nie będziesz mieć zaufanego urządzenia przy sobie."</string>
     <string name="forget" msgid="3971143908183848527">"Zapomnij"</string>
+    <string name="connect" msgid="5861699594602380150">"Połącz"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Odłącz"</string>
     <string name="delete_button" msgid="5840500432614610850">"Usuń"</string>
     <string name="remove_button" msgid="6664656962868194178">"Usuń"</string>
     <string name="cancel" msgid="750286395700355455">"Anuluj"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Zamknij tryb demonstracyjny"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Spowoduje to usunięcie konta demonstracyjnego i przywrócenie danych fabrycznych systemu. Utracisz wszystkie swoje dane użytkownika."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Zamknij tryb demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"dokończ konfigurację"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"nie teraz"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ZAMKNIJ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkcja niedostępna podczas jazdy."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Nie można dodać użytkownika podczas jazdy."</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index c9af603..0b954b8 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"escurecer ecrã, ecrã tátil, bateria"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"escurecer ecrã, noite, tonalidade"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modo noturno"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Rede e Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Rede móvel"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dados móveis"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Aceder aos dados através de rede móvel"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Pretende desativar os dados móveis?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Utilização de dados"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Limite e aviso de dados"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de utilização de dados da aplic."</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Definir aviso de dados"</string>
+    <string name="data_warning" msgid="116776633806885370">"Aviso de dados"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Definir limite de dados"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limite de dados"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitação da utilização de dados"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"A unidade principal do seu veículo desativa os dados móveis quando alcança o limite definido.\n\nUma vez que a utilização de dados é medida pela unidade principal e o seu operador pode calcular a utilização de forma diferente, considere definir um limite de precaução."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configurar e gerir pontos de acesso sem fios"</string>
     <string name="wifi_starting" msgid="473253087503153167">"A ligar Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"A desligar Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"A carregar a lista de Wi‑Fi…"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi desativado"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Não foi possível esquecer a rede."</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Não foi possível estabelecer ligação à rede."</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Adicionar rede"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi desativado"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Ligar"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Palavra-passe"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Mostrar palavra-passe"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nome da rede"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Introduza o SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Segurança"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Intensidade do sinal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Intensidade do sinal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Estado"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Velocidade da ligação"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequência"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Endereço IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Mostrar palavra-passe"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Introduzir nome da rede"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Introduzir palavra-passe"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Fraca"</item>
-    <item msgid="2032262610626057081">"Razoável"</item>
-    <item msgid="3859756017461098953">"Boa"</item>
-    <item msgid="1521103743353335724">"Excelente"</item>
+    <item msgid="7683058295076342057">"Fraca"</item>
+    <item msgid="1639222824821660744">"Razoável"</item>
+    <item msgid="1838705897358163300">"Boa"</item>
+    <item msgid="6067166649320533751">"Excelente"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Ativar Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth desativado."</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalhes da rede"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Endereço MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Endereço IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Máscara de sub-rede"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Endereços IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferências de Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Ativar o Wi‑Fi automaticamente"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi é reativ. quando perto de redes de alta qual. guard., como a rede domést."</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Indisp. porque a localiz. está desativ. Ative a "<annotation id="link">"localização"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Pretende ativar a procura de Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Ativar"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Procura de Wi-Fi ativada"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Mude automaticamente para os dados móveis"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Utilize os dados móveis quando não tiver acesso à Internet via Wi-Fi. Podem aplicar-se custos de utilização de dados."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Saiba mais"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Gerir ligações, definir nome e deteção do dispositivo"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computador"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Auscultadores com microfone integrado"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telemóvel"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Dispositivo de imagem"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Auscultadores"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periférico de entrada"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispositivos sincronizados"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispositivos disponíveis"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Sem dispositivos sincronizados"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nenhum dispositivo disponível"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispositivo sincronizado"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nome"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Utilizar para"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Altere o nome do disp. Bluetooth."</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispositivo sem nome"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispositivos sincronizados"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Sincronizar novo dispositivo"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"O Bluetooth será ativado para a sincronização."</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Desassociar o dispositivo?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"O veículo irá desassociar-se do dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Endereço Bluetooth do veículo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Endereço Bluetooth do dispositivo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nome do veículo"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Mudar o nome deste veículo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Mudar o nome do dispositivo"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Mudar nome"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispositivos disponíveis"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Perfis"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Pedido de sincronização de Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Sincronizar e ligar"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Código de sincronização Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"O PIN contém letras ou símbolos."</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Introduza o código de sincronização e, em seguida, prima Return ou Enter."</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Geralmente 0000 ou 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Pedido de sincronização"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Toque para sincronizar com o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e introdução"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Efetue a gestão dos teclados"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Saída de síntese de voz"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motor preferido"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motor atual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Taxa de voz"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tom"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Repor"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Som"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume do toque"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume da navegação"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Multimédia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Definir volume para música e vídeos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarme"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Toque do telemóvel"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Som de notificação predefinido"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Som de alarme predefinido"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplicações e notificações"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Mostrar todas as aplicações"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplicações predefinidas"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informações da aplicação"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forçar paragem"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Pretende forçar a paragem?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Se forçar a paragem de uma aplicação, esta poderá apresentar um comportamento anormal."</string>
     <string name="disable_text" msgid="4358165448648990820">"Desativar"</string>
     <string name="enable_text" msgid="1794971777861881238">"Ativar"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Se desativar esta aplicação, o Android e outras aplicações podem deixar de funcionar corretamente."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Desativar aplicação"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Autorizações"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versão: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nenhuma autorização concedida."</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nenhuma autorização solicitada."</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Utilização de dados"</string>
-    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Utiliz. dados da aplic."</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forçar paragem"</string>
+    <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Utiliz. dados da app"</string>
     <string name="computing_size" msgid="5791407621793083965">"A calcular…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorizações adicionais.</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> autorização adicional.</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistente e entrada de texto por voz"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplicação de assistência"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Utilizar o texto do ecrã"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Permitir que a aplicação de assistência aceda ao conteúdo do ecrã como texto"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Utilizar a captura de ecrã"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Permitir que a aplicação de assistência aceda a uma imagem do ecrã"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Serviço de preenchimento automático"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nenhuma"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Selecionada"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"O assistente pode ler informações sobre aplicações utilizadas no seu sistema, incluindo informações visíveis no ecrã ou acessíveis nas aplicações."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Certifique-se de que confia nesta aplicação&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=O Preenchimento automático do Google&gt;%1$s&lt;/xliff:g&gt; utiliza o que está no ecrã para determinar o que pode ser preenchido automaticamente."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Adicionar serviço"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Localização"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Pedidos de localização recentes"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Sem pedidos de localização recentes."</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorizações de nível de aplicação"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Procura"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Serviços de localização"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Procurar por Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Permita que as aplicações e os serviços procurem redes Wi‑Fi em qualquer altura, mesmo quando o Wi-Fi estiver desativado. Isto pode ser utilizado, por exemplo, para melhorar as funcionalidades e os serviços baseados na localização."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Procurar por Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Permita que as aplicações e os serviços procurem dispositivos próximos em qualquer altura, mesmo quando o Bluetooth estiver desativado. Isto pode ser utilizado para, p. ex., melhorar as funcionalidades e os serviços baseados na localização."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Atualizações do sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Atualizações do sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versão do Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nível do patch de segurança do Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versão da banda de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versão do kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número de compilação"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Endereço Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Não disponível"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Estado"</string>
     <string name="device_status" msgid="267298179806290920">"Estado"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Direitos de autor"</string>
     <string name="license_title" msgid="936705938435249965">"Licença"</string>
     <string name="terms_title" msgid="5201471373602628765">"Termos de Utilização"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licença WebView do sistema"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licenças WebView do sistema"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Imagens de fundo"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Fornecedores de imagens de satélite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenças de terceiros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ocorreu um problema ao carregar as licenças."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"A carregar…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Está agora a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passos de se tornar um programador.</item>
+      <item quantity="one">Está agora a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> passo de se tornar um programador.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Agora é um programador!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Não é necessário, já é um programador."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opções de programador"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opções de reposição"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Reposição da rede, de aplicações ou do dispositivo"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Repor rede"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Esta ação repõe todas as definições de rede, incluindo:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Dados móveis"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Apagar todos os eSIMs do veículo"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Esta opção não cancela o seu plano de serviço."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Não é possível repor os eSIMs"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Selecionar rede"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Repor definições"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Pretende repor?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Pretende repor todas as definições de rede? Não é possível anular esta ação."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Repor definições"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"As definições de rede foram repostas."</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Repor preferências das aplicações"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Esta ação irá repor todas as preferências de:\n\n"<li>"Aplicações desativadas"</li>\n<li>"Notificações de aplicações desativadas"</li>\n<li>"Aplicações predefinidas para ações"</li>\n<li>"Restrições de dados de segundo plano para aplicações"</li>\n<li>"Todas as restrições de autorização"</li>\n\n"Não irá perder quaisquer dados das aplicações."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Repor aplicações"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"As preferências das aplicações foram repostas."</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Apagar todos os dados (repor dados de fábrica)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Esta ação irá apagar todos os dados da unidade principal do veículo, incluindo:\n\n"<li>"A Conta Google"</li>\n<li>"Dados e definições do sistema e da aplicação"</li>\n<li>"Aplicações transferidas"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Atualmente, tem sessão iniciada nas seguintes contas:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Existem outros utilizadores presentes neste veículo."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Repor veículo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Pretende repor?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Pretende apagar todas as informações pessoais e as aplicações transferidas? Não é possível anular esta ação!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Apagar tudo"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"A apagar…"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Aguarde…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data e hora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Definir data e hora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Definir data, hora, fuso horário e formatos"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Ordenar por fuso horário"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Hora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Adicionar utilizador"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Adicionar conta"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Eliminar utilizador"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Novo utilizador"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Convidado"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrador"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Sessão iniciada como administrador"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Todas as autorizações de administrador"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Tornar administrador"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"O utilizador poderá eliminar utilizadores, incluindo outros administradores, e repor os dados de fábrica do sistema."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Esta ação não é reversível."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Sim, tornar administrador"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Criar novos utilizadores"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Fazer chamadas telefónicas"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mensagem via dados móveis do carro"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalar novas aplicações"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Desinstalar aplicações"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Adicionar utilizador"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Novo utilizador"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Adicion. novo utilizador?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualquer utilizador pode atualizar aplicações para todos os outros utilizadores."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Limite de utilizadores alcançado"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Pode criar até <xliff:g id="COUNT">%d</xliff:g> utilizadores.</item>
+      <item quantity="one">Apenas é possível criar um utilizador.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Falha ao criar um novo utilizador"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Eliminar este utilizador?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Todas as aplicações e os dados serão eliminados."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Falha ao eliminar o utilizador"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ignorar"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Tentar novamente"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Elim. último utilizador?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Depois de eliminar o único utilizador restante deste automóvel, será criado um novo administrador."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Todos os dados, as definições e as aplicações associados a este utilizador serão eliminados. Terá de configurar o sistema novamente."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Escolher novo administrador"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Necessita de, pelo menos, um administrador. Para eliminar este, primeiro escolha um substituto."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Escolher administrador"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Convidado"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Convidado"</string>
     <string name="user_switch" msgid="6544839750534690781">"Mudar"</string>
     <string name="current_user_name" msgid="3813671533249316823">"O utilizador (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Não configurado"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar o nome do utilizador"</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilizadores"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Autorizações concedidas a %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Contas"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Utilizador"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Adicionar conta"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nenhuma conta adicionada."</string>
     <string name="account_list_title" msgid="7631588514613843065">"Contas de <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizar dados automaticamente"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permitir que as aplicações atualizem dados automaticamente"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Ativar sincron. autom. de dados?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Qualquer alteração que efetue nas contas a partir da Web será copiada automaticamente para o dispositivo.\n\nAlgumas contas também podem copiar automaticamente para a Web qualquer alteração que efetue no telemóvel. É assim que funciona uma Conta Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Desativar sincroniz. automática?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Esta ação irá conservar os dados, mas é necessário sincronizar manualmente cada conta para recolher informações recentes. Além disso, não receberá notificações quando ocorrem atualizações."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informações da conta"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Adicionar conta"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Adicionar uma conta"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Remover conta"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Pretende remover a conta?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"A remoção desta conta elimina todas as mensagens, os contactos e outros dados do dispositivo."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"O administrador não permite esta alteração."</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Remover este utilizador?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Todas as aplicações e os dados serão eliminados."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Falha ao remover o utilizador"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Pretende tentar novamente?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ignorar"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Tentar novamente"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Adicion. novo utilizador?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualquer utilizador pode atualizar aplicações para todos os outros utilizadores."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Falha ao remover a conta"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronização da conta"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sincronização ativada para <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g> itens"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sincronização ativada para todos os itens"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sincronização desativada para todos os itens"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sincronização desativada"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Erro de sincronização"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Última sincronização: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"A sincronizar agora…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tocar para sincronizar agora<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar agora"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar sincronização"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"A sincronização está atualmente com problemas e será retomada em breve."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Segurança"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueio de ecrã"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nenhum"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Palavra-passe"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Escolher tipo bloqueio"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opções de bloqueio de ecrã"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opções de bloqueio"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Introduza o padrão"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmar"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redesenhar"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Definir um bloqueio de ecrã"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Escolher o PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Escolher o padrão"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Escolher a palavra-passe"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Escolher a palavra-passe"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Bloqueio de ecrã atual"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Por segurança, defina um padrão."</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Limpar"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"As palavras-passe comuns estão bloqueadas pelo seu gestor de TI. Experimente outra palavra-passe."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Não é permitida uma sequência de dígitos ascendente, descendente ou repetida."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opções de bloqueio de ecrã"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: há <xliff:g id="NUM_DAYS">%3$s</xliff:g> dias"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Adicionar disposit. fidedigno"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Disposit. fidedignos"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dispositivos</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dispositivo</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"O dispositivo <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> irá desbloquear este automóvel quando for ligado. Se alguém pegar no dispositivo <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, essa pessoa pode aceder ao mesmo."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmar"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Remover dispositivo fidedigno"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Concluído"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Utilize a aplicação associada para configurar um dispositivo fidedigno. Após a configuração, poderá desbloquear o perfil do utilizador quando o telemóvel for detetado pelo veículo."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Transfira a aplicação associada no telemóvel."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selecione o automóvel <xliff:g id="CAR_NAME">%1$s</xliff:g> no telemóvel para sincronizar os dispositivos."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"O Smart Lock não consegue detetar funcionalidades de segurança deste dispositivo. Para ajudar a proteger o seu automóvel, o dispositivo fidedigno só pode manter o automóvel desbloqueado após já ter sido desbloqueado por si. O dispositivo fidedigno pode manter o automóvel desbloqueado quando estiver próximo, mesmo se outra pessoa estiver a utilizá-lo."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Adicione o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g> como um dispositivo fidedigno"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"O dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g> foi adicionado com êxito como um dispositivo fidedigno."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Falha ao inscrever o dispositivo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ao adicionar um dispositivo fidedigno, tem de definir um método de autenticação a seguir. Se não tiver o dispositivo fidedigno consigo, será necessária a autenticação para aceder ao seu perfil."</string>
     <string name="forget" msgid="3971143908183848527">"Esquecer"</string>
+    <string name="connect" msgid="5861699594602380150">"Ligar"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Desligar"</string>
     <string name="delete_button" msgid="5840500432614610850">"Eliminar"</string>
     <string name="remove_button" msgid="6664656962868194178">"Remover"</string>
     <string name="cancel" msgid="750286395700355455">"Cancelar"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Sair do modo de demonstração"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Esta ação elimina a conta de demonstração e efetua a reposição de dados de fábrica do sistema. Todos os dados do utilizador são perdidos."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Sair da demonstração"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"concluir configuração"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"agora não"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"IGNORAR"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funcionalidade não disponível durante a condução."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Não é possível adicionar o utilizador durante a condução."</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 184ee4c..5781005 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"escurecer tela, touchscreen, bateria"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"escurecer tela, noite, tingir"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modo noturno"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Rede e Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Rede móvel"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dados móveis"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Acessar os dados pela rede móvel"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Desativar os dados móveis?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Uso de dados"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Aviso e limite de dados"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciclo de uso de dados do app"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Definir aviso de dados"</string>
+    <string name="data_warning" msgid="116776633806885370">"Aviso de dados"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Definir limite de dados"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limite de dados"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitar uso de dados"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"A unidade principal do veículo desativará os dados móveis quando o limite especificado for atingido.\n\nComo o uso de dados é calculado pela unidade principal, e sua operadora pode entender o uso de forma diferente, defina um limite moderado."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configurar e gerenciar pontos de acesso sem fio"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Ativando Wi-Fi..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Desativando Wi-Fi..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Carregando lista de Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi desativado"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Falha ao esquecer a rede"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Falha ao conectar à rede"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Adicionar rede"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi desativado"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Conectar"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Senha"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Mostrar senha"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nome da rede"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Digite o SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Segurança"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Potência do sinal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Potência do sinal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Velocidade do link"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequência"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Endereço IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Exibir senha"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Digite nome da rede"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Digite a senha"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Fraca"</item>
-    <item msgid="2032262610626057081">"Regular"</item>
-    <item msgid="3859756017461098953">"Boa"</item>
-    <item msgid="1521103743353335724">"Excelente"</item>
+    <item msgid="7683058295076342057">"Fraca"</item>
+    <item msgid="1639222824821660744">"Regular"</item>
+    <item msgid="1838705897358163300">"Boa"</item>
+    <item msgid="6067166649320533751">"Excelente"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Ativar Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth desativado"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalhes da rede"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Endereço MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Endereço IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Máscara de sub-rede"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Endereços IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferências de Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Ativar o Wi‑Fi automaticamente"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"O Wi‑Fi será ativado perto de redes salvas de alta qualidade, como sua rede doméstica"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Indisponível porque o local está desativado. Ative o"<annotation id="link">"local"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Ativar a busca por Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Ativar"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Busca por Wi‑Fi ativada"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Alternar para dados móveis automaticamente"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Usar dados móveis quando o Wi-Fi perder o acesso à Internet. Cobranças de dados podem ser aplicadas."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Saiba mais"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Gerenciar conexões, definir o nome e detecção do dispositivo"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computador"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Fone de ouvido"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefone"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imagem"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Fone de ouvido"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periférico de entrada"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispositivos pareados"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispositivos disponíveis"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nenhum dispositivo pareado"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nenhum dispositivo disponível"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispositivo pareado"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nome"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Usar para"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Altere o nome do dispos. Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispositivo sem nome"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispositivos pareados"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Parear novo dispositivo"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"O Bluetooth será ativado para o pareamento"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Desconectar dispositivo?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Seu veículo será desconectado do <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Endereço Bluetooth do veículo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Endereço Bluetooth do dispositivo: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Nome do veículo"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Renomear este veículo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Renomear dispositivo"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Renomear"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispositivos disponíveis"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Perfis"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Solicitação de pareamento Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Parear e conectar"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Código de pareamento Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"O PIN contém letras ou símbolos"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Digite o código de pareamento e pressione Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Geralmente, 0000 ou 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Solicitação de pareamento"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Toque para parear com <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Idiomas"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Idiomas e entrada"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Teclado"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Gerenciar teclados"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Converter texto em voz"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Mecanismo preferencial"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Mecanismo atual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Velocidade da fala"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tom da fala"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Redefinir"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Som"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume do toque"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume de navegação"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Mídia"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Definir o volume para música e vídeos"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarme"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Toque do telefone"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Som de notificação padrão"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Som de alarme padrão"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Apps e notificações"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Mostrar todos os apps"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Apps padrão"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informações do app"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Forçar fechamento"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Forçar fechamento?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Se você forçar o fechamento de um app, ele poderá apresentar mau funcionamento."</string>
     <string name="disable_text" msgid="4358165448648990820">"Desativar"</string>
     <string name="enable_text" msgid="1794971777861881238">"Ativar"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Desinstalar"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Se você desativar esse app, o Android e outros apps poderão deixar de funcionar como deveriam."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Desativar app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permissões"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versão: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nenhuma permissão concedida"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nenhuma permissão solicitada"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Uso de dados"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uso de dados do app"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Forçar fechamento"</string>
     <string name="computing_size" msgid="5791407621793083965">"Calculando…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> permissão adicional</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> permissões adicionais</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistente e entrada de texto por voz"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"App assistivo"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Usar texto da tela"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Permitir que o app assistivo acesse o conteúdo da tela como texto"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Usar captura de tela"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Permitir que o app assistivo acesse uma imagem da tela"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Preenchimento automático"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Nenhum"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Selecionado"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"O assistente lerá informações sobre apps em uso no seu sistema, incluindo informações visíveis na tela ou as que podem ser acessadas nos apps."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Você precisa confiar nesse app&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=O Preenchimento automático do Google&gt;%1$s&lt;/xliff:g&gt; usa o que está na sua tela para determinar o que pode ser preenchido automaticamente."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Adicionar serviço"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Local"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitações recentes"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nenhuma solicitação recente de local"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permissões no app"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Verificação"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Serviços de localização"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Busca por Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Permitir que apps e serviços procurem redes Wi‑Fi a qualquer momento, mesmo quando o Wi‑Fi estiver desativado. Essa configuração pode ser usada, por exemplo, para melhorar recursos e serviços baseados na localização."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Verificação de Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Permitir que apps e serviços procurem dispositivos próximos a qualquer momento, mesmo quando o Bluetooth estiver desativado. Essa configuração pode ser usada, por exemplo, para melhorar recursos e serviços baseados na localização."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistema"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Atualizações do sistema"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Atualizações do sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versão do Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nível do patch de segurança do Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versão da banda de base"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versão do kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Número da versão"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Endereço Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Não disponível"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Direitos autorais"</string>
     <string name="license_title" msgid="936705938435249965">"Licença"</string>
     <string name="terms_title" msgid="5201471373602628765">"Termos e Condições"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licença do sistema Webview"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licenças do sistema WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Planos de fundo"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Provedores de imagens via satélite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenças de terceiros"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ocorreu um problema ao carregar as licenças."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Carregando…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Falta <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> etapa para você se tornar um desenvolvedor.</item>
+      <item quantity="other">Faltam <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> etapas para você se tornar um desenvolvedor.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Você agora é um desenvolvedor!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Não é necessário. Você já é um desenvolvedor."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opções do desenvolvedor"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opções de redefinição"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Redefinição de rede, apps ou dispositivo"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Redefinir rede"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Isso redefinirá todas as configurações de rede, incluindo:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Dados móveis"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Limpar todos os eSIMs do veículo"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Essa ação não cancelará seu plano de serviços."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Não é possível redefinir os eSIMs"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Selecionar rede"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Redefinir configurações"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Redefinir?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Redefinir todas as configurações de rede? Não é possível desfazer essa ação."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Redefinir configurações"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"As configurações de rede foram redefinidas"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Redefinir preferências de apps"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Isso redefinirá todas as preferências para:\n\n"<li>" apps desativados;"</li>" \n "<li>"notificações de apps desativados; "</li>\n<li>"apps padrão para ações;"</li>\n<li>"restrições de dados em segundo plano para apps; "</li>\n<li>"qualquer restrição de permissão."</li>\n\n"Você não perderá os dados dos apps."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Redefinir apps"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"As preferências do app foram redefinidas"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Limpar todos os dados"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Essa ação limpará todos os dados da unidade principal do seu veículo, incluindo:\n\n"<li>"sua Conta do Google;"</li>\n<li>"dados e configurações do sistema e do app;"</li>\n<li>"apps transferidos."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"No momento, as seguintes contas estão conectadas:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Há outros usuários neste veículo."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Redefinir veículo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Redefinir?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Limpar todas as suas informações pessoais e apps transferidos por download? Não é possível desfazer essa ação."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Apagar tudo"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Apagando"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Aguarde…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data e hora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Definir data e hora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Definir data, hora, fuso horário e formatos"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Classificar por fuso horário"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Hora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Adicionar usuário"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Adicionar conta"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Excluir usuário"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Novo usuário"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Convidado"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrador"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Conectado como administrador"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Todas as permissões de administrador"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Tornar administrador"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"O usuário poderá excluir outros usuários, incluindo administradores, e redefinir o sistema para a configuração original."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Esta ação não pode ser revertida."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Sim, tornar administrador"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Criar novos usuários"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Fazer chamadas telefônicas"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mensagens com dados móveis do carro"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalar novos apps"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Desinstalar apps"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Adicionar usuário"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Novo usuário"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Adicionar novo usuário?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualquer usuário pode atualizar os apps para todos os demais."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Limite de usuários atingido"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">É possível criar até <xliff:g id="COUNT">%d</xliff:g> usuário.</item>
+      <item quantity="other">É possível criar até <xliff:g id="COUNT">%d</xliff:g> usuários.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Falha ao criar um novo usuário"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Excluir este usuário?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Todos os apps e dados serão excluídos."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Falha ao excluir usuário."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Dispensar"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Tentar novamente"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Excluir o último usuário?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Após a exclusão do único usuário restante deste carro, um novo usuário administrador será criado."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Todos os dados, configurações e apps associados ao usuário serão excluídos. Será necessário configurar o sistema novamente."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Escolher novo administrador"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Você precisa de pelo menos um administrador. Para excluir este, primeiro escolha um substituto."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Escolher administrador"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Convidado"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Visitante"</string>
     <string name="user_switch" msgid="6544839750534690781">"Alternar"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Você (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nome"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Não configurado"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editar nome de usuário"</string>
     <string name="users_list_title" msgid="770764290290240909">"Usuários"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permissões concedidas a %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Contas"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Usuário"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Adicionar conta"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nenhuma conta adicionada"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Contas de <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizar dados automaticamente"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permitir que os apps atualizem dados automaticamente"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Ativar sincronização automática?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"As alterações feitas nas suas contas na Web serão automaticamente copiadas para o dispositivo.\n\nEm algumas contas, as alterações feitas no smartphone também poderão ser copiadas automaticamente para a Web. É o caso de uma Conta do Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Desativar sincroniz. automática?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Isso economizará dados, mas será necessário sincronizar manualmente cada conta para coletar as informações mais recentes. Além disso, você não receberá notificações quando as atualizações ocorrerem."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informações da conta"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Adicionar conta"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Adicionar uma conta"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Remover conta"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Remover conta?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"A remoção desta conta excluirá do dispositivo todas as mensagens, os contatos e outros dados dela."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Esta alteração não é permitida pelo administrador"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Remover este usuário?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Todos os apps e dados serão excluídos."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Falha ao remover usuário."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Tentar novamente?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Dispensar"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Tentar novamente"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Adicionar novo usuário?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Quando você adiciona um usuário novo, essa pessoa precisa configurar o espaço dela."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qualquer usuário pode atualizar os apps para todos os demais."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Falha ao remover a conta."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronização da conta"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sincronização ativada para <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g> itens"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sincronização ativada para todos os itens"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sincronização desativada para todos os itens"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sincronização DESATIVADA"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Erro na sincronização"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Última sincronização: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sincronizando agora…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Toque para sincronizar agora<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizar agora"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Cancelar a sincronização"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"A sincronização está enfrentando problemas no momento. Ela será retomada em breve."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Segurança"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Bloqueio de tela"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Nenhum"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Senha"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Escolher tipo de bloqueio"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opções de bloqueio de tela"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opções de bloqueio"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Digite seu padrão"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmar"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Desenhar novamente"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Definir bloqueio de tela"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Escolha seu PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Escolha seu padrão"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Escolha sua senha"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Escolha sua senha"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Bloqueio de tela atual"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Por segurança, defina um padrão"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Limpar"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Senhas comuns foram bloqueadas pelo seu administrador de TI. Tente uma senha diferente."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Não é permitido usar uma sequência de dígitos em ordem crescente, decrescente ou repetidos."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opções de bloqueio de tela"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> dias atrás"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Adicionar disp. confiável"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Disp. confiáveis"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dispositivo</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dispositivos</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Seu <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> desbloqueará este carro quando estiver conectado. Se alguém pegar o <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, essa pessoa pode conseguir acessar este dispositivo."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmar"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Remover dispositivo confiável"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Concluído"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Use o app complementar para configurar um dispositivo confiável. Após a configuração, será possível desbloquear seu perfil de usuário quando o smartphone for detectado pelo veículo."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Faça o download do app complementar no smartphone."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selecione <xliff:g id="CAR_NAME">%1$s</xliff:g> no smartphone para parear os dispositivos."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Os recursos de segurança deste dispositivo não podem ser detectados pelo Smart Lock. Para ajudar a proteger seu carro, será possível mantê-lo destrancado com o dispositivo confiável apenas depois que você destrancá-lo. É possível manter o carro destrancado com o dispositivo confiável por perto mesmo que outra pessoa o esteja segurando."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Adicionar <xliff:g id="DEVICE_NAME">%1$s</xliff:g> como dispositivo confiável"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"O <xliff:g id="DEVICE_NAME">%1$s</xliff:g> foi definido como um dispositivo confiável"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Falha na inscrição do <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Depois de adicionar um dispositivo confiável, é necessário configurar um método de autenticação. Se o dispositivo confiável não estiver com você, a autenticação será necessária para acessar seu perfil."</string>
     <string name="forget" msgid="3971143908183848527">"Ignorar"</string>
+    <string name="connect" msgid="5861699594602380150">"Conectar"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Desconectar"</string>
     <string name="delete_button" msgid="5840500432614610850">"Excluir"</string>
     <string name="remove_button" msgid="6664656962868194178">"Remover"</string>
     <string name="cancel" msgid="750286395700355455">"Cancelar"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Sair do modo de demonstração"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Isso excluirá a conta de demonstração e redefinirá o sistema para a configuração original. Todos os dados do usuário serão perdidos."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Sair da demonstração"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"concluir configuração"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"agora não"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"DISPENSAR"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Recurso não disponível enquanto você dirige."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Não é possível adicionar usuários enquanto você dirige."</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index f894963..ebdca72 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"reduceți luminozitatea ecranului, ecran tactil, baterie"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"reduceți luminozitatea ecranului, noapte, nuanță"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modul noapte"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Rețea și internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Rețea mobilă"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Date mobile"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Accesați datele folosind rețeaua mobilă"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Dezactivați datele mobile?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Utilizarea datelor"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Avertisment și limită de date"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Ciclu de utilizare a datelor aplicației"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Setați avertisment pentru date"</string>
+    <string name="data_warning" msgid="116776633806885370">"Avertisment pentru date"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Setați o limită date"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limită de date"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Limitarea utilizării datelor"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Unitatea principală a vehiculului va dezactiva datele mobile când se atinge limita specificată.\n\nDeoarece utilizarea datelor este măsurată de unitatea principală, iar operatorul poate contoriza în mod diferit utilizarea, vă recomandăm să stabiliți o limită prudentă."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Configurați și gestionați punctele de acces wireless"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Se activează Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Se dezactivează Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Se încarcă lista de conexiuni Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi dezactivat"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Nu s-a putut elimina rețeaua"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Nu s-a realizat conexiunea la rețea"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Adăugați o rețea"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi dezactivat"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Conectați"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Parolă"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Afișează parola"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Numele rețelei"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Introduceți identificatorul SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Securitate"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Puterea semnalului"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Puterea semnalului"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Stare"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Viteza conexiunii"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frecvență"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Adresă IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Afișați parola"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Introduceți numele rețelei"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Introduceți parola"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Slab"</item>
-    <item msgid="2032262610626057081">"Acceptabil"</item>
-    <item msgid="3859756017461098953">"Bun"</item>
-    <item msgid="1521103743353335724">"Excelent"</item>
+    <item msgid="7683058295076342057">"Slab"</item>
+    <item msgid="1639222824821660744">"Acceptabil"</item>
+    <item msgid="1838705897358163300">"Bun"</item>
+    <item msgid="6067166649320533751">"Excelent"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Activați Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth dezactivat"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detalii despre rețea"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adresă MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Adresă IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Mască de subrețea"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adrese IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferințe Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Activați automat Wi-Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi se va reactiva lângă rețelele calitate înaltă salvate, cum ar fi cea de domiciliu"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Indisponibil, deoarece locația este dezactivată. Activați "<annotation id="link">"Locația"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Activați căutarea de rețele Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Activați"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Căutarea de rețele Wi-Fi este activată"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Comutați automat la date mobile"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Folosiți datele mobile atunci când rețeaua Wi-Fi nu are acces la internet. Este posibil să se aplice taxe pentru utilizarea datelor."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Aflați mai multe"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Gestionați conexiunile, setați numele dispozitivului și detectabilitatea acestuia"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Set căști-microfon"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Dispozitiv pentru imagini"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Căști"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Dispozitiv periferic de intrare"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Dispozitive asociate"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dispozitive disponibile"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nu există dispozitive asociate"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nu există dispozitive disponibile"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Dispozitiv asociat"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nume"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Utilizați pentru"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Redenumiți dispozitivul Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Dispozitiv nedenumit"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Dispozitive asociate"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Asociați un nou dispozitiv"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth se va activa pentru asociere"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Deconectați dispozitivul?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Vehiculul dvs. se va deconecta de la <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adresa Bluetooth a vehiculului: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adresa Bluetooth a dispozitivului: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Numele vehiculului"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Redenumiți acest vehicul"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Redenumiți dispozitivul"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Redenumiți"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dispozitive disponibile"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiluri"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Solicitare de conectare prin Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Asociați și conectați"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Cod de conectare prin Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Codul PIN conține litere sau simboluri"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Introduceți codul de conectare, apoi apăsați pe Return sau pe Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"De obicei, 0000 sau 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Solicitare de conectare"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Atingeți pentru a asocia cu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Limbi"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Limbi și introducere de text"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastatură"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Gestionați tastaturile"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Rezultatul redării vocale a textului"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motor preferat"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motor actual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Ritmul vorbirii"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tonalitate"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Resetați"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Sunet"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volumul soneriei"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volum navigare"</string>
@@ -100,31 +140,66 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Setați volumul pentru muzică și videoclipuri"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarmă"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ton de sonerie pentru telefon"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Sunet de notificare prestabilit"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Sunet de alarmă prestabilit"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplicații și notificări"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Afișați toate aplicațiile"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplicații prestabilite"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informații despre aplicație"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Opriți forțat"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Opriți forțat?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Dacă forțați oprirea unei aplicații, aceasta se poate comporta necorespunzător."</string>
     <string name="disable_text" msgid="4358165448648990820">"Dezactivați"</string>
     <string name="enable_text" msgid="1794971777861881238">"Activați"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Dezinstalați"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Dacă dezactivați această aplicație, este posibil ca Android și alte aplicații să nu mai funcționeze corespunzător."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Dezactivați aplicația"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Permisiuni"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versiunea: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nicio permisiune acordată"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nicio permisiune solicitată"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Utilizarea datelor"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Utilizare date aplicație"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Opriți forțat"</string>
     <string name="computing_size" msgid="5791407621793083965">"Se calculează…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> permisiuni suplimentare</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de permisiuni suplimentare</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> permisiune suplimentară</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistent și intrare vocală"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplicație asistent"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Folosiți textul de pe ecran"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Permiteți aplicației asistent să acceseze conținutul ecranului ca text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Folosiți captura de ecran"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Permiteți aplicației asistent să acceseze o imagine a ecranului"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Serviciu de completare automată"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Niciuna"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Bifată"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Aplicația asistent va putea să citească informații despre aplicațiile în uz de pe sistem, inclusiv informațiile vizibile pe ecran sau accesibile în aplicații."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Asigurați-vă că aveți încredere în această aplicație&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Completarea automată Google&gt;%1$s&lt;/xliff:g&gt; folosește conținutul de pe ecran pentru a stabili ce se poate completa automat."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Adăugați un serviciu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Locație"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Solicitări recente privind locația"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nu există solicitări recente privind locația"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Permisiuni la nivel de aplicație"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Căutare"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Servicii de localizare"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Căutare Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Permiteți aplicațiilor și serviciilor să caute permanent rețele Wi-Fi, chiar și atunci când setarea Wi-Fi este dezactivată. Această permisiune poate fi folosită, de exemplu, pentru a îmbunătăți funcțiile și serviciile bazate pe locație."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Căutare Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Permiteți aplicațiilor și serviciilor să caute permanent dispozitive din apropiere, chiar dacă setarea Bluetooth este dezactivată. Această opțiune poate fi folosită, de exemplu, pentru a îmbunătăți funcțiile și serviciile bazate pe locație."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Actualizări de sistem"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Actualizări de sistem"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versiunea Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Nivelul corecției de securitate Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versiunea benzii de bază"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versiune nucleu"</string>
     <string name="build_number" msgid="3997326631001009102">"Numărul versiunii"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adresă Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Indisponibil"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Stare"</string>
     <string name="device_status" msgid="267298179806290920">"Stare"</string>
@@ -141,12 +216,50 @@
     <string name="copyright_title" msgid="4220237202917417876">"Drepturi de autor"</string>
     <string name="license_title" msgid="936705938435249965">"Licență"</string>
     <string name="terms_title" msgid="5201471373602628765">"Termeni și condiții"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licență de sistem pentru WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licențe de sistem pentru WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Imagini de fundal"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Furnizori de imagini din satelit:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licențe terță parte"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"A apărut o problemă la încărcarea licențelor."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Se încarcă…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="few">Mai aveți de parcurs <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pași pentru a deveni dezvoltator.</item>
+      <item quantity="other">Mai aveți de parcurs <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> de pași pentru a deveni dezvoltator.</item>
+      <item quantity="one">Mai aveți de parcurs <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> pas pentru a deveni dezvoltator.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Ați devenit dezvoltator!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nu mai este nevoie, sunteți deja dezvoltator."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opțiuni dezvoltator"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opțiuni de resetare"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Resetați rețeaua, aplicațiile sau dispozitivul"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Resetați rețeaua"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Această acțiune va reseta toate setările pentru rețea, inclusiv:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Date mobile"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Ștergeți toate eSIM-urile vehiculului"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Astfel, planul de servicii nu va fi anulat."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Cardurile eSIM nu se pot reseta"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Selectați o rețea"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Resetați setările"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Resetați?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Resetați toate setările pentru rețea? Nu puteți anula această acțiune!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Resetați setările"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Setările pentru rețea au fost resetate"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Resetați preferințele pentru aplicații"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Astfel vor fi resetate toate preferințele pentru:\n\n"<li>"aplicații dezactivate,"</li>\n<li>"notificări de aplicații dezactivate,"</li>\n<li>"aplicații prestabilite pentru acțiuni,"</li>\n<li>"restricții privind datele de fundal pentru aplicații,"</li>\n<li>"orice restricții de permisiuni."</li>\n\n"Nu veți pierde datele aplicațiilor."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Resetați aplicațiile"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Preferințele pentru aplicații au fost resetate"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Ștergeți datele (reveniți la setările din fabrică)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Astfel, vor fi șterse toate datele de pe unitatea principală a vehiculului, între care:\n\n"<li>"contul dvs. Google;"</li>\n<li>"datele și setările de sistem și de aplicație;"</li>\n<li>"aplicațiile descărcate"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Sunteți conectat(ă) la următoarele conturi:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Există și alți utilizatori în acest vehicul."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Resetați vehiculul"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Resetați?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Ștergeți toate informațiile cu caracter personal și aplicațiile descărcate? Nu puteți anula această acțiune!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Ștergeți tot"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Se șterge"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Așteptați..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data și ora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Setați data și ora"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Setați data, ora, fusul orar și formatele"</string>
@@ -166,23 +279,60 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sortați după fusul orar"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Ora"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Adăugați un utilizator"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Adăugați un cont"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Ștergeți utilizatorul"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Utilizator nou"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Invitat"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Conectat(ă) ca administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Toate permisiunile de administrator"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Setați ca administrator"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Utilizatorul va putea să șteargă utilizatori, inclusiv alți administratori, și să readucă sistemul la setările din fabrică."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Această acțiune nu este reversibilă."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Da, setez ca administrator"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Creați noi utilizatori"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Efectuați apeluri telefonice"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mesaje – datele mobile ale mașinii"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalați aplicații noi"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Dezinstalați aplicații"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Adăugați un utilizator"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Utilizator nou"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Adăugați utilizator nou?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Orice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Ați atins limita de utilizatori"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="few">Puteți crea maximum <xliff:g id="COUNT">%d</xliff:g> utilizatori.</item>
+      <item quantity="other">Puteți crea maximum <xliff:g id="COUNT">%d</xliff:g> de utilizatori.</item>
+      <item quantity="one">Poate fi creat doar un utilizator.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Nu s-a creat noul utilizator"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Ștergeți utilizatorul?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Toate aplicațiile și datele vor fi șterse."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Utilizatorul nu a putut fi șters."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Închideți"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Reîncercați"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Ștergeți ultimul utilizator?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"După ștergerea singurului utilizator rămas pentru această mașină, va fi creat un nou utilizator administrator."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Toate datele, setările și aplicațiile asociate acestui utilizator vor fi șterse. Va trebui să configurați din nou sistemul."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Alegeți un administrator nou"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Aveți nevoie de cel puțin un administrator. Pentru a-l șterge pe acesta, mai întâi alegeți un înlocuitor."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Alegeți un administrator"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Invitat"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Invitat"</string>
     <string name="user_switch" msgid="6544839750534690781">"Comutați"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Dvs. (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Nume"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Neconfigurat"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Editați numele de utilizator"</string>
     <string name="users_list_title" msgid="770764290290240909">"Utilizatori"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Permisiuni acordate pentru %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Conturi"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Utilizator"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Adăugați un cont"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nu a fost adăugat niciun cont."</string>
     <string name="account_list_title" msgid="7631588514613843065">"Conturi pentru <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sincronizare automată a datelor"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Permiteți aplicațiilor să actualizeze date automat"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Activați sincronizarea datelor?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Ceea ce modificați în conturi pe web se va reflecta automat și pe dispozitiv.\n\nUnele conturi pot să copieze automat pe web toate modificările de pe telefon. Așa funcționează un Cont Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Opriți sincronizarea automată?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Această acțiune va economisi date, dar va trebui să sincronizați fiecare cont manual pentru a colecta informațiile recente. În plus, nu veți primi notificări atunci când apar actualizări."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informații despre cont"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Adăugați un cont"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Adăugați un cont"</string>
@@ -190,16 +340,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Eliminați contul"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Eliminați contul?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Prin eliminarea acestui cont, se vor șterge toate mesajele și persoanele de contact pe care le conține, precum și alte date de pe dispozitiv!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Această modificare nu este permisă de administrator"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Eliminați utilizatorul?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Toate aplicațiile și datele vor fi șterse."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Nu s-a putut elimina utilizatorul."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Reîncercați?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Închideți"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Reîncercați"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Adăugați utilizator nou?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Orice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Nu s-a putut elimina contul."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sincronizarea contului"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sincronizare activată pentru <xliff:g id="ID_1">%1$d</xliff:g> din <xliff:g id="ID_2">%2$d</xliff:g> articole"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sincronizare activată pentru toate articolele"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sincronizare dezactivată pentru toate articolele"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sincronizare DEZACTIVATĂ"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Eroare de sincronizare"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Ultima sincronizare: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Se sincronizează acum…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Atingeți pentru a sincroniza acum<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sincronizați acum"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Anulați sincronizarea"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sincronizarea se confruntă cu probleme. Aceasta va fi funcțională în curând."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Securitate"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Blocarea ecranului"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Fără"</string>
@@ -207,7 +361,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Parolă"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Alegeți tipul blocării"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opțiuni de blocare a ecranului"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opțiuni de blocare"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Introduceți modelul"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Confirmați"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Redesenați"</string>
@@ -217,7 +371,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Setați o blocare a ecranului"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Alegeți codul PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Alegeți modelul"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Alegeți parola"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Alegeți parola"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Blocarea actuală a ecranului"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Pentru securitate, setați un model"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Ștergeți"</string>
@@ -295,7 +449,29 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Parolele obișnuite sunt blocate de administratorul IT. Încercați altă parolă."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Șirurile de cifre ascendente, descendente sau repetate nu sunt permise."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opțiuni de blocare a ecranului"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: acum <xliff:g id="NUM_DAYS">%3$s</xliff:g> zile"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Adăugați un dispozitiv de încredere"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Dispozitive de încredere"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dispozitive</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de dispozitive</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dispozitiv</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> va debloca această mașină când este conectat. Dacă cineva vă ia <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, este posibil să poată accesa acest dispozitiv"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Confirmați"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Eliminați dispozitivul de încredere"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Gata"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Folosiți aplicația parteneră pentru a configura un dispozitiv de încredere. După configurare veți putea să vă deblocați profilul de utilizator atunci când mașina vă detectează telefonul."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Descărcați aplicația parteneră pe telefon"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Selectați <xliff:g id="CAR_NAME">%1$s</xliff:g> de pe telefon pentru a asocia dispozitivele"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock nu poate detecta funcțiile de securitate ale dispozitivului. Pentru a vă proteja mașina, dispozitivul de încredere va putea menține mașina deblocată numai după ce ați deblocat-o personal. Dispozitivul de încredere poate să mențină mașina deblocată când se află în apropiere, chiar dacă este folosită de o altă persoană."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Adăugați <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ca dispozitiv de încredere"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> a fost adăugat ca dispozitiv de încredere"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Înscrierea dispozitivului <xliff:g id="DEVICE_NAME">%1$s</xliff:g> a eșuat"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Dacă adăugați un dispozitiv de încredere, trebuie să setați apoi o metodă de autentificare. Dacă nu aveți dispozitivul de încredere cu dvs., va fi necesar să vă autentificați pentru a vă accesa profilul."</string>
     <string name="forget" msgid="3971143908183848527">"Eliminați"</string>
+    <string name="connect" msgid="5861699594602380150">"Conectați"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Deconectați"</string>
     <string name="delete_button" msgid="5840500432614610850">"Ștergeți"</string>
     <string name="remove_button" msgid="6664656962868194178">"Eliminați"</string>
     <string name="cancel" msgid="750286395700355455">"Anulați"</string>
@@ -305,8 +481,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Închideți modul demonstrativ"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Această acțiune va șterge contul demonstrativ, iar sistemul va reveni la setările din fabrică. Toate datele utilizatorului se vor pierde."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Închideți demonstrația"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"finalizați configurarea"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"nu acum"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"RESPINGEȚI"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funcția nu este disponibilă când conduceți."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Nu puteți adăuga un utilizator în timp ce conduceți."</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 81f2e38..240bd3a 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"снижение яркости, сенсорный экран, батарея"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"снижение яркости, ночь, оттенок"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Ночной режим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Сеть и Интернет"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобильная сеть"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобильный Интернет"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Доступ к Интернету по мобильной сети"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Отключить мобильный Интернет?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Передача данных"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Предупреждения и лимит"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Период статистики"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Установить предупреждение"</string>
+    <string name="data_warning" msgid="116776633806885370">"Предупреждение"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Задать лимит трафика"</string>
+    <string name="data_limit" msgid="227338836292511425">"Лимит трафика"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ограничение передачи данных"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"После достижения установленного лимита передача данных по мобильной сети будет отключена.\n\nПри выборе ограничения учитывайте, что статистика оператора может отличаться от статистики головного устройства автомобиля."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Настройка точек доступа беспроводной сети и управление ими"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Включение Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Отключение Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Загрузка списка сетей Wi‑Fi…"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi: отключено"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Не удалось удалить сеть"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Не удалось подключиться к сети"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Добавить сеть"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi: отключено"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Подключить"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Пароль"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Показать пароль"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Название сети"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Введите имя сети (SSID)"</string>
     <string name="wifi_security" msgid="158358046038876532">"Защита"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Уровень сигнала"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Уровень сигнала"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Статус"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Скорость связи"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Частота"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-адрес"</string>
+    <string name="show_password" msgid="2074628020371139240">"Показать пароль"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Введите название сети"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Введите пароль"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Слабый"</item>
-    <item msgid="2032262610626057081">"Достаточный"</item>
-    <item msgid="3859756017461098953">"Хороший"</item>
-    <item msgid="1521103743353335724">"Отличный"</item>
+    <item msgid="7683058295076342057">"Слабый"</item>
+    <item msgid="1639222824821660744">"Достаточный"</item>
+    <item msgid="1838705897358163300">"Хороший"</item>
+    <item msgid="6067166649320533751">"Отличный"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Включить Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Функция Bluetooth отключена"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Мбит/с"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 ГГц"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ГГц"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Информация о сети"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-адрес"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-адрес"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Маска подсети"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Адреса IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Шлюз"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Настройки Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Включать Wi‑Fi автоматически"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Включать Wi‑Fi в зоне действия сохраненных сетей (например, домашней) с хорошим сигналом"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Недоступно: доступ к геоданным запрещен. "<annotation id="link">"Включите его"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Включить поиск сетей Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Включить"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Поиск сетей Wi‑Fi включен"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Автоматически подключаться к мобильному Интернету"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Использовать мобильный Интернет, когда нет подключения к Интернету по Wi-Fi. Может взиматься плата за передачу данных."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Подробнее…"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Настройка подключений, параметров видимости и названия устройства"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Компьютер"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Гарнитура"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Телефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Камера"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Наушники"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Периферийное устройство ввода"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Подключенные устройства"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Доступные устройства"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Нет подключенных устройств"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Нет доступных устройств"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Подключенное устройство"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Название"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Использовать для"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Измените имя Bluetooth-устройства"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Устройство без названия"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Подключенные устройства"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Подключить новое устройство"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Будет включена функция Bluetooth."</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Отключить устройство?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Автомобиль будет отключен от устройства \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Адрес Bluetooth для автомобиля: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Адрес Bluetooth для устройства: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Название автомобиля"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Переименование автомобиля"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Переименование устройства"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Переименовать"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Доступные устройства"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профили"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Запрос на подключение через Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Установить соединение и подключить"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Код подключения через Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN-код содержит буквы или символы"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Введите код подключения и нажмите клавишу ввода"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Обычно 0000 или 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Запрос на подключение"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Нажмите, чтобы установить соединение с устройством \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Языки"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Язык и ввод"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Клавиатура"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Управление клавиатурами"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Озвучивание текста"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Синтезатор по умолчанию"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Текущий синтезатор"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Скорость речи"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Тон"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Сбросить настройки"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Звук"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Громкость звонка"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Громкость навигации"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Мультимедиа"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Настроить громкость музыки и видео"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Будильник"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Рингтон"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Звук уведомления по умолчанию"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Звук будильника по умолчанию"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Приложения и уведомления"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Показать все приложения"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Приложения по умолчанию"</string>
     <string name="applications_settings" msgid="794261395191035632">"Сведения о приложениях"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Остановить"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Остановить принудительно?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Принудительное закрытие приложения может отразиться на его функциональности."</string>
     <string name="disable_text" msgid="4358165448648990820">"Отключить"</string>
     <string name="enable_text" msgid="1794971777861881238">"Включить"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Удалить"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Отключение этого приложения может привести к некорректной работе системы Android и других приложений."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Отключить приложение"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Разрешения"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Версия: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"У приложения нет разрешений"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Приложение не запрашивало разрешения"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Передача данных"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Трафик приложения"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Остановить"</string>
     <string name="computing_size" msgid="5791407621793083965">"Вычисление…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дополнительное разрешение</item>
@@ -117,15 +168,39 @@
       <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> дополнительных разрешений</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дополнительного разрешения</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помощник и голосовой ввод"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Помощник"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Использовать текст с экрана"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Разрешить Помощнику доступ к тексту на экране."</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Использовать скриншот"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Разрешить Помощнику доступ к изображению экрана."</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Автозаполнение"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Нет"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Выбрано"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Ассистент сможет получать данные о программах в вашей системе, в том числе сведения с экрана и из приложений."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Убедитесь, что это приложение безопасно&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; анализирует содержимое экрана и находит поля, которые можно заполнить автоматически."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Добавить службу"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Передача геоданных"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Последние запросы местоположения"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Нет недавних запросов местоположения."</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Разрешения для приложений"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Поиск"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Геолокация"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Поиск сетей Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Разрешите приложениям и сервисам искать беспроводные сети, даже когда Wi-Fi отключен. Таким образом можно улучшить работу функций и сервисов, использующих данные о местоположении."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Поиск устройств Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Разрешите приложениям и сервисам искать сигналы устройств, расположенных поблизости, даже если Bluetooth отключен. Таким образом можно улучшить работу функций и сервисов, использующих данные о местоположении."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Система"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Обновления системы"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Обновления системы"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версия Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Обновление системы безопасности"</string>
     <string name="model_info" msgid="4966408071657934452">"Модель"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Прошивка модуля связи"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версия ядра"</string>
     <string name="build_number" msgid="3997326631001009102">"Номер сборки"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Адрес Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Недоступно"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Статус"</string>
     <string name="device_status" msgid="267298179806290920">"Статус"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Авторские права"</string>
     <string name="license_title" msgid="936705938435249965">"Лицензия"</string>
     <string name="terms_title" msgid="5201471373602628765">"Условия использования"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Системная лицензия WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Системные лицензии WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Обои"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Спутниковые фотографии:\n© CNES 2014/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лицензии третьих сторон"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Не удалось загрузить лицензии."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Загрузка…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Вы почти у цели. Остался <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шаг.</item>
+      <item quantity="few">Вы почти у цели. Осталось <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шага.</item>
+      <item quantity="many">Вы почти у цели. Осталось <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шагов.</item>
+      <item quantity="other">Вы почти у цели. Осталось <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> шага.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Вы стали разработчиком!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Не нужно, вы уже разработчик."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Для разработчиков"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Сброс настроек"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Сброс настроек сети, приложений и устройства"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Сбросить настройки сети"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Будут сброшены все настройки, в том числе:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобильный Интернет"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Удалить данные всех eSIM автомобиля"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Это действие не отменит ваш тарифный план."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Не удалось сбросить настройки eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Выберите сеть"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Сбросить настройки"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Сбросить настройки?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Сброшенные настройки нельзя будет восстановить. Продолжить?"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Сбросить настройки"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Сетевые настройки сброшены"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Сбросить настройки приложений"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Будут сброшены следующие настройки:\n\n"<li>"Отключенные приложения."</li>\n<li>"Отключенные уведомления приложений."</li>\n<li>"Приложения по умолчанию."</li>\n<li>"Ограничения на передачу данных в фоновом режиме."</li>\n<li>"Все ограничения разрешений."</li>\n\n"Данные приложений удалены не будут."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Сбросить настройки"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Настройки приложений сброшены"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Удалить все данные (сбросить настройки)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Будут удалены все данные из головного устройства автомобиля, в том числе:\n\n"<li>"ваш аккаунт Google;"</li>\n<li>"настройки/данные системы и приложений;"</li>\n<li>"установленные приложения."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Вы вошли в следующие аккаунты:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"В этом автомобиле есть другие пользователи."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Сбросить настройки автомобиля"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Сбросить настройки?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Удалить всю личную информацию и скачанные приложения? Это действие нельзя отменить."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Стереть все"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Удаление…"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Подождите..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Дата и время"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Дата и время"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Установка даты, времени, часового пояса и формата"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Упорядочить по часовому поясу"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Дата"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Время"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Добавление пользователя"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Добавить аккаунт"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Удалить пользователя"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Новый пользователь"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Гость"</string>
     <string name="user_admin" msgid="1535484812908584809">"Администратор"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Вы вошли как администратор"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Все права администратора"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Назначить администратором"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Пользователь сможет удалять других пользователей (в том числе администраторов) и сбрасывать системные настройки."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Это действие нельзя будет отменить."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Назначить администратором"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Создание профилей пользователей"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Исходящие телефонные звонки"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS по мобильному Интернету в авто"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Установка новых приложений"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Удаление приложений"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Добавление пользователя"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Новый пользователь"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Добавить пользователя?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Когда вы добавите пользователя, ему потребуется настроить профиль."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Любой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Достигнуто ограничение"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Можно создать не более <xliff:g id="COUNT">%d</xliff:g> пользователя.</item>
+      <item quantity="few">Можно создать не более <xliff:g id="COUNT">%d</xliff:g> пользователей.</item>
+      <item quantity="many">Можно создать не более <xliff:g id="COUNT">%d</xliff:g> пользователей.</item>
+      <item quantity="other">Можно создать не более <xliff:g id="COUNT">%d</xliff:g> пользователя.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Не удалось создать пользователя"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Удалить пользователя?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Будут удалены все приложения и данные."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Не удалось удалить пользователя"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Закрыть"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Повторить попытку"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Удалить последнего пользователя?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"После удаления единственного оставшегося пользователя в системе вам будет предложено создать новый профиль администратора."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Будут удалены все данные, настройки и приложения, связанные с этим пользователем. Вам потребуется заново настроить систему."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Выберите нового администратора"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"В системе должен быть хотя бы один администратор. Прежде чем удалить этого администратора, выберите того, кто его заменит."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Выбрать администратора"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Гость"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Гость"</string>
     <string name="user_switch" msgid="6544839750534690781">"Сменить пользователя"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Вы (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Имя"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не настроен"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Изменение имени пользователя"</string>
     <string name="users_list_title" msgid="770764290290240909">"Пользователи"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s: разрешения"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Аккаунты"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Пользователь"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Добавить аккаунт"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Аккаунтов нет."</string>
     <string name="account_list_title" msgid="7631588514613843065">"Аккаунты пользователя <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Автосинхронизация данных"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Данные приложений будут обновляться автоматически."</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Включить автосинхронизацию?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Все изменения в аккаунтах на компьютере будут автоматически копироваться на устройство.\n\nВ некоторых случаях также может выполняться обратная синхронизация (например, для аккаунта Google)."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Отключить автосинхронизацию?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Расход трафика будет ниже, но для получения новых данных вам придется синхронизировать аккаунты вручную. Уведомления о наличии обновлений будут отключены."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Информация об аккаунте"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Добавьте аккаунт"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Добавление аккаунта"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Удалить аккаунт"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Удалить аккаунт?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"С устройства будут удалены все сообщения, контакты и другие данные этого аккаунта."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Это действие запрещено администратором"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Удалить пользователя?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Все приложения и данные будут удалены."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Не удалось удалить пользователя"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Повторить попытку?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Закрыть"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Повторить"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Добавить пользователя?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Когда вы добавите пользователя, ему потребуется настроить профиль."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Любой пользователь устройства может обновлять приложения для всех аккаунтов."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Не удалось удалить аккаунт"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Синхронизация аккаунта"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Синхронизация включена для некоторых элементов (<xliff:g id="ID_1">%1$d</xliff:g> из <xliff:g id="ID_2">%2$d</xliff:g>)"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Синхронизация включена для всех элементов"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Синхронизация отключена для всех элементов"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Синхронизация отключена"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Ошибка синхронизации"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Последняя синхронизация: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Синхронизация…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Нажмите, чтобы синхронизировать<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизировать"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Отменить синхронизацию"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Проблемы с синхронизацией. Скоро все заработает."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безопасность"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Блокировка экрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Нет"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-код"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Пароль"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Выберите тип блокировки"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Параметры блокировки экрана"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Способы блокировки"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Введите графический ключ"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Подтвердить"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Начертить ещё раз"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Блокировка экрана"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Выберите PIN-код"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Выберите графический ключ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Выберите пароль"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Выберите пароль"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Текущий способ блокировки"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Для защиты системы создайте граф. ключ."</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Очистить"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ИТ-администратор запретил использовать простые пароли. Выберите более сложную комбинацию."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Нельзя использовать последовательности из идущих подряд или повторяющихся цифр."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Параметры блокировки экрана"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> (<xliff:g id="NUM_DAYS">%3$s</xliff:g> дн. назад)"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Добавить надежное устройство"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Надежные устройства"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> устройство</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> устройства</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> устройств</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> устройства</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Устройство <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> будет разблокировать автомобиль при подключении. Если кто-то возьмет <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, то сможет получить доступ к этому устройству."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"ОК"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Удалить надежное устройство"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Готово"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Для настройки надежного устройства используйте сопутствующее приложение. С помощью надежного устройства можно разблокировать свой профиль пользователя сразу после того, как автомобиль обнаружит ваш телефон."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Скачайте сопутствующее приложение на телефон."</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Чтобы подключить устройства, нажмите \"<xliff:g id="CAR_NAME">%1$s</xliff:g>\" на телефоне."</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock не удалось обнаружить функции безопасности на этом устройстве. В целях защиты вашего автомобиля от несанкционированного доступа действие функции разблокировки ограничено. Разблокировать автомобиль с помощью надежного устройства можно только в том случае, если до этого вы разблокируете его сами."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Добавление устройства \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\" в список надежных"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Устройство \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\" добавлено в список надежных."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Не удалось зарегистрировать устройство \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Чтобы добавить надежное устройство, необходимо выбрать способ аутентификации. Если надежного устройства не будет под рукой, вы сможете получить доступ к своему профилю только после аутентификации."</string>
     <string name="forget" msgid="3971143908183848527">"Удалить"</string>
+    <string name="connect" msgid="5861699594602380150">"Подключить"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Отключить"</string>
     <string name="delete_button" msgid="5840500432614610850">"Удалить"</string>
     <string name="remove_button" msgid="6664656962868194178">"Удалить"</string>
     <string name="cancel" msgid="750286395700355455">"Отмена"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Выход из деморежима"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Произойдет сброс настроек. Тестовый аккаунт и все пользовательские данные будут удалены."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Выйти из деморежима"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"Завершить настройку"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"Не сейчас"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ЗАКРЫТЬ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Эта функция недоступна во время вождения."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Невозможно добавить пользователя во время вождения."</string>
 </resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 3d06bf6..aef8fbb 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"අඳුරු තිරය, ස්පර්ශ තිරය, බැටරිය"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"අඳුරු තිරය, රාත්‍රිය, වර්ණ ගැන්වීම"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"රාත්‍රී ප්‍රකාරය"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"ජාලය සහ අන්තර්ජාලය"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"ජංගම ජාලය"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"ජංගම දත්ත"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"ජංගම ජාලය භාවිතයෙන් දත්තවලට ප්‍රවේශය"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"ජංගම දත්ත ක්‍රියාවිරහිත කරන්න ද?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"දත්ත භාවිතය"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"දත්ත අනතුරු ඇඟවීම සහ සීමාව"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"යෙදුම් දත්ත භාවිත චක්‍රය"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"දත්ත අනතුරු ඇඟවීම සකසන්න"</string>
+    <string name="data_warning" msgid="116776633806885370">"දත්ත අනතුරු ඇඟවීම"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"දත්ත සීමාව සකසන්න"</string>
+    <string name="data_limit" msgid="227338836292511425">"දත්ත සීමාව"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"දත්ත භාවිතය සීමා කිරීම"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ජංගම දත්ත ඔබ සැකසූ සීමාවට ළඟා වූ විට ඔබගේ වාහනයේ ශීර්ෂ ඒකකය එය අක්‍රිය කරයි.\n\nඔබගේ ශීර්ෂ ඒකකයෙන් දත්ත භාවිතය ගණනය කරනු ලබන අතර භාවිතය වෙනස් වීම සඳහා ඔබගේ වාහකයා ගිණුම මධ්‍යස්ථ සීමාවකට සැකසිය හැකි බව සලකන්න."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"නොරැහැන් ප්‍රවේශ ස්ථාන සකසන්න සහ කළමනාකරණය කරන්න"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi ක්‍රියාත්මක කරමින්…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi ක්‍රියා විරහිත කරමින්…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi ලැයිස්තුව පූරණ කිරීම"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi අබලයි"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ජාලය අමතක කිරීමට අසමත් විය"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ජාලයට සම්බන්ධ වීමට අසමත් විය"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"ජාලය එක් කරන්න"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi අබලයි"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"සබඳින්න"</string>
     <string name="wifi_password" msgid="5565632142720292397">"මුරපදය"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"මුරපදය පෙන්වන්න"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ජාල නම"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID ඇතුළු කරන්න"</string>
     <string name="wifi_security" msgid="158358046038876532">"ආරක්ෂාව"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"සංඥා ප්‍රබලතාව"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"සංඥා ප්‍රබලතාව"</string>
     <string name="wifi_status" msgid="5688013206066543952">"තත්ත්වය"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"සම්බන්ධතා වේගය"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"සංඛ්‍යාතය"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP ලිපිනය"</string>
+    <string name="show_password" msgid="2074628020371139240">"මුරපදය පෙන්වන්න"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ජාලයේ නම ඇතුළත් කරන්න"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"මුරපදය ඇතුළත් කරන්න"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"දුර්වලයි"</item>
-    <item msgid="2032262610626057081">"සතුටුදායකයි"</item>
-    <item msgid="3859756017461098953">"හොඳයි"</item>
-    <item msgid="1521103743353335724">"ඉතා හොඳයි"</item>
+    <item msgid="7683058295076342057">"දුර්වලයි"</item>
+    <item msgid="1639222824821660744">"තරමක් හොඳයි"</item>
+    <item msgid="1838705897358163300">"හොඳයි"</item>
+    <item msgid="6067166649320533751">"ඉතා හොඳයි"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"බ්ලූටූත්"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"බ්ලූටූත් ක්‍රියාත්මක කරන්න"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"බ්ලූටූත්"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"බ්ලූටූත් අබලයි"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"ජාල විස්තර"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC ලිපිනය"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP ලිපිනය"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"උප ජාල ආවරණය"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 ලිපින"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"වාහල"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi-Fi මනාප"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi ස්වයංක්‍රීයව ක්‍රියාත්මක කරන්න"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"ඔබේ නිවෙස් ජාලය වැනි, ඉහළ-ගුණත්වයේ සුරැකි ජාල අවට Wi-Fi ආපසු ක්‍රියාත්මක වනු ඇත"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"ස්ථානය ක්‍රියාවිරහිත නිසා නොමැත. "<annotation id="link">"ස්ථානය"</annotation>" ක්‍රියාත්මක කරන්න."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi ස්කෑන් කිරීම ක්‍රියාත්මක කරන්න ද?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ක්‍රියාත්මක කරන්න"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi ස්කෑන් කිරීම ක්‍රියාත්මකයි"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"ජංගම දත්ත වෙත ස්වයංක්‍රීයව මාරු වන්න"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi‑Fi හට අන්තර්ජාල ප්‍රවේශය නැති විට ජංගම දත්ත භාවිතා කරන්න. දත්ත භාවිතයේ ගාස්තු අදාළ විය හැකිය."</string>
+    <string name="learn_more" msgid="8214605928933358604">"තව දැන ගන්න"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"බ්ලූටූත්"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"සබැඳුම් කළමනාකරණය කරන්න, උපාංගයේ නම සහ සොයා ගැනීමේ හැකියාව සකසන්න"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"පරිගණකය"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"හෙඩ්සෙටය"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"දුරකථනය"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"නිරූපණය"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"හෙඩ්ෆෝන්"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ආදාන පර්යන්තය"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"බ්ලූටූත්"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"යුගල කළ උපාංග"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"තිබෙන උපාංග"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"යුගල කළ උපාංග නැත"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"පවතින උපාංග නැත"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"යුගලිත උපාංගය"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"නම‍"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"සඳහා භාවිතා කරන්න"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"බ්ලූටූත් උපාංගයේ නම වෙනස් කරන්න"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"නම් නොකළ උපාංගය"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"යුගල කළ උපාංග"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"නව උපාංගය යුගල කරන්න"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"යුගල කිරීමට බ්ලූටූත් ක්‍රියාත්මක කරනු ඇත"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"උපාංගය විසන්ධි කරන්න ද?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"ඔබේ වාහනය <xliff:g id="DEVICE_NAME">%1$s</xliff:g> වෙතින් විසන්ධි කරනු ඇත."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"වාහනයේ බ්ලූටූත් ලිපිනය: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"උපාංගයේ බ්ලූටූත් ලිපිනය: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"වාහනයේ නම"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"මෙම වාහනය යළි නම් කරන්න"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"උපාංගය යළි නම් කරන්න"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"යළි නම් කරන්න"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"තිබෙන උපාංග"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"පැතිකඩවල්"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"බ්ලූටූත් යුගලන ඉල්ලීම"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"යුගලනය සහ සබැඳීම"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"බ්ලූටූත්"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"බ්ලූටූත් යුගල කේතය"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN හි අකුරු හෝ සංකේත අඩංගු වේ"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"යුගලන කේතය යතුරු ලියා අනතුරුව ආපසු හෝ එන්ටර් ඔබන්න"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"සාමාන්‍යයෙන් 0000 හෝ 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"යුගල කිරීමේ ඉල්ලීම"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> සමඟ යුගල කිරීමට තට්ටු කරන්න."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"භාෂා"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"භාෂා සහ ආදාන"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"යතුරු පුවරුව"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"යතුරු පුවරු කළමනා කරන්න"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"පෙළින්-කථන ප්‍රතිදානය"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"වරණ එන්ජිම"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"වර්තමාන එන්ජිම"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"කථන ශීඝ්‍රතාව"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"තාරතාව"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"යළි සකසන්න"</string>
     <string name="sound_settings" msgid="3072423952331872246">"හඬ"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"නාද ශබ්දය"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"සංචාලන ශබ්දය"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"මාධ්‍ය"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"සංගීත සහ වීඩියෝ සඳහා ශබ්දය සකසන්න"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"එලාමය"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"දුරකථන රිගින්ටෝනය"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"පෙරනිමි දැනුම්දීම් හඬ"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"පෙරනිමි එලාම හඬ"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"යෙදුම් සහ දැනුම්දීම්"</string>
+    <string name="all_applications" msgid="7798210477486822168">"සියලුම යෙදුම් පෙන්වන්න"</string>
+    <string name="default_applications" msgid="1558183275638697087">"පෙරනිමි යෙදුම්"</string>
     <string name="applications_settings" msgid="794261395191035632">"යෙදුම් තතු"</string>
+    <string name="force_stop" msgid="2153183697014720520">"බලෙන් නවත්වන්න"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"බලෙන් නවතන්න ද?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"ඔබ යෙදුමක් බලෙන් නැවතුවහොත්, එය වැරදි ලෙස ක්‍රියා කරනු ඇත."</string>
     <string name="disable_text" msgid="4358165448648990820">"අබල කරන්න"</string>
     <string name="enable_text" msgid="1794971777861881238">"සබල කරන්න"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"අස්ථාපනය"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"ඔබ මෙම යෙදුම අබල කළහොත්, Android සහ වෙනත් යෙදුම් බලාපොරොත්තු වන පරිදි ක්‍රියා නොකරනු ඇත."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"යෙදුම අබල කරන්න"</string>
     <string name="permissions_label" msgid="2701446753515612685">"අවසර"</string>
     <string name="application_version_label" msgid="8556889839783311649">"අනුවාදය: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"අවසර ලබා දී නැත"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"අවසර ඉල්ලා නැත"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"දත්ත භාවිතය"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"යෙදුම් දත්ත භාවිතය"</string>
-    <string name="force_stop" msgid="2153183697014720520">"බලෙන් නවත්වන්න"</string>
     <string name="computing_size" msgid="5791407621793083965">"ගණනය කරමින්…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one">අතිරේක අවසර <xliff:g id="COUNT_1">%d</xliff:g>ක්</item>
       <item quantity="other">අතිරේක අවසර <xliff:g id="COUNT_1">%d</xliff:g>ක්</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"සහය සහ හඬ ආදානය"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"සහාය යෙදුම"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"තිරයෙන් පෙළ භාවිතා කරන්න"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"සහාය යෙදුමට තිර අන්තර්ගත පෙළ ලෙස ප්‍රවේශයට ඉඩ දෙන්න"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"තිර රුව භාවිතා කරන්න"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"සහාය යෙදුමට තිරයේ රූපයකට ප්‍රවේශයට ඉඩ දෙන්න"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"ස්වයං පිරවුම් සේවය"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"කිසිවක් නැත"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"තේරුවා"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"සහකරුට ඔබේ තිරය මත දෘශ්‍යමාන වන හෝ යෙදුම් තුළ ප්‍රවේශ විය හැකි තොරතුරු ඇතුළුව, ඔබේ පද්ධතිය මත භාවිතයේ ඇති යෙදුම් ගැන කියවීමට හැකි වෙයි."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ඔබ මෙම යෙදුම විශ්වාස කරන බව සහතික කර ගන්න&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; ස්වයං පිරවිය හැකි දේවල් නිර්ණය කිරීමට ඔබේ තිරයෙහි ඇති දේවල් භාවිත කරයි."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"සේවාව එක් කරන්න"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ස්ථානය"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"මෑත ස්ථාන ඉල්ලීම්"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"මෑත ස්ථාන ඉල්ලීම් නැත"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"යෙදුම්-මට්ටමේ අවසර"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"ස්කෑන් කිරීම"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"ස්ථානීය සේවා"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi ස්කෑන් කිරීම"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi‑Fi ක්‍රියාවිරහිත විට පවා, ඕනෑම වේලාවක දී Wi‑Fi ජාල සඳහා ස්කෑන් කිරීමට යෙදුම් සහ සේවාවන්ට ඉඩ දෙන්න. උදාහරණයක් ලෙස, ස්ථානය-පදනම් වූ විශේෂාංග සහ සේවා වැඩි දියුණු කිරීම සඳහා මෙය භාවිතා කළ හැකිය."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"බ්ලූටූත් ස්කෑන් කිරීම"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"බ්ලූටූත් ක්‍රියාවිරහිත විට පවා, ඕනෑම වේලාවක දී අවට උපාංග සඳහා ස්කෑන් කිරීමට යෙදුම් සහ සේවාවන්ට ඉඩ දෙන්න. උදාහරණයක් ලෙස, ස්ථානය-පදනම් වූ විශේෂාංග සහ සේවා වැඩි දියුණු කිරීම සඳහා මෙය භාවිතා කළ හැකිය."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"පද්ධතිය"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"පද්ධති යාවත්කාලීන"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"පද්ධති යාවත්කාලීන"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android අනුවාදය"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android ආරක්ෂක පැච් මට්ටම"</string>
     <string name="model_info" msgid="4966408071657934452">"මාදිලිය"</string>
     <string name="baseband_version" msgid="2370088062235041897">"පාදම් කලාප අනුවාදය"</string>
     <string name="kernel_version" msgid="7327212934187011508">"කර්නලයේ අනුවාදය"</string>
     <string name="build_number" msgid="3997326631001009102">"නිමැවුම් අංකය"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"බ්ලූටූත් ලිපිනය"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"ලද නොහැක"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"තත්ත්වය"</string>
     <string name="device_status" msgid="267298179806290920">"තත්ත්වය"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"ප්‍රකාශන හිමිකම"</string>
     <string name="license_title" msgid="936705938435249965">"බලපත්‍රය"</string>
     <string name="terms_title" msgid="5201471373602628765">"නියම සහ කොන්දේසි"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"පද්ධති WebView බලපත"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"පද්ධති WebView බලපත්‍ර"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"වෝල්පේපර"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"චන්ද්‍රිකා රූප සපයන්නන්:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"තුන් වන පාර්ශ්ව බලපත්‍ර"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"බලපත්‍ර පූරණය කිරීමේදී ගැටලුවක් විය."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"පූරණය කරමින්…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">දැන් ඔබ සංවර්ධකයෙක් වීමට ඇත්තේ පියවර <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> කි.</item>
+      <item quantity="other">දැන් ඔබ සංවර්ධකයෙක් වීමට ඇත්තේ පියවර <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> කි.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ඔබ දැන් වර්ධකයෙකි"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"අවශ්‍ය නැත, ඔබ දැනටමත් වර්ධකයෙකි."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"සංවර්ධක විකල්ප"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"යළි පිහිටුවීමේ විකල්ප"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"ජාලය, යෙදුම්, හෝ උපාංගය යළි පිහිටුවීම"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"ජාලය යළි සකසන්න"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"මෙය පහත ඒවා ඇතුළුව, සියලු ජාල සැකසීම් යළි පිහිටුවනු ඇත:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"ජංගම දත්ත"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"බ්ලූටූත්"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"වාහන eSIM සියල්ල මකන්න"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"මෙය ඔබේ සේවා සැලසුම අවලංගු නොකරයි."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIMs යළි පිහිටුවිය නොහැක"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"ජාලය තෝරන්න"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"සැකසීම් යළි පිහිටුවන්න"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"යළි පිහිටුවන්න ද?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"සියලු ජාල සැකසීම් යළි පිහිටුවන්න ද? ඔබට මෙම ක්‍රියාව පසුගමනය කළ නොහැකිය!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"සැකසීම් යළි පිහිටුවන්න"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"ජාල සැකසීම් යළි පිහිටුවිණි"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"යෙදුම් මනාප යළි පිහිටුවන්න"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"මෙමඟින් මේ සඳහා සියලු මනාප යළි පිහිටුවනු ඇත:\n\n"<li>"අබලිත යෙදුම්"</li>\n<li>"අබලිත යෙදුම් දැනුම්දීම්"</li>\n<li>"ක්‍රියා සඳහා පෙරනිමි යෙදුම්"</li>\n<li>"යෙදුම් සඳහා පසුබිම් දත්ත සීමා කිරීම්"</li>\n<li>"ඕනෑම අවසර සීමාවක්"</li>\n\n"ඔබට කිසිදු යෙදුම් දත්තයක් නැති වන්නේ නැත."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"යෙදුම් යළි පිහිටුවන්න"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"යෙදුම් මනාප යළි පිහිටුවා ඇත"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"සියලු දත්ත මකන්න (කම්හල් යළි පිහිටුවීම)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"මෙමඟින් මේවා ඇතුළුව, ඔබේ වාහනයේ ප්‍රධාන ඒකකයෙන් සියලුම දත්ත මකනු ඇත:\n\n"<li>"ඔබේ Google ගිණුම"</li>\n<li>"පද්ධති සහ යෙදුම් දත්ත සහ සැකසීම්"</li>\n<li>"බාගත් යෙදුම්"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"ඔබ දැනට පහත ගිණුම් වෙත පුරනය වී සිටියි:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"මෙම වාහනයෙහි වෙනත් පරිශීලකයින් සිටී."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"වාහනය යළි පිහිටුවන්න"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"යළි පිහිටුවන්න ද?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"ඔබේ සියලු පුද්ගලික තොරතුරු සහ බාගත් යෙදුම් මකන්න ද? ඔබට මෙම ක්‍රියාව ආපසු හැරවිය නොහැක!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"සියල්ල මකන්න"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"මකමින්"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"රැඳී සිටින්න..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"දිනය සහ වේලාව"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"දිනය සහ වේලාව සකසන්න"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"දිනය, වේලාව, වේලා කලාපය සහ ආකෘති සකසන්න"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"වේලා කලාපය අනුව පෙළගස්වන්න"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"දිනය"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"වේලාව"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"පරිශීලක එක් කරන්න"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"ගිණුම එක් කරන්න"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"පරිශීලකයා මකන්න"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"නව පරිශීලකයා"</string>
-    <string name="user_guest" msgid="3465399481257448601">"අමුත්තා"</string>
     <string name="user_admin" msgid="1535484812908584809">"පරිපාලක"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"පරිපාලක ලෙස පුරනය වී ඇත"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"පරිපාලක අවසර සියල්ල"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"පරිපාලක කරන්න"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"පරිශීලකයාට වෙනත් පරිපාලකයින් ඇතුළුව, පරිශීලකයින් මැකීමට සහ පද්ධතිය කම්හල් යළි පිහිටුවීමට හැකි වනු ඇත."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"මෙම ක්‍රියාව ආපසු හැරවිය නොහැක."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ඔව්, පරිපාලක කරන්න"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"නව පරිශීලකයින් සාදන්න"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"දුරකථන ඇමතුම් ලබා ගන්න"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"මෝටර් රථයේ ජංගම දත්ත හරහා පණිවුඩ යැවීම"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"නව යෙදුම් ස්ථාපන කරන්න"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"යෙදුම් අස්ථාපන කරන්න"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"පරිශීලක එක් කරන්න"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"නව පරිශීලකයා"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"අලුත් පරිශීලක එක් කරනව ද?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ඔබ අලුත් පරිශීලකයෙක් එක් කරන විට, එම පුද්ගලයාට තමන්ගේ ඉඩ සකසා ගැනීමට අවශ්‍ය වේ."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"සියලුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යෙදුම් යාවත්කාලීන කළ හැක."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"පරිශීලක සීමාවට ළඟා විය"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">ඔබට පරිශීලකයින් <xliff:g id="COUNT">%d</xliff:g> දෙනෙක් දක්වා නිර්මාණ කළ හැක.</item>
+      <item quantity="other">ඔබට පරිශීලකයින් <xliff:g id="COUNT">%d</xliff:g> දෙනෙක් දක්වා නිර්මාණ කළ හැක.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"නව පරිශීලකයෙකු සෑදීමට අසමත් විය"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"මෙම පරිශීලකයා මකන්නද?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"සියලුම යෙදුම් සහ දත්ත මකා දැමෙනු ඇත."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"පරිශීලක මකා දැමීමට අසමත් විය."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ඉවතලන්න"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"යළි උත්සාහ කරන්න"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"අවසාන පරිශීලක මකන්නද?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"මෙම මෝටර් රථය සඳහා ඉතිරිව ඇති ඉතිරි පරිශීලක මකා දැමීමෙන් පසු, නව පරිපාලක පරිශීලකයකු තනනු ඇත."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"මෙම පරිශීලකයාට සම්බන්ධ සියලු දත්ත, සැකසීම් සහ යෙදුම් මකා දමනු ලැබේ. ඔබ නැවතත් පද්ධතිය සැකසිය යුතුයි."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"නව පරිපාලක තෝරන්න"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"ඔබට අවම වශයෙන් එක් පරිපාලකයෙකු සිටිය යුතුය. මෙම කොටස මකා දැමීම සඳහා, මුලින්ම විකල්පයක් තෝරා ගන්න."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"පරිපාලක තෝරන්න"</string>
+    <string name="user_guest" msgid="3465399481257448601">"අමුත්තා"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"අමුත්තා"</string>
     <string name="user_switch" msgid="6544839750534690781">"මාරු වෙන්න"</string>
     <string name="current_user_name" msgid="3813671533249316823">"ඔබ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"නම‍"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"සකසා නැත"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"පරිශීලක නම සංස්කරණය"</string>
     <string name="users_list_title" msgid="770764290290240909">"පරිශීලකයින්"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s ට අවසර දෙන ලදි"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"ගිණුම්"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"පරිශීලක"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"ගිණුම එක් කරන්න"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ගිණුම් එක් නොකෙරිණි"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> සඳහා ගිණුම්"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ස්වයංක්‍රීයව දත්ත සමමුහූර්ත කරන්න"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"යෙදුම් වෙත දත්ත ස්වයංක්‍රීයව නැවුම් කිරීමට ඉඩ දෙන්න"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"දත්ත ස්වයංක්‍රීය-සමමුහූර්ත වීම සක්‍රී කරන්නේද?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"අන්තර්ජාලයේ ඔබගේ උපාංගවලට ඔබ කරන ඕනෑම වෙනස්කමක් ස්වයංක්‍රියව දුරකතනයට පිටපත් වෙයි.\n\nසමහර ගිණුම් මඟින් ඔබ දුරකථනයේ සිදු කරන ඕනෑම වෙනස්කමක් ස්වයංක්‍රීයව වෙබ් අඩවියට පිටපත් කිරීම ද කළ හැක. Google ගිණුමක් මෙවැනි ආකාරයකට ක්‍රියා කරයි."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"දත්ත ස්වයංක්‍රීය-සමමුහූර්ත වීම අක්‍රිය කරන්නේද?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"මෙමඟින් දත්ත භාවිතය ඉතිරි කරන, නමුත් මෑත තොරතුරු එකතු කිරීමට සෑම ගිණුමක්ම ඔබ හස්තීයව සමමුහූර්ත  කළ යුතු වෙයි. තවද යාවත්කාලීන සිදුවන විට ඔබට දැනුම්දීම් නොලැබෙයි."</string>
     <string name="account_details_title" msgid="7529571432258448573">"ගිණුම් තතු"</string>
     <string name="add_account_title" msgid="5988746086885210040">"ගිණුම එක් කරන්න"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ගිණුමක් එක් කරන්න"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"ගිණුම ඉවත් කරන්න"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"ගිණුම ඉවත් කරන්න ද?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"මෙම ගිණුම ඉවත් කිරීමෙන් උපාංගයෙන් එහි සියලු පණිවිඩ, සම්බන්ධතා සහ වෙනත් දත්ත මකනු ඇත!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ඔබේ පරිපාලක විසින් මෙම වෙනස් කිරීමට ඉඩ නොදේ"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"මෙම පරිශීලක ඉවත් කරන්න ද?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"සියලුම යෙදුම් සහ දත්ත මකා දැමෙනු ඇත."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"පරිශීලක ඉවත් කිරීමට අසමත් විය."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"නැවත උත්සාහ කරන්න ද?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"අස් කරන්න"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"යළි උත්සාහ කරන්න"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"අලුත් පරිශීලක එක් කරනව ද?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"ඔබ අලුත් පරිශීලකයෙක් එක් කරන විට, එම පුද්ගලයාට තමන්ගේ ඉඩ සකසා ගැනීමට අවශ්‍ය වේ."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"සියලුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යෙදුම් යාවත්කාලීන කළ හැක."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"ගිණුම ඉවත් කිරීමට අසමත් විය."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ගිණුම් සමමුහුර්තය"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"අයිතම <xliff:g id="ID_2">%2$d</xliff:g>කින් <xliff:g id="ID_1">%1$d</xliff:g>ක් සඳහා සමමුහුර්තය ක්‍රියාත්මකයි"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"සියලු අයිතම සඳහා සමමුහුර්තය ක්‍රියාත්මකයි"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"සියලු අයිතම සඳහා සමමුහුර්තය ක්‍රියාවිරහිතයි"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"සමමුහුර්තය ක්‍රියාවිරහිතයි"</string>
+    <string name="sync_error" msgid="6698021343089247914">"සමමුහුර්ත දෝෂයක්"</string>
+    <string name="last_synced" msgid="4745124489150101529">"අවසාන සමමුහුර්තය <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"දැන් සමමුහුර්ත වේ…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"දැන් සමමුහුර්ත කිරීමට තට්ටු කරන්න<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"දැන් සමමුහුර්ත කරන්න"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"සමමුහුර්තය අවලංගු කරන්න"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"සමමුහුර්තය දැනට ගැටලුවලට මුහුණ පා ඇත. එය සුළු මොහොතකින් ආපසු පැමිණෙනු ඇත."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ආරක්ෂාව"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"තිර අගුල"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"කිසිවක් නැත"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"මුරපදය"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"අගුළු ආකාරයක් තෝරාගන්න"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"තිර අගුළු විකල්ප"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"අඟුලු විකල්ප"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"ඔබගේ රටාව ඇතුළු කරන්න"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"තහවුරු කරන්න"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"යළි අඳින්න"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"තිර අගුලක් සකසන්න"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"ඔබගේ PIN තෝරන්න"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"ඔබේ රටාව තෝරා ගන්න"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"ඔබගේ මුරපදය තෝරන්න"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"ඔබේ මුරපදය තෝරා ගන්න"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"වත්මන් තිර අගුල"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ආරක්ෂාව සඳහා, රටාවක් සකසන්න"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"හිස් කරන්න"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ඔබේ IT පරිපාලක විසින් සුලබ මුරපද අවහිර කරනු ලැබේ. වෙනස් මුරපදයක් උත්සාහ කරන්න."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ආරෝහණ, අවරෝහණ හෝ පුනරාවර්ත අනුක්‍රමයේ ඉලක්කම්වලට ඉඩ නොදේ."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"තිර අගුළු විකල්ප"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : දින <xliff:g id="NUM_DAYS">%3$s</xliff:g>කට පෙර"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"විශ්වාසදායී උපාංගය එක් කරන්න"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"විශ්වාසදායී උපාංග"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one">උපාංග <xliff:g id="COUNT_1">%d</xliff:g> ක්</item>
+      <item quantity="other">උපාංග <xliff:g id="COUNT_1">%d</xliff:g> ක්</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"ඔබේ <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> සම්බන්ධ වන විට මෙම මෝටර් රථය අගුළු හරිනු ඇත. යමෙකු ඔබේ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>රැගෙන ගියහොත්, ඔවුන්ට මෙම උපාංගයට ප්‍රවේශ වීමට හැකි වනු ඇත"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"තහවුරු කරන්න"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"විශ්වාසදායී උපාංගය ඉවත් කරන්න"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"නිමයි"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"විශ්වසනීය උපාංගයක් සැකසීමට මිත්‍ර යෙදුම භාවිත කරන්න. සැකසූ පසු, වාහනය ඔබේ දුරකථනය අනාවර කළ විට ඔබට ඔබේ පරිශීලක පැතිකඩ අඟුලු ඇරීමට හැකි වෙයි."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ඔබේ දුරකථනය මත මිත්‍ර යෙදුම බාගන්න"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. උපාංග යුගල කිරීමට ඔබේ දුරකථනයේ <xliff:g id="CAR_NAME">%1$s</xliff:g> තෝරන්න"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"හපන් අඟුලට මෙම උපාංගයේ ආරක්‍ෂණ විශේෂාංග අනාවරණ කළ නොහැක ඔබේ කාර් රථය ආරක්‍ෂා කිරීමට උදවු කිරීමට, ඔබ ඔබේ කාර් රථය අඟුලු ඇරීමෙන් පසු පමණක් විශ්වසනීය උපාංගයට ඔබේ කාර් රථට අඟුලු ඇර තබා ගත හැක. වෙනත් කෙනෙක් ඔබේ විශ්වසනීය උපාංගය තබා සිටින්නේ වූවත්, එයට එය අවට තිබියදී ඔබේ කාර් රථය අඟුලු ඇර තබා ගත හැක."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> විශ්වසනීය උපාංගයක් ලෙස එක් කරන්න"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> විශ්වසනීය උපාංගයක් ලෙස සාර්ථකය එක් කළා"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ලියාපදිංචි වීම අසාර්ථකයි"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"විශ්වාසදායී උපාංගයක් එක් කිරීමට ඔබට මීළඟට සත්‍යාපන ක්‍රමයක් සැකසීමට අවශ්‍ය කරයි. ඔබට ඔබේ විශ්වාසදායී උපාංගය ළඟ නොමැති නම්, ඔබේ පැතිකඩට ප්‍රවේශයට සත්‍යාපනය අවශ්‍ය වනු ඇත."</string>
     <string name="forget" msgid="3971143908183848527">"අමතක කරන්න"</string>
+    <string name="connect" msgid="5861699594602380150">"සබඳින්න"</string>
+    <string name="disconnect" msgid="6140789953324820336">"විසන්ධි කරන්න"</string>
     <string name="delete_button" msgid="5840500432614610850">"මකන්න"</string>
     <string name="remove_button" msgid="6664656962868194178">"ඉවත් කරන්න"</string>
     <string name="cancel" msgid="750286395700355455">"අවලංගු කරන්න"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ආදර්ශන ප්‍රකාරයෙන් ඉවත් වන්න"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"මෙමගින් ආදර්ශන ගිණුම මකා පද්ධතිය කර්මාන්තශාලා දත්ත යළි පිහිටුවීම කරනු ඇත. සියලු පරිශීලක දත්ත අහිමි වනු ඇත."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ආදර්ශනයෙන් ඉවත් වන්න"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"පිහිටුවීම අවසන් කරන්න"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"දැන් නොවේ"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"අස් කරන්න"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"විශේෂාංගය රිය පැදවීමේ දී නොමැත."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"රිය පැදවීමේ දී පරිශීලකයා එක් කළ නොහැක."</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index b08e2eb..8533f3b 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"stlmiť obrazovku, dotyková obrazovka, batéria"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"stlmenie obrazovky, noc, tónovanie"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nočný režim"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Sieť a internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilná sieť"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobilné dáta"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Prístup k dátam pomocou mobilnej siete"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vypnúť mobilné dáta?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Využitie dát"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Upozornenie o dátach a limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cyklus spotreby dát aplikáciami"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Nastaviť dátové upozornenie"</string>
+    <string name="data_warning" msgid="116776633806885370">"Dátové upozornenie"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Nastaviť dátový limit"</string>
+    <string name="data_limit" msgid="227338836292511425">"Dátový limit"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Obmedzenie spotreby dát"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Autorádio vozidla vypne po dosiahnutí nastaveného limitu mobilné dátové pripojenie.\n\nKeďže spotrebu dát meria autorádio, ale váš operátor môže spotrebu vyčísliť inak, je vhodné nastaviť si nižší limit."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Umožňuje nastaviť a spravovať prístupové body bezdrôtovej siete"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Zapína sa Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Vypína sa Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Načítava sa zoznam sietí Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Sieť Wi-Fi je vypnutá"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Sieť sa nepodarilo odstrániť"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Nepodarilo sa pripojiť k sieti"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Pridať sieť"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Sieť Wi-Fi je vypnutá"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Pripojiť"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Heslo"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Zobraziť heslo"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Názov siete"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Zadajte SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Zabezpečenie"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Sila signálu"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Sila signálu"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Stav"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Rýchlosť pripojenia"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvencia"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Adresa IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Zobraziť heslo"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Zadajte názov siete"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Zadajte heslo"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Slabé"</item>
-    <item msgid="2032262610626057081">"Priemerné"</item>
-    <item msgid="3859756017461098953">"Dobré"</item>
-    <item msgid="1521103743353335724">"Vynikajúce"</item>
+    <item msgid="7683058295076342057">"Slabé"</item>
+    <item msgid="1639222824821660744">"Priemerné"</item>
+    <item msgid="1838705897358163300">"Dobré"</item>
+    <item msgid="6067166649320533751">"Vynikajúce"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Zapnúť Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Rozhranie Bluetooth je deaktivované"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Podrobnosti siete"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adresa MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Adresa IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska podsiete"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adresy IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Brána"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Predvoľby Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Zapínať Wi‑Fi automaticky"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi sa zapne v blízkosti uložených sietí vysokej kvality"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nedostupné, pretože určovanie polohy je vypnuté. "<annotation id="link">"Zapnúť"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Zapnúť vyhľadávanie Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Zapnúť"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Vyhľadávanie sietí Wi‑Fi je zapnuté"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Automaticky prepnúť na mobilné dáta"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Používať mobilné dáta, keď Wi‑Fi nemá prístup k internetu. Za využité dáta vám môžu byť účtované poplatky."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Ďalšie informácie"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Správa pripojenia, nastavenie názvu zariadenia a viditeľnosti"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Počítač"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Náhlavná súprava"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefón"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Snímkovacie zariadenie"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Slúchadlá"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Periférne vstupné zariadenie"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Spárované zariadenia"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Dostupné zariadenia"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Žiadne spárované zariadenia"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nie sú k dispozícii žiadne zariadenia"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Spárované zariadenie"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Názov"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Použiť pre"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Zmeňte názov zariadenia Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Zariadenie bez názvu"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Spárované zariadenia"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Spárovať nové zariadenie"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Zapne sa Bluetooth s cieľom párovania"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Odpojiť zariadenie?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Vozidlo bolo odpojené od zariadenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adresa Bluetooth vozidla: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adresa Bluetooth zariadenia: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Názov vozidla"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Premenovať vozidlo"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Premenovať zariadenie"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Premenovať"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Dostupné zariadenia"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profily"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Žiadosť o párovanie zariadenia Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Párovať a pripojiť"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Párovací kód Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Kód PIN obsahuje písmená alebo symboly"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Zadajte párovací kód a potom stlačte tlačidlo Return alebo Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Obvykle 0000 alebo 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Žiadosť o párovanie"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> spárujete klepnutím."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Jazyky"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Jazyky a vstup"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klávesnica"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Spravovať klávesnice"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Výstup prevodu textu na reč"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Preferovaný nástroj"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Aktuálny nástroj"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Rýchlosť reči"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Výška"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Resetovať"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Zvuk"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Hlasitosť zvonenia"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Hlasitosť navigácie"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Médiá"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Umožňuje nastaviť hlasitosť hudby a videí"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Budík"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Tón zvonenia telefónu"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Predvolený zvuk upozornenia"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Predvolený zvuk budíka"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikácie a upozornenia"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Zobraziť všetky aplikácie"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Predvolené aplikácie"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informácie o aplikácii"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Vynútiť zastavenie"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Chcete vynútiť zastavenie?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ak vynútite zastavenie aplikácie, môže sa správať zvláštne."</string>
     <string name="disable_text" msgid="4358165448648990820">"Zakázať"</string>
     <string name="enable_text" msgid="1794971777861881238">"Povoliť"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Odinštalovať"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ak aplikáciu deaktivujete, systém a ďalšie aplikácie už nemusia fungovať podľa očakávaní."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Deaktivovať aplikáciu"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Povolenia"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Verzia: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Neboli udelené žiadne povolenia"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Neboli požadované žiadne povolenia"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Spotreba dát"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Spotreba dát aplikácie"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Vynútiť zastavenie"</string>
     <string name="computing_size" msgid="5791407621793083965">"Prebieha výpočet…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> ďalšie povolenia</item>
@@ -117,15 +168,39 @@
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ďalších povolení</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ďalšie povolenie</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomoc a hlasový vstup"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Asistenčná aplikácia"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Použiť text z obrazovky"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Povoliť asistenčnej aplikácii prístup k obsahu obrazovky ako k textu"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Použiť snímku obrazovky"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Povoliť asistenčnej aplikácii prístup k snímke obrazovky"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Služba automatického dopĺňania"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Žiadna"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Vybraná"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Pomocník bude môcť čítať informácie o aplikáciách používaných vo vašom systéme vrátane údajov viditeľných na obrazovke alebo prístupných v aplikáciách."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Skontrolujte, či ide o dôveryhodnú aplikáciu&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Automatické dopĺňanie Google&gt;%1$s&lt;/xliff:g&gt; určuje na základe obsahu obrazovky, čo je možné automaticky vyplniť."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Pridať službu"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Poloha"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedávne žiadosti o polohu"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Žiadne nedávne žiadosti o polohu"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Povolenia na úrovni aplikácie"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Vyhľadávanie"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Služby určovania polohy"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Vyhľadávanie sietí Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Povoľte aplikáciám a službám kedykoľvek vyhľadávať siete Wi‑Fi, a to aj vtedy, keď je sieť Wi-Fi vypnutá. Môžete to využiť napríklad na zlepšenie funkcií a služieb podmienených polohou."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Vyhľadávanie zariadení Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Povoľte aplikáciám a službám kedykoľvek vyhľadávať zariadenia v okolí, a to aj vtedy, keď je rozhranie Bluetooth vypnuté. Môžete to využiť napríklad na zlepšenie funkcií a služieb podmienených polohou."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Systém"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Aktualizácie systému"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Aktualizácie systému"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Verzia Androidu"</string>
     <string name="security_patch" msgid="4794276590178386903">"Úroveň opráv zabezpečenia systému"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Verzia základného pásma"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Verzia jadra"</string>
     <string name="build_number" msgid="3997326631001009102">"Číslo zostavy"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adresa Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nie je k dispozícii"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Stav"</string>
     <string name="device_status" msgid="267298179806290920">"Stav"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Licencia"</string>
     <string name="terms_title" msgid="5201471373602628765">"Zmluvné podmienky"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licencia systému WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licencie systému WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Tapety"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Poskytovatelia satelitných snímok:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencie tretích strán"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Pri načítavaní licencií sa vyskytla chyba."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Načítava sa…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="few">Ešte <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroky a bude z vás vývojár.</item>
+      <item quantity="many">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer.</item>
+      <item quantity="other">Ešte <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> krokov a bude z vás vývojár.</item>
+      <item quantity="one">Ešte <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> krok a bude z vás vývojár.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Teraz ste vývojár!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nie je to potrebné, už ste vývojár."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Pre vývojárov"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Obnovenie možností"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Obnovenie siete, aplikácií alebo zariadenia"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Obnoviť sieť"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Týmto obnovíte všetky sieťové nastavenia vrátane:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobilné dáta"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Vymazať všetky eSIM karty vo vozidle"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Vaša tarifa nebude zrušená."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM karty sa nedajú obnoviť"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Vyberte sieť"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Obnoviť nastavenia"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Obnoviť?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Chcete obnoviť všetky sieťové nastavenia? Toto akciu nie je možné vrátiť späť."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Obnoviť nastavenia"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Sieťové nastavenia boli obnovené"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Obnoviť predvoľby aplikácií"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Táto akcia resetuje predvoľby pre:\n\n"<li>"Zakázané aplikácie"</li>\n<li>"Upozornenia zakázaných aplikácií"</li>\n<li>"Predvolené aplikácie pre akcie"</li>\n<li>"Obmedzenia dát v pozadí pre aplikácie"</li>\n<li>"Akékoľvek obmedzenia povolení"</li>\n\n"Nestratíte žiadne dáta aplikácií."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Obnoviť aplikácie"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Predvoľby aplikácií boli obnovené"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Vymazať dáta (obnova výr. nastavení)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Týmto vymažete všetky údaje z autorádia vozidla, napríklad:\n\n"<li>"svoj účet Google,"</li>\n<li>"údaje aj nastavenia systému a aplikácií,"</li>\n<li>"stiahnuté aplikácie."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Aktuálne ste prihlásený/-á do nasledujúcich účtov:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"V tomto vozidle sú ďalší používatelia."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Resetovať vozidlo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Chcete resetovať?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Chcete vymazať všetky osobné údaje a stiahnuté aplikácie? Túto akciu nebude možné vrátiť späť."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Vymazať všetko"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Prebieha vymazávanie"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Čakajte…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Dátum a čas"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Nastavenie dátumu a času"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Nastaviť dátum, čas, časové pásmo a formáty"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Zoradiť podľa časového pásma"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Dátum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Čas"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Pridanie používateľa"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Pridať účet"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Odstránenie používateľa"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nový používateľ"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Hosť"</string>
     <string name="user_admin" msgid="1535484812908584809">"Správca"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Prihlásený/-á ako správca"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Všetky povolenia správcu"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Nastaviť ako správcu"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Používateľ bude môcť odstrániť ostatných používateľov (vrátane správcov) a obnoviť systém do výrobných nastavení."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Túto akciu nie je možné vrátiť späť."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Áno, nastaviť ako správcu"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Vytvorenie nových používateľov"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefonovanie"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS cez mobilné dáta auta"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Inštalácia nových aplikácií"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Odinštalovanie aplikácií"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Pridanie používateľa"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nový používateľ"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Pridať nového používateľa?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Akýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Dosiahnutý limit počtu používateľov"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="few">Môžete vytvoriť až <xliff:g id="COUNT">%d</xliff:g> používateľov.</item>
+      <item quantity="many">You can create up to <xliff:g id="COUNT">%d</xliff:g> users.</item>
+      <item quantity="other">Môžete vytvoriť až <xliff:g id="COUNT">%d</xliff:g> používateľov.</item>
+      <item quantity="one">Môžete vytvoriť iba jedného používateľa.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Vytvorenie nového používateľa zlyhalo"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Odstrániť používateľa?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Všetky aplikácie a údaje budú odstránené."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Používateľa sa nepodarilo odstrániť."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Zavrieť"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Skúsiť znova"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Odstrániť posledného používateľa?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Po odstránení posledného zostávajúceho používateľa tohto auta sa vytvorí nový správca."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Všetky údaje, nastavenia a aplikácie priradené k tomuto používateľovi budú odstránené. Budete musieť znova nastaviť systém."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Výber nového správcu"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Potrebujete aspoň jedného správcu. Ak chcete tohto odstrániť, najprv vyberte jeho náhradníka."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Vybrať správcu"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Hosť"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Hosť"</string>
     <string name="user_switch" msgid="6544839750534690781">"Prepnúť"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vy (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Meno"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nenastavené"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Úprava používateľského mena"</string>
     <string name="users_list_title" msgid="770764290290240909">"Používatelia"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Povolenia používateľa %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Účty"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Používateľ"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Pridať účet"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Neboli pridané žiadne účty"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Účty používateľa <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Automaticky synchronizovať údaje"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Umožniť aplikáciám automaticky obnovovať údaje"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Zapnúť automat. synchr. údajov?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Všetky zmeny vykonané v účtoch na webe sa automaticky skopírujú do vášho zariadenia.\n\nNiektoré účty môžu tiež automaticky skopírovať na web akékoľvek zmeny vykonané v telefóne. Týmto spôsobom funguje aj účet Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Vypnúť automat. synchr. údajov?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Toto nastavenie šetrí spotrebu dát a batérie. Na získanie najnovších informácií však budete musieť každý účet synchronizovať ručne. Nebudete tiež dostávať upozornenia na dostupné aktualizácie."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informácie o účte"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Pridanie účtu"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Pridanie účtu"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Odstrániť účet"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Chcete odstrániť účet?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Odstránením tohto účtu budú zo zariadenia odstránené aj všetky správy, kontakty a ďalšie dáta."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Správca túto zmenu zakázal"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Odstrániť používateľa?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Všetky aplikácie a dáta budú odstránené."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Používateľa sa nepodarilo odstrániť."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Skúsiť znova?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Odmietnuť"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Znova"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Pridať nového používateľa?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Akýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Účet sa nepodarilo odstrániť."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Synchronizácia účtu"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synchronizácia je zapnutá pre <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g> položiek"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synchronizácia je zapnutá pre všetky položky"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synchronizácia je vypnutá pre všetky položky"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synchronizácia je VYPNUTÁ"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Chyba synchronizácie"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Posledná synchronizácia: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synchronizuje sa…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Klepnutím synchronizujete (naposledy synchronizované: <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synchronizovať"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Zrušiť synchronizáciu"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Vyskytli sa problémy so synchronizáciou. Služba bude čoskoro obnovená."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Zabezpečenie"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zámka obrazovky"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Žiadna zámka"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Heslo"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Voľba typu zámku"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Možnosti zámky obrazovky"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Možnosti zámky"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Zadajte vzor"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Potvrdiť"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Nakresliť znova"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Nastavte zámku obrazovky"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Zvoľte si PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Vyberte vzor"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Zvoľte si heslo"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Zvoľte si heslo"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Aktuálna zámka obrazovky"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Z bezpečnostných dôvodov nastavte vzor"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Vymazať"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Bežné heslá zablokoval správca IT. Skúste iné heslo."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Vzostupná, zostupná alebo opakovaná sekvencia čísiel nie je povolená."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Možnosti zámky obrazovky"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : pred <xliff:g id="NUM_DAYS">%3$s</xliff:g> dňami"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Pridanie dôveryhodného zar."</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Dôveryhodné zar."</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> zariadenia</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> devices</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> zariadení</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> zariadenie</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Vaše zariadenie <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> po pripojení odomkne toto auto. Ak vám niekto zariadenie <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> vezme, pravdepodobne bude mať prístup do tohto zariadenia"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Potvrdiť"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Odstrániť dôveryhodné zariadenie"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Hotovo"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Nastavte dôveryhodné zariadenie pomocou sprievodnej aplikácie. Po nastavení budete môcť odomknúť profil používateľa, keď vozidlo rozpozná váš telefón"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Stiahnite v telefóne sprievodnú aplikáciu"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Vyberte v telefóne auto <xliff:g id="CAR_NAME">%1$s</xliff:g> a spárujte tak zariadenia"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock nemôže rozpoznať funkcie zabezpečenia tohto zariadenia. V záujme ochrany ponechá dôveryhodné zariadenie vaše auto odomknuté iba v prípade, že ste ho už odomkli. Dôveryhodné zariadenie môže ponechať vaše auto odomknuté, keď je nablízku, dokonca aj keď ho drží iná osoba."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Pridanie dôveryhodného zariadenia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Dôveryhodné zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bolo úspešne pridané"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> sa nepodarilo zaregistrovať"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ak chcete pridať dôveryhodné zariadenie, musíte v ďalšom kroku nastaviť spôsob overenia. Ak nemáte dôveryhodné zariadenie pri sebe, prístup do vášho profilu bude možný až po overení."</string>
     <string name="forget" msgid="3971143908183848527">"Odstrániť"</string>
+    <string name="connect" msgid="5861699594602380150">"Pripojiť"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Odpojiť"</string>
     <string name="delete_button" msgid="5840500432614610850">"Odstrániť"</string>
     <string name="remove_button" msgid="6664656962868194178">"Odstrániť"</string>
     <string name="cancel" msgid="750286395700355455">"Zrušiť"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Ukončenie ukážkového režimu"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ukážkový účet bude odstránený a systém sa obnoví do výrobných nastavení. Všetky dáta používateľa budú stratené."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Ukončiť ukážku"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"dokončiť nastavenie"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"teraz nie"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ODMIETNUŤ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkcia nie je k dispozícii za jazdy."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Za jazdy nie je možné pridať používateľa."</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 41726ac..41af707 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"zatemnitev zaslona, zaslon na dotik, akumulator"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"zatemnitev zaslona, noč, obarvanje"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nočni način"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Omrežje in internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilno omrežje"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Prenos pod. v mobilnem omrežju"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Dostop do podatkov prek mobilnega omrežja"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Želite izklopiti prenos pod. v mobilnih omrežjih?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Prenesena količina podatkov"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Opozorilo in omejitev za prenos podatk."</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cikel porabe podatkov aplikacije"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Nastavi opoz. za prenos podat."</string>
+    <string name="data_warning" msgid="116776633806885370">"Opozorilo o prenosu podatkov"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Nastavi omejitev prenosa pod."</string>
+    <string name="data_limit" msgid="227338836292511425">"Omejitev prenosa podatkov"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Omejitev prenesene količine podatkov"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Glavna enota vozila bo izklopila prenos podatkov v mobilnih omrežjih, ko bo dosežena nastavljena omejitev.\n\nKer količino prenesenih podatkov meri glavna enota, operater pa jo morda drugače, priporočamo, da nastavite nekoliko manjšo omejitev."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Nastavitev in upravljanje brezžičnih dostopnih točk"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Vklapljanje povezave Wi‑Fi …"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Izklapljanje povezave Wi‑Fi …"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Nalaganje seznama omrežij Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi je onemogočen"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Pozabljanje omrežja ni uspelo"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Vzpostavljanje povezave z omrežjem ni uspelo"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Dodaj omrežje"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi je onemogočen"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Poveži"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Geslo"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Prikaži geslo"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Ime omrežja"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Vnesite SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Varnost"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Moč signala"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Moč signala"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Stanje"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Hitrost povezave"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvenca"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Naslov IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Pokaži geslo"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Vnesite ime omrežja"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Vnesite geslo"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Šibka"</item>
-    <item msgid="2032262610626057081">"Kar dobra"</item>
-    <item msgid="3859756017461098953">"Dobra"</item>
-    <item msgid="1521103743353335724">"Odlična"</item>
+    <item msgid="7683058295076342057">"Šibka"</item>
+    <item msgid="1639222824821660744">"Kar dobra"</item>
+    <item msgid="1838705897358163300">"Dobra"</item>
+    <item msgid="6067166649320533751">"Odlična"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Vklop Bluetootha"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth je onemogočen"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"O omrežju"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Naslov MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Naslov IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska podomrežja"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Naslovi IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Prehod"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Nastavitve za Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Samodejno vklopi Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi se vklopi v bližini zanesljivih shr. omrežij, npr. domačega omrežja"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Ni na voljo, ker je lokacija izklopljena. Vklopite "<annotation id="link">"lokacijo"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Želite vklopiti iskanje omrežij Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Vklop"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Iskanje omrežij Wi‑Fi je vklopljeno"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Samodejno preklopi na prenos podatkov v mobilnih omrežjih"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Uporaba prenosa podatkov v mobilnih omrežjih, če omrežje Wi-Fi nima dostopa do interneta. Pri tem bodo morda nastali stroški prenosa podatkov v mobilnih omrežjih."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Več o tem"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Upravljanje povezav, nastavitev imena naprave in vidnosti"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Računalnik"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Slušalke z mikrofonom"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Naprava za zajem slik"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Slušalka"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Zunanja dodatna oprema"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Seznanjene naprave"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Razpoložljive naprave"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Ni seznanjenih naprav"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nobena naprava ni na voljo"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Seznanjena naprava"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Ime"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Uporaba za"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Spremenite ime naprave Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Neimenovana naprava"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Seznanjene naprave"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Seznanitev nove naprave"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth bo vklopljen, da bo omogočeno seznanjanje"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Prekinitev povezave z napravo?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Povezava vozila z napravo <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bo prekinjena."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Naslov Bluetooth vozila: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Naslov Bluetooth naprave: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Ime vozila"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Preimenovanje tega vozila"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Preimenovanje naprave"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Preimenuj"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Razpoložljive naprave"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profili"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Zahteva za seznanitev naprave Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Seznanitev in povezava"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Koda za seznanitev naprave Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Koda PIN vsebuje črke ali simbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Vnesite kodo za seznanjanje in nato pritisnite Return ali Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Običajno 0000 ali 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Zahteva za seznanitev"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Dotaknite se, če želite opraviti seznanitev z napravo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Jeziki"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Jeziki in vnos"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tipkovnica"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Upravljanje tipkovnic"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Pretvorba besedila v govor"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Prednostni mehanizem"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Trenutni mehanizem"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Hitrost govora"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Višina tona"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Ponastavi"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Zvok"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Glasnost zvonjenja"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Glasnost navigacije"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Predstavnost"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Nastavi glasnost za glasbo in video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ton zvonjenja telefona"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Privzeti zvok obvestila"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Privzeti zvok alarma"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikacije in obvestila"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Pokaži vse aplikacije"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Privzete aplikacije"</string>
     <string name="applications_settings" msgid="794261395191035632">"Podatki o aplikaciji"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Prisilna ustavitev"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Želite prisilno ustaviti aplikacijo?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Če prisilno ustavite aplikacijo, morda ne bo pravilno delovala."</string>
     <string name="disable_text" msgid="4358165448648990820">"Onemogoči"</string>
     <string name="enable_text" msgid="1794971777861881238">"Omogoči"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Odmesti"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Če onemogočite to aplikacijo, Android in druge aplikacije morda ne bodo več delovali, kot bi morali."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Onemogočanje aplikacije"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Dovoljenja"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Različica: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ni odobrenih dovoljenj"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ni zahtevanih dovoljenj"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Prenes. količina podatkov"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Pren. kol. podat. aplik."</string>
-    <string name="force_stop" msgid="2153183697014720520">"Prisilna ustavitev"</string>
     <string name="computing_size" msgid="5791407621793083965">"Izračunavanje …"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dodatno dovoljenje</item>
@@ -117,15 +168,39 @@
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dodatna dovoljenja</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dodatnih dovoljenj</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Pomočnik in glasovni vnos"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplikacija za pomoč"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Uporaba besedila na zaslonu"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Aplikaciji za pomoč dovoli dostop do vsebine na zaslonu v obliki besedila"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Uporaba posnetka zaslona"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Aplikaciji za pomoč dovoli dostop do posnetka zaslona"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Storitev samodejnega izpolnjevanja"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Brez"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Izbrano"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Pomočnik bo lahko bral podatke o aplikacijah, ki se uporabljajo v vašem sistemu, vključno s podatki, ki so vidni na zaslonu ali do katerih je mogoče dostopati v aplikacijah."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Prepričajte se, ali zaupate tej aplikaciji&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Samodejno izpolnjevanje&gt;%1$s&lt;/xliff:g&gt; iz elementov na zaslonu ugotovi, kaj je mogoče samodejno izpolniti."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Dodaj storitev"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokacija"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nedavne zahteve za lokacijo"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Ni nedavnih zahtev za lokacijo"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Dovoljenja na ravni aplikacije"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Iskanje"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Lokacijske storitve"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Iskanje omrežij Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Aplikacijam in storitvam omogoči, da kadar koli iščejo omrežja Wi-Fi v bližini, tudi ko je Wi-Fi izklopljen. To funkcijo lahko na primer uporabite, če želite izboljšati funkcije in storitve, ki pri delovanju uporabljajo lokacijo."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Iskanje naprav Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Aplikacijam in storitvam omogoči, da kadar koli iščejo naprave v bližini, tudi ko je Bluetooth izklopljen. To funkcijo lahko na primer uporabite, če želite izboljšati funkcije in storitve, ki pri delovanju uporabljajo lokacijo."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Sistemske posodobitve"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Posodobitve sistema"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Različica Androida"</string>
     <string name="security_patch" msgid="4794276590178386903">"Raven popravkov za varnost v Androidu"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Različica radijske programske opreme"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Različica jedra"</string>
     <string name="build_number" msgid="3997326631001009102">"Delovna različica"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Naslov vmesnika Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ni na voljo"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Stanje"</string>
     <string name="device_status" msgid="267298179806290920">"Stanje"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Avtorske pravice"</string>
     <string name="license_title" msgid="936705938435249965">"Licenca"</string>
     <string name="terms_title" msgid="5201471373602628765">"Določila in pogoji"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licenca za WebView v sistemu"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Sistemske licence za spletni pogled"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Ozadja"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Ponudniki satelitskih posnetkov: \n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licence drugih ponudnikov"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Težava pri nalaganju licenc."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Nalaganje …"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak vas loči od tega, da postanete razvijalec.</item>
+      <item quantity="two"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vas ločita od tega, da postanete razvijalec.</item>
+      <item quantity="few"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraki vas ločijo od tega, da postanete razvijalec.</item>
+      <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korakov vas loči od tega, da postanete razvijalec.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Zdaj ste razvijalec."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Ni treba, ker ste že razvijalec."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Možnosti za razvijalce"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Ponastavitev možnosti"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Ponastavitev omrežja, aplikacij ali naprave"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Ponastavi omrežje"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"S tem boste ponastavili vse omrežne nastavitve, med drugim tudi:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Prenos podatkov v mobilnem omrežju"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Izbris vseh kartic eSIM za vozilo"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"S tem ne boste prekinili naročniškega paketa pri operaterju."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Kartic e-SIM ni mogoče ponastaviti"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Izbira omrežja"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Ponastavi nastavitve"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Želite ponastaviti?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Ali želite ponastaviti vse omrežne nastavitve? Tega dejanja ni mogoče razveljaviti."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Ponastavi nastavitve"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Omrežne nastavitve so ponastavljene"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Ponastavi nastavitve aplikacij"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"S tem bodo ponastavljene vse nastavitve za:\n\n"<li>" onemogočene aplikacije,"</li>\n<li>" obvestila za onemogočene aplikacije,"</li>\n<li>" privzete aplikacije za dejanja,"</li>\n<li>" omejitev prenosa podatkov v ozadju za aplikacije,"</li>\n<li>" omejitve dovoljenj."</li>\n\n" Podatkov aplikacij ne boste izgubili."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Ponastavi aplikacije"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Nastavitve aplikacij so ponastavljene"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Izbriši vse podatke (pon. na tov. nast.)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"S tem boste iz glavne enote vozila izbrisali vse podatke, med drugim:\n\n"<li>"Račun za Google"</li>\n<li>"Podatke in nastavitve sistema in aplikacij"</li>\n<li>"Prenesene aplikacije"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Trenutno ste prijavljeni v te račune:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"V tem vozilu so drugi uporabniki."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Ponastavi vozilo"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Želite ponastaviti?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Želite izbrisati vse osebne podatke in prenesene aplikacije? Tega dejanja ni mogoče razveljaviti."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Izbriši vse"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Brisanje"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Počakajte ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum in ura"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Nastavitev datuma in ure"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Nastavi datum, uro, časovni pas in oblike"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Razvrsti po časovnem pasu"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Ura"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodajanje uporabnika"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj račun"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Brisanje uporabnika"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Nov uporabnik"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
     <string name="user_admin" msgid="1535484812908584809">"Skrbnik"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Prijavljeni ste kot skrbnik"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Vsa dovoljenja za skrbnika"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Spremeni v skrbnika"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Uporabnik bo lahko brisal uporabnike, vključno s skrbniki, ter sistem ponastavil na tovarniške nastavitve."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Dejanja ne bo mogoče preklicati."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Da, spremeni v skrbnika"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Ustvarjanje novih uporabnikov"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefoniranje"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Sporočanje prek mob. povezave avta"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Namestitev novih aplikacij"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Odstranitev aplikacij"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Dodajanje uporabnika"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Nov uporabnik"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Dodaj. novega uporabnika?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Vsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Omejitev uporabnikov je dosežena"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> uporabnika.</item>
+      <item quantity="two">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> uporabnika.</item>
+      <item quantity="few">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> uporabnike.</item>
+      <item quantity="other">Ustvariti je mogoče do <xliff:g id="COUNT">%d</xliff:g> uporabnikov.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Ni uspelo ustvariti novega uporabnika."</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Izbris tega uporabnika?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Vse aplikacije in vsi podatki bodo izbrisani."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Brisanje uporabnika ni uspelo."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Opusti"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Poskusi znova"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Izbris zadnj. uporabnika?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Po izbrisu edinega preostalega uporabnika za ta avtomobil bo ustvarjen nov skrbnik."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Vsi podatki, nastavitve in aplikacije, povezani s tem uporabnikom, bodo izbrisani. Znova boste morali nastaviti sistem."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Izberite novega skrbnika"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Potrebujete vsaj enega skrbnika. Če želite izbrisati tega, najprej izberite zamenjavo."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Izberite skrbnika"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gost"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gost"</string>
     <string name="user_switch" msgid="6544839750534690781">"Preklop"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Vi (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ime"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Uporabnik ni nastavljen"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Urejanje imena uporabnika"</string>
     <string name="users_list_title" msgid="770764290290240909">"Uporabniki"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Dovoljenja, odobrena osebi %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Računi"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Uporabnik"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Dodaj račun"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Dodan ni bil noben račun"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Računi uporabnika <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Samodejno sinhroniziranje podatkov"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Omogoči, da aplikacije samodejno osvežijo podatke"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Vklop samodej. sinhr. podatkov?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Morebitne spremembe v računih, ki jih naredite v spletu, bodo samodejno kopirane v telefon.\n\nNekateri računi morda tudi samodejno kopirajo morebitne spremembe, ki jih naredite v telefonu, v splet. Tako deluje račun za Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Izklop samodej. sinhr. podatkov?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"S tem boste varčevali s prenosom podatkov, vendar boste morali vsak posamezen račun sinhronizirati ročno, da dobite najnovejše podatke. Prav tako ne boste prejeli obvestil, ko bodo na voljo posodobitve."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Podatki o računu"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Dodajanje računa"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Dodajanje računa"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Odstrani račun"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Želite odstraniti račun?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Z odstranitvijo računa boste iz naprave izbrisali vsa sporočila, stike in druge podatke v računu."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Skrbnik ne dovoli te spremembe"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Odstranitev uporabnika?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Vse aplikacije in vsi podatki bodo izbrisani."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Odstranitev uporabnika ni uspela."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Želite poskusiti znova?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Opusti"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Poskusi znova"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Dodaj. novega uporabnika?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Vsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Odstranitev računa ni uspela."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sinhronizacija računa"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinhronizacija je vklopljena za <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g> elementov"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinhronizacija je vklopljena za vse elemente"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinhronizacija je izklopljena za vse elemente"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinhronizacija je IZKLOPLJENA"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Napaka pri sinhronizaciji"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Zadnje sinhroniziranje: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinhroniziranje ..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Dotaknite se za sinhronizacijo<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinhroniziraj"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Prekliči sinhronizacijo"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Težava pri sinhronizaciji. Kmalu bo spet na voljo."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Varnost"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Zaklepanje zaslona"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Brez"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Koda PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Geslo"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Izbira vrste zaklep."</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Možnosti zaklepanja zaslona"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Možnosti zaklepanja"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Vnesite vzorec"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Potrdi"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Znova nariši"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Nastavite zaklepanje zaslona"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Izbira kode PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Izberite vzorec"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Izbira gesla"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Izbira gesla"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Trenutno zaklepanje zaslona"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Nastavite vzorec za večjo varnost"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Počisti"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Skrbnik za IT je blokiral pogosta gesla. Poskusite z drugim geslom."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Naraščajoč, padajoč ali ponavljajoč se niz števk je prepovedan."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Možnosti zaklepanja zaslona"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: pred toliko dnevi: <xliff:g id="NUM_DAYS">%3$s</xliff:g>"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Dodaj zaupanja vredno napravo"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Zaup. vredne naprave"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> naprava</item>
+      <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> napravi</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> naprave</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> naprav</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Naprava <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> bo odklenila ta avtomobil, ko je povezana. Če vam kdo vzame napravo <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, lahko ta oseba morda dostopa do nje."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Potrdi"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Odstrani zaupanja vredno napravo"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Končano"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"S spremljevalno aplikacijo nastavite zaupanja vredno napravo. Ko je nastavljena, lahko profil uporabnika odklenete, ko vozilo zazna vaš telefon."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. V telefon prenesite spremljevalno aplikacijo"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Če želite seznaniti napravi, v telefonu izberite avtomobil <xliff:g id="CAR_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Funkcija Smart Lock ne zazna varnostnih funkcij te naprave. Zaradi boljše zaščite avtomobila zaupanja vredna naprava prepreči zaklepanje avtomobila šele, ko ga odklenete vi. Zaupanja vredna naprava prepreči zaklepanje avtomobila, ko je v bližini, tudi če jo ima v rokah kdo drug."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Dodajanje naprave <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kot zaupanja vredno napravo"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Naprava <xliff:g id="DEVICE_NAME">%1$s</xliff:g> je uspešno dodana kot zaupanja vredna naprava"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Včlanitev naprave <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ni uspela"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Če želite dodati zaupanja vredno napravo, morate nato nastaviti način za preverjanje pristnosti. Če zaupanja vredne naprave nimate pri sebi, boste morali preveriti pristnost, če boste želeli dostopati do profila."</string>
     <string name="forget" msgid="3971143908183848527">"Pozabi"</string>
+    <string name="connect" msgid="5861699594602380150">"Poveži"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Prekini povezavo"</string>
     <string name="delete_button" msgid="5840500432614610850">"Izbriši"</string>
     <string name="remove_button" msgid="6664656962868194178">"Odstrani"</string>
     <string name="cancel" msgid="750286395700355455">"Prekliči"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Zapri predstavitveni način"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"S tem izbrišete predstavitveni račun in ponastavite sistem na tovarniške nastavitve. Vsi uporabniški podatki bodo izgubljeni."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Zapri predstavitev"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"dokončaj nastavitev"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ne zdaj"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"OPUSTI"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funkcija med vožnjo ni na voljo."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Med vožnjo ni mogoče dodati uporabnika."</string>
 </resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 6f3214e..471a538 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"zbeh ekranin, ekran me prekje, bateri"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"errëso ekranin, natë, ngjyrosje"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Modaliteti i natës"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Rrjeti dhe interneti"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Rrjeti celular"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Të dhënat celulare"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Qasu te të dhënat duke përdorur rrjetin celular"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Të çaktivizohen të dhënat celulare?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Përdorimi i të dhënave"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Paralajmërimi dhe kufiri i të dhënave"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cikli i përd. të të dhënave të apl."</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Cakto paralajm. për të dhënat"</string>
+    <string name="data_warning" msgid="116776633806885370">"Paralajmërim për të dhënat"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Cakto kufirin e të dhënave"</string>
+    <string name="data_limit" msgid="227338836292511425">"Kufiri i të dhënave"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Kufizimi i përdorimit të të dhënave"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Njësia kryesore e automjetit tënd do t\'i çaktivizojë të dhënat celulare kur të arrihet kufiri që cakton ti.\n\nMeqenëse përdorimi i të dhënave matet nga njësia kryesore dhe operatori celular mund ta llogarisë ndryshe përdorimin, ki parasysh të vendosësh një kufi të menduar mirë."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Cakto dhe menaxho zonat e qasjes të rrjetit me valë"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Po aktivizon Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Po çaktivizon Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Ngarko listën e Wi-Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi i çaktivizuar"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Dështoi në harrimin e rrjetit"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Lidhja me rrjetin dështoi"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Shto një rrjet"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi i çaktivizuar"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Lidhu"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Fjalëkalimi"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Shfaq fjalëkalimin"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Emri i rrjetit"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Fut SSID-në"</string>
     <string name="wifi_security" msgid="158358046038876532">"Siguria"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Fuqia e sinjalit"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Fuqia e sinjalit"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Statusi"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Shpejtësia e lidhjes"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekuenca"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Adresa e IP-së"</string>
+    <string name="show_password" msgid="2074628020371139240">"Shfaq fjalëkalimin"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Fut emrin e rrjetit"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Fut fjalëkalimin"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"I dobët"</item>
-    <item msgid="2032262610626057081">"Pak i dobët"</item>
-    <item msgid="3859756017461098953">"I mirë"</item>
-    <item msgid="1521103743353335724">"I shkëlqyer"</item>
+    <item msgid="7683058295076342057">"I dobët"</item>
+    <item msgid="1639222824821660744">"Pak i dobët"</item>
+    <item msgid="1838705897358163300">"I mirë"</item>
+    <item msgid="6067166649320533751">"I shkëlqyer"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Aktivizo Bluetooth-in"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth-i u çaktivizua"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Detajet e rrjetit"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Adresa e MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Adresa e IP-së"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Maska e nënrrjetit"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Adresat IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Porta e kalimit"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Preferencat e Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Aktivizo automatikisht Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi do të aktivizohet përsëri në afërsi të rrjeteve të ruajtura me cilësi të lartë, si p.sh. rrjetin e shtëpisë"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Nuk ofrohet sepse vendndodhja është e çaktivizuar. Aktivizo "<annotation id="link">"vendndodhjen"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Të aktivizohet skanimi për Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aktivizo"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Skanimi i Wi‑Fi është aktivizuar"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Kalo automatikisht te të dhënat celulare"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Përdor të dhënat celulare kur Wi-Fi nuk ka qasje në internet. Mund të zbatohen tarifa për të dhënat."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Mëso më shumë"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Menaxho lidhjet, cakto emrin e pajisjes dhe zbulueshmërinë"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Kompjuteri"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Kufje me mikrofon"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefoni"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imazhe"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Kufje"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Hyrje periferike"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Pajisjet e çiftuara"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Pajisjet e disponueshme"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Nuk ka pajisje të çiftuara"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Nuk ofrohen pajisje"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Pajisja e çiftuar"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Emri"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Përdore për"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Ndrysho emrin e pajisjes Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Pajisje e paemërtuar"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Pajisjet e çiftuara"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Çifto pajisjen e re"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth-i do të aktivizohet për çiftimin"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Të shkëputet pajisja?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Automjeti yt do të shkëputet nga <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Adresa e Bluetooth-it e automjetit: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Adresa e Bluetooth-it e pajisjes: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Emri i automjetit"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Riemërto këtë automjet"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Riemërto pajisjen"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Riemërto"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Pajisjet që ofrohen"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profilet"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Kërkesë çiftimi me Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Ҫifto dhe lidh"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Kodi i çiftimit të Bluetooth-it"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Kodi PIN përmban shkronja ose simbole"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Shkruaj kodin e çiftimit, pastaj shtyp \"Kthehu\" ose \"Hyr\""</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Zakonisht 0000 ose 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Kërkesa e çiftimit"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Trokit për ta çiftuar me <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Gjuhët"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Gjuhët dhe të dhënat"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tastiera"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Menaxho tastierat"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Dalja \"tekst-në-ligjërim\""</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Motori i preferuar"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Motori aktual"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Shpejtësia e të folurit"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tonaliteti"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Rivendos"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Tingulli"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volumi i ziles"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volumi i navigimit"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Cakto volumin për muzikë dhe video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Zilja e telefonit"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Tingulli i parazgjedhur i njoftimit"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Tingulli i parazgjedhur i alarmit"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aplikacionet dhe njoftimet"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Shfaq të gjitha aplikacionet"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Aplikacionet e parazgjedhura"</string>
     <string name="applications_settings" msgid="794261395191035632">"Informacioni mbi aplikacionin"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Ndalo me forcë"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Të ndalohet me forcë?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Nëse e ndalon me forcë një aplikacion, ai mund të përjetojë çrregullime në funksionim."</string>
     <string name="disable_text" msgid="4358165448648990820">"Çaktivizo"</string>
     <string name="enable_text" msgid="1794971777861881238">"Aktivizo"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Çinstalo"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Nëse e çaktivizon këtë aplikacion, Android dhe aplikacionet e tjera mund të mos funksionojnë më siç pritet."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Çaktivizo aplikacionin"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Lejet"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versioni: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Nuk është dhënë leje"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Nuk është kërkuar leje"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Përdorimi i të dhënave"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Përdorimi i të dhënave"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Ndalo me forcë"</string>
     <string name="computing_size" msgid="5791407621793083965">"Po llogarit…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> autorizime shtesë</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> autorizim shtesë</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistenti dhe hyrja zanore"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Aplikacioni i asistentit"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Përdor tekstin nga ekrani"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Lejo që aplikacioni i asistentit të qaset te përmbajtjet e ekranit si tekst"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Përdor pamjen e ekranit"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Lejo që aplikacioni i asistentit të qaset te një imazh i ekranit"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Shërbimi i plotësimit automatik"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Asnjë"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"I zgjedhur"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asistenti do të jetë në gjendje të lexojë informacion rreth aplikacioneve në përdorim në sistemin tënd, duke përfshirë informacionin e dukshëm në ekran ose të qasshëm brenda aplikacioneve."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Sigurohu që ke besim te ky aplikacion&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=\"Plotësimi automatik i Google\"&gt;%1$s&lt;/xliff:g&gt; përdor atë që ndodhet në ekranin tënd për të përcaktuar se çfarë mund të plotësohet automatikisht."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Shto shërbim"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Vendndodhja"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Kërkesat e vendndodhjeve të fundit"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Nuk ka kërkesa të vendndodhjeve të fundit"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Autorizimet në nivel aplikacioni"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Skanimi"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Shërbimet e vendndodhjes"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Skanimi i Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Lejo që aplikacionet dhe shërbimet të skanojnë për rrjete Wi-Fi në çdo moment, edhe kur Wi-Fi është joaktiv. Kjo mund të përdoret, për shembull, për të përmirësuar funksionet dhe shërbimet e bazuara te vendndodhja."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Skanimi i Bluetooth-it"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Lejo që aplikacionet dhe shërbimet të skanojnë për pajisje në afërsi në çdo moment, edhe kur Bluetooth është joaktiv. Kjo mund të përdoret, për shembull, për të përmirësuar funksionet dhe shërbimet e bazuara te vendndodhja."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistemi"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Përditësimet e sistemit"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Përditësimet e sistemit"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Versioni i Android-it"</string>
     <string name="security_patch" msgid="4794276590178386903">"Niveli i korrigjimit të sigurisë së Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modeli"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Versioni i brezit të bazës"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Versioni i bërthamës"</string>
     <string name="build_number" msgid="3997326631001009102">"Numri i ndërtimit"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Adresa e Bluetooth-it"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Nuk ofrohet"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Statusi"</string>
     <string name="device_status" msgid="267298179806290920">"Statusi"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Të drejtat e autorit"</string>
     <string name="license_title" msgid="936705938435249965">"Licenca"</string>
     <string name="terms_title" msgid="5201471373602628765">"Kushtet e përgjithshme"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Licenca e WebView në sistem"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Licencat e WebView të sistemit"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Imazhet e sfondit"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Ofruesit e imazheve satelitore:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licencat e palëve të treta"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ka një problem me ngarkimin e licencave."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Po ngarkohet…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Tani të duhen edhe <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> hapa që të bëhesh një zhvillues</item>
+      <item quantity="one">Tani të duhet edhe <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> hap që të bëhesh një zhvillues</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Tani je një zhvillues!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Nuk ka nevojë, ti je tashmë një zhvillues."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Opsionet e zhvilluesit"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Opsionet e rivendosjes"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Rivendosja e rrjetit, aplikacioneve ose pajisjes"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Rivendos rrjetin"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Kjo do të rivendosë të gjitha cilësimet e rrjetit, duke përfshirë:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Të dhënat celulare"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Spastro të gjitha kartat eSIM të automjetit"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Kjo nuk do të anulojë planin tënd të shërbimit."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Kartat eSIM nuk mund të rivendosen"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Zgjidh rrjetin"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Rivendos cilësimet"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Të rivendoset?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Të rivendosen të gjitha cilësimet e rrjetit? Ky veprim nuk mund të zhbëhet!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Rivendos cilësimet"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Cilësimet e rrjetit janë rivendosur"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Rivendos preferencat e aplikacionit"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Kjo do t\'i rivendosë të gjitha preferencat për:\n\n"<li>" Aplikacionet e çaktivizuara"</li>\n<li>" Njoftimet e aplikacioneve të çaktivizuara"</li>\n<li>" Aplikacionet e parazgjedhura për veprimet"</li>\n<li>" Kufizimet e të dhënave në sfond për aplikacionet"</li>\n<li>" Çdo kufizim të autorizimeve"</li>\n\n" Nuk do të humbësh asnjë të dhënë aplikacioni."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Rivendos aplikacionet"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Preferencat e aplikacioneve janë rivendosur"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Spastro të gjitha të dhënat (rivendosja e fabrikës)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Kjo do të spastrojë të gjitha të dhënat nga njësia kryesore e automjetit tënd, duke përfshirë:\n\n"<li>"Llogarinë tënde të Google"</li>\n<li>"Të dhënat dhe cilësimet e sistemit dhe të aplikacioneve"</li>\n<li>"Aplikacionet e shkarkuara"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Je i identifikuar aktualisht në llogaritë e mëposhtme:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Ka përdorues të tjerë të pranishëm në këtë automjet."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Rivendose automjetin"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Të rivendoset?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Të spastrohen të gjitha informacionet e tua personale dhe aplikacionet e shkarkuara? Ky veprim nuk mund të zhbëhet!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Spastroji të gjitha"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Po spastrohen"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Qëndro në pritje..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Data dhe ora"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Vendos datën dhe orën"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Cakto datën, orën, brezin orar dhe formatet"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Rendit sipas brezit orar"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Data"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Koha"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Shto përdorues"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Shto llogari"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Fshi përdoruesin"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Përdorues i ri"</string>
-    <string name="user_guest" msgid="3465399481257448601">"I ftuar"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administratori"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Identifikuar si administrator"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Të gjitha autorizimet e administratorit"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Bëje administrator"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Përdoruesi do të jetë në gjendje të fshijë përdoruesit, duke përfshirë administratorët e tjerë, si dhe të rivendosë sistemin në gjendje fabrike."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ky veprim është i pakthyeshëm."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Po, bëje administrator"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Krijo përdorues të rinj"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Kryej telefonata"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Mesazhet përmes të dhënave celulare të makinës"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Instalo aplikacione të reja"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Çinstalo aplikacione"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Shto përdorues"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Përdorues i ri"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Të shtohet përdoruesi i ri?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Çdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"U arrit kufiri i përdoruesve"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Mund të krijosh deri në <xliff:g id="COUNT">%d</xliff:g> përdorues.</item>
+      <item quantity="one">Mund të krijohet vetëm një përdorues.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Krijimi i një përdoruesi të ri dështoi"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Të fshihet ky përdorues?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Të gjitha aplikacionet dhe të dhënat do të fshihen."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Fshirja e përdoruesit dështoi."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Hiq"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Riprovo"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Të fshihet përdoruesi i fundit?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Pas fshirjes së përdoruesit të vetëm të mbetur për këtë makinë, do të krijohet një përdorues i ri administrator."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Të gjitha të dhënat, cilësimet dhe aplikacionet e lidhura me këtë përdorues do të fshihen. Do të duhet ta konfigurosh përsëri sistemin."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Zgjidh një administrator të ri"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Të duhet të paktën një administrator. Për ta fshirë këtë, në fillim zgjidh një zëvendësues."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Zgjidh administratorin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"I ftuar"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"I ftuar"</string>
     <string name="user_switch" msgid="6544839750534690781">"Ndërro"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Ti (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Emri"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Nuk është konfiguruar"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Redakto emrin e përdoruesit"</string>
     <string name="users_list_title" msgid="770764290290240909">"Përdoruesit"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Lejet që ka marrë %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Llogaritë"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Përdoruesi"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Shto llogari"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Nuk u shtua asnjë llogari"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Llogaritë për <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sinkronizo automatikisht të dhënat"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Lejo që aplikacionet t\'i rifreskojnë automatikisht të dhënat"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Të aktivizohen të dhënat e sinkronizimit automatik?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Çdo ndryshim që bën në llogaritë e tua në ueb do të kopjohet automatikisht te pajisja jote.\n\nDisa llogari mund të kopjojnë po ashtu automatikisht në ueb çdo ndryshim që bën në telefon, për ta sinkronizuar në ueb. Kështu funksionon \"Llogaria e Google\"."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Të çaktivizohen të dhënat e sinkronizimit automatik?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Kjo do të kursejë të dhënat, por për të mbledhur informacionet më të fundit, do të të duhet të sinkronizosh në mënyrë manuale çdo llogari. Dhe nuk do të marrësh njoftime kur të ndodhin përditësimet."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Informacionet e llogarisë"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Shto llogari"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Shto një llogari"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Hiq llogarinë"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Të hiqet llogaria?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Heqja e kësaj llogarie do të fshijë të gjitha mesazhet, kontaktet e saj dhe të dhëna të tjera nga pajisja!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Ky ndryshim nuk lejohet nga administratori"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Të fshihet ky përdorues?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Të gjitha aplikacionet dhe të dhënat do të fshihen."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Heqja e përdoruesit dështoi."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Do ta riprovosh?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Hiq"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Riprovo"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Të shtohet përdoruesi i ri?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Çdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Heqja e llogarisë dështoi."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Sinkronizimi i llogarisë"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinkronizimi është aktiv për <xliff:g id="ID_1">%1$d</xliff:g> nga <xliff:g id="ID_2">%2$d</xliff:g> artikuj"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinkronizimi aktiv për të gjithë artikujt"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinkronizimi joaktiv për të gjithë artikujt"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinkronizimi është JOAKTIV"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Gabim gjatë sinkronizimit"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Sinkronizuar për herë të fundit <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Po sinkronizon tani…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Trokit për ta sinkronizuar tani<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sinkronizo tani"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Anulo sinkronizimin"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sinkronizimi ka aktualisht probleme. Do të ofrohet sërish së shpejti."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Siguria"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kyçja e ekranit"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Asnjë"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Kodi PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Fjalëkalimi"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Zgjidh një lloj kyçjeje"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Opsionet e kyçjes së ekranit"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Opsionet e kyçjes"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Fut motivin"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Konfirmo"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Tërhiq sërish"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Cakto një kyçje të ekranit"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Zgjidh kodin PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Zgjidh motivin"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Zgjidh fjalëkalimin"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Zgjidh fjalëkalimin"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Kyçja aktuale e ekranit"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Për siguri, cakto një motiv"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Pastro"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Fjalëkalimet e zakonshme janë bllokuar nga administratori i TI-së. Provo një fjalëkalim tjetër."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Nuk lejohet një sekuencë shifrash në rritje, në zbritje ose me përsëritje."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Opsionet e kyçjes së ekranit"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ditë më parë"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Shto një pajisje të besuar"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Pajisjet e besuara"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pajisje</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> pajisje</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Pajisja jote <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> do ta shkyçë këtë makinë kur është e lidhur. Nëse dikush merr pajisjen tënde <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, mund të jetë në gjendje të ketë qasje te kjo pajisje"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Konfirmo"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Hiq pajisjen e besuar"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"U krye"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Përdor aplikacionin shoqërues për të konfiguruar një pajisje të besuar. Pasi të konfigurohet, do të jesh në gjendje të shkyçësh profilin tënd të përdoruesit kur telefoni yt të zbulohet nga automjeti"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Shkarko aplikacionin shoqërues në telefonin tënd"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Zgjidh <xliff:g id="CAR_NAME">%1$s</xliff:g> në telefon për të çiftuar pajisjet"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock nuk mund të zbulojë funksionet e sigurisë së kësaj pajisjeje. Për të ndihmuar në mbrojtjen e makinës sate, pajisja e besuar do të mund ta mbajë makinën tënde të shkyçur vetëm pasi të jetë shkyçur tashmë nga ti. Pajisja jote e besuar mund ta mbajë makinën tënde të shkyçur kur është në afërsi, edhe nëse e mban dikush tjetër."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Shtoje <xliff:g id="DEVICE_NAME">%1$s</xliff:g> si pajisje të besuar"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> u shtua me sukses si pajisje e besuar"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Regjistrimi i <xliff:g id="DEVICE_NAME">%1$s</xliff:g> dështoi"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Shtimi i një pajisjeje të besuar kërkon që të caktosh më pas një metodë vërtetimi. Nëse nuk e ke pajisjen e besuar me vete, do të kërkohet vërtetim për të pasur qasje te profili yt."</string>
     <string name="forget" msgid="3971143908183848527">"Harro"</string>
+    <string name="connect" msgid="5861699594602380150">"Lidh"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Shkëput"</string>
     <string name="delete_button" msgid="5840500432614610850">"Fshi"</string>
     <string name="remove_button" msgid="6664656962868194178">"Hiq"</string>
     <string name="cancel" msgid="750286395700355455">"Anulo"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Dil nga modaliteti i demonstrimit"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Kjo do të fshijë llogarinë e demonstrimit dhe sistemi do të rivendoset në të dhënat e fabrikës. Të gjitha të dhënat e përdoruesit do të humbasin."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Dil nga demonstrimi"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"përfundo konfigurimin"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"jo tani"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"HIQ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funksioni nuk ofrohet gjatë drejtimit të makinës."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Përdoruesi nuk mund të shtohet gjatë drejtimit të makinës"</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 5fff82a..4b43f98 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"затамнити екран, додирни екран, батерија"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"затамнити екран, ноћ, нијанса"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Ноћни режим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Мрежа и интернет"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобилна мрежа"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобилни подаци"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Користи податке преко мобилне мреже"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Желите ли да искључите мобилне податке?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Потрошња података"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Упозорење и ограничења за податке"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Циклус потрошње података апликације"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Подесите упозорења о подацима"</string>
+    <string name="data_warning" msgid="116776633806885370">"Упозорење на потрошњу података"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Подесите ограничења за податке"</string>
+    <string name="data_limit" msgid="227338836292511425">"Ограничење потрошње података"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ограничавање потрошње података"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Главна јединица у возилу ће искључити мобилне податке чим достигне ограничење које сте подесили.\n\nПошто потрошњу података мери главна јединица, а мобилни оператер може другачије да рачуна потрошњу, размислите о томе да подесите неко уобичајено ограничење."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Подешавајте бежичне приступне тачке и управљајте њима"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi се укључује..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi-Fi се искључује..."</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Учитава се Wi‑Fi листа"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi је онемогућен"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Брисање мреже није успело"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Повезивање са мрежом није успело"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Додај мрежу"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi је онемогућен"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Повежи се"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Лозинка"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Прикажи лозинку"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Назив мреже"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Унесите SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Безбедност"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Јачина сигнала"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Јачина сигнала"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Статус"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Брзина везе"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Фреквенција"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP адреса"</string>
+    <string name="show_password" msgid="2074628020371139240">"Прикажи лозинку"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Унесите назив мреже"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Унесите лозинку"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Слаба"</item>
-    <item msgid="2032262610626057081">"Задовољавајућа"</item>
-    <item msgid="3859756017461098953">"Добра"</item>
-    <item msgid="1521103743353335724">"Одлична"</item>
+    <item msgid="7683058295076342057">"Слаба"</item>
+    <item msgid="1639222824821660744">"Задовољавајућа"</item>
+    <item msgid="1838705897358163300">"Добра"</item>
+    <item msgid="6067166649320533751">"Одлична"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Укључи Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth је онемогућен"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d MB/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Детаљи о мрежи"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC адреса"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP адреса"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Маска подмреже"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 адресе"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Мрежни пролаз"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Подешавања Wi‑Fi-ја"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Аутоматски укључи Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi ће се поново укључити у близини сачуваних мрежа високог квалитета, као што је кућна мрежа"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Није доступно јер је локација искључена. Укључите "<annotation id="link">"локацију"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Желите ли да укључите Wi-Fi скенирање?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Укључи"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi скенирање је укључено"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Аутоматски пређи на мобилне податке"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Користите мобилне податке када Wi‑Fi нема приступ интернету. Може да вам буде наплаћена потрошња података."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Сазнајте више"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Управљајте везама, подешавајте назив и видљивост уређаја"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Рачунар"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Слушалице"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Телефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Обрада слика"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Слушалице"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Периферни уређај за унос"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Упарени уређаји"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Доступни уређаји"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Нема упарених уређаја"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Нема доступних уређаја"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Упарени уређај"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Назив"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Користите за"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Промените назив Bluetooth уређаја"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Неименовани уређај"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Упарени уређаји"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Упари нови уређај"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth ће се укључити ради упаривања"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Прекидате везу са уређајем?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Возило ће прекинути везу са уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth адреса возила: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth адреса уређаја: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Назив возила"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Преименујте ово возило"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Преименујте уређај"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Преименуј"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Доступни уређаји"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профили"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Захтев за Bluetooth упаривање"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Упари и повежи"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Кôд за упаривање са Bluetooth уређајем"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN садржи слова или симболе"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Унесите кôд за упаривање, па притисните Return или Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Обично 0000 или 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Захтев за упаривање"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Додирните да бисте упарили са уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Језици"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Језици и унос"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Тастатура"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Управљајте тастатурама"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Излаз за претв. текста у говор"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Жељени механизам"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Актуелни механизам"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Брзина говора"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Висина гласа"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Ресетуј"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Звук"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Јачина звука звона"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Јачина звука за навигацију"</string>
@@ -100,31 +140,66 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Медији"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Подесите јачину звука за музику и видео снимке"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Аларм"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Мелодија звона телефона"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Подразумевани звук обавештења"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Подразумевани звук аларма"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Aпликације и обавештења"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Прикажи све апликације"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Подразумеване апликације"</string>
     <string name="applications_settings" msgid="794261395191035632">"Информације о апликацији"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Принудно заустави"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Желите ли да принудно зауставите?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ако принудно зауставите апликацију, можда ће се понашати неочекивано."</string>
     <string name="disable_text" msgid="4358165448648990820">"Онемогући"</string>
     <string name="enable_text" msgid="1794971777861881238">"Омогући"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Деинсталирај"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ако онемогућите ову апликацију, Android и друге апликације можда више неће функционисати исправно."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Онемогући апликацију"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Дозволе"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Верзија: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Ниједна дозвола није одобрена"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Ниједна дозвола није захтевана"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Потрошња података"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Потрошња података аплик."</string>
-    <string name="force_stop" msgid="2153183697014720520">"Принудно заустави"</string>
     <string name="computing_size" msgid="5791407621793083965">"Израчунава се..."</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> додатна дозвола</item>
       <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> додатне дозволе</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> додатних дозвола</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Помоћник и гласовни унос"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Апликација за помоћ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Користи текст са екрана"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Дозволите апликацији за помоћ да приступи садржају екрана као тексту"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Користи снимак екрана"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Дозволите апликацији за помоћ да приступи слици екрана"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Услуга аутоматског попуњавања"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ништа"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Изабрано"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Помоћник ће моћи да чита информације о апликацијама које се користе у систему, укључујући информације видљиве на екрану или којима може да се приступа у оквиру апликација."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Уверите се да је ова апликација поуздана&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google аутоматско попуњавање&gt;%1$s&lt;/xliff:g&gt; користи садржај екрана за утврђивање података који могу аутоматски да се попуне."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Додајте услугу"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Локација"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Недавни захтеви за локацију"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Нема недавних захтева за локацију"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дозволе на нивоу апликација"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Скенирање"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Услуге локације"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi скенирање"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Дозволите апликацијама и услугама да траже Wi‑Fi мреже у било ком тренутку, чак и када је Wi‑Fi искључен. Ово може да се користи, на пример, за побољшање функција и услуга заснованих на локацији."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth скенирање"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Дозволите апликацијама и услугама да траже уређаје у близини у сваком тренутку, чак и када је Bluetooth искључен. Ово може да се користи, на пример, за побољшање функција и услуга заснованих на локацији."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Систем"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Ажурирања система"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Ажурирања система"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Верзија Android-а"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ниво безбедносне закрпе за Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Модел"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Верзија основног пропусног опсега"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Верзија језгра"</string>
     <string name="build_number" msgid="3997326631001009102">"Број верзије"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth адреса"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Није доступно"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Статус"</string>
     <string name="device_status" msgid="267298179806290920">"Статус"</string>
@@ -141,12 +216,50 @@
     <string name="copyright_title" msgid="4220237202917417876">"Ауторска права"</string>
     <string name="license_title" msgid="936705938435249965">"Лиценца"</string>
     <string name="terms_title" msgid="5201471373602628765">"Услови и одредбе"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Лиценца за системски WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Лиценце за системски WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Позадине"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Добављачи сателитских слика:\n©2014. CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Лиценце треће стране"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Дошло је до проблема при учитавању лиценци."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Учитава се…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Треба да обавите још <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> корак да бисте постали програмер.</item>
+      <item quantity="few">Треба да обавите још <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> корака да бисте постали програмер.</item>
+      <item quantity="other">Треба да обавите још <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> корака да бисте постали програмер.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Постали сте програмер!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Нема потребе, већ сте програмер."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Опције за програмере"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Опције за ресетовање"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Ресетовање мреже, апликација или уређаја"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Ресетуј мрежу"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Овим ресетујете сва подешавања мреже, укључујући:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi-Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобилни подаци"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Избриши све eSIM-ове возила"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Тиме нећете отказати тарифни пакет."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Ресетовање eSIM-ова није успело"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Изаберите мрежу"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Ресетуј подешавања"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Желите ли да ресетујете?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Желите ли да ресетујете сва подешавања мреже? Ова радња не може да се опозове!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Ресетуј подешавања"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Подешавања мреже су ресетована"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Ресетуј подешавања апликација"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Овим ће се ресетовати сва подешавања за:\n\n"<li>"Онемогућене апликације"</li>\n<li>"Обавештења о онемогућеним апликацијама"</li>\n<li>"Подразумеване апликације за радње"</li>\n<li>"Ограничења за позадинске податке за апликације"</li>\n<li>"Сва ограничења за дозволе"</li>\n\n"Нећете изгубити никакве податке апликације."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Ресетуј апликације"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Подешавања апликација су ресетована"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Обриши све податке"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Овим бришете све податке из интерне меморије возила, укључујући:\n\n"<li>"Google налог"</li>\n<li>"податке и подешавања система и апликација"</li>\n<li>"преузете апликације"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Тренутно сте пријављени на следеће налоге:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"У овом возилу су присутни и други корисници."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Ресетуј возило"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Желите ли да ресетујете?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Желите ли да обришете све личне податке и преузете апликације? Не можете да опозовете ову радњу!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Избриши све"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Брише се"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Сачекајте..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Датум и време"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Подесите датум и време"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Подесите датум, време, временску зону и формате"</string>
@@ -166,23 +279,60 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Сортирај према временској зони"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Датум"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Време"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Додај корисника"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Додај налог"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Избришите корисника"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Нови корисник"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Гост"</string>
     <string name="user_admin" msgid="1535484812908584809">"Администратор"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Пријављени сте као администратор"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Све дозволе за администратора"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Постави за администратора"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Корисник ће моћи да брише кориснике, укључујући остале администраторе, и да ресетује систем на фабричка подешавања."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Ова радња не може да се опозове."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Да, постави за администатора"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Направите нове кориснике"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Позивајте"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"SMS преко мобилних података аута"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Инсталирајте нове апликације"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Деинсталирајте апликације"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Додај корисника"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Нови корисник"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Додајете новог корисника?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Када додате новог корисника, та особа треба да подеси свој простор."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Сваки корисник може да ажурира апликације за све остале кориснике."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Достигнут максимални број корисника"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Можете да направите највише <xliff:g id="COUNT">%d</xliff:g> корисника.</item>
+      <item quantity="few">Можете да направите највише <xliff:g id="COUNT">%d</xliff:g> корисника.</item>
+      <item quantity="other">Можете да направите највише <xliff:g id="COUNT">%d</xliff:g> корисника.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Прављење новог корисника није успело"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Желите да избришете овог корисника?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Све апликације и подаци ће бити избрисани."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Брисање корисника није успело."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Одбаци"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Пробај поново"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Желите да избришете последњег корисника?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Нови администратор ће се направити када избришете јединог преосталог корисника за овај аутомобил."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Избрисаће се сви подаци, подешавања и апликације који су повезани са овим корисником. Мораћете да подесите систем поново."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Одаберите новог администратора"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Треба вам најмање један администратор. Да бисте избрисали овог, прво одаберите замену."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Одаберите администратора"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Гост"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Гост"</string>
     <string name="user_switch" msgid="6544839750534690781">"Пребаците на другог корисника"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Ви (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Име"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Није подешено"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Измените име корисника"</string>
     <string name="users_list_title" msgid="770764290290240909">"Корисници"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Дозвола је дата кориснику %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Налози"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Корисник"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Додај налог"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Ниједан налог није додат"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Налози за корисника <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Аутоматски синхронизуј податке"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Омогући апликацијама да аутоматски освежавају податке"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Укључити аутом. синх. података?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Све промене које унесете на налоге на вебу ће аутоматски бити копиране на уређај.\n\nНеки налози могу и аутоматски да копирају на веб све промене које унесете на телефону. Тако функционише Google налог."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Искључити аутом. синх. података?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"То ће се смањити потрошњу података, али биће потребно да ручно синхронизујете сваки налог да бисте прикупили недавне информације. Нећете примати обавештења о ажурирањима."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Информације о налогу"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Додајте налог"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Додајте налог"</string>
@@ -190,16 +340,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Уклони налог"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Желите да уклоните налог?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Ако уклоните овај налог, избрисаћете све поруке, контакте и друге податке са уређаја!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Администратор не дозвољава ову промену"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Уклањате овог корисника?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Све апликације и подаци ће бити избрисани."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Уклањање корисника није успело."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Желите да пробате поново?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Одбаци"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Пробај поново"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Додајете новог корисника?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Када додате новог корисника, та особа треба да подеси свој простор."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Сваки корисник може да ажурира апликације за све остале кориснике."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Уклањање налога није успело."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Синхронизација налога"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Синхронизација је укључена за одређене ставке (<xliff:g id="ID_1">%1$d</xliff:g> од <xliff:g id="ID_2">%2$d</xliff:g>)"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Синхронизација је укључена за све ставке"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Синхронизација је искључена за све ставке"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Синхронизација је ИСКЉ."</string>
+    <string name="sync_error" msgid="6698021343089247914">"Грешка при синхронизацији"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Последња синхронизација: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Синхронизација је у току..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Додирните да бисте синхронизовали одмах <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронизуј одмах"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Откажи синхронизацију"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Синхронизација тренутно има проблема. Ускоро ће се наставити."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безбедност"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Закључавање екрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Нема"</string>
@@ -207,7 +361,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Лозинка"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Изаберите закључавање"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Опције закључавања екрана"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Опције закључавања"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Унесите шаблон"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Потврди"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Поново нацртајте"</string>
@@ -217,7 +371,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Подесите закључавање екрана"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Одаберите PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Одаберите шаблон"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Одаберите лозинку"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Одаберите лозинку"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Тренутно закључавање екрана"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Подесите шаблон из безбедносних разлога"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Обриши"</string>
@@ -295,18 +449,39 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ИТ администратор блокира честе лозинке. Изаберите другу лозинку."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Растући, опадајући или поновљени низ цифара није дозвољен."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Опције закључавања екрана"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: пре <xliff:g id="NUM_DAYS">%3$s</xliff:g> дан(а)"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Додај поуздани уређај"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Поуздани уређаји"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> уређај</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> уређаја</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> уређаја</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ће откључати овај аутомобил када се повеже. Ако вам неко узме <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, можда ће моћи да приступа овом уређају"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Потврди"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Уклони поуздани уређај"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Готово"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Поуздани уређај подесите помоћу пратеће апликације. Када га подесите, моћи ћете да откључавате кориснички профил када возило открије телефон"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Преузмите пратећу апликацију на телефону"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Изаберите <xliff:g id="CAR_NAME">%1$s</xliff:g> на телефону да бисте упарили уређаје"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock не може да открије безбедносне функције овог уређаја. Да би аутомобил био заштићен, поуздани уређај ће омогућити да аутомобил остане откључан само када га ви претходно откључате. Поуздани уређај може да омогући да аутомобил остане откључан када се налази у близини, чак и када га неко други држи."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Додајте уређај <xliff:g id="DEVICE_NAME">%1$s</xliff:g> као поуздани"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Додали сте уређај <xliff:g id="DEVICE_NAME">%1$s</xliff:g> као поуздани"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Регистрација уређаја <xliff:g id="DEVICE_NAME">%1$s</xliff:g> није успела"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"За додавање поузданог уређаја следеће што треба да урадите је да подесите метод потврде идентитета. Ако немате поуздани уређај са собом, потврда идентитета ће бити потребна да бисте приступили профилу."</string>
     <string name="forget" msgid="3971143908183848527">"Заборави"</string>
+    <string name="connect" msgid="5861699594602380150">"Повежи"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Прекини везу"</string>
     <string name="delete_button" msgid="5840500432614610850">"Избриши"</string>
     <string name="remove_button" msgid="6664656962868194178">"Уклони"</string>
     <string name="cancel" msgid="750286395700355455">"Откажи"</string>
     <string name="backspace_key" msgid="1545590866688979099">"Тастер за брисање уназад"</string>
     <string name="enter_key" msgid="2121394305541579468">"Тастер Enter"</string>
     <string name="exit_retail_button_text" msgid="6093240315583384473">"Напустите режим демонстр."</string>
-    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Да напустите режим дем.?"</string>
+    <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Да напустите режим демонстрације"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Овим ћете избрисати налог за демонстрације и ресетовати систем на фабричка подешавања. Сви подаци корисника ће бити изгубљени."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Напусти режим демонстр."</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"завршите подешавање"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"не сада"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ОДБАЦИ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Функција није доступна током вожње."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Не можете да додате корисника током вожње."</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 8cad62e..b31dce8 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"tona ned skärm, pekskärm, batteri"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"tona ned skärmen, natt, tona"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Nattläge"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Nätverk och internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobilnätverk"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobildata"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Få åtkomst till data via mobilt nätverk"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vill du inaktivera mobildata?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Dataanvändning"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Varning och gräns för data"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cykel för appdataanvändning"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Ställ in en datavarning"</string>
+    <string name="data_warning" msgid="116776633806885370">"Datavarning"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Ange datagräns"</string>
+    <string name="data_limit" msgid="227338836292511425">"Datagräns"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Begränsa dataanvändningen"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"När mobildatan når den gräns du har angett inaktiveras den av fordonets huvudenhet.\n\nVi föreslår att du anger en något lägre gräns eftersom dataanvändningen mäts med huvudenheten och din leverantör kan mäta användningen på ett annat sätt."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Ställ in och hantera trådlösa åtkomstpunkter"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi-Fi aktiveras …"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi inaktiveras …"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi-Fi-listan läses in"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi har inaktiverats"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Det gick inte att glömma nätverket"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Det gick inte att ansluta till nätverket"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Lägg till nätverk"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi har inaktiverats"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Anslut"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Lösenord"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Visa lösenord"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Nätverksnamn"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Ange SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Säkerhet"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signalstyrka"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signalstyrka"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"länkhastighet"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekvens"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP-adress"</string>
+    <string name="show_password" msgid="2074628020371139240">"Visa lösenord"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Ange nätverksnamn"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Ange lösenord"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Dålig"</item>
-    <item msgid="2032262610626057081">"Ganska bra"</item>
-    <item msgid="3859756017461098953">"Bra"</item>
-    <item msgid="1521103743353335724">"Utmärkt"</item>
+    <item msgid="7683058295076342057">"Dålig"</item>
+    <item msgid="1639222824821660744">"Ganska bra"</item>
+    <item msgid="1838705897358163300">"Bra"</item>
+    <item msgid="6067166649320533751">"Utmärkt"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Aktivera Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth har inaktiverats"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbit/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Nätverksinformation"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-adress"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP-adress"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Nätmask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6-adresser"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Inställningar för Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Aktivera Wi‑Fi automatiskt"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi aktiveras i närheten av sparade nätverk, t.ex ditt hemnätverk"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Ej tillgängligt när plats är inaktiverat. Aktivera "<annotation id="link">"plats"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Vill du aktivera Wi-Fi-sökning?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aktivera"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi-sökning har aktiverats"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Byt till mobildata automatiskt"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Använd mobildata när Wi-Fi-nätverket inte är anslutet till internet. Avgifter för dataanvändning kan tillkomma."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Läs mer"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Hantera anslutningar, ange inställningar för enhetens namn och synlighet"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Dator"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Mobil"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Bild"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Hörlur"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Inmatning från kringutrustning"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Kopplade enheter"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Tillgängliga enheter"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Inga kopplade enheter"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Inga tillgängliga enheter"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Kopplad enhet"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Namn"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Använd för"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Byt namn på Bluetooth-enheten"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Namnlös enhet"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Kopplade enheter"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Koppla en ny enhet"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth aktiveras för parkoppling"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Ska enheten kopplas från?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Fordonet kopplas bort från <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Fordonets Bluetooth-adress: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Enhetens Bluetooth-adress: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Fordonets namn"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Byt namn på fordonet"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Byt namn på enheten"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Byt namn"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Tillgängliga enheter"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiler"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Begäran om Bluetooth-koppling"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Parkoppla och anslut"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Kopplingskod för Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Pinkoden innehåller bokstäver eller symboler"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Ange kopplingskoden och tryck på Retur"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Vanligtvis 0000 eller 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Begäran om parkoppling"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Tryck om du vill parkoppla med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Språk"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Språk och inmatning"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Tangentbord"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Hantera tangentbord"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Text till tal"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Prioriterad motor"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Aktuell motor"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Talhastighet"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Tonhöjd"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Återställ"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Ljud"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Ringvolym"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigeringsvolym"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Ställ in volym för musik och video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ringsignal"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Standardljud för aviseringar"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Standardljud för alarm"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Appar och aviseringar"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Visa alla appar"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Standardappar"</string>
     <string name="applications_settings" msgid="794261395191035632">"Appinformation"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Tvinga att avsluta"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Vill du tvinga att avsluta?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Om du tvingar appen att avsluta kanske den inte fungerar som den ska."</string>
     <string name="disable_text" msgid="4358165448648990820">"Inaktivera"</string>
     <string name="enable_text" msgid="1794971777861881238">"Aktivera"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Avinstallera"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Om du inaktiverar den här appen kan det påverka Android och andra appar så att de inte längre fungerar som de ska."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Inaktivera app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Behörigheter"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Version: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Inga behörigheter har beviljats"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Inga behörigheter har begärts"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Dataanvändning"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Appens dataanvändning"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Tvinga att avsluta"</string>
     <string name="computing_size" msgid="5791407621793083965">"Beräknar …"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> behörigheter till</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> behörighet till</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistent och röstinmatning"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assistentapp"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Använda text från skärmen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Tillåt att assistentappen får åtkomst till innehåll på skärmen, till exempel text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Använda skärmdump"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Tillåt att assistenappen får åtkomst till en bild på skärmen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Tjänsten Autofyll"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Ingen"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Vald"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistenten kan läsa information om appar som används i systemet, inklusive information som visas på skärmen eller är åtkomlig i apparna."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Kontrollera att du litar på den här appen&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofyll&gt;%1$s&lt;/xliff:g&gt; identifierar vad som kan fyllas i automatiskt utifrån vad som visas på skärmen."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Lägg till tjänst"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Plats"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Nyligen gjorda platsbegäranden"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Inga platsbegäranden har gjorts nyligen"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Behörigheter på appnivå"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Platssökning"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Platstjänster"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi-sökning"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Tillåt att appar och tjänster söker efter Wi‑Fi-nätverk när som helst, även när Wi‑Fi är inaktiverat. Funktionen kan till exempel användas till att förbättra platsbaserade funktioner och tjänster."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth-sökning"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Tillåt att appar och tjänster söker efter enheter i närheten när som helst, även när Bluetooth är inaktiverat. Funktionen kan till exempel användas till att förbättra platsbaserade funktioner och tjänster."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Systemuppdateringar"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Systemuppdateringar"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android-version"</string>
     <string name="security_patch" msgid="4794276590178386903">"Korrigeringsnivå för Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modell"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Basbandsversion"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel-version"</string>
     <string name="build_number" msgid="3997326631001009102">"Version"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth-adress"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ej tillgängligt"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright-symbol"</string>
     <string name="license_title" msgid="936705938435249965">"Licens"</string>
     <string name="terms_title" msgid="5201471373602628765">"Användarvillkor"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Systemets WebView-licens"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Systemets WebView-licenser"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Bakgrunder"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Satellitbildsleverantörer:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Licenser från tredje part"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Ett problem inträffade när licenserna lästes in."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Läser in …"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Nu är du <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steg från att bli utvecklare.</item>
+      <item quantity="one">Nu är du <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> steg från att bli utvecklare.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Nu är du en utvecklare!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Det behövs inte. Du är redan utvecklare."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Utvecklaralternativ"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Återställningsalternativ"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Nätverk, appar eller ehetsåterställning"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Återställ nätverk"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Om du gör detta återställs alla nätverksinställningar, inklusive:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobildata"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Rensa alla eSIM för fordonet"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Serviceavtalet fortsätter att gälla."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Det gick inte att återställa eSIM-korten"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Välj nätverk"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Återställ inställningar"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Vill du återställa?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Vill du återställa alla nätverksinställningar? Det går inte att ångra den här åtgärden."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Återställ inställningar"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Nätverksinställningarna har återställts"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Återställ appinställningarna"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Detta återställer alla inställningar för:\n\n"<li>"Inaktiverade appar"</li>\n<li>"Inaktiverade appmeddelanden"</li>\n<li>"Standardappar för åtgärder"</li>\n<li>"Begränsningar av bakgrundsdata för appar"</li>\n<li>"Alla begränsningar av behörigheter"</li>\n\n"Ingen appdata försvinner."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Återställ appar"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Appinställningarna har återställts"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Rensa all data (återställ standardinst.)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Detta rensar all data från fordonets huvudenhet, bland annat:\n\n"<li>"Ditt Google-konto"</li>\n<li>"System- och appdata och inställningar"</li>\n<li>"Nedladdade appar"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Du är inloggad på följande konton:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Det finns andra användare av fordonet."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Återställ fordonet"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Vill du återställa?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Vill du rensa alla personliga uppgifter och nedladdade appar? Det går inte att ångra den här åtgärden."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Rensa allt"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Rensar"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Vänta ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Datum och tid"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Ange datum och tid"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Ange datum, tidszon och format"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sortera efter tidszon"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Datum"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Tid"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Lägg till användare"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Lägg till konto"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Radera användare"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Ny användare"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Gäst"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administratör"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Inloggad som administratör"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Alla administratörsbehörigheter"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Gör till administratör"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Användaren kan ta bort användare, även andra administratörer, och återställa systemet till standardinställningarna."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Det går inte att ångra den här åtgärden."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ja, gör till administratör"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Skapa nya användare"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Ringa telefonsamtal"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Meddelanden via bilens mobildata"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Installera nya appar"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Avinstallera appar"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Lägg till användare"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Ny användare"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Lägga till ny användare?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Alla användare kan uppdatera appar för andra användare."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Användargränsen har nåtts"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Det går att skapa upp till <xliff:g id="COUNT">%d</xliff:g> användare.</item>
+      <item quantity="one">Det går bara att skapa en användare.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Det gick inte att skapa en ny användare"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Radera användaren?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Alla appar och all data raderas."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Det gick inte att radera användaren."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Stäng"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Försök igen"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Radera sista användaren?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Om du raderar den sista användaren för bilen skapas en ny adminanvändare."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Alla inställningar, appar och all data som är kopplade till användaren raderas. Du måste konfigurera systemet igen."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Välj en ny administratör"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Du måste ha minst en administratör. Välj en ersättare innan du tar bort administratören."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Välj administratör"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Gäst"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Gäst"</string>
     <string name="user_switch" msgid="6544839750534690781">"Byt"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Du (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Namn"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Inte konfigurerad"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Redigera användarnamn"</string>
     <string name="users_list_title" msgid="770764290290240909">"Användare"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s har beviljats behörighet"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Konton"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Användare"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Lägg till konto"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Inga konton har lagts till"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Konton som tillhör <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Synkronisera data automatiskt"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Tillåt att data uppdateras av appar automatiskt"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Aktivera automatisk datasynk.?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Alla kontoändringar som görs på webben kopieras automatiskt till enheten.\n\nFör vissa konton kopieras även alla ändringar som görs på mobilen automatiskt till webben. Så här fungerar ett Google-konto."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Inaktivera automatisk datasynk.?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Detta minskar dataanvändningen, men varje konto måste synkroniseras manuellt varje gång du vill samla in aktuell information. Du får inga meddelanden om nya uppdateringar."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Kontoinformation"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Lägg till konto"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Lägga till ett konto"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Ta bort konto"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Vill du ta bort kontot?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Om du tar bort kontot tar du också bort alla meddelanden, kontakter och andra data från enheten."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Administratören tillåter inte denna ändring"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Ta bort användaren?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Alla appar och all data raderas."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Det gick inte att ta bort användaren."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Vill du försöka igen?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Stäng"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Försök igen"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Lägga till ny användare?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Alla användare kan uppdatera appar för andra användare."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Det gick inte att radera kontot."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Kontosynkronisering"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Synkronisering har aktiverats för <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g> objekt"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Synkronisering har aktiverats för alla objekt"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Synkronisering har inaktiverats för alla objekt"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Synkronisering är avstängd"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Synkroniseringsfel"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Synkroniserades senast: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Synkroniserar nu …"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Tryck om du vill synkronisera nu <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Synkronisera nu"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Avbryt synkronisering"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Det är för närvarande problem med synkronisering. Det fungerar igen om en stund."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Säkerhet"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Skärmlås"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Inga"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Pinkod"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Lösenord"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Välj en låstyp"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Alternativ för skärmlås"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Låsalternativ"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Ange det grafiska lösenordet"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Bekräfta"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Rita igen"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ange ett skärmlås"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Välj en pinkod"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Välj grafiskt lösenord"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Välj ett lösenord"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Välj ett lösenord"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Nuvarande skärmlås"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Ange ett grafiskt lösenord som skydd"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Rensa"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IT-adminstratören har blockerat de vanligaste lösenorden. Testa ett annat lösenord."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"En stigande, fallande eller upprepad siffersekvens är inte tillåten."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Alternativ för skärmlås"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>: <xliff:g id="NUM_DAYS">%3$s</xliff:g> dagar sedan"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Lägg till betrodd enhet"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Betrodda enheter"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> enheter</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> enhet</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Bilen låses upp av din <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> när den är ansluten. Om någon kommer över din <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> kan de få åtkomst till den här enheten"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Bekräfta"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Ta bort betrodd enhet"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Klar"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Konfigurera en betrodd enhet med den tillhörande appen. När konfigureringen är klar låses din användarprofil upp när bilen känner av mobilen"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Ladda ned den tillhörande appen på mobilen"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Koppla enheterna genom att välja <xliff:g id="CAR_NAME">%1$s</xliff:g> på mobilen"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock kan inte identifiera enhetens säkerhetsfunktioner. Som en säkerhetsåtgärd kan den betrodda enheten bara hålla bilen olåst efter att den har låsts upp av dig. Den betrodda enheten kan hålla bilen olåst när den finns i närheten, även om någon annan håller i enheten."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Lägg till <xliff:g id="DEVICE_NAME">%1$s</xliff:g> som en betrodd enhet"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> har lagts till som en betrodd enhet"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Det gick inte att registrera <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"När du lägger till en betrodd enhet måste du lägga till en autentiseringsmetod också. Autentisering krävs för att komma åt profilen om du inte skulle ha den betrodda enheten med dig."</string>
     <string name="forget" msgid="3971143908183848527">"Glöm"</string>
+    <string name="connect" msgid="5861699594602380150">"Anslut"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Koppla från"</string>
     <string name="delete_button" msgid="5840500432614610850">"Radera"</string>
     <string name="remove_button" msgid="6664656962868194178">"Ta bort"</string>
     <string name="cancel" msgid="750286395700355455">"Avbryt"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Avsluta demoläge"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Detta raderar demokontot och återställer standardinställningarna för systemet. All användardata tas bort."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Avsluta demoläget"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"slutför konfigurationen"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"inte nu"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"IGNORERA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Funktionen är inte tillgänglig när du kör."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Du kan inte lägga till användare medan du kör."</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 4efc4e6..bd3df55 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"punguza mwanga wa skrini, skrini ya kugusa, betri"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"punguza mwangaza wa skrini, usiku, weka rangi maalum"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Hali ya usiku"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Mtandao na intaneti"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mtandao wa simu"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Data ya mtandao wa simu"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Tumia data ya mtandao wa simu"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Ungependa kuzima data ya mtandao wa simu?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Matumizi ya data"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Kikomo na onyo kuhusu matumizi ya data"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Awamu ya matumizi ya data ya programu"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Weka onyo la matumizi ya data"</string>
+    <string name="data_warning" msgid="116776633806885370">"Onyo kuhusu matumizi ya data"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Weka kikomo cha data"</string>
+    <string name="data_limit" msgid="227338836292511425">"Kikomo cha data"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Kupunguza matumizi ya data"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Stereo ya dashibodi ya gari lako itazima data ya mtandao wa simu pindi itakapofikia kikomo cha data ulichoweka.\n\nKwa kuwa stereo ya dashibodi ndiyo hupima matumizi ya data, na huenda kampuni inayokupa huduma za mtandao ikahesabu matumizi hayo kwa njia tofauti, unashauriwa kuweka kikomo kisicho kamili sana."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Weka na udhibiti vituo vya kufikia mtandao wa Wi-Fi"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Inawasha Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Inazima Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Inapakia orodha ya Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Umezima Wi‑Fi"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Imeshindwa kusahau mtandao"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Imeshindwa kuunganisha kwenye mtandao"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Ongeza mtandao"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Umezima Wi‑Fi"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Unganisha"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Nenosiri"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Onyesha nenosiri"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Jina la mtandao"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Weka SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Usalama"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Nguvu za mawimbi"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Nguvu za mawimbi"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Hali"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Kasi ya muunganisho"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Masafa"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Anwani ya IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Onyesha nenosiri"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Weka jina la mtandao"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Weka nenosiri"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Dhaifu"</item>
-    <item msgid="2032262610626057081">"Wastani"</item>
-    <item msgid="3859756017461098953">"Thabiti"</item>
-    <item msgid="1521103743353335724">"Bora zaidi"</item>
+    <item msgid="7683058295076342057">"Dhaifu"</item>
+    <item msgid="1639222824821660744">"Wastani"</item>
+    <item msgid="1838705897358163300">"Thabiti"</item>
+    <item msgid="6067166649320533751">"Thabiti zaidi"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Washa Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Umezima Bluetooth"</string>
+    <string name="link_speed" msgid="7868861844075624445">"Mbps %1$d"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"GHz 2.4"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"GHz 5"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Maelezo ya mtandao"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Anwani ya MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Anwani ya IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Anwani za IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Lango"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Mapendeleo ya Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Washa Wi‑Fi kiotomatiki"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi itarejea kwenye mitandao bora zaidi ya karibu uliyohifadhi, k.m. mtandao wa nyumbani"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Haipatikani kwa sababu umezima huduma za mahali."<annotation id="link">"Ziwashe"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Ungependa kuwasha kipengele cha kutafuta Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Washa"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Umewasha utafutaji wa Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Tumia data ya mtandao wa simu kiotomatiki"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Tumia data ya mtandao wa simu wakati Wi-Fi haina muunganisho wa intaneti. Huenda ukalipia data utakayotumia."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Pata maelezo zaidi"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Dhibiti miunganisho, weka jina na uwezo wa kutambulika wa kifaa"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Kompyuta"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Vifaa vya sauti"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Simu"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Kupiga picha"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Kifaa cha sauti"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Vifaa vya Ziada vya Kuingiza Data"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Vifaa vilivyooanishwa"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Vifaa vinavyopatikana"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Hakuna vifaa vilivyooanishwa"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Hakuna vifaa vinavyopatikana"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Kifaa kilichooanishwa"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Jina"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Tumia kwa"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Badilisha jina la kifaa cha Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Kifaa kisichokuwa na jina"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Vifaa vilivyooanishwa"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Oanisha kifaa kipya"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth itawaka ili ioanishe"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Ungependa kuondoa kifaa?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Muunganisho wa gari lako utaondolewa kwenye <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Anwani ya Bluetooth ya gari: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Anwani ya Bluetooth ya Kifaa chako: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Jina la gari"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Badilisha jina la gari hii"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Badilisha jina la kifaa"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Badilisha jina"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Vifaa vinavyopatikana"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Maelezo"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Ombi la kuoanisha Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Oanisha kisha unganisha"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Msimbo wa kuoanisha Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN inajumlisha herufi au alama"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Andika msimbo wa kuoanisha kisha ubonyeze \"Rejesha\" au \"Enter\""</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Kwa kawaida 0000 au 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Ombi la kuoanisha"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Gusa ili uoanishe na <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Lugha"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Lugha na uingizaji wa data"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Kibodi"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Dhibiti kibodi"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Matokeo ya kusoma maandishi kwa sauti"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Mtambo unaopendelewa"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Mtambo wa sasa"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Kasi ya Kutamka"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Uzito wa sauti"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Badilisha"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Mlio"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Sauti ya mlio"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Kiasi cha sauti"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Maudhui"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Badilisha sauti ya muziki na video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Kengele"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Mlio wa simu"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Sauti chaguomsingi ya arifa"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Sauti chaguomsingi ya kengele"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Programu na arifa"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Onyesha programu zote"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Programu chaguomsingi"</string>
     <string name="applications_settings" msgid="794261395191035632">"Maelezo ya programu"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Lazimisha kuzima"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Ungependa kuilazimisha izime?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ukilazimisha programu izime, huenda isifanye kazi vizuri."</string>
     <string name="disable_text" msgid="4358165448648990820">"Zima"</string>
     <string name="enable_text" msgid="1794971777861881238">"Washa"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Ondoa"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Ukizima programu hii, huenda Android na programu zingine zikakosa kufanya kazi tena kama ilivyokusudiwa."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Zima programu"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Ruhusa"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Toleo: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Hakuna ruhusa zilizotolewa"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Hakuna ruhusa zilizoombwa"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Matumizi ya data"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Matumizi ya data ya programu"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Lazimisha kuzima"</string>
     <string name="computing_size" msgid="5791407621793083965">"Inahesabu…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">Ruhusa <xliff:g id="COUNT_1">%d</xliff:g> za ziada</item>
       <item quantity="one">Ruhusa <xliff:g id="COUNT_0">%d</xliff:g> ya ziada</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Mratibu na kuweka data kwa kutamka"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Programu ya usaidizi"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Tumia maandishi kutoka kwenye skrini"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Ruhusu programu ya usaidizi kufikia maudhui ya skrini katika muundo wa maandishi"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Tumia picha ya skrini"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Ruhusu programu ya usaidizi kufikia picha ya skrini"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Huduma ya kujaza kiotomatiki"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Hakuna"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Umechagua"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Programu ya Mratibu itaweza kusoma maelezo kuhusu programu unazotumia katika mfumo wako, ikiwa ni pamoja na maelezo yanayoonekana kwenye skrini yako au yanayoweza kufikiwa ndani ya programu."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Hakikisha kuwa unaamini programu hii&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; hutumia kilicho kwenye skrini yako kubaini kinachoweza kujazwa kiotomatiki."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Ongeza huduma"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Mahali"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Maombi ya Hivi Karibuni ya Kutambua Eneo"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Hamna maombi ya hivi karibuni ya kutambua eneo"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Ruhusa za kiwango cha programu"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Kutafuta"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Huduma za Mahali"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Kutafuta Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Ruhusu programu na huduma zitafute mitandao ya Wi-Fi wakati wowote, hata wakati umezima Wi-Fi. Hali hii inaweza kutumika, kwa mfano, kuboresha huduma na vipengele vinavyohusiana na mahali."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Kutafuta Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Ruhusu programu na huduma itafute vifaa vilivyo karibu wakati wowote, hata wakati umezima Bluetooth. Hali hii inaweza kutumika, kwa mfano, kuboresha huduma na vipengele vinavyohusiana na mahali."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Mfumo"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Masisho ya mfumo"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Masasisho ya mfumo"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Toleo la Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Kiwango cha rekebisho la usalama kwenye Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Muundo"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Toleo la mitambo ya redio"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Toleo la kiini"</string>
     <string name="build_number" msgid="3997326631001009102">"Nambari ya muundo"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Anwani ya Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Haipatikani"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Hali"</string>
     <string name="device_status" msgid="267298179806290920">"Hali"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Hakimiliki"</string>
     <string name="license_title" msgid="936705938435249965">"Leseni"</string>
     <string name="terms_title" msgid="5201471373602628765">"Sheria na Masharti"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Leseni ya WebView ya Mfumo"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Leseni za mfumo za Mwonekano wa Wavuti"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Mandhari"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Watoa huduma za picha za setilaiti: \n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Leseni za watu wengine"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kuna shida ya kupakia leseni."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Inapakia…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Sasa umebakisha hatua <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kabla ya kuwa msanidi programu.</item>
+      <item quantity="one">Sasa umebakisha hatua <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> kabla ya kuwa msanidi programu.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Sasa wewe ni msanidi programu!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Usijali, tayari wewe ni msanidi programu."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Chaguo za wasanidi programu"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Chaguo za kubadilisha mipangilio"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Kubadilisha mipangilio ya kifaa, programu au mtandao"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Badilisha mipangilio ya mtandao"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Hatua hii itabadilisha mipangilio yote ya mtandao, ikiwa ni pamoja na:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Data ya mtandao wa simu"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Futa eSIM zote za gari"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Hatua hii haitaghairi mpango wako wa huduma."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Imeshindwa kuweka eSIM upya"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Chagua mtandao"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Badilisha mipangilio"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Ungependa kubadilisha?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Ungependa kubadilisha mipangilio yote ya mtandao? Huwezi kutendua hatua hii!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Badilisha mipangilio"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Imebadilisha mipangilio ya mtandao"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Badilisha mapendeleo ya programu"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Hatua hii itaweka upya mapendeleo yote ya:\n\n"<li>"Programu zilizozimwa"</li>\n<li>"Arifa za programu zilizomwa"</li>\n<li>"Programu chaguomsingi za vitendo"</li>\n<li>"Masharti ya matumizi ya data chinichini katika programu"</li>\n<li>"Masharti yoyote ya ruhusa"</li>\n\n"Hutapoteza data yoyote ya programu."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Weka programu upya"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Mapendeleo ya programu yamewekwa upya"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Futa data yote (rejesha mipangilio ya kiwandani)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Hatua hii itafuta data yote kwenye sehemu ya mbele ya gari lako ikiwa ni pamoja na:\n\n"<li>" Akaunti yako ya Google"</li>\n<li>"Data na mipangilio ya mfumo na programu"</li>\n<li>"Programu ulizopakua"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Kwa sasa umeingia katika akaunti zifuatazo:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Watu wengine katika gari hili.wanatumia kifaa."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Badilisha mipangilio ya gari"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Ungependa kubadilisha?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Ungependa kufuta taarifa yako yote ya binafsi na programu ulizopakua? Huwezi kutendua hatua hii!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Futa kila kitu"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Inafuta"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Tafadhali subiri..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Tarehe na saa"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Weka tarehe na saa"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Weka tarehe, saa, saa za eneo na mfumo"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Panga kulingana na saa za eneo"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Tarehe"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Saa"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Ongeza mtumiaji"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Ongeza akaunti"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Futa mtumiaji"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Mtumiaji mpya"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Mgeni"</string>
     <string name="user_admin" msgid="1535484812908584809">"Msimamizi"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Umeingia katika akaunti ya msimamizi"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Ruhusa zote za msimamizi"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Mfanye awe Msimamizi"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Mtumiaji ataweza kufuta watumiaji, ikiwa ni pamoja na Wasimamizi wengine na kuweka upya mipangilio ya mfumo."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Hatua hii haiwezi kutenduliwa."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ndiyo, mfanye awe msimamizi"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Ongeza watumiaji wapya"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Piga simu"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Ujumbe kupitia data ya simu ya gari"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Sakinisha programu mpya"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Ondoa programu"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Ongeza mtumiaji"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Mtumiaji mpya"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Ungependa kuongeza mtumiaji?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ukiongeza mtumiaji mpya, ni lazima aweke kikundi chake."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Mtumiaji yeyote anaweza kusasisha programu za watumiaji wengine."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Umefikia kima cha juu cha watumiaji"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Unaruhusiwa kuongeza hadi watumiaji <xliff:g id="COUNT">%d</xliff:g>.</item>
+      <item quantity="one">Unaruhusiwa kuongeza mtumiaji mmoja pekee.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Imeshindwa kuongeza mtumiaji mpya"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Utafuta mtumiaji huyu?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Data na programu zote zitafutwa."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Imeshindwa kumfuta mtumiaji."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Ondoa"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Jaribu tena"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Ifute mtumiaji wa mwisho?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Baada ya kufuta mtumiaji aliyesalia wa gari hili, itaweka mtumiaji mwingine ambaye ni msimamizi."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Data, mipangilio, na programu zote zinazohusishwa na mtumiaji huyu zitafutwa. Utahitaji kuweka tena mipangilio ya mfumo."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Chagua msimamizi mwingine"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Unahitaji angalau msimamizi mmoja. Chagua kwanza msimamizi mwingine ili ufute msimamizi huyu."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Chagua msimamizi"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Mgeni"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Mgeni"</string>
     <string name="user_switch" msgid="6544839750534690781">"Badilisha"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Wewe (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Jina"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Haijawekwa mipangilio"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Badilisha jina la mtumiaji"</string>
     <string name="users_list_title" msgid="770764290290240909">"Watumiaji"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Ruhusa zilizotolewa kwa %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Akaunti"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Mtumiaji"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Ongeza akaunti"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Hakuna akaunti zilizoongezwa"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Akaunti za <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Sawazisha data kiotomatiki"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Ruhusu programu zionyeshe data upya kiotomatiki"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Utawasha usawazishaji wa data kiotomatiki?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Mabadiliko yoyote utakayofanya katika akaunti zako kwenye wavuti yatanakiliwa kiotomatiki kwenye kifaa chako.\n\nHuenda baadhi ya akaunti pia zikanakili kiotomatiki kwenye wavuti mabadiliko yoyote utakayofanya kwenye simu. Hivi ndivyo akaunti ya Google inavyofanya kazi."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Utazima usawazishaji wa data kiotomatiki?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Kuzima kipengele hiki kutaokoa data lakini utahitaji kusawazisha kila akaunti wewe mwenyewe ili ukusanye taarifa ya hivi karibuni. Na hutaarifiwa wakati kuna taarifa mpya."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Maelezo ya akaunti"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Ongeza akaunti"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Ongeza akaunti"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Ondoa akaunti"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Unataka kuondoa akaunti?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Kuondoa akaunti hii kutasabibisha kufutwa kwa ujumbe, anwani na data nyingine kwenye kifaa!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Mabadiliko haya hayaruhusiwi na msimamizi wako"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Mtumiaji huyu aondolewe?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Data na programu zote zitafutwa."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Imeshindwa kumwondoa mtumiaji."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Utajaribu tena?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Ondoa"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Jaribu tena"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Ungependa kuongeza mtumiaji?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Ukiongeza mtumiaji mpya, ni lazima aweke kikundi chake."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Mtumiaji yeyote anaweza kusasisha programu za watumiaji wengine."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Imeshindwa kuondoa akaunti."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Usawazishaji wa akaunti"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Umewasha usawazishaji katika vipengee <xliff:g id="ID_1">%1$d</xliff:g> kati ya <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Umewasha usawazishaji katika vipengee vyote"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Umezima usawazishaji katika vipengee vyote"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Usawazishaji UMEZIMWA"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Hitilafu ya usawazishaji"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Ilisawazishwa mwisho <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Inasawazisha sasa…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Gusa ili usawazishe<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g> sasa"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Sawazisha sasa"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Ghairi usawazishaji"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Kwa sasa kipengele cha kusawazisha kina matatizo. Kitaanza kufanya kazi baada ya muda mfupi."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Usalama"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Kufunga skrini"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Hamna"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Nenosiri"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Chagua mbinu ya kufunga skrini"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Chaguo za kufunga skrini"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Chaguo za kufunga"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Weka mchoro wako"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Thibitisha"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Chora tena"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Weka mbinu ya kufunga skrini"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Chagua PIN yako"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Chagua mchoro wako"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Chagua nenosiri lako"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Chagua nenosiri lako"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Mbinu inayotumika kufunga skrini"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Kwa sababu za usalama, weka mchoro"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Futa"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Manenosiri yanayotumika sana yamezuiwa na msimamizi wako wa Tehama. Jaribu nenosiri tofauti."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Haturuhusu mpangilio wa tarakimu wa kupanda, kushuka au kujirudia."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Chaguo za kufunga skrini"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : Siku <xliff:g id="NUM_DAYS">%3$s</xliff:g> zilizopita"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Ongeza kifaa unachokiamini"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Vifaa unavyoviamini"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other">Vifaa <xliff:g id="COUNT_1">%d</xliff:g></item>
+      <item quantity="one">Kifaa <xliff:g id="COUNT_0">%d</xliff:g></item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> yako itafungua gari hili itakapounganishwa. Mtu akichukua <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> yako, huenda ataweza kufikia kifaa hiki."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Thibitisha"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Ondoa kifaa unachokiamini"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Nimemaliza"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Tumia programu saidizi kuweka mipangilio ya kifaa unachoamini Ukishakamilisha kuweka mipangilio, utaweza kufungua wasifu wako wa mtumiaji wakati simu yako itatambuliwa na gari"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Pakua programu saidizi kwenye simu yako"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Chagua <xliff:g id="CAR_NAME">%1$s</xliff:g> kwenye simu yako ili uoanishe vifaa"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock haiwezi kutambua vipengele vya usalama katika kifaa hiki. Ili kukusaidia ulinde gari lako, kifaa unachoamini kitaweza tu kuzuia gari lako lisijifunge ukishalifungua. Kifaa unachoamini kinaweza kuzuia gari lako lisijifunge likiwa karibu, hata kama kimebebwa na mtu mwingine."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Ongeza <xliff:g id="DEVICE_NAME">%1$s</xliff:g>kiwe kifaa unachoamini"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Umeongeza <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kuwa kifaa unachoamini"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Imeshindwa kuandikisha <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Unatakiwa uweke njia ya kuthibitisha ili uongeze kifaa unachoamini katika hatua inayofuata. Kama huna kifaa unachoamini, uthibitishaji utataka idhini ya kufikia wasifu wako."</string>
     <string name="forget" msgid="3971143908183848527">"Sahau"</string>
+    <string name="connect" msgid="5861699594602380150">"Unganisha"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Tenganisha"</string>
     <string name="delete_button" msgid="5840500432614610850">"Futa"</string>
     <string name="remove_button" msgid="6664656962868194178">"Ondoa"</string>
     <string name="cancel" msgid="750286395700355455">"Ghairi"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Funga hali ya onyesho"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Hatua hii itafuta akaunti ya onyesho na kurejesha data ambayo kifaa kilitoka nayo kiwandani. Data yote ya mtumiaji itapotea."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Funga Onyesho"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"maliza kuweka mipangilio"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"si sasa"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ONDOA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Kipengele hakipatikani unapoendesha gari."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Huwezi kuongeza mtumiaji unapoendesha gari."</string>
 </resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 44f3b77..0b7991f 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ஒளிமங்கல் திரை, டச்ஸ்கிரீன், பேட்டரி"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"ஒளிமங்கல் திரை, இரவு, மென்னிறம்"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"இரவுப் பயன்முறை"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"நெட்வொர்க் &amp; இணையம்"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"மொபைல் நெட்வொர்க்"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"மொபைல் டேட்டா"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"மொபைல் நெட்வொர்க் மூலம் டேட்டாவைப் பயன்படுத்து"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"மொபைல் டேட்டாவை ஆஃப் செய்யவா?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"டேட்டா உபயோகம்"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"டேட்டா உபயோக எச்சரிக்கை &amp; வரம்பு"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ஆப்ஸ் டேட்டா உபயோக சுழற்சி"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"டேட்டா உபயோக எச்சரிக்கையை அமை"</string>
+    <string name="data_warning" msgid="116776633806885370">"டேட்டா உபயோக எச்சரிக்கை"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"டேட்டா வரம்பை அமை"</string>
+    <string name="data_limit" msgid="227338836292511425">"டேட்டா வரம்பு"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"டேட்டா உபயோகத்தை வரம்பிடுதல்"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"நீங்கள் அமைத்துள்ள வரம்பை அடைந்ததும் மொபைல் டேட்டாவைக் கார் சாதனத்தின் முதன்மை யூனிட் மொபைல் டேட்டாவை முடக்கும்.\n\nடேட்டா உபயோகத்தை முதன்மை யூனிட் அளவிட்டாலும் உங்கள் மொபைல் நிறுவனம் வேறுவிதமாக அளவிடலாம். எனவே பாதுகாப்பான அளவில் வரம்பை அமைக்கவும்."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"வைஃபை"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"வயர்லெஸ் ஆக்சஸ் பாயிண்ட்களை அமைத்து நிர்வகிக்கவும்"</string>
     <string name="wifi_starting" msgid="473253087503153167">"வைஃபையை ஆன் செய்கிறது…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"வைஃபையை ஆஃப் செய்கிறது…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"வைஃபை பட்டியலை ஏற்றுகிறது"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"வைஃபை ஆஃப் செய்யப்பட்டது"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"நெட்வொர்க்கை நீக்க முடியவில்லை"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"நெட்வொர்க்கைச் சேர்"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"வைஃபை ஆஃப் செய்யப்பட்டது"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"இணை"</string>
     <string name="wifi_password" msgid="5565632142720292397">"கடவுச்சொல்"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"கடவுச்சொல்லைக் காட்டு"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"நெட்வொர்க் பெயர்"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSIDயை உள்ளிடவும்"</string>
     <string name="wifi_security" msgid="158358046038876532">"பாதுகாப்பு"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"சிக்னலின் வலிமை"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"சிக்னலின் வலிமை"</string>
     <string name="wifi_status" msgid="5688013206066543952">"நிலை"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"இணைப்பு வேகம்"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"அதிர்வெண்"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP முகவரி"</string>
+    <string name="show_password" msgid="2074628020371139240">"கடவுச்சொல்லைக் காட்டு"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"நெட்வொர்க்கின் பெயரை உள்ளிடவும்"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"கடவுச்சொல்லை உள்ளிடவும்"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"மோசம்"</item>
-    <item msgid="2032262610626057081">"சுமார்"</item>
-    <item msgid="3859756017461098953">"நன்று"</item>
-    <item msgid="1521103743353335724">"பிரமாதம்"</item>
+    <item msgid="7683058295076342057">"மோசம்"</item>
+    <item msgid="1639222824821660744">"பரவாயில்லை"</item>
+    <item msgid="1838705897358163300">"நன்று"</item>
+    <item msgid="6067166649320533751">"பிரமாதம்"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"புளூடூத்"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"புளூடூத்தை ஆன் செய்"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"புளூடூத்"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"புளூடூத் முடக்கப்பட்டுள்ளது"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d மெ.பை./வி"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"நெட்வொர்க் விவரங்கள்"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC முகவரி"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP முகவரி"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"சப்நெட் மாஸ்க்"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 முகவரிகள்"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"கேட்வே"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"வைஃபை விருப்பத்தேர்வுகள்"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"வைஃபையைத் தானாக இயக்கு"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"சேமிக்கப்பட்ட உயர்தர நெட்வொர்க்குகளுக்கு (எடுத்துக்காட்டு: உங்கள் வீட்டு நெட்வொர்க்) அருகில் இருக்கும்போது வைஃபை இயக்கப்படும்"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"இருப்பிடம் ஆஃபில் உள்ளதால் கிடைக்கவில்லை. "<annotation id="link">"இருப்பிடத்தை"</annotation>" ஆன் செய்க."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"வைஃபை ஸ்கேனிங்கை ஆன் செய்யவா?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ஆன் செய்"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"வைஃபை ஸ்கேனிங் ஆன் செய்யப்பட்டது"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"தானாகவே மொபைல் டேட்டாவிற்கு மாறு"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"வைஃபையில் இணைய அணுகல் இல்லாதபோது மொபைல் டேட்டாவைப் பயன்படுத்தும். டேட்டா உபயோகத்திற்குக் கட்டணம் விதிக்கப்படலாம்."</string>
+    <string name="learn_more" msgid="8214605928933358604">"மேலும் அறிக"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"புளூடூத்"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"இணைப்புகளை நிர்வகிக்கவும், சாதனப் பெயரையும் கண்டறியத்தக்க நிலையையும் அமைக்கவும்"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"கம்ப்யூட்டர்"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ஹெட்செட்"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"மொபைல்"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"இமேஜிங்"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ஹெட்ஃபோன்"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"இன்புட் பெரிபெரல்"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"புளூடூத்"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"இணைக்கப்பட்ட சாதனங்கள்"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"கிடைக்கும் சாதனங்கள்"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"இணைக்கப்பட்ட சாதனங்கள் இல்லை"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"சாதனங்கள் எதுவுமில்லை"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"இணைக்கப்பட்ட சாதனம்"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"பெயர்"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"இதற்குப் பயன்படுத்து"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"புளூடூத் சாதனத்தின் பெயரை மாற்றவும்"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"பெயரிடப்படாத சாதனம்"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"இணைக்கப்பட்ட சாதனங்கள்"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"புதிய சாதனத்தை இணைத்தல்"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"இணைப்பதற்கு புளூடூத் ஆன் செய்யப்படும்"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"சாதன இணைப்பைத் துண்டிக்கவா?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> இலிருந்து உங்கள் வாகனத்தின் புளூடூத் இணைப்பு துண்டிக்கப்படும்."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"வாகனத்தின் புளூடூத் முகவரி: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"சாதனத்தின் புளூடூத் முகவரி: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"வாகனத்தின் பெயர்"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"வாகனத்திற்கு மறுபெயரிடுதல்"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"சாதனத்திற்கு மறுபெயரிடுதல்"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"மறுபெயரிடு"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"இணைப்பிற்குக் கிடைக்கும் சாதனங்கள்"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"புளூடூத் சுயவிவரங்கள்"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"புளூடூத் இணைப்பிற்கான கோரிக்கை"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"ஜோடி சேர்த்து, இணை"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"புளூடூத்"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"புளூடூத் இணைத்தல் குறியீடு"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"பின்னில் எழுத்துகள் அல்லது குறிகள் உள்ளன"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"இணைத்தல் குறியீட்டை உள்ளிட்டு, ரிட்டர்ன் அல்லது என்டரை அழுத்தவும்"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"பொதுவாக 0000 அல்லது 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"இணைப்பிற்கான கோரிக்கை"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> உடன் இணைக்க, தட்டவும்."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"மொழிகள்"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"மொழிகள் &amp; உள்ளீடு"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"கீபோர்டு"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"கீபோர்டுகளை நிர்வகித்தல்"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"உரையிலிருந்து பேச்சுக்கு"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"இன்ஜின் விருப்பத்தேர்வு"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"தற்போதைய இன்ஜின்"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"பேச்சு வீதம்"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"குரல் அழுத்தம்"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"மீட்டமை"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ஒலி"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"ரிங் ஒலியளவு"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"வழிசெலுத்தலுக்கான ஒலியளவு"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"மீடியா"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"இசை மற்றும் வீடியோக்களுக்கான ஒலியளவை அமை"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"அலாரம்"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"மொபைலுக்கான ரிங்டோன்"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"இயல்புநிலை அறிவிப்பிற்கான ஒலி"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"இயல்புநிலை அலாரத்திற்கான ஒலி"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ஆப்ஸ் &amp; அறிவிப்புகள்"</string>
+    <string name="all_applications" msgid="7798210477486822168">"அனைத்து ஆப்ஸையும் காட்டு"</string>
+    <string name="default_applications" msgid="1558183275638697087">"இயல்புநிலை ஆப்ஸ்"</string>
     <string name="applications_settings" msgid="794261395191035632">"பயன்பாட்டுத் தகவல்"</string>
+    <string name="force_stop" msgid="2153183697014720520">"உடனே நிறுத்து"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"உடனே நிறுத்தவா?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"ஆப்ஸை உடனே நிறுத்தினால் சரியாக இயங்காமல் போகக்கூடும்."</string>
     <string name="disable_text" msgid="4358165448648990820">"முடக்கு"</string>
     <string name="enable_text" msgid="1794971777861881238">"இயக்கு"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"நிறுவல் நீக்கு"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"இந்த ஆப்ஸை முடக்கினால் Androidடும் பிற ஆப்ஸும் எதிர்பார்த்தவாறு செயல்படாமல் போகக்கூடும்."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ஆப்ஸை முடக்கு"</string>
     <string name="permissions_label" msgid="2701446753515612685">"அனுமதிகள்"</string>
     <string name="application_version_label" msgid="8556889839783311649">"பதிப்பு: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"அனுமதிகள் எதுவும் வழங்கப்படவில்லை"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"அனுமதிகள் எதையும் கோரவில்லை"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"டேட்டா உபயோகம்"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"பயன்பாட்டின் டேட்டா உபயோகம்"</string>
-    <string name="force_stop" msgid="2153183697014720520">"உடனே நிறுத்து"</string>
     <string name="computing_size" msgid="5791407621793083965">"கணக்கிடுகிறது…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> கூடுதல் அனுமதிகள்</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> கூடுதல் அனுமதி</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"அசிஸ்டண்ட் &amp; குரல் உள்ளீடு"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"அசிஸ்ட் ஆப்ஸ்"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"திரையில் உள்ள உரையைப் பயன்படுத்துதல்"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"திரையில் உள்ள உள்ளடக்கத்தை உரையாக அணுகுவதற்கு அசிஸ்ட் ஆப்ஸை அனுமதிக்கும்"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ஸ்கிரீன்ஷாட்டைப் பயன்படுத்துதல்"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"திரையில் உள்ள படத்தை அணுகுவதற்கு அசிஸ்ட் ஆப்ஸை அனுமதிக்கும்"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"தன்னிரப்பிச் சேவை"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ஏதுமில்லை"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"தேர்ந்தெடுக்கப்பட்டது"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"திரையில் தெரியும் தகவல் அல்லது ஆப்ஸுக்குள் அணுகத்தக்க தகவல் உட்பட உங்கள் சிஸ்டமில் செயலிலுள்ள ஆப்ஸ்கள் பற்றிய தகவல்களை அசிஸ்டண்ட்டால் படிக்க இயலும்."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;இந்த ஆப்ஸை நம்புகிறீர்கள் என்பதை உறுதிப்படுத்தவும்&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; உங்கள் திரையில் இருப்பதைப் பயன்படுத்தி எவற்றையெல்லாம் தானாக நிரப்ப இயலும் என்பதைத் தீர்மானிக்கும்."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"சேவையைச் சேர்த்தல்"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"இடம்"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"இருப்பிடத் தகவல் குறித்த சமீபத்திய கோரிக்கைகள்"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"இருப்பிடத் தகவல் குறித்த சமீபத்திய கோரிக்கைகள் இல்லை"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ஆப்ஸ் நிலை அனுமதிகள்"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"ஸ்கேன் செய்தல்"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"இருப்பிடச் சேவைகள்"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"வைஃபை ஸ்கேன் செய்தல்"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"வைஃபை ஆஃப் செய்யப்பட்டிருந்தாலும்கூட எந்தநேரத்திலும் வைஃபை நெட்வொர்க்குகளைத் தேட ஆப்ஸையும் சேவைகளையும் அனுமதிக்கும். உதாரணத்திற்கு இருப்பிடம் சார்ந்த அம்சங்களையும் சேவைகளையும் மேம்படுத்துவதற்கும் இதைப் பயன்படுத்தலாம்."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"புளூடூத் ஸ்கேன் செய்தல்"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"புளூடூத் ஆஃப் செய்யப்பட்டிருந்தாலும்கூட எந்தநேரத்திலும் அருகிலுள்ள சாதனங்களைத் தேட ஆப்ஸையும் சேவைகளையும் அனுமதிக்கும். உதாரணத்திற்கு இருப்பிடம் சார்ந்த அம்சங்களையும் சேவைகளையும் மேம்படுத்துவதற்கும் இதைப் பயன்படுத்தலாம்."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"சிஸ்டம்"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"இயங்குதளப் புதுப்பிப்புகள்"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"சிஸ்டம் புதுப்பிப்புகள்"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android பதிப்பு"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android பாதுகாப்பின் பேட்ச் நிலை"</string>
     <string name="model_info" msgid="4966408071657934452">"மாடல்"</string>
     <string name="baseband_version" msgid="2370088062235041897">"பேஸ்பேண்ட் பதிப்பு"</string>
     <string name="kernel_version" msgid="7327212934187011508">"கர்னல் பதிப்பு"</string>
     <string name="build_number" msgid="3997326631001009102">"பதிப்பு எண்"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"புளூடூத் முகவரி"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"கிடைக்கவில்லை"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"நிலை"</string>
     <string name="device_status" msgid="267298179806290920">"நிலை"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"பதிப்புரிமை"</string>
     <string name="license_title" msgid="936705938435249965">"உரிமம்"</string>
     <string name="terms_title" msgid="5201471373602628765">"விதிமுறைகளும் நிபந்தனைகளும்"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"சிஸ்டம் WebView உரிமம்"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"சிஸ்டம் WebView உரிமங்கள்"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"வால்பேப்பர்கள்"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"சாட்டிலைட் படங்களை வழங்குபவர்கள்:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"மூன்றாம் தரப்பு உரிமங்கள்"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"உரிமங்களை ஏற்றுவதில் சிக்கல்."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"ஏற்றுகிறது…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">நீங்கள் டெவெலப்பராக இன்னும் <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> படிகள் உள்ளன.</item>
+      <item quantity="one">நீங்கள் டெவெலப்பராக இன்னும் <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> படி உள்ளது.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"நீங்கள் இப்போது டெவெலப்பராகிவிட்டீர்கள்!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"தேவையில்லை, நீங்கள் ஏற்கனவே ஒரு டெவெலப்பர்."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"டெவெலப்பர் விருப்பங்கள்"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"மீட்டமைவு விருப்பங்கள்"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"சாதனம், ஆப்ஸ் அல்லது நெட்வொர்க் மீட்டமைவு"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"நெட்வொர்க்கை மீட்டமைத்தல்"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"பின்வருபவை உட்பட, அனைத்து நெட்வொர்க் அமைப்புகளையும் மீட்டமைக்கும்:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"வைஃபை"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"மொபைல் டேட்டா"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"புளூடூத்"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"வாகன eSIMகளை அழித்தல்"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"இதனால் உங்கள் சேவைத் திட்டம் ரத்துசெய்யப்படாது."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIMகளை மீட்டமைக்க இயலவில்லை"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"நெட்வொர்க்கைத் தேர்வுசெய்தல்"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"அமைப்புகளை மீட்டமை"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"மீட்டமைக்கவா?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"எல்லா நெட்வொர்க் அமைப்புகளையும் மீட்டமைக்கவா? இதைச் செயல்தவிர்க்க முடியாது!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"அமைப்புகளை மீட்டமை"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"நெட்வொர்க் அமைப்புகள் மீட்டமைக்கப்பட்டன"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ஆப்ஸ் விருப்பத்தேர்வுகளை மீட்டமை"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"பின்வரும் விருப்பத்தேர்வுகளை இது மீட்டமைக்கும்:\n\n"<li>"முடக்கப்பட்டுள்ள ஆப்ஸ்"</li>\n<li>"முடக்கப்பட்டுள்ள ஆப்ஸ் அறிவிப்புகள்"</li>\n<li>"செயல்பாடுகளுக்கான இயல்புநிலை ஆப்ஸ்"</li>\n<li>"ஆப்ஸிற்கான பின்புலத் தரவுக் கட்டுப்பாடுகள்"</li>\n<li>"ஏதேனும் அனுமதிக் கட்டுப்பாடுகள்"</li>\n\n"இதன் காரணமாக எந்த ஆப்ஸ் தரவையும் இழக்கமாட்டீர்கள்."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ஆப்ஸை மீட்டமை"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ஆப்ஸ் விருப்பத்தேர்வுகள் மீட்டமைக்கப்பட்டன"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"எல்லாத் தரவையும் அழி (ஆரம்பநிலை ரீசெட்)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"இது உங்கள் கார் சாதனத்தின் முதன்மை யூனிட்டிலிருந்து அனைத்துத் தரவையும் அழித்துவிடும். இவற்றில்\n\n"<li>"உங்களின் Google கணக்கு"</li>\n<li>"சிஸ்டம் &amp; ஆப்ஸ் தரவுகள் மற்றும் அமைப்புகள்"</li>\n<li>"பதிவிறக்கப்பட்ட ஆப்ஸ்"</li>" ஆகியவை உள்ளடங்கும்"</string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"தற்போது பின்வரும் கணக்குகளில் உள்நுழைந்துள்ளீர்கள்:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"இந்தக் காரின் சாதனத்தைப் பிற பயனர்கள் பயன்படுத்துகின்றனர்."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"காரின் சாதனத்தை மீட்டமை"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"மீட்டமைக்கவா?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"அனைத்துத் தனிப்பட்ட தகவலையும், பதிவிறக்கிய ஆப்ஸையும் அழிக்கவா? இதைச் செயல்தவிர்க்க இயலாது!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"அனைத்தையும் அழி"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"அழிக்கிறது"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"காத்திருக்கவும்..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"தேதி &amp; நேரம்"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"தேதி மற்றும் நேரத்தை அமை"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"தேதி, நேரம், நேரமண்டலம் &amp; வடிவங்களை அமை"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"நேர மண்டலத்தின்படி வரிசைப்படுத்து"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"தேதி"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"நேரம்"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"பயனரைச் சேர்"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"கணக்கைச் சேர்"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"பயனரை நீக்கும்"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"புதிய பயனர்"</string>
-    <string name="user_guest" msgid="3465399481257448601">"விருந்தினர்"</string>
     <string name="user_admin" msgid="1535484812908584809">"நிர்வாகி"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"நிர்வாகியாக உள்நுழைந்துள்ளீர்கள்"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"நிர்வாகி அனுமதிகளை வழங்குதல்"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"நிர்வாகியாக்கு"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"நிர்வாகியாக்கப்பட்ட பயனரால் மற்ற ’நிர்வாகிகள்’ உட்பட எவரையும் நீக்க முடிவதோடு சிஸ்டத்தையும் ஆரம்பநிலைக்கு மீட்டமைக்க முடியும்."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"இந்தச் செயலைத் திரும்பப் பெற இயலாது."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ஆம், நிர்வாகியாக்கு"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"புதிய பயனர்களை உருவாக்குதல்"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ஃபோன் அழைப்புகளைச் செய்தல்"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"காரின் மொபைல் டேட்டா மூலம் மெசேஜிங்"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"புதிய ஆப்ஸை நிறுவுதல்"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ஆப்ஸை நிறுவல்நீக்குதல்"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"பயனரைச் சேர்"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"புதிய பயனர்"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"புதிய பயனரைச் சேர்க்கவா?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"எந்தவொரு பயனரும், மற்ற பயனர்களுக்காக ஆப்ஸைப் புதுப்பிக்கலாம்."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"பயனர் வரம்பை அடைந்துவிட்டீர்கள்"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> பயனர்கள் வரை சேர்க்க முடியும்.</item>
+      <item quantity="one">ஒரு பயனரை மட்டுமே சேர்க்க முடியும்.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"புதிய பயனரைச் சேர்க்க முடியவில்லை"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"இந்தப் பயனரை நீக்கவா?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"அனைத்து ஆப்ஸ் மற்றும் தரவு நீக்கப்படும்."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"பயனரை நீக்க இயலவில்லை."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"நிராகரி"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"மீண்டும் முயலவும்"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"கடைசிப் பயனரை நீக்கவா?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"இந்தக் காருக்கான மீதியிருக்கும் ஒரேயொரு பயனரையும் நீக்கியபிறகு, புதிதாக ஒரு ’நிர்வாகிப் பயனர் கணக்கு’ உருவாக்கப்படும்."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"இந்தப் பயனர் கணக்குடன் தொடர்புடைய ஆப்ஸ், தரவு மற்றும் அமைப்புகள் அனைத்தும் நீக்கப்படும். சிஸ்டத்தை நீங்கள் மீண்டும் அமைத்திட வேண்டியிருக்கும்."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"புதிய \'நிர்வாகிக் கணக்கைத்\' தேர்வு செய்க"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"குறைந்தபட்சம் ஒரு \'நிர்வாகிக் கணக்காவது’ இருக்க வேண்டும். இக்கணக்கை நீக்க, முதலில் ஒரு மாற்றுக் கணக்கைத் தேர்வு செய்யவும்."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"நிர்வாகியைத் தேர்வு செய்க"</string>
+    <string name="user_guest" msgid="3465399481257448601">"விருந்தினர்"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"விருந்தினர்"</string>
     <string name="user_switch" msgid="6544839750534690781">"பயனரை மாற்றும்"</string>
     <string name="current_user_name" msgid="3813671533249316823">"நீங்கள் (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"பெயர்"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"அமைக்கவில்லை"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"பயனர் பெயரைத் திருத்தவும்"</string>
     <string name="users_list_title" msgid="770764290290240909">"பயனர்கள்"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$sக்கு இந்த அனுமதிகள் உள்ளன"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"கணக்குகள்"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"பயனர்"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"கணக்கைச் சேர்"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"கணக்குகள் எதுவும் சேர்க்கப்படவில்லை"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> இன் கணக்குகள்"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"தானாகத் தரவை ஒத்திசைத்தல்"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"தானாகத் தரவை ரெஃப்ரெஷ் செய்ய ஆப்ஸை அனுமதிக்கவும்"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"தானாக ஒத்திசைப்பதை ஆன் செய்யவா?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"இணையத்திலுள்ள கணக்குகளில் நீங்கள் செய்யும் மாற்றங்கள் தானாகவே உங்கள் சாதனத்தில் நகலெடுக்கப்படும்.\n\n மொபைலில் நீங்கள் செய்யும் மாற்றங்களையும் சில கணக்குகள் தானாகவே இணையத்தில் நகலெடுக்கக்கூடும். Google கணக்கு இவ்வாறுதான் செயல்படுகிறது."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"தானாக ஒத்திசைப்பதை ஆஃப் செய்யவா?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"இவ்வாறு செய்வது தரவைச் சேமிக்கும், ஆனால் சமீபத்திய தகவலைச் சேகரிக்க ஒவ்வொரு கணக்கையும் நீங்களே நேரடியாக ஒத்திசைக்க வேண்டும். புதுப்பிக்கப்படும்போது அறிவிப்புகளைப் பெறமாட்டீர்கள்."</string>
     <string name="account_details_title" msgid="7529571432258448573">"கணக்குத் தகவல்"</string>
     <string name="add_account_title" msgid="5988746086885210040">"கணக்கைச் சேர்க்கவும்"</string>
     <string name="add_an_account" msgid="1072285034300995091">"கணக்கைச் சேர்"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"கணக்கை அகற்று"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"கணக்கை அகற்றவா?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"இந்தக் கணக்கை அகற்றினால், இதன் செய்திகள், தொடர்புகள், பிற தரவு ஆகியவை சாதனத்திலிருந்து நீக்கப்படும்!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"உங்கள் நிர்வாகி இந்த மாற்றத்தை அனுமதிக்கவில்லை"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"இந்தப் பயனரை அகற்றவா?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"எல்லா ஆப்ஸும் தரவும் நீக்கப்படும்."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"பயனரை அகற்ற முடியவில்லை."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"மீண்டும் முயலவா?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"நிராகரி"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"மீண்டும் முயலவும்"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"புதிய பயனரைச் சேர்க்கவா?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"எந்தவொரு பயனரும், மற்ற பயனர்களுக்காக ஆப்ஸைப் புதுப்பிக்கலாம்."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"கணக்கை அகற்ற இயலவில்லை."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"கணக்கு ஒத்திசைவு"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> இல் <xliff:g id="ID_1">%1$d</xliff:g>க்கு ஒத்திசைவு ஆன் செய்யப்பட்டுள்ளது"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"அனைத்துக்கும் ஒத்திசைவை ஆன் செய்"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"அனைத்துக்கும் ஒத்திசைவை ஆஃப் செய்"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"ஒத்திசைவு: ஆஃப்"</string>
+    <string name="sync_error" msgid="6698021343089247914">"ஒத்திசைவுப் பிழை"</string>
+    <string name="last_synced" msgid="4745124489150101529">"கடைசியாக ஒத்திசைத்தது <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"இப்போது ஒத்திசைக்கிறது…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"இப்போது ஒத்திசைக்கத் தட்டவும்<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"இப்போதே ஒத்திசை"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ஒத்திசைவை ரத்துசெய்"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"தற்போது ஒத்திசைக்க இயலவில்லை. விரைவில் இது சரிசெய்யப்படும்."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"பாதுகாப்பு"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"திரைப் பூட்டு"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"எதுவுமில்லை"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"பின்"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"கடவுச்சொல்"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"பூட்டு வகை தேர்வுசெய்க"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"திரைப் பூட்டு விருப்பங்கள்"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"பூட்டு விருப்பங்கள்"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"பேட்டர்னை உள்ளிடுக"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"உறுதிப்படுத்து"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"மீண்டும் வரைக"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"திரைப் பூட்டை அமைக்கவும்"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"பின்னைத் தேர்ந்தெடுக்கவும்"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"பேட்டர்னைத் தேர்வுசெய்யவும்"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"கடவுச்சொல்லைத் தேர்ந்தெடுக்கவும்"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"கடவுச்சொல்லைத் தேர்வுசெய்க"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"தற்போதைய திரைப் பூட்டு"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"பாதுகாப்பிற்கு, பேட்டர்னை அமைக்கவும்"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"அழி"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"உங்கள் IT நிர்வாகி, பொதுவான கடவுச்சொற்களைத் தடுத்துள்ளார். வேறு கடவுச்சொல்லைப் பயன்படுத்திப் பார்க்கவும்."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"இலக்கங்கள் ஏறுவரிசையில், இறங்குவரிசையில் அல்லது ஒரே இலக்கத்தைத் தொடர்ந்து பயன்படுத்துவது அனுமதிக்கப்படாது."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"திரைப் பூட்டு விருப்பங்கள்"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> நாட்கள் முன்பு"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"நம்பகமான சாதனத்தைச் சேர்"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"நம்பகமான சாதனங்கள்"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> சாதனங்கள்</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> சாதனம்</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> சாதனம் இணைக்கப்படும்போது உங்கள் காரை அது திறக்கும். <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> சாதனம் எவர் கையிலாவது கிடைத்தால் அவர்கள் அதைப் பயன்படுத்த வாய்ப்பிருக்கிறது"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"உறுதிப்படுத்து"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"நம்பகமான சாதனத்தை அகற்று"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"முடிந்தது"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"நம்பகமான சாதனத்தை அமைக்க கம்பேனியன் ஆப்ஸைப் பயன்படுத்தவும். அமைவு முடிந்ததும், உங்கள் மொபைலை வாகனம் கண்டறிந்தால் உங்களின் பயனர் சுயவிவரத்தை அன்லாக் செய்ய இயலும்"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. உங்கள் மொபைலில் கம்பேனியன் ஆப்ஸைப் பதிவிறக்கவும்"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. சாதனங்களை இணைக்க உங்கள் மொபைலில் <xliff:g id="CAR_NAME">%1$s</xliff:g> என்பதைத் தேர்வுசெய்யவும்"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ஆப்ஸால் இந்தச் சாதனத்தின் பாதுகாப்பு அம்சங்களைக் கண்டறிய இயலாது. உங்கள் காரைப் பாதுகாக்க, நீங்கள் ஏற்கனவே அன்லாக் செய்திருந்தால் மட்டுமே, நம்பகமான சாதனங்களால் அதனை அன்லாக் செய்ய இயலும். வேறு யாராவது உங்கள் காரை வைத்திருந்தாலும்கூட, அருகில் இருக்கும்போது நம்பகமான சாதனங்களால் உங்கள் காரை அன்லாக் செய்ய இயலும்."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> என்ற சாதனத்தை நம்பகமான சாதனமாகச் சேர்த்தல்"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"நம்பகமான சாதனமாக <xliff:g id="DEVICE_NAME">%1$s</xliff:g> சேர்க்கப்பட்டது."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> பதிவு செய்வதில் தோல்வி"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"நம்பகமான சாதனத்தைச் சேர்த்த பிறகு அடையாளச் சரிபார்ப்பு முறையை அமைக்க வேண்டும். உங்களிடம் நம்பகமான சாதனம் இல்லையெனில் அடையாளச் சரிபார்ப்பிற்காக உங்கள் சுயவிவரத்தை அணுக வேண்டிய அவசியம் ஏற்படும்."</string>
     <string name="forget" msgid="3971143908183848527">"அகற்று"</string>
+    <string name="connect" msgid="5861699594602380150">"இணை"</string>
+    <string name="disconnect" msgid="6140789953324820336">"துண்டி"</string>
     <string name="delete_button" msgid="5840500432614610850">"நீக்கு"</string>
     <string name="remove_button" msgid="6664656962868194178">"அகற்று"</string>
     <string name="cancel" msgid="750286395700355455">"ரத்துசெய்"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"டெமோ மோடிலிருந்து வெளியேறுதல்"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"இவ்வாறு செய்தால், டெமோ கணக்கு நீக்கப்படுவதோடு, சாதனமானது தரவின் ஆரம்பநிலைக்கு மீட்டமைக்கப்படும். எல்லாப் பயனர் தரவையும் இழப்பீர்கள்."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"டெமோவிலிருந்து வெளியேறு"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"அமைவை முடி"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"இப்போது வேண்டாம்"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"நிராகரி"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"வாகனம் ஓட்டும்போது, இந்த அம்சத்தைப் பயன்படுத்த முடியாது."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"வாகனம் ஓட்டும்போது, பயனரைச் சேர்க்க முடியாது."</string>
 </resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index dece14b..2df2f73 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"కాంతివిహీన స్క్రీన్, టచ్‌స్క్రీన్, బ్యాటరీ"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"కాంతివిహీన స్క్రీన్, రాత్రి, లేత రంగు"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"రాత్రి మోడ్"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"నెట్‌వర్క్ &amp; ఇంటర్నెట్"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"మొబైల్ నెట్‌వర్క్"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"మొబైల్ డేటా"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"మొబైల్ నెట్‌వర్క్‌ను ఉపయోగించి డేటాను యాక్సెస్ చేయండి"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"మొబైల్ డేటాని ఆఫ్ చేయాలా?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"డేటా వినియోగం"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"డేటా వార్నింగ్ &amp; పరిమితి"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"యాప్ డేటా వినియోగ సైకిల్"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"డేటా హెచ్చరికను సెట్ చేయండి"</string>
+    <string name="data_warning" msgid="116776633806885370">"డేటా హెచ్చరిక"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"డేటా పరిమితిని సెట్ చేయండి"</string>
+    <string name="data_limit" msgid="227338836292511425">"డేటా పరిమితి"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"డేటా వినియోగాన్ని పరిమితం చేయడం"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"మీరు సెట్ చేసిన పరిమితిని చేరుకున్న తర్వాత మీ వాహనం యొక్క మొబైల్ డేటా ఆఫ్ చేయబడుతుంది.\n\nడేటా వినియోగాన్ని మీ ఫోన్ ఒక పద్ధతిలో గణిస్తే, అదే వినియోగ పరిమాణాన్ని మీ క్యారియర్ వేరే పద్ధతిలో గణించవచ్చు, కనుక కనిష్ట పరిమితిని సెట్ చేయడం మంచిది."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"వైర్‌లెస్ యాక్సెస్ స్థానాలను సెటప్ చేయండి &amp; నిర్వహించండి"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fiని ఆన్ చేస్తోంది…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fiని ఆఫ్ చేస్తోంది…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi జాబితా లోడ్ అవుతోంది"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi నిలిపివేయబడింది"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"నెట్‌వర్క్‌ను మర్చిపోవడంలో విఫలమైంది"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"నెట్‌వర్క్‌కు కనెక్ట్ చేయడం విఫలమైంది"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"నెట్‌వర్క్‌ను జోడించు"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi నిలిపివేయబడింది"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"కనెక్ట్"</string>
     <string name="wifi_password" msgid="5565632142720292397">"పాస్‌‌వర్డ్"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"పాస్‌వర్డ్‌ను చూపు"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"నెట్‌వర్క్ పేరు"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSIDని నమోదు చేయండి"</string>
     <string name="wifi_security" msgid="158358046038876532">"భద్రత"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"సిగ్నల్ సామర్థ్యం"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"సిగ్నల్ సామర్థ్యం"</string>
     <string name="wifi_status" msgid="5688013206066543952">"స్థితి"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"లింక్ వేగం"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"తరచుదనం"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP చిరునామా"</string>
+    <string name="show_password" msgid="2074628020371139240">"పాస్‌వర్డ్‌ను చూపు"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"నెట్‌వర్క్ పేరును నమోదు చేయండి"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"పాస్‌వర్డ్‌ని నమోదు చేయండి"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"బాగాలేదు"</item>
-    <item msgid="2032262610626057081">"పర్వాలేదు"</item>
-    <item msgid="3859756017461098953">"బాగుంది"</item>
-    <item msgid="1521103743353335724">"అద్భుతం"</item>
+    <item msgid="7683058295076342057">"బాగాలేదు"</item>
+    <item msgid="1639222824821660744">"ఫర్వాలేదు"</item>
+    <item msgid="1838705897358163300">"బాగుంది"</item>
+    <item msgid="6067166649320533751">"అద్భుతం"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"బ్లూటూత్"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"బ్లూటూత్‌ను ఆన్ చేయి"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"బ్లూటూత్"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"బ్లూటూత్ నిలిపివేయబడింది"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"నెట్‌వర్క్ వివరాలు"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC చిరునామా"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP చిరునామా"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"సబ్‌నెట్ మాస్క్"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 చిరునామాలు"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"గేట్‌వే"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi ప్రాధాన్యతలు"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fiని ఆటోమేటిక్‌గా ఆన్ చేయి"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"మీ ఇంటి నెట్‌వర్క్‌ల వంటి సేవ్ చేసిన అధిక నాణ్యత గల నెట్‌వర్క్‌లు అందుబాటులో ఉన్నప్పుడు Wi‑Fi తిరిగి ఆన్ చేయబడుతుంది"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"స్థానం ఆఫ్ చేయబడింది కనుక అందుబాటులో లేదు. "<annotation id="link">"స్థానం"</annotation>" ఆన్ చేయండి."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi స్కానింగ్‌ను ఆన్ చేయాలా?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"ఆన్ చేయి"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi-Fi స్కానింగ్ ఆన్ చేయబడింది"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"స్వయంచాలకంగా మొబైల్ డేటాకి మార్చు"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi‑Fiకి ఇంటర్నెట్ యాక్సెస్ లేనప్పుడు మొబైల్ డేటాను ఉపయోగిస్తుంది. డేటా వినియోగ ఛార్జీలు వర్తించవచ్చు."</string>
+    <string name="learn_more" msgid="8214605928933358604">"మరింత తెలుసుకోండి"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"బ్లూటూత్"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"కనెక్షన్‌లను నిర్వహించండి, పరికరం పేరును &amp; శోధనలో కనుగొనబడే సామర్థ్యాన్ని సెట్ చేయండి"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"కంప్యూటర్"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"హెడ్‌సెట్"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"ఫోన్"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"ప్రతిబింబనం"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"హెడ్‌ఫోన్"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ఇన్‌పుట్ అనుబంధ పరికరం"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"బ్లూటూత్"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"జత చేయబడిన పరికరాలు"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"అందుబాటులో ఉన్న పరికరాలు"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"జత చేయబడిన పరికరాలు లేవు"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"అందుబాటులో ఉన్న పరికరాలేవీ లేవు"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"జత చేయబడిన పరికరం"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"పేరు"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"దీని కోసం ఉపయోగించు"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"బ్లూటూత్ పరికరం పేరును మార్చండి"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"పేరులేని పరికరం"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"జత చేయబడిన పరికరాలు"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"కొత్త పరికరాన్ని జత చేయి"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"జత చేయడం కోసం బ్లూటూత్ ఆన్ చేయబడుతుంది"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"పరికరాన్ని డిస్‌కనెక్ట్ చేయాలా?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"మీ వాహనం <xliff:g id="DEVICE_NAME">%1$s</xliff:g> నుండి డిస్‌కనెక్ట్ అవుతుంది."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"వాహనం బ్లూటూత్ చిరునామా: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"పరికరం యొక్క బ్లూటూత్ చిరునామా: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"వాహనం పేరు"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"ఈ వాహనం పేరు మార్చండి"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"పరికరం పేరు మార్చండి"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"పేరు మార్చు"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"అందుబాటులో ఉన్న పరికరాలు"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"ప్రొఫైల్‌లు"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"బ్లూటూత్ జత చేయడానికి అభ్యర్థన"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"జత చేసి, కనెక్ట్ చేయి"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"బ్లూటూత్"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"బ్లూటూత్ జత చేసే కోడ్"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"పిన్‌ అక్షరాలను లేదా చిహ్నాలను కలిగి ఉంది"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"జత చేసే కోడ్‌ను టైప్ చేసి, ఆపై Return లేదా Enter నొక్కండి"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"సాధారణంగా 0000 లేదా 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"జత చేయడానికి అభ్యర్థన"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>తో జత చేయడానికి నొక్కండి."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"భాషలు"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"భాషలు &amp; ఇన్‌పుట్"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"కీబోర్డ్"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"కీబోర్డ్‌లను నిర్వహించండి"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"వచనం నుండి ప్రసంగం అవుట్‌పుట్"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ప్రాధాన్య ఇంజిన్"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"ప్రస్తుత ఇంజిన్"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"ప్రసంగం రేట్"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"పిచ్"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"రీసెట్ చేయి"</string>
     <string name="sound_settings" msgid="3072423952331872246">"ధ్వని"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"రింగ్ వాల్యూమ్"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"నావిగేషన్ వాల్యూమ్"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"మీడియా"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"సంగీతం మరియు వీడియోల కోసం వాల్యూమ్‌ను సెట్ చేయండి"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"అలారం"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"ఫోన్ రింగ్‌టోన్"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"డిఫాల్ట్ నోటిఫికేషన్ ధ్వని"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"డిఫాల్ట్ అలారం ధ్వని"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"యాప్‌లు &amp; నోటిఫికేషన్‌లు"</string>
+    <string name="all_applications" msgid="7798210477486822168">"అన్ని యాప్‌లను చూపండి"</string>
+    <string name="default_applications" msgid="1558183275638697087">"డిఫాల్ట్ యాప్‌లు"</string>
     <string name="applications_settings" msgid="794261395191035632">"యాప్ సమాచారం"</string>
+    <string name="force_stop" msgid="2153183697014720520">"ఫోర్స్ స్టాప్"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"హటాత్తుగా ఆపివేయాలా?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"మీరు ఏదైనా యాప్‌ను హటాత్తుగా ఆపివేస్తే, అది సరిగ్గా పని చేయకపోవచ్చు."</string>
     <string name="disable_text" msgid="4358165448648990820">"నిలిపివేయి"</string>
     <string name="enable_text" msgid="1794971777861881238">"ప్రారంభించు"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"అన్ఇన్‌స్టాల్ చేయి"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"మీరు ఈ యాప్‌ను నిలిపివేస్తే, Android మరియు ఇతర యాప్‌లు ఇకపై ఉద్దేశించిన రీతిలో పని చేయకపోవచ్చు."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"యాప్‌ను నిలిపివేయి"</string>
     <string name="permissions_label" msgid="2701446753515612685">"అనుమతులు"</string>
     <string name="application_version_label" msgid="8556889839783311649">"వెర్షన్: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"అనుమతులు మంజూరు కాలేదు"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"అనుమతులను అభ్యర్థించలేదు"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"డేటా వినియోగం"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"యాప్ డేటా వినియోగం"</string>
-    <string name="force_stop" msgid="2153183697014720520">"ఫోర్స్ స్టాప్"</string>
     <string name="computing_size" msgid="5791407621793083965">"గణిస్తోంది…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> అదనపు అనుమతులు</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> అదనపు అనుమతి</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"అసిస్టెంట్ &amp; వాయిస్ ఇన్‌పుట్"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"సహాయక యాప్"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"స్క్రీన్‌లోని వచనాన్ని ఉపయోగించండి"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"స్క్రీన్ కంటెంట్‌లను వచన రూపంలో యాక్సెస్ చేయడానికి సహాయక యాప్‌ను అనుమతిస్తుంది"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"స్క్రీన్‌షాట్‌ను ఉపయోగించండి"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"స్క్రీన్ చిత్రాన్ని యాక్సెస్ చేయడానికి సహాయక యాప్‌ను అనుమతిస్తుంది"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"స్వీయ పూరింపు సేవ"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ఏదీ కాదు"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"ఎంచుకోబడింది"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"అసిస్టెంట్ మీ సిస్టమ్‌లో వినియోగంలో ఉన్న యాప్‌ల గురించిన సమాచారం, అలాగే మీ స్క్రీన్‌పై కనిపించే లేదా యాప్‌లలో యాక్సెస్ చేసే సమాచారాన్ని చదవగలుగుతుంది."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ఈ యాప్‌ను మీరు విశ్వసిస్తున్నట్లు నిర్ధారించండి&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; మీ స్క్రీన్‌పై ఉన్నవాటిని పరిగణనలోకి తీసుకొని వేటిని ఆటోమేటిక్‌గా పూరించాలో నిశ్చయిస్తుంది."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"సేవను జోడించు"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"స్థానం"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"ఇటీవలి స్థాన అభ్యర్థనలు"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ఇటీవలి స్థాన అభ్యర్థనలు లేవు"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"యాప్‌-స్థాయి అనుమతులు"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"స్కానింగ్"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"స్థాన సేవలు"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi స్కానింగ్"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi‑Fi ఆఫ్‌లో ఉన్నా కూడా, ఏ సమయంలోనైనా Wi‑Fi నెట్‌‍వర్క్‌లను స్కాన్ చేయడానికి యాప్‌లను మరియు సేవలను అనుమతించండి. ఉదాహరణకు, ఇది స్థాన ఆధారిత ఫీచర్‌లు మరియు సేవలను మెరుగుపరచడానికి ఉపయోగించబడుతుంది."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"బ్లూటూత్ స్కానింగ్"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"బ్లూటూత్ ఆఫ్‌లో ఉన్నప్పుడు కూడా, ఏ సమయంలోనైనా సమీపంలోని పరికరాలను స్కాన్ చేయడానికి యాప్‌లను మరియు సేవలను అనుమతించండి. ఉదాహరణకు, ఇది స్థాన ఆధారిత ఫీచర్‌లు మరియు సేవలను మెరుగుపరచడానికి ఉపయోగించబడుతుంది."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"సిస్టమ్"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"సిస్టమ్ అప్‌డేట్‌లు"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"సిస్టమ్ అప్‌డేట్‌లు"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android వెర్షన్"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android భద్రతా ప్యాచ్ స్థాయి"</string>
     <string name="model_info" msgid="4966408071657934452">"మోడల్"</string>
     <string name="baseband_version" msgid="2370088062235041897">"బేస్‌బ్యాండ్ వెర్షన్"</string>
     <string name="kernel_version" msgid="7327212934187011508">"కెర్నెల్ వెర్షన్"</string>
     <string name="build_number" msgid="3997326631001009102">"బిల్డ్ సంఖ్య"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"బ్లూటూత్ చిరునామా"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"అందుబాటులో లేదు"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"స్థితి"</string>
     <string name="device_status" msgid="267298179806290920">"స్థితి"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"కాపీరైట్"</string>
     <string name="license_title" msgid="936705938435249965">"లైసెన్స్"</string>
     <string name="terms_title" msgid="5201471373602628765">"నిబంధనలు మరియు షరతులు"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"సిస్టమ్ వెబ్ వీక్షణ లైసెన్స్"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"సిస్టమ్ వెబ్ వీక్షణ లైసెన్స్‌లg"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"వాల్‌పేపర్‌లు"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ఉపగ్రహ చిత్రాల ప్రదాతలు:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"మూడవ పక్షం లైసెన్స్‌లు"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"లైసెన్స్‌లను లోడ్ చేయడంలో సమస్య ఉంది."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"లోడ్ చేస్తోంది…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">మీరు ఇప్పుడు డెవలపర్ కావడానికి <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> అడుగుల దూరంలో ఉన్నారు.</item>
+      <item quantity="one">మీరు ఇప్పుడు డెవలపర్ కావడానికి <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> అడుగు దూరంలో ఉన్నారు.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"మీరు ఇప్పుడు డెవలపర్!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"అవసరం లేదు, మీరు ఇప్పటికే డెవలపర్‌గా ఉన్నారు."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"డెవలపర్ ఎంపికలు"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"రీసెట్ ఎంపికలు"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"నెట్‌వర్క్, యాప్‌లు లేదా పరికరాన్ని రీసెట్ చేయి"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"నెట్‌వర్క్‌ని రీసెట్ చేయండి"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"ఇది అన్ని నెట్‌వర్క్ సెట్టింగ్‌లను రీసెట్ చేస్తుంది, వీటితో సహా:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"మొబైల్ డేటా"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"బ్లూటూత్"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"వాహన eSIMలన్నింటినీ తొలగించండి"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"ఇది మీ సేవా ప్లాన్‌ని రద్దు చేయదు."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"ESIMలను రీసెట్ చేయడం సాధ్యం కాదు"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"నెట్‌వర్క్‌ని ఎంచుకోండి"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"సెట్టింగ్‌లను రీసెట్ చేయి"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"రీసెట్ చేయాలా?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"అన్ని నెట్‌వర్క్ సెట్టింగ్‌లను రీసెట్ చేయాలా? మీరు ఈ చర్యను తిరిగి రద్దు చేయలేరు!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"సెట్టింగ్‌లను రీసెట్ చేయి"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"నెట్‌వర్క్ సెట్టింగ్‌లు రీసెట్ చేయబడ్డాయి"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"యాప్ ప్రాధాన్యతలను రీసెట్ చేయి"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"ఇది వీటి కోసం అన్ని ప్రాధాన్యతలను రీసెట్ చేస్తుంది:\n\n"<li>"నిలిపివేయబడిన యాప్‌లు"</li>\n<li>"నిలిపివేయబడిన యాప్ నోటిఫికేషన్‌లు"</li>\n<li>"చర్యల కోసం డిఫాల్ట్ యాప్‌లు"</li>\n<li>"యాప్‌ల కోసం నేపథ్య డేటా పరిమితులు"</li>\n<li>"ఏవైనా అనుమతి పరిమితులు"</li>\n\n" మీరు ఏ యాప్‌ డేటాను కోల్పోరు."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"యాప్‌లను రీసెట్ చేయి"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"యాప్ ప్రాధాన్యతలు రీసెట్ చేయబడ్డాయి"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"మొత్తం డేటాను తొలగించు (ఫ్యాక్టరీ రీసెట్)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"ఇది మీ వాహన ప్రధాన విభాగం నుండి మొత్తం డేటాను తొలగిస్తుంది, వీటితో సహా:\n\n"<li>"మీ Google ఖాతా"</li>\n<li>"సిస్టమ్ మరియు యాప్ డేటా మరియు సెట్టింగ్‌లు"</li>\n<li>"డౌన్‌లోడ్ చేసిన యాప్‌‍లు"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"మీరు ప్రస్తుతం క్రింది ఖాతాలకు సైన్ ఇన్ చేసారు:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"ఈ వాహనంలో ఇతర వినియోగదారులు ఉన్నారు."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"వాహనాన్ని రీసెట్ చేయి"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"రీసెట్ చేయాలా?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"మీ వ్యక్తిగత సమాచారం మరియు డౌన్‌లోడ్ చేసిన యాప్‌లు అన్నింటినీ తొలగించాలా? మీరు ఈ చర్యను తిరిగి రద్దు చేయలేరు!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ప్రతి దాన్ని తొలగించండి"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"తొలగిస్తోంది"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"దయచేసి వేచి ఉండండి..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"తేదీ &amp; సమయం"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"తేదీ మరియు సమయాన్ని సెట్ చేయండి"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"తేదీ, సమయం, సమయ మండలి &amp; ఫార్మాట్‌లను సెట్ చేయండి"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"సమయ మండలి ప్రకారం క్రమీకరించు"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"తేదీ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"సమయం"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"వినియోగదారుని జోడించు"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"ఖాతాను జోడించు"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"వినియోగదారుని తొలగించు"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"కొత్త వినియోగదారు"</string>
-    <string name="user_guest" msgid="3465399481257448601">"అతిథి"</string>
     <string name="user_admin" msgid="1535484812908584809">"నిర్వాహకుడు"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"నిర్వాహకుడిగా సైన్ ఇన్ చేసారు"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"అన్ని నిర్వాహక అనుమతులు"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"నిర్వాహకుడిగా చేయి"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"వినియోగదారు ఇతర నిర్వాహకులతో సహా వినియోగదారులను తొలగించగలరు మరియు సిస్టమ్‌ని ఫ్యాక్టరీ రీసెట్ చేయగలరు."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"ఈ చర్యను రద్దు చేయలేరు."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"అవును, నిర్వాహకుడిగా చేయి"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"కొత్త వినియోగదారులను సృష్టించడం"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"ఫోన్ కాల్‌లు చేయడం"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"కారు మొబైల్ డేటాతో సందేశం పంపడం"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"కొత్త యాప్‌లను ఇన్‌స్టాల్ చేయడం"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"యాప్‌లను అన్‌ఇన్‌స్టాల్ చేయడం"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"వినియోగదారుని జోడించు"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"కొత్త వినియోగదారు"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"కొత్త వినియోగదారుని జోడించాలా?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"మీరు కొత్త వినియోగదారును జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం యాప్‌లను అప్‌డేట్ చేయవచ్చు."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"వినియోగదారు పరిమితిని చేరుకున్నారు"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">మీరు <xliff:g id="COUNT">%d</xliff:g>వినియోగదారుల వరకు సృష్టించవచ్చు.</item>
+      <item quantity="one">ఒక్క వినియోగదారుని మాత్రమే సృష్టించవచ్చు.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"కొత్త వినియోగదారుని సృష్టించడంలో విఫలమైంది"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ఈ వినియోగదారును తొలగించాలా?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"అన్ని యాప్‌లు మరియు డేటా తొలగించబడతాయి."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"వినియెగదారును తొలగించడం విఫలమైంది."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"విస్మరించు"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"మళ్లీ ప్రయత్నించు"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"చివరి వినియోగదారుని తొలగించాలా?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"ఈ కార్ యొక్క ఏకైక వినియోగదారుని తొలగించిన తర్వాత, కొత్త నిర్వాహక వినియోగదారు సృష్టించబడతారు."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ఈ వినియోగదారుకు అనుబంధంగా ఉన్న మొత్తం డేటా, సెట్టింగ్‌లు మరియు యాప్‌లు తొలగించబడతాయి. మీరు సిస్టమ్‌ను మళ్లీ సెటప్ చేయవలసి ఉంటుంది."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"కొత్త నిర్వాహకుడిని ఎంచుకోండి"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"మీకు కనీసం ఒక నిర్వాహకుడు అవసరం. ఈ నిర్వహకుడిని తొలగించడానికి, ముందుగా ఒక ప్రత్యామ్నాయాన్ని ఎంచుకోండి."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"నిర్వాహకుడిని ఎంచుకోండి"</string>
+    <string name="user_guest" msgid="3465399481257448601">"అతిథి"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"అతిథి"</string>
     <string name="user_switch" msgid="6544839750534690781">"మార్చు"</string>
     <string name="current_user_name" msgid="3813671533249316823">"మీరు (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"పేరు"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"సెటప్ చేయలేదు"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"వినియోగదారు పేరుని సవరించండి"</string>
     <string name="users_list_title" msgid="770764290290240909">"వినియోగదారులు"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s కి అనుమతులు మంజూరు చేయబడ్డాయి"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"ఖాతాలు"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"వినియోగదారు"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"ఖాతాను జోడించు"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ఖాతాలు జోడించబడలేదు"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> యొక్క ఖాతాలు"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"డేటాని ఆటోమేటిక్‌గా సమకాలీకరించు"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"డేటాని ఆటోమేటిక్‌గా రిఫ్రెష్ చేసేలా యాప్‌లు అనుమతించబడతాయి"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"స్వీయ-సమకాలీకరణ డేటాను ప్రారంభించాలా?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"వెబ్‌లో మీ ఖాతాలకు మీరు ఏవైనా మార్పులు చేస్తే అవి స్వయంచాలకంగా మీ పరికరానికి కాపీ చేయబడతాయి.\n\nకొన్ని ఖాతాలు మీరు ఫోన్‌లో ఏవైనా మార్పులు చేస్తే కూడా ఆటోమేటిక్‌గా వాటిని వెబ్‌కి కాపీ చేస్తాయి. Google ఖాతా ఈ విధంగానే పనిచేస్తుంది."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"స్వీయ-సమకాలీకరణ డేటాను ఆఫ్ చేయాలా?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ఇది డేటాను ఆదా చేస్తుంది, కానీ మీరు ఇటీవలి సమాచారాన్ని సేకరించడానికి మాన్యువల్‌గా ప్రతి ఖాతాను సమకాలీకరించాల్సి ఉంటుంది. అలాగే మీరు అప్‌డేట్‌లు జరిగినప్పుడు నోటిఫికేషన్‌లను స్వీకరించరు."</string>
     <string name="account_details_title" msgid="7529571432258448573">"ఖాతా సమాచారం"</string>
     <string name="add_account_title" msgid="5988746086885210040">"ఖాతాను జోడించండి"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ఖాతాను జోడించండి"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"ఖాతాను తీసివేయి"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"ఖాతాను తీసివేయాలా?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"ఈ ఖాతాను తీసివేయడం వలన పరికరం నుండి దానికి సంబంధించిన అన్ని సందేశాలు, పరిచయాలు మరియు ఇతర డేటా తొలగించబడతాయి!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ఈ మార్పును మీ నిర్వాహకులు అనుమతించలేదు"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"ఈ వినియోగదారుని తీసేయాలా?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"అన్ని యాప్‌లు మరియు డేటా తొలగించబడతాయి."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"వినియోగదారును తీసివేయడంలో విఫలమైంది."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"మళ్లీ ప్రయత్నించాలా?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"విస్మరించండి"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"మళ్లీ ప్రయత్నించండి"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"కొత్త వినియోగదారుని జోడించాలా?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"మీరు కొత్త వినియోగదారును జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం యాప్‌లను అప్‌డేట్ చేయవచ్చు."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"ఖాతాను తీసివేయడం విఫలమైంది."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"ఖాతా సమకాలీకరణ"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g>లో <xliff:g id="ID_1">%1$d</xliff:g> అంశాలకు సమకాలీకరణ ఆన్‌లో ఉంది"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"అన్ని అంశాలకు సమకాలీకరణ ఆన్‌లో ఉంది"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"అన్ని అంశాలకు సమకాలీకరణ ఆఫ్‌లో ఉంది"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"సమకాలీకరణ ఆఫ్‌లో ఉంది"</string>
+    <string name="sync_error" msgid="6698021343089247914">"సమకాలీకరణ ఎర్రర్"</string>
+    <string name="last_synced" msgid="4745124489150101529">"చివరిగా సమకాలీకరించినది <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ఇప్పుడు సమకాలీకరిస్తోంది…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ఇప్పుడే సమకాలీకరించడానికి నొక్కండి<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ఇప్పుడే సమకాలీకరించు"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"సమకాలీకరణను రద్దు చేయి"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"సమకాలీకరణ ప్రస్తుతం సమస్యలను ఎదుర్కొంటోంది. ఇది త్వరలో అందుబాటులోకి వస్తుంది."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"భద్రత"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"స్క్రీన్ లాక్"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ఏదీ కాదు"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"పిన్"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"పాస్‌‌వర్డ్"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"లాక్ రకాన్ని ఎంచుకోండి"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"స్క్రీన్ లాక్ ఎంపికలు"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"లాక్ ఎంపికలు"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"మీ ఆకృతిని నమోదు చేయండి"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"నిర్ధారించు"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"మళ్లీ గీయి"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"స్క్రీన్ లాక్‌ను సెట్ చేయండి"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"మీ పిన్ ఎంచుకోండి"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"మీ నమూనాను ఎంచుకోండి"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"మీ పాస్‌వర్డ్‌ను ఎంచుకోండి"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"మీ పాస్‌వర్డ్‌ను ఎంచుకోండి"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"ప్రస్తుత స్క్రీన్ లాక్"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"భద్రత కోసం, ఆకృతిని సెట్ చేయండి"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"తీసివేయి"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"సాధారణ పాస్‌వర్డ్‌లను మా IT నిర్వాహకులు బ్లాక్ చేసారు. వేరే పాస్‌వర్డ్‌ని ప్రయత్నించండి."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"అంకెలను ఆరోహణ, అవరోహణ క్రమంలో లేదా ఒకే అంకెను వరుసగా పునరావృతంగా ఉపయోగించకూడదు."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"స్క్రీన్ లాక్ ఎంపికలు"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> రోజుల క్రితం"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"విశ్వసనీయ పరికరాన్ని జోడించండి"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"విశ్వసనీయ పరికరాలు"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> పరికరాలు</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> పరికరం</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"కనెక్ట్ అయి ఉన్నప్పుడు మీ <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> మీ కారును అన్‌లాక్ చేస్తుంది. ఎవరైనా మీ <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>ను తీసుకున్నట్లయితే, వారు ఈ పరికరాన్ని యాక్సెస్ చేయగలరు"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"నిర్ధారించు"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"విశ్వసనీయ పరికరాన్ని తీసివేయి"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"పూర్తయింది"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"విశ్వసనీయ పరికరాన్ని సెటప్ చేయడానికి సహచర యాప్‌ను ఉపయోగించండి. ఒకసారి సెటప్ చేసిన తర్వాత, వాహనం మీ ఫోన్‌ను గుర్తించినపుడు మీరు మీ వినియోగదారు ప్రొఫైల్‌ను అన్‌లాక్ చేయగలుగుతారు"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. మీ ఫోన్‌లో సహచర యాప్‌ను డౌన్‌లోడ్ చేయండి"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. పరికరాలను జత చేయడానికి మీ ఫోన్‌లో <xliff:g id="CAR_NAME">%1$s</xliff:g>ను ఎంచుకోండి"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"ఈ పరికరం యొక్క భద్రతా ఫీచర్‌లను Smart Lock గుర్తించలేదు. మీ కారును సురక్షితంగా ఉంచడంలో సహాయపడటానికి, మీ కారు ఇదివరకే అన్‌లాక్ చేసి ఉంటే మాత్రమే విశ్వసనీయమైన పరికరం మీ కారు అన్‌లాక్ స్థితిలో ఉంచగలదు. మీ కారు సమీపంలో ఉన్నపుడు వేరొకరు దాన్ని పట్టుకుని ఉన్నప్పటికీ మీ విశ్వసనీయమైన పరికరం దాన్ని అన్‌లాక్ చేయగలదు."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ని విశ్వసనీయ పరికరంగా జోడించండి"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> విజయవంతంగా విశ్వసనీయ పరికరంగా జోడించబడింది"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> నమోదు విఫలమైంది"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"విశ్వసనీయ పరికరాన్ని జోడించడానికి తర్వాత ప్రమాణీకరణ పద్ధతిని సెట్ చేయాల్సిన అవసరం ఉంది. మీ వద్ద మీ విశ్వసనీయ పరికరం లేకపోతే, మీ ప్రొఫైల్‌ను యాక్సెస్ చేయడానికి ప్రామాణీకరణ చేయాల్సిన అవసరం ఉంది."</string>
     <string name="forget" msgid="3971143908183848527">"విస్మరించు"</string>
+    <string name="connect" msgid="5861699594602380150">"కనెక్ట్ చేయి"</string>
+    <string name="disconnect" msgid="6140789953324820336">"డిస్‌కనెక్ట్ చేయి"</string>
     <string name="delete_button" msgid="5840500432614610850">"తొలగించు"</string>
     <string name="remove_button" msgid="6664656962868194178">"తీసివేయి"</string>
     <string name="cancel" msgid="750286395700355455">"రద్దు చేయి"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"డెమో మోడ్ నుండి నిష్క్రమించండి"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"ఫ్యాక్టరీ డేటా డెమో ఖాతాను తొలగించి, సిస్టమ్‌ను రీసెట్ చేస్తుంది. మొత్తం వినియోగదారు డేటాను కోల్పోతారు."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"డెమో నుండి నిష్క్రమించండి"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"సెటప్‌ను పూర్తి చేయండి"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ఇప్పుడు వద్దు"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"విస్మరించు"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"డ్రైవింగ్ చేస్తున్నప్పుడు ఫీచర్ అందుబాటులో ఉండదు."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"డ్రైవింగ్ చేస్తున్నప్పుడు వినియోగదారుని జోడించడం సాధ్యం కాదు."</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 0fa4c31..c5d6110 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"หน้าจอสลัว หน้าจอสัมผัส แบตเตอรี่"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"หรี่หน้าจอ กลางคืน แต้มสี"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"โหมดกลางคืน"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"เครือข่ายและอินเทอร์เน็ต"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"เครือข่ายมือถือ"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"เน็ตมือถือ"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"เข้าถึงข้อมูลโดยใช้เครือข่ายมือถือ"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"ปิดเน็ตมือถือใช่ไหม"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ปริมาณการใช้อินเทอร์เน็ต"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"คำเตือนและขีดจำกัดอินเทอร์เน็ต"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"รอบปริมาณที่แอปใช้อินเทอร์เน็ต"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ตั้งค่าเตือนการใช้อินเทอร์เน็ต"</string>
+    <string name="data_warning" msgid="116776633806885370">"คำเตือนปริมาณอินเทอร์เน็ต"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ตั้งขีดจำกัดอินเทอร์เน็ต"</string>
+    <string name="data_limit" msgid="227338836292511425">"ขีดจำกัดอินเทอร์เน็ต"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"จำกัดปริมาณการใช้อินเทอร์เน็ต"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"ระบบเครื่องเสียงของรถยนต์จะปิดอินเทอร์เน็ตมือถือเมื่อมีการใช้งานถึงขีดจำกัดที่คุณกำหนดไว้\n\nเนื่องจากนี่เป็นปริมาณการใช้อินเทอร์เน็ตที่วัดโดยระบบเครื่องเสียง ปริมาณการใช้งานที่ผู้ให้บริการวัดได้จึงอาจไม่เท่ากัน โปรดกำหนดขีดจำกัดอย่างระมัดระวัง"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"ตั้งค่าและจัดการจุดเข้าใช้งานระบบไร้สาย"</string>
     <string name="wifi_starting" msgid="473253087503153167">"กำลังเปิด Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"กำลังปิด Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"กำลังโหลดรายการ Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi ปิดอยู่"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"ไม่สามารถเลิกการจดจำเครือข่าย"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"ไม่สามารถเชื่อมต่อกับเครือข่าย"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"เพิ่มเครือข่าย"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi ปิดอยู่"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"เชื่อมต่อ"</string>
     <string name="wifi_password" msgid="5565632142720292397">"รหัสผ่าน"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"แสดงรหัสผ่าน"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"ชื่อเครือข่าย"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"ป้อน SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"ความปลอดภัย"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"ความแรงสัญญาณ"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"ความแรงสัญญาณ"</string>
     <string name="wifi_status" msgid="5688013206066543952">"สถานะ"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"ความเร็วในการเชื่อมโยง"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"ความถี่"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"ที่อยู่ IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"แสดงรหัสผ่าน"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"ป้อนชื่อเครือข่าย"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"ป้อนรหัสผ่าน"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"อ่อน"</item>
-    <item msgid="2032262610626057081">"ปานกลาง"</item>
-    <item msgid="3859756017461098953">"ดี"</item>
-    <item msgid="1521103743353335724">"ยอดเยี่ยม"</item>
+    <item msgid="7683058295076342057">"อ่อน"</item>
+    <item msgid="1639222824821660744">"ปานกลาง"</item>
+    <item msgid="1838705897358163300">"ดี"</item>
+    <item msgid="6067166649320533751">"ยอดเยี่ยม"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"บลูทูธ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"เปิดบลูทูธ"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"บลูทูธ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"บลูทูธปิดอยู่"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"รายละเอียดเครือข่าย"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"ที่อยู่ MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"ที่อยู่ IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"ซับเน็ตมาสก์"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"ที่อยู่ IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"เกตเวย์"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"ค่ากำหนด Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"เปิด Wi‑Fi อัตโนมัติ"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi จะเปิดอีกครั้งเมื่ออยู่ใกล้เครือข่ายคุณภาพสูงที่บันทึกไว้ เช่น เครือข่ายที่บ้านของคุณ"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"ไม่พร้อมใช้งานเนื่องจากตำแหน่งปิดอยู่ โปรดเปิด"<annotation id="link">"ตำแหน่ง"</annotation></string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"เปิดการสแกน Wi-Fi ไหม"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"เปิด"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"การสแกนหา Wi‑Fi เปิดอยู่"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"สลับไปใช้เน็ตมือถือโดยอัตโนมัติ"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"ใช้เน็ตมือถือเมื่อ Wi‑Fi เชื่อมต่ออินเทอร์เน็ตไม่ได้ อาจมีค่าบริการจากปริมาณการใช้อินเทอร์เน็ต"</string>
+    <string name="learn_more" msgid="8214605928933358604">"ดูข้อมูลเพิ่มเติม"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"บลูทูธ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"จัดการการเชื่อมต่อ ตั้งชื่ออุปกรณ์และการค้นพบ"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"คอมพิวเตอร์"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ชุดหูฟัง"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"โทรศัพท์"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"การถ่ายภาพ"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"หูฟัง"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"อุปกรณ์อินพุต"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"บลูทูธ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"อุปกรณ์ที่จับคู่"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"อุปกรณ์ที่จับคู่ได้"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"ไม่มีอุปกรณ์ที่จับคู่"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"ไม่มีอุปกรณ์ที่จับคู่ได้"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"อุปกรณ์ที่จับคู่แล้ว"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"ชื่อ"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"ใช้สำหรับ"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"เปลี่ยนชื่ออุปกรณ์บลูทูธ"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"อุปกรณ์ไม่มีชื่อ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"อุปกรณ์ที่จับคู่"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"จับคู่อุปกรณ์ใหม่"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"บลูทูธจะเปิดเพื่อจับคู่อุปกรณ์"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"เลิกเชื่อมต่ออุปกรณ์ไหม"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"พาหนะจะยกเลิกการเชื่อมต่อจาก <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"ที่อยู่บลูทูธของพาหนะ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"ที่อยู่บลูทูธของอุปกรณ์: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"ชื่อพาหนะ"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"เปลี่ยนชื่อพาหนะนี้"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"เปลี่ยนชื่ออุปกรณ์"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"เปลี่ยนชื่อ"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"อุปกรณ์ที่ใช้ได้"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"การตั้งค่า"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"คำขอจับคู่อุปกรณ์บลูทูธ"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"จับคู่อุปกรณ์และเชื่อมต่อ"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"บลูทูธ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"รหัสการจับคู่บลูทูธ"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN ประกอบดัวยตัวอักษรหรือสัญลักษณ์"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"พิมพ์รหัสการจับคู่แล้วกด Return หรือ Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"ปกติจะเป็น 0000 หรือ 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"คำขอจับคู่อุปกรณ์"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"แตะเพื่อจับคู่กับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"ภาษา"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"ภาษาและการป้อนข้อมูล"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"แป้นพิมพ์"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"จัดการแป้นพิมพ์"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"เอาต์พุตการอ่านออกเสียงข้อความ"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"เครื่องมือที่ต้องการ"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"เครื่องมือปัจจุบัน"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"ความเร็วในการพูด"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"ความสูง-ต่ำของเสียง"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"รีเซ็ต"</string>
     <string name="sound_settings" msgid="3072423952331872246">"เสียง"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"ระดับเสียงเรียกเข้า"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"ระดับเสียงของระบบนำทาง"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"สื่อ"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"ตั้งค่าระดับเสียงสำหรับเพลงและวิดีโอ"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"การปลุก"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"เสียงเรียกเข้าของโทรศัพท์"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"เสียงการแจ้งเตือนเริ่มต้น"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"เสียงปลุกเริ่มต้น"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"แอปและการแจ้งเตือน"</string>
+    <string name="all_applications" msgid="7798210477486822168">"แสดงแอปทั้งหมด"</string>
+    <string name="default_applications" msgid="1558183275638697087">"แอปเริ่มต้น"</string>
     <string name="applications_settings" msgid="794261395191035632">"ข้อมูลแอป"</string>
+    <string name="force_stop" msgid="2153183697014720520">"บังคับให้หยุด"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"บังคับให้หยุดไหม"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"แอปอาจทำงานผิดพลาดหากบังคับให้หยุด"</string>
     <string name="disable_text" msgid="4358165448648990820">"ปิดใช้"</string>
     <string name="enable_text" msgid="1794971777861881238">"เปิดใช้"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"ถอนการติดตั้ง"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"หากคุณปิดใช้แอปนี้ Android และแอปอื่นๆ อาจไม่ทำงานตามที่ควรจะเป็นอีกต่อไป"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ปิดใช้แอป"</string>
     <string name="permissions_label" msgid="2701446753515612685">"สิทธิ์"</string>
     <string name="application_version_label" msgid="8556889839783311649">"เวอร์ชัน: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"ไม่มีการมอบสิทธิ์"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"ไม่มีการขอสิทธิ์"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ปริมาณการใช้อินเทอร์เน็ต"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ปริมาณการใช้เน็ตของแอป"</string>
-    <string name="force_stop" msgid="2153183697014720520">"บังคับให้หยุด"</string>
     <string name="computing_size" msgid="5791407621793083965">"กำลังคำนวณ…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">สิทธิ์เพิ่มเติม <xliff:g id="COUNT_1">%d</xliff:g> รายการ</item>
       <item quantity="one">สิทธิ์เพิ่มเติม <xliff:g id="COUNT_0">%d</xliff:g> รายการ</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"ผู้ช่วยและป้อนข้อมูลด้วยเสียง"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"แอปผู้ช่วย"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"ใช้ข้อความจากหน้าจอ"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"อนุญาตให้แอปผู้ช่วยเข้าถึงเนื้อหาบนหน้าจอเป็นข้อความ"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"ใช้ภาพหน้าจอ"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"อนุญาตให้แอปผู้ช่วยเข้าถึงรูปภาพของหน้าจอ"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"บริการป้อนอัตโนมัติ"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"ไม่มี"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"เลือกไว้"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistant จะอ่านข้อมูลเกี่ยวกับแอปที่ใช้งานอยู่ในระบบของคุณได้ รวมถึงข้อมูลที่ปรากฏบนหน้าจอหรือที่เข้าถึงได้ภายในแอป"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;ตรวจดูว่าคุณเชื่อถือแอปนี้ได้&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google ป้อนอัตโนมัติ&gt;%1$s&lt;/xliff:g&gt; ดูรายการบนหน้าจอว่าข้อมูลอะไรบ้างที่ป้อนอัตโนมัติได้"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"เพิ่มบริการ"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"ตำแหน่ง"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"คำขอตำแหน่งล่าสุด"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"ไม่มีคำขอตำแหน่งล่าสุด"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"สิทธิ์ระดับแอป"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"การสแกน"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"บริการตำแหน่ง"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"การสแกนหา Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"อนุญาตให้แอปและบริการต่างๆ สแกนหาเครือข่าย Wi‑Fi ตลอดเวลาแม้ Wi‑Fi จะปิดอยู่ การตั้งค่านี้ใช้เพื่อปรับปรุงสิ่งต่างๆ เช่น ฟีเจอร์และบริการตามสถานที่"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"การสแกนหาบลูทูธ"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"อนุญาตให้แอปและบริการต่างๆ สแกนหาอุปกรณ์ใกล้เคียงตลอดเวลา แม้บลูทูธจะปิดอยู่ การตั้งค่านี้ใช้เพื่อปรับปรุงสิ่งต่างๆ เช่น ฟีเจอร์และบริการตามสถานที่"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"ระบบ"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"การอัปเดตระบบ"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"การอัปเดตระบบ"</string>
     <string name="firmware_version" msgid="8491753744549309333">"เวอร์ชันของ Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"ระดับแพตช์ความปลอดภัยของ Android"</string>
     <string name="model_info" msgid="4966408071657934452">"รุ่น"</string>
     <string name="baseband_version" msgid="2370088062235041897">"เวอร์ชันเบสแบนด์"</string>
     <string name="kernel_version" msgid="7327212934187011508">"เวอร์ชันเคอร์เนล"</string>
     <string name="build_number" msgid="3997326631001009102">"หมายเลขบิวด์"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"ที่อยู่บลูทูธ"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"ไม่พร้อมให้บริการ"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"สถานะ"</string>
     <string name="device_status" msgid="267298179806290920">"สถานะ"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"ลิขสิทธิ์"</string>
     <string name="license_title" msgid="936705938435249965">"ใบอนุญาต"</string>
     <string name="terms_title" msgid="5201471373602628765">"ข้อกำหนดในการให้บริการ"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"ใบอนุญาต WebView ของระบบ"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"ใบอนุญาต WebView ของระบบ"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"วอลเปเปอร์"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"ผู้ให้บริการภาพถ่ายดาวเทียม:\n©2014 CNES/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"ใบอนุญาตของบุคคลที่สาม"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"พบปัญหาในการโหลดใบอนุญาต"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"กำลังโหลด…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">ตอนนี้คุณเหลืออีกเพียง <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว</item>
+      <item quantity="one">ตอนนี้คุณเหลืออีกเพียง <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"ตอนนี้คุณเป็นนักพัฒนาซอฟต์แวร์แล้ว!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"ไม่จำเป็น คุณเป็นนักพัฒนาซอฟต์แวร์อยู่แล้ว"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"ตัวเลือกการรีเซ็ต"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"การรีเซ็ตเครือข่าย แอป หรืออุปกรณ์"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"รีเซ็ตเครือข่าย"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"การดำเนินการนี้จะรีเซ็ตการตั้งค่าเครือข่ายทั้งหมด รวมถึงการตั้งค่าต่อไปนี้"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"เน็ตมือถือ"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"บลูทูธ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"ลบ eSIM ทั้งหมดของพาหนะ"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"การดำเนินการนี้จะไม่ยกเลิกแผนบริการของคุณ"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"รีเซ็ต eSIM ไม่ได้"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"เลือกเครือข่าย"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"รีเซ็ตการตั้งค่า"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"รีเซ็ตไหม"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"หากรีเซ็ตการตั้งค่าเครือข่ายทั้งหมด คุณจะยกเลิกการทำงานนี้ไม่ได้"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"รีเซ็ตการตั้งค่า"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"รีเซ็ตการตั้งค่าเครือข่ายแล้ว"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"รีเซ็ตค่ากำหนดของแอป"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"คำสั่งนี้จะรีเซ็ตค่ากำหนดทั้งหมดของ:\n\n"<li>"แอปที่ปิดใช้"</li>\n<li>"การแจ้งเตือนของแอปที่ปิดใช้"</li>\n<li>"แอปพลิเคชันเริ่มต้นสำหรับการทำงานต่างๆ"</li>\n<li>"ข้อจำกัดข้อมูลในพื้นหลังสำหรับแอป"</li>\n<li>"ข้อจำกัดสิทธิ์ใดๆ"</li>\n\n"ข้อมูลของแอปจะไม่หายไป"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"รีเซ็ตแอป"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"รีเซ็ตค่ากำหนดของแอปแล้ว"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"ลบข้อมูล (รีเซ็ตเป็นค่าเริ่มต้น)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"การดำเนินการนี้จะลบข้อมูลทั้งหมดออกจากระบบเครื่องเสียงในยานพาหนะ โดยรวมถึงสิ่งต่อไปนี้\n\n"<li>"บัญชี Google ของคุณ"</li>\n<li>"ข้อมูลและการตั้งค่าของระบบและแอป"</li>\n<li>"แอปที่ดาวน์โหลด"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"คุณลงชื่อเข้าใช้บัญชีต่อไปนี้อยู่ในขณะนี้"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"มีผู้ใช้รายอื่นอยู่บนยานพาหนะคันนี้"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"รีเซ็ตยานพาหนะ"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"รีเซ็ตไหม"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"ลบข้อมูลส่วนบุคคลและแอปที่ดาวน์โหลดทั้งหมดไหม คุณจะเลิกทำการดำเนินการนี้ไม่ได้"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ลบทุกอย่าง"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"กำลังลบ"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"โปรดรอสักครู่..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"วันที่และเวลา"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"ตั้งวันที่และเวลา"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"ตั้งวันที่ เวลา เขตเวลาและรูปแบบ"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"จัดเรียงตามเขตเวลา"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"วันที่"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"เวลา"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"เพิ่มผู้ใช้"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"เพิ่มบัญชี"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"ลบผู้ใช้"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"ผู้ใช้ใหม่"</string>
-    <string name="user_guest" msgid="3465399481257448601">"ผู้มาเยือน"</string>
     <string name="user_admin" msgid="1535484812908584809">"ผู้ดูแลระบบ"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"ลงชื่อเข้าใช้เป็นผู้ดูแลระบบ"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"สิทธิ์ทั้งหมดของผู้ดูแลระบบ"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"เปลี่ยนสถานะเป็นผู้ดูแลระบบ"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"ผู้ใช้จะลบผู้ใช้อื่นได้ รวมถึงผู้ดูแลระบบอื่น และรีเซ็ตระบบเป็นค่าเริ่มต้นได้"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"การดำเนินการนี้ไม่สามารถย้อนกลับได้"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"ใช่ เปลี่ยนสถานะเป็นผู้ดูแลระบบ"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"สร้างผู้ใช้ใหม่"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"โทรออก"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"การรับส่งข้อความผ่านเน็ตมือถือของรถ"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"ติดตั้งแอปใหม่"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ถอนการติดตั้งแอป"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"เพิ่มผู้ใช้"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"ผู้ใช้ใหม่"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"เพิ่มผู้ใช้ใหม่ไหม"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"ผู้ใช้ทุกคนจะอัปเดตแอปให้แก่ผู้ใช้คนอื่นๆ ได้"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"ถึงขีดจำกัดผู้ใช้แล้ว"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">คุณสร้างผู้ใช้ได้สูงสุด <xliff:g id="COUNT">%d</xliff:g> คน</item>
+      <item quantity="one">สร้างผู้ใช้ได้เพียง 1 คนเท่านั้น</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"สร้างผู้ใช้ใหม่ไม่ได้"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"ลบผู้ใช้นี้ใช่ไหม"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"แอปและข้อมูลทั้งหมดจะถูกลบ"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"ลบผู้ใช้ไม่สำเร็จ"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"ปิด"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"ลองอีกครั้ง"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"ลบผู้ใช้สุดท้ายไหม"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"หลังจากลบผู้ใช้ที่เหลืออยู่เพียงรายเดียวของรถคันนี้ ระบบจะสร้างผู้ดูแลระบบใหม่ขึ้น"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"ระบบจะลบข้อมูล การตั้งค่า และแอปทั้งหมดที่เชื่อมโยงกับผู้ใช้นี้ คุณจะต้องตั้งค่าระบบอีกครั้ง"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"เลือกผู้ดูแลระบบใหม่"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"คุณต้องมีผู้ดูแลระบบอย่างน้อย 1 ราย หากต้องการลบผู้ดูแลระบบรายนี้ ก่อนอื่นให้เลือกคนที่จะมาแทน"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"เลือกผู้ดูแลระบบ"</string>
+    <string name="user_guest" msgid="3465399481257448601">"ผู้มาเยือน"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"ผู้มาเยือน"</string>
     <string name="user_switch" msgid="6544839750534690781">"เปลี่ยน"</string>
     <string name="current_user_name" msgid="3813671533249316823">"คุณ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"ชื่อ"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ไม่ได้ตั้งค่า"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"แก้ไขชื่อผู้ใช้"</string>
     <string name="users_list_title" msgid="770764290290240909">"ผู้ใช้"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"มอบสิทธิ์ให้กับ %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"บัญชี"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"ผู้ใช้"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"เพิ่มบัญชี"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"ไม่ได้เพิ่มบัญชี"</string>
     <string name="account_list_title" msgid="7631588514613843065">"บัญชีของ <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"ซิงค์ข้อมูลอัตโนมัติ"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ให้แอปรีเฟรชข้อมูลอัตโนมัติ"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"เปิดซิงค์ข้อมูลอัตโนมัติหรือไม่"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"การเปลี่ยนแปลงที่คุณทำต่อบัญชีในเว็บจะคัดลอกไปยังอุปกรณ์ของคุณโดยอัตโนมัติ\n\nบัญชีบางบัญชีอาจคัดลอกการเปลี่ยนแปลงที่คุณทำในโทรศัพท์ไปยังเว็บโดยอัตโนมัติด้วยเช่นกัน บัญชี Google ทำงานในลักษณะนี้"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ปิดซิงค์ข้อมูลอัตโนมัติหรือไม่"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"ตัวเลือกนี้จะช่วยประหยัดอินเทอร์เน็ต แต่คุณจะต้องซิงค์แต่ละบัญชีด้วยตนเองเพื่อรวบรวมข้อมูลล่าสุด และคุณจะไม่ได้รับการแจ้งเตือนเมื่อมีการอัปเดต"</string>
     <string name="account_details_title" msgid="7529571432258448573">"ข้อมูลบัญชี"</string>
     <string name="add_account_title" msgid="5988746086885210040">"เพิ่มบัญชี"</string>
     <string name="add_an_account" msgid="1072285034300995091">"เพิ่มบัญชี"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"นำบัญชีออก"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"นำบัญชีออกใช่ไหม"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"การนำบัญชีนี้ออกจะเป็นการลบข้อความ รายชื่อติดต่อ และข้อมูลอื่นๆ ทั้งหมดออกจากอุปกรณ์!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"ผู้ดูแลระบบไม่อนุญาตให้ทำการเปลี่ยนแปลงนี้"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"นำผู้ใช้รายนี้ออกใช่ไหม"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"แอปและข้อมูลทั้งหมดจะถูกลบ"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"นำผู้ใช้ออกไม่สำเร็จ"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"ลองอีกครั้งไหม"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"ปิด"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"ลองอีกครั้ง"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"เพิ่มผู้ใช้ใหม่ไหม"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"ผู้ใช้ทุกคนจะอัปเดตแอปให้แก่ผู้ใช้คนอื่นๆ ได้"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"นำบัญชีออกไม่สำเร็จ"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"การซิงค์บัญชี"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"การซิงค์เปิดอยู่สำหรับ <xliff:g id="ID_1">%1$d</xliff:g> จาก <xliff:g id="ID_2">%2$d</xliff:g> รายการ"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"การซิงค์เปิดอยู่สำหรับรายการทั้งหมด"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"การซิงค์ปิดอยู่สำหรับรายการทั้งหมด"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"การซิงค์ปิดอยู่"</string>
+    <string name="sync_error" msgid="6698021343089247914">"ข้อผิดพลาดในการซิงค์"</string>
+    <string name="last_synced" msgid="4745124489150101529">"ซิงค์ล่าสุดเมื่อ <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"กำลังซิงค์อยู่ในขณะนี้…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"แตะเพื่อซิงค์เลย<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ซิงค์เลย"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"ยกเลิกการซิงค์"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"ขณะนี้ พบปัญหาในการซิงค์ อีกสักครู่จึงจะกลับมาดำเนินการต่อ"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"ความปลอดภัย"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"ล็อกหน้าจอ"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"ไม่มี"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"รหัสผ่าน"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"เลือกประเภทการล็อก"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"ตัวเลือกการล็อกหน้าจอ"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"ตัวเลือกการล็อก"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"ป้อนรูปแบบ"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"ยืนยัน"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"วาดซ้ำ"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"ตั้งค่าการล็อกหน้าจอ"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"เลือก PIN ของคุณ"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"เลือกรูปแบบของคุณ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"เลือกรหัสผ่านของคุณ"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"เลือกรหัสผ่านของคุณ"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"การล็อกหน้าจอปัจจุบัน"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"ตั้งรูปแบบเพื่อความปลอดภัย"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"ล้าง"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"ผู้ดูแลระบบไอทีบล็อกรหัสผ่านที่ไม่รัดกุม ลองรหัสผ่านอื่น"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ไม่อนุญาตให้เรียงจากน้อยไปมาก จากมากไปน้อย หรือเรียงลำดับตัวเลขที่ซ้ำกัน"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"ตัวเลือกการล็อกหน้าจอ"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> วันที่ผ่านมา"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"เพิ่มอุปกรณ์ที่เชื่อถือได้"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"อุปกรณ์ที่เชื่อถือได้"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other">อุปกรณ์ <xliff:g id="COUNT_1">%d</xliff:g> เครื่อง</item>
+      <item quantity="one">อุปกรณ์ <xliff:g id="COUNT_0">%d</xliff:g> เครื่อง</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> จะปลดล็อกรถคันนี้เมื่อมีการเชื่อมต่อ หากมีคนเอา <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> ของคุณไป เขาก็อาจใช้งานอุปกรณ์นี้ได้"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"ยืนยัน"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"นำอุปกรณ์ที่เชื่อถือได้ออก"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"เสร็จ"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"ใช้แอปที่ใช้ร่วมกันเพื่อตั้งค่าอุปกรณ์ที่เชื่อถือได้ เมื่อตั้งค่าแล้ว คุณจะปลดล็อกโปรไฟล์ผู้ใช้ได้เมื่อรถยนต์ตรวจพบโทรศัพท์"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. ดาวน์โหลดแอปที่ใช้ร่วมกันในโทรศัพท์"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. เลือก <xliff:g id="CAR_NAME">%1$s</xliff:g> ในโทรศัพท์เพื่อจับคู่กับอุปกรณ์"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock ไม่พบฟีเจอร์ความปลอดภัยของอุปกรณ์นี้ เพื่อช่วยปกป้องรถยนต์ของคุณ อุปกรณ์ที่เชื่อถือได้จะทำให้รถยนต์ของคุณปลดล็อกอยู่ตลอดได้ก็ต่อเมื่อคุณเป็นผู้ปลดล็อกไว้แล้วเท่านั้น อุปกรณ์ที่เชื่อถือได้จะทำให้รถยนต์ของคุณปลดล็อกอยู่ตลอดได้เมื่ออยู่ใกล้กันแม้ว่าผู้อื่นจะเป็นคนถืออุปกรณ์ก็ตาม"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"เพิ่ม <xliff:g id="DEVICE_NAME">%1$s</xliff:g> เป็นอุปกรณ์ที่เชื่อถือได้"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"เพิ่ม <xliff:g id="DEVICE_NAME">%1$s</xliff:g> เป็นอุปกรณ์ที่เชื่อถือได้เรียบร้อยแล้ว"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"การลงทะเบียน <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ล้มเหลว"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"ในการเพิ่มอุปกรณ์ที่เชื่อถือได้ คุณจำเป็นต้องกำหนดวิธีการตรวจสอบสิทธิ์ในขั้นถัดไป หากไม่มีอุปกรณ์ที่เชื่อถือได้ ระบบจะขอให้มีการตรวจสอบสิทธิ์ในการเข้าถึงโปรไฟล์ของคุณ"</string>
     <string name="forget" msgid="3971143908183848527">"ลืม"</string>
+    <string name="connect" msgid="5861699594602380150">"เชื่อมต่อ"</string>
+    <string name="disconnect" msgid="6140789953324820336">"ยกเลิกการเชื่อมต่อ"</string>
     <string name="delete_button" msgid="5840500432614610850">"ลบ"</string>
     <string name="remove_button" msgid="6664656962868194178">"นำออก"</string>
     <string name="cancel" msgid="750286395700355455">"ยกเลิก"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ออกจากโหมดสาธิต"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"การดำเนินการนี้จะลบบัญชีสาธิตและรีเซ็ตข้อมูลในระบบเป็นค่าเริ่มต้น ข้อมูลผู้ใช้ทั้งหมดจะสูญหาย"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ออกจากการสาธิต"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"ตั้งค่าให้เสร็จ"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ไว้ทีหลัง"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ปิด"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ฟีเจอร์ไม่พร้อมใช้งานขณะขับรถ"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"เพิ่มผู้ใช้ขณะขับรถไม่ได้"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 59ae29e..ffc2d9c 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"i-dim ang screen, touchscreen, baterya"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"i-dim ang screen, gabi, tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Night mode"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Network at internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobile network"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobile data"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"I-access ang data gamit ang mobile network"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"I-off ang mobile data?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Paggamit ng data"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Babala at limitasyon sa data"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Cycle ng paggamit ng data ng app"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Magtakda ng babala sa data"</string>
+    <string name="data_warning" msgid="116776633806885370">"Babala sa data"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Itakda ang limitasyon sa data"</string>
+    <string name="data_limit" msgid="227338836292511425">"Limitasyon sa data"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Pag-limit sa paggamit ng data"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Io-off ng head unit ng iyong sasakyan ang mobile data sa oras na maabot nito ang itinakda mong limitasyon.\n\nDahil sinusukat ng head unit ang paggamit ng data, at maaaring mag-iba ang pagkalkula ng carrier mo sa paggamit, pag-isipang magtakda ng mababang limitasyon."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Mag-set up at mamahala ng mga wireless na access point"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Ino-on ang Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Ino-off ang Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Nilo-load ang listahan ng Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Naka-disable ang Wi‑Fi"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Hindi nakalimutan ang network"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Hind nakakonekta sa network"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Magdagdag ng network"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Naka-disable ang Wi‑Fi"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Kumonekta"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Password"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Ipakita ang password"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Pangalan ng network"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Ilagay ang SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Seguridad"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Lakas ng signal"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Lakas ng signal"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Status"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Bilis ng link"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frequency"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP address"</string>
+    <string name="show_password" msgid="2074628020371139240">"Ipakita ang password"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Ilagay ang pangalan ng network"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Ilagay ang password"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Mahina"</item>
-    <item msgid="2032262610626057081">"Katamtaman"</item>
-    <item msgid="3859756017461098953">"Malakas"</item>
-    <item msgid="1521103743353335724">"Napakalakas"</item>
+    <item msgid="7683058295076342057">"Mahina"</item>
+    <item msgid="1639222824821660744">"Katamtaman"</item>
+    <item msgid="1838705897358163300">"Malakas"</item>
+    <item msgid="6067166649320533751">"Napakalakas"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"I-on ang Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Naka-disable ang Bluetooth"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Mga detalye ng network"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC address"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP address"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Subnet mask"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Mga IPv6 address"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Gateway"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Mga kagustuhan sa Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Awtomatikong i-on ang Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Mag-o-on ang Wi‑Fi malapit sa saved high-quality network, gaya ng home network"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Hindi available, naka-off ang lokasyon. I-on ang "<annotation id="link">"lokasyon"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"I-on ang pag-scan ng Wi‑Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"I-on"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Na-on ang pag-scan ng Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Awtomatikong lumipat sa mobile data"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Gumamit ng mobile data kapag walang access sa internet ang Wi‑Fi. Maaaring may mga babayaran sa paggamit ng data."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Matuto pa"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Pamahalaan ang mga koneksyon, itakda ang pangalan at pagiging nahahanap ng device"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Computer"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Headset"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telepono"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Imaging"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Headphone"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Input Peripheral"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Mga nakapares na device"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Mga available na device"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Walang nakapares na device"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Walang available na device"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Nakapares na device"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Pangalan"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Gamitin para sa"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"I-rename ang Bluetooth device"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Walang pangalang device"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Mga nakapares na device"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Magpares ng bagong device"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Mao-on ang Bluetooth para magpares"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Idiskonekta ang device?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Madidiskonekta ang iyong sasakyan sa <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Bluetooth address ng sasakyan: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Bluetooth address ng device: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Pangalan ng sasakyan"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"I-rename ang sasakyang ito"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Palitan ang pangalan ng device"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Palitan ang pangalan"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Mga available na device"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Mga Profile"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Kahilingan sa pagpapares ng Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Ipares at kumonekta"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Code ng pagpapares ng Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"May mga titik o simbolo ang PIN"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"I-type ang code ng pagpapares, pagkatapos ay pindutin ang Return o Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Karaniwang 0000 o 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Kahilingan sa pagpapares"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"I-tap para makipagpares sa <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Mga Wika"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Mga wika at input"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Keyboard"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Pamahalaan ang mga keyboard"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Output ng text-to-speech"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Gustong engine"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Kasalukuyang engine"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Bilis ng pagsasalita"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Pitch"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"I-reset"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Tunog"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Volume ng pag-ring"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Volume ng navigation"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Magtakda ng volume para sa musika at mga video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ringtone ng telepono"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Default na notification sound"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Default na tunog ng alarm"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Mga app at notification"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Ipakita ang lahat ng app"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Mga default na app"</string>
     <string name="applications_settings" msgid="794261395191035632">"Impormasyon ng app"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Sapilitang ihinto"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Sapilitang itigil?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Kung sapilitan mong ititigil ang isang app, maaari itong kumilos nang hindi tama."</string>
     <string name="disable_text" msgid="4358165448648990820">"I-disable"</string>
     <string name="enable_text" msgid="1794971777861881238">"I-enable"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"I-uninstall"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Kung idi-disable mo ang app na ito, maaaring hindi na gumana ang Android at iba pang mga app gaya ng inaasahan."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"I-disable ang app"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Mga Pahintulot"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Bersyon: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Walang ibinigay na pahintulot"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Walang hiniling na pahintulot"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Paggamit ng data"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Paggamit ng data ng app"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Sapilitang ihinto"</string>
     <string name="computing_size" msgid="5791407621793083965">"Kinakalkula…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> karagdagang pahintulot</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na karagdagang pahintulot</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assist at voice input"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Assist app"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Gamitin ang text mula sa screen"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Payagan ang assist app na i-access ang mga content ng screen bilang text"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Gamitin ang screenshot"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Payagan ang assist app na i-access ang isang larawan ng screen"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Serbisyo ng autofill"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Wala"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Napili"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Makakabasa ang assistant ng impormasyon tungkol sa mga app na ginagamit sa iyong system, kabilang ang impormasyong nakikita sa screen mo o naa-access sa loob ng mga app."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Tiyaking pinagkakatiwalaan mo ang app na ito&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; Ginagamit ng &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; kung ano ang nasa iyong screen para matukoy kung ano ang maaaring i-autofill."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Magdagdag ng serbisyo"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Lokasyon"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Mga Kamakailang Kahilingan sa Lokasyon"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Walang kamakailang kahilingan sa lokasyon"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Mga pahintulot sa antas ng app"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Pag-scan"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Mga Serbisyo ng Lokasyon"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Pag-scan ng Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Bigyang-daan ang mga app at serbisyo na mag-scan ng mga Wi-Fi network anumang oras, kahit na naka-off ang Wi-Fi. Magagamit ito, halimbawa, para pahusayin ang mga feature at serbisyong batay sa lokasyon."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Pag-scan ng Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Bigyang-daan ang mga app at serbisyo na mag-scan ng mga kalapit na device anumang oras, kahit na naka-off ang Bluetooth. Magagamit ito, halimbawa, para pahusayin ang mga feature at serbisyong batay sa lokasyon."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"System"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Mga update sa system"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Mga pag-update ng system"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Bersyon ng Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Antas ng patch ng seguridad ng Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Modelo"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Bersyon ng baseband"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Kernel version"</string>
     <string name="build_number" msgid="3997326631001009102">"Numero ng build"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Address ng bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Hindi available"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Status"</string>
     <string name="device_status" msgid="267298179806290920">"Status"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Lisensya"</string>
     <string name="terms_title" msgid="5201471373602628765">"Mga tuntunin at kundisyon"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Lisensya ng System WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Mga lisensya ng System WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Mga Wallpaper"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Mga provider ng koleksyon ng imahe na galing sa satellite:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Mga lisensya ng third party"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"May problema sa pag-load ng mga lisensya."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Naglo-load…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> (na) hakbang na lang at magiging developer ka na.</item>
+      <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> (na) hakbang na lang at magiging developer ka na.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Isa ka nang developer!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Hindi na kailangan, isa ka nang developer."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Mga opsyon ng developer"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Mga opsyon sa pag-reset"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Pag-reset ng network, mga app, o device"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"I-reset ang network"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Ire-reset nito ang lahat ng setting ng network, kabilang ang:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobile data"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Burahin ang lahat ng eSIM ng sasakyan"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Hindi makakansela ang iyong plan ng serbisyo dahil dito."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Hindi ma-reset ang mga eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Pumili ng network"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"I-reset ang mga setting"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"I-reset?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"I-reset ang lahat ng setting ng network? Hindi mo maaaring i-undo ang pagkilos na ito!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"I-reset ang mga setting"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Na-reset na ang mga setting ng network"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"I-reset ang mga kagustuhan sa app"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Ire-reset nito ang lahat ng kagustuhan para sa:\n\n"<li>"Mga naka-disable na app"</li>\n<li>"Mga naka-disable na notification ng app"</li>\n<li>"Mga default na application para sa mga pagkilos"</li>\n<li>"Mga paghihigpit sa data ng background para sa mga app"</li>\n<li>"Anumang paghihigpit sa pahintulot"</li>\n\n"Hindi ka mawawalan ng anumang data ng app."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"I-reset ang mga app"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Na-reset na ang mga kagustuhan sa app"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Burahin lahat ng data (factory reset)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Buburahin nito ang lahat ng data mula sa head unit ng iyong sasakyan, kasama ang:\n\n"<li>"Iyong Google account"</li>\n<li>"Data ng system at app at mga setting"</li>\n<li>"Mga na-download na app"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Kasalukuyan kang naka-sign in sa mga sumusunod na account:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"May iba pang user sa sasakyang ito."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"I-reset ang sasakyan"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"I-reset?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Burahin ang lahat ng iyong personal na impormasyon at na-download na app? Hindi mo maaaring i-undo ang pagkilos na ito!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Burahin lahat"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Binubura"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Mangyaring maghintay..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Petsa at oras"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Itakda ang petsa at oras"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Itakda ang petsa, oras, time zone, at mga format"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Pagbukud-bukurin ayon sa time zone"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Petsa"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Oras"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Magdagdag ng user"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Magdagdag ng account"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Mag-delete ng user"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Bagong user"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Bisita"</string>
     <string name="user_admin" msgid="1535484812908584809">"Admin"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Naka-sign in bilang admin"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Lahat ng pang-admin na pahintulot"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Gawing Admin"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Magagawa ng user na mag-delete ng mga user, kabilang ang iba pang Admin, at i-factory reset ang system."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Hindi mababawi ang pagkilos na ito."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Oo, gawing admin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Gumawa ng mga bagong user"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Tumawag sa telepono"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Messaging sa mobile data ng kotse"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Mag-install ng mga bagong app"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Mag-uninstall ng mga app"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Magdagdag ng user"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Bagong user"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Magdagdag ng bagong user?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Maaaring i-update ng sinumang user ang mga app para sa lahat ng iba pang user."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Naabot na ang limitasyon sa user"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Maaari kang gumawa ng hanggang <xliff:g id="COUNT">%d</xliff:g> user.</item>
+      <item quantity="other">Maaari kang gumawa ng hanggang <xliff:g id="COUNT">%d</xliff:g> na user.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Hindi nakagawa ng bagong user"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"I-delete ang user na ito?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Made-delete ang lahat ng app at data."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Hindi na-delete ang user."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"I-dismiss"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Subukang muli"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"I-delete ang huling user?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Pagkatapos i-delete ang nag-iisang natitirang user para sa kotseng ito, may gagawing bagong admin user."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Made-delete ang lahat ng data, setting, at app na nauugnay sa user na ito. Kakailanganin mong i-set up muli ang system."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Pumili ng bagong admin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Kailangan mo ng kahit isang admin lang. Para i-delete ang isang ito, pumili muna ng kapalit."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Pumili ng admin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Bisita"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Bisita"</string>
     <string name="user_switch" msgid="6544839750534690781">"Lumipat"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Ikaw (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Pangalan"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Hindi naka-set up"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"I-edit ang user name"</string>
     <string name="users_list_title" msgid="770764290290240909">"Mga User"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Binigyan ng pahintulot si %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Mga Account"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"User"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Magdagdag ng account"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Walang naidagdag na account"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Mga account para kay <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Awtomatikong i-sync ang data"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Hayaan ang mga app na awtomatikong mag-refresh ng data"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"I-on ang pag-auto-sync ng data?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Ang anumang pagbabagong gagawin mo sa iyong mga account sa web ay awtomatikong makokopya sa device mo.\n\nMaaari ding awtomatikong kopyahin ng ilang account sa web ang anumang pagbabagong gagawin mo sa telepono. Ganito gumagana ang Google Account."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"I-off ang pag-auto sync ng data?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Makakatipid ito ng data, ngunit kakailanganin mong manual na i-sync ang bawat account para makakuha ng kamakailang impormasyon. At hindi ka makakatanggap ng mga notification kapag nagkaroon ng mga update."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Impormasyon ng account"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Magdagdag ng account"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Magdagdag ng account"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Alisin ang account"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Alisin ang account?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Kapag inalis ang account na ito, made-delete ang lahat ng mensahe, contact, at iba pang data nito sa device!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Hindi pinapayagan ng iyong admin ang pagbabagong ito"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Alisin ang user na ito?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Made-delete ang lahat ng app at data."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Hindi naalis ang user."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Subukang muli?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"I-dismiss"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Subukang Muli"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Magdagdag ng bagong user?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Maaaring i-update ng sinumang user ang mga app para sa lahat ng iba pang user."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Hindi naalis ang account."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Pag-sync ng account"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Naka-on ang pag-sync para sa <xliff:g id="ID_1">%1$d</xliff:g> sa <xliff:g id="ID_2">%2$d</xliff:g> (na) item"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Naka-on ang pag-sync para sa lahat ng item"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Naka-off ang pag-sync para sa lahat ng item"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"NAKA-OFF ang pag-sync"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Error sa pag-sync"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Huling na-sync noong <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Nagsi-sync ngayon…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"I-tap para mag-sync ngayon<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"I-sync ngayon"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Kanselahin ang pag-sync"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Kasalukuyang nagkakaproblema sa pag-sync. Babalik ito pagkalipas ng ilang sandali."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Seguridad"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Lock ng screen"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Wala"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Password"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Pumili ng uri ng lock"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Mga opsyon sa lock ng screen"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Mga opsyon sa lock"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Ilagay ang iyong pattern"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Kumpirmahin"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Muling Iguhit"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Magtakda ng lock ng screen"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Piliin ang iyong PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Pumili ng iyong pattern"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Piliin ang iyong password"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Piliin ang iyong password"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Kasalukuyang lock ng screen"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Para sa seguridad, magtakda ng pattern"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"I-clear"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Bina-block ng iyong IT admin ang mga pangkaraniwang password. Sumubok ng ibang password."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Hindi pinapayagan ang pataas, pababa, o paulit-ulit na pagkakasunod-sunod ng mga digit."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Mga opsyon sa lock ng screen"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> (na) araw ang nakalipas"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Magdagdag ng trusted na device"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Trusted na device"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> device</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na device</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"Maa-unlock ng iyong <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> ang kotseng ito kapag nakakonekta ito. Kung may kumuha ng iyong <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, maaari niyang ma-access ang device na ito"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Kumpirmahin"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Mag-alis ng pinagkakatiwalaang device"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Tapos na"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Buksan ang kasamang app para mag-set up ng pinagkakatiwalaang device. Kapag na-set up ito, maa-unlock mo ang iyong profile ng user kapag na-detect ng sasakyan ang telepono mo"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. I-download ang kasamang app sa iyong telepono"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Piliin ang <xliff:g id="CAR_NAME">%1$s</xliff:g> sa iyong telepono para ipares ang mga device"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Hindi ma-detect ng Smart Lock ang mga panseguridad na feature ng device na ito. Para makatulong na maprotektahan ang iyong kotse, magagawa lang ng pinagkakatiwalaang device na panatilihing naka-unlock ang kotse mo kapag na-unlock mo na ito. Mapapanatili ng iyong pinagkakatiwalaang device na naka-unlock ang kotse mo, kahit na ibang tao ang humahawak nito."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Idagdag ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bilang pinagkakatiwalaang device"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Naidagdag ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bilang pinagkakatiwalaang device"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Hindi na-enroll ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Kapag nagdagdag ng pinagkakatiwalaang device, kinakailangan mong magtakda ng paraan ng pag-authenticate. Kung wala sa iyo ang pinagkakatiwalaan mong device, kakailanganin ang pag-authenticate para ma-access ang iyong profile."</string>
     <string name="forget" msgid="3971143908183848527">"Kalimutan"</string>
+    <string name="connect" msgid="5861699594602380150">"Kumonekta"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Idiskonekta"</string>
     <string name="delete_button" msgid="5840500432614610850">"I-delete"</string>
     <string name="remove_button" msgid="6664656962868194178">"Alisin"</string>
     <string name="cancel" msgid="750286395700355455">"Kanselahin"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Lumabas sa demo mode"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Ide-delete nito ang demo account at ire-reset ang factory data ng system. Mawawala ang lahat ng data ng user."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Lumabas sa Demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"tapusin ang pag-set up"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"huwag ngayon"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"I-DISMISS"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Hindi available ang feature habang nagmamaneho."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Hindi maaaring magdagdag ng user habang nagmamaneho."</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 57014c1..526472a 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"ekranı karartma, dokunmatik ekran, pil"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"loş ekran, gece, tonlama"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Gece modu"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Ağ ve internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobil ağ"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobil veri"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Verilere mobil ağ üzerinden erişim"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobil veri kapatılsın mı?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Veri kullanımı"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Veri uyarısı ve limiti"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Uygulama veri kullanımı döngüsü"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Veri uyarısı oluştur"</string>
+    <string name="data_warning" msgid="116776633806885370">"Veri uyarısı"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Veri limiti ayarla"</string>
+    <string name="data_limit" msgid="227338836292511425">"Veri limiti"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Veri kullanımını sınırlama"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Aracınızın ana birimi, belirlediğiniz mobil veri limitine ulaşıldığında mobil veriyi kapatır.\n\nVeri kullanımı ana birim tarafından ölçülür ve operatörünüz kullanımı farklı bir şekilde hesaplayabilir. Bu nedenle, risk almadan güvenli bir limit belirleyin."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Kablosuz"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Kablosuz erişim noktaları kurun ve bunları yönetin"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Kablosuz açılıyor…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Kablosuz kapatılıyor…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Kablosuz listesi yükleniyor"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Kablosuz devre dışı"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Ağ unutulamadı"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Ağa bağlanılamadı"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Ağ ekle"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Kablosuz devre dışı"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Bağlan"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Şifre"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Şifreyi göster"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Ağ adı"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID\'yi girin"</string>
     <string name="wifi_security" msgid="158358046038876532">"Güvenlik"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Sinyal gücü"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Sinyal gücü"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Durum"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Bağlantı hızı"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Frekans"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP adresi"</string>
+    <string name="show_password" msgid="2074628020371139240">"Şifreyi göster"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Ağ adını girin"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Şifreyi girin"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Zayıf"</item>
-    <item msgid="2032262610626057081">"Yeterli"</item>
-    <item msgid="3859756017461098953">"İyi"</item>
-    <item msgid="1521103743353335724">"Mükemmel"</item>
+    <item msgid="7683058295076342057">"Zayıf"</item>
+    <item msgid="1639222824821660744">"Yeterli"</item>
+    <item msgid="1838705897358163300">"İyi"</item>
+    <item msgid="6067166649320533751">"Mükemmel"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetooth\'u aç"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth devre dışı"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/sn."</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Ağ ayrıntıları"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC adresi"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP adresi"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Alt ağ maskesi"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 adresleri"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Ağ geçidi"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Kablosuz tercihleri"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Kablosuzu otomatik olarak aç"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Ev ağınız gibi yüksek kaliteli kayıtlı ağların yakınında olduğunuzda kablosuz özelliği tekrar açılır"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Konum kapalı olduğundan kullanılamıyor. "<annotation id="link">"Konum"</annotation>"\'u açın."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Kablosuz taraması açılsın mı?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Aç"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Kablosuz tarama açıldı"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Mobil veriye otomatik olarak geç"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Kablosuz internet erişimi yoksa mobil veri kullan. Veri kullanımı ücretleri uygulanabilir."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Daha fazla bilgi"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Bağlantıları yönetin, cihaz adını girin ve bulunabilirlik ayarını yapın"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Bilgisayar"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Mikrofonlu kulaklık"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Görüntüleme"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Kulaklık"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Giriş Çevre Birimi"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Eşlenen cihazlar"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Kullanılabilir cihazlar"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Eşlenen cihaz yok"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Kullanılabilir cihaz yok"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Eşlenen cihaz"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Ad"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Şunun için kullan:"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth cihazının adını değiştirin"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Adsız cihaz"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Eşlenen cihazlar"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Yeni cihaz eşle"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth, eşleme yapmak için açılır"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Cihazla bağlantı kesilsin mi?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Aracınızın <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bağlantısı kesilecek."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Aracın Bluetooth adresi: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Cihazın Bluetooth adresi: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Araç adı"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Bu aracın adını değiştirin"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Cihazın adını değiştir"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Yeniden adlandır"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Kullanılabilir cihazlar"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profiller"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth eşleme isteği"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Eşleştir ve bağlan"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth eşleme kodu"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN, harf veya simge içerir"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Eşleme kodunu girip Return veya Enter tuşuna basın"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Genellikle 0000 veya 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Eşleme isteği"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ile eşlemek için dokunun."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Diller"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Diller ve giriş"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klavye"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Klavyeleri yönet"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Metin okuma çıkışı"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Tercih edilen motor"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Mevcut motor"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Konuşma Hızı"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Perde"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Sıfırla"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Ses"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Zil sesi düzeyi"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Gezinme ses düzeyi"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Medya"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Müziğin ve videoların ses düzeyini ayarla"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Alarm"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefon zil sesi"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Varsayılan bildirim sesi"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Varsayılan alarm sesi"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Uygulamalar ve bildirimler"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Tüm uygulamaları göster"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Varsayılan uygulamalar"</string>
     <string name="applications_settings" msgid="794261395191035632">"Uygulama bilgileri"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Zorla durdur"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Zorla durdurulsun mu?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Uygulama zorla durdurulursa hatalı davranabilir."</string>
     <string name="disable_text" msgid="4358165448648990820">"Devre dışı bırak"</string>
     <string name="enable_text" msgid="1794971777861881238">"Etkinleştir"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Yüklemeyi kaldır"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Bu uygulamayı devre dışı bırakırsanız Android ve diğer uygulamalar artık beklendiği gibi çalışmayabilir."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Uygulamayı devre dışı bırak"</string>
     <string name="permissions_label" msgid="2701446753515612685">"İzinler"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Sürüm: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Hiçbir izin verilmedi"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Hiçbir izin istenmedi"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Veri kullanımı"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Uygulama veri kullanımı"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Zorla durdur"</string>
     <string name="computing_size" msgid="5791407621793083965">"Hesaplanıyor…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ek izin</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ek izin</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Asistan ve ses girişi"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Asistan uygulaması"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Ekrandaki metni kullan"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Asistan uygulamasının, ekran içeriklerine metin biçiminde erişmesine izin ver"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Ekran görüntüsü kullan"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Asistan uygulamasının ekrandaki bir resme erişmesine izin ver"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Otomatik doldurma hizmeti"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Yok"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Seçilen"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Asistan, ekranınızda görünür olan veya uygulamaların içinden erişilebilen bilgiler dahil olmak üzere sisteminizde kullanılan uygulamalar hakkındaki bilgileri okuyabilecektir."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Bu uygulamaya güvendiğinizden emin olun&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Otomatik Doldurma&gt;%1$s&lt;/xliff:g&gt; özelliği, otomatik doldurulabilecek alanları belirlemek için ekranınızdaki bilgileri kullanır."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Hizmet ekle"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Konum"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Yeni Konum İstekleri"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Yeni konum isteği yok"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Uygulama düzeyinde izinler"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Tarama"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Konum Hizmetleri"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Kablosuz taraması"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Uygulamaların ve hizmetlerin kablosuz ağları Kablosuz özelliği kapalıyken bile her zaman taramasına izin verin. Bu özellik, konuma dayalı özellikleri ve hizmetleri iyileştirme gibi amaçlar için kullanılabilir."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth taraması"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Uygulamaların ve hizmetlerin etrafınızdaki cihazları Bluetooth kapalıyken bile her zaman taramasına izin verin. Bu özellik, konuma dayalı özellikleri ve hizmetleri iyileştirme gibi amaçlar için kullanılabilir."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Sistem"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Sistem güncellemeleri"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Sistem güncellemeleri"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android sürümü"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android güvenlik yaması düzeyi"</string>
     <string name="model_info" msgid="4966408071657934452">"Model"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Ana bant sürümü"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Çekirdek sürümü"</string>
     <string name="build_number" msgid="3997326631001009102">"Derleme numarası"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth adresi"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Kullanılamıyor"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Durum"</string>
     <string name="device_status" msgid="267298179806290920">"Durum"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Telif hakkı"</string>
     <string name="license_title" msgid="936705938435249965">"Lisans"</string>
     <string name="terms_title" msgid="5201471373602628765">"Şartlar ve koşullar"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Sistem Web Görünümü Lisansı"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Sistem Web Görünümü lisansları"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Duvar kağıtları"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Uydu görüntüsü sağlayıcıları:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Üçüncü taraf lisansları"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Lisansları yüklemeyle ilgili bir sorun var."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Yükleniyor…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Geliştirici olmanıza <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> adım kaldı.</item>
+      <item quantity="one">Geliştirici olmanıza <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> adım kaldı.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Artık bir geliştiricisiniz!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Gerekli değil, siz zaten bir geliştiricisiniz."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Geliştirici seçenekleri"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Sıfırlama seçenekleri"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Ağı, uygulamaları veya cihazı sıfırlama"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Ağı sıfırla"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Bu işlem, şunlar dahil tüm ağ ayarlarını sıfırlayacak:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Kablosuz"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobil veri"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Tüm araç eSIM\'lerini sil"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Bu işlem, hizmet planınızı iptal etmez."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM\'ler sıfırlanamıyor"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Ağ seçin"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Ayarları sıfırla"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Sıfırlansın mı?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Tüm ağ ayarları sıfırlansın mı? Bu işlem geri alınamaz!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Ayarları sıfırla"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Ağ ayarları sıfırlandı"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Uygulama tercihlerini sıfırla"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Bu işlem, şunlarla ilgili tüm tercihleri sıfırlayacaktır:\n\n"<li>"Devre dışı bırakılan uygulamalar"</li>\n<li>"Devre dışı bırakılan uygulama bildirimleri"</li>\n<li>"İşlemler için varsayılan uygulamalar"</li>\n<li>"Uygulamalar için arka plan verileri kısıtlamaları"</li>\n<li>"Tüm izin kısıtlamaları"</li>\n\n"Uygulama verileriniz kaybolmayacak."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Uygulamaları sıfırla"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Uygulama tercihleri sıfırlandı"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Tüm verileri sil (fabrika ayarları)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Bu işlem, aracınızın ana biriminden şunlar dahil tüm verileri siler:\n\n"<li>"Google hesabınız"</li>\n<li>"Sistem ve uygulama verileri ile ayarları"</li>\n<li>"İndirilen uygulamalar"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Şu anda oturum açmış olduğunuz hesaplar:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Bu araçta başka kullanıcılar da var."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Aracı sıfırla"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Sıfırlansın mı?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Tüm kişisel bilgileriniz ve indirdiğiniz uygulamalar silinsin mi? Bu işlem geri alınamaz!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Her şeyi sil"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Siliniyor"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Lütfen bekleyin..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Tarih ve saat"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Tarih ve saati ayarlayın"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Tarihi, saati, saat dilimini ve biçimleri ayarlayın"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Saat dilimine göre sırala"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Tarih"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Saat"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Kullanıcı ekle"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Hesap ekle"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Kullanıcıyı sil"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Yeni kullanıcı"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Misafir"</string>
     <string name="user_admin" msgid="1535484812908584809">"Yönetici"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Yönetici olarak oturum açıldı"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Tüm yönetici izinleri"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Yönetici yap"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Kullanıcı, diğer Yöneticiler dahil tüm kullanıcıları silebilecek ve sistemi fabrika ayarlarına sıfırlayabilecektir."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Bu işlem geri alınamaz."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Evet, yönetici yap"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Yeni kullanıcı oluşturma"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Telefon araması yapma"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Araç mobil verisiyle mesajlaşma"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Yeni uygulama yükleme"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Uygulamaları kaldırma"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Kullanıcı ekle"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Yeni kullanıcı"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Kullanıcı eklensin mi?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Yeni kullanıcı eklediğinizde, bu kişinin alanını ayarlaması gerekir."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Herhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Kullanıcı sınırına ulaşıldı"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">En fazla <xliff:g id="COUNT">%d</xliff:g> kullanıcı oluşturabilirsiniz.</item>
+      <item quantity="one">Yalnızca bir kullanıcı oluşturulabilir.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Yeni kullanıcı oluşturulamadı"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Bu kullanıcı silinsin mi?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Tüm uygulamalar ve veriler silinecek."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Kullanıcı silinemedi."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Kapat"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Tekrar dene"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Kullanıcı silinsin mi?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Bu aracın kalan son kullanıcısı silindikten sonra yeni bir yönetici kullanıcı oluşturulacak."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Bu kullanıcıyla ilişkili tüm veriler, ayarlar ve uygulamalar silinecek. Sistemi tekrar ayarlamanız gerekecek."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Yeni yönetici seçin"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"En az bir yöneticiye ihtiyacınız var. Bu yöneticiyi silmek için önce yedek yönetici seçin."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Yönetici seçin"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Misafir"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Misafir"</string>
     <string name="user_switch" msgid="6544839750534690781">"Değiştir"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Siz (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ad"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Yapılandırılmamış"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Kullanıcı adını düzenleme"</string>
     <string name="users_list_title" msgid="770764290290240909">"Kullanıcılar"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s için izinler verildi"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Hesaplar"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Kullanıcı"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Hesap ekle"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Hiçbir hesap eklenmedi"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> adlı kullanıcının hesapları"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Verileri otomatik olarak senkronize et"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Uygulamaların verileri otomatik olarak yenilemesine izin ver"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Otomatik veri senk. açılsın mı?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Hesaplarınızda web üzerinden yaptığınız tüm değişiklikler cihazınıza otomatik olarak kopyalanacaktır.\n\nBazı hesaplar telefonda yaptığınız değişiklikleri de web\'e otomatik olarak kopyalayabilir. Google Hesaplarının işleyişi bu şekildedir."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Otomatik senk. kapatılsın mı?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Bu işlem verileri korur ancak son bilgileri almak için her bir hesabı manuel olarak senkronize etmeniz gerekecektir. Güncelleme olduğunda bildirim de almazsınız."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Hesap bilgileri"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Hesap ekle"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Hesap ekleme"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Hesabı kaldır"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Hesap kaldırılsın mı?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Bu hesabın kaldırılması, hesaba ait tüm mesajların, kişilerin ve cihazdaki diğer verilerin silinmesine neden olacak!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Yöneticiniz bu değişikliğe izin vermiyor"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Kullanıcı kaldırılsın mı?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Tüm uygulamalar ve veriler silinecek."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Kullanıcı kaldırılamadı."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Tekrar denensin mi?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Kapat"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Tekrar dene"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Kullanıcı eklensin mi?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Yeni kullanıcı eklediğinizde, bu kişinin alanını ayarlaması gerekir."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Herhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Hesap kaldırılamadı."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Hesap senkronizasyonu"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Senkronizasyon <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g> öğe için açık"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Senkronizasyon tüm öğeler için açık"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Senkronizasyon tüm öğeler için kapalı"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Senkronizasyon KAPALI"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Senkronizasyon hatası"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Son senkronizasyon: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Şimdi senkronize ediliyor…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Şimdi senkronize etmek için dokunun<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Şimdi senkronize et"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Senkronizasyonu iptal et"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Şu anda senkronizasyon sorunu yaşanıyor. Senkronizasyon kısa bir süre sonra tekrar devreye girecek."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Güvenlik"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekran kilidi"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Yok"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Şifre"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Kilit türü seçin"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Ekran kilidi seçenekleri"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Kilit seçenekleri"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Deseninizi girin"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Onayla"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Yeniden çiz"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ekran kilidi ayarlama"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN\'inizi seçin"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Deseninizi seçin"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Şifrenizi seçin"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Şifrenizi seçin"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Geçerli ekran kilidi"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Güvenlik için desen oluşturun"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Temizle"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Yaygın olarak kullanılan şifreler BT yöneticiniz tarafından engellenir. Farklı bir şifre deneyin."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Artan, azalan veya tekrar eden rakam dizisine izin verilmez."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Ekran kilidi seçenekleri"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> gün önce"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Güvenilen cihaz ekle"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Güvenilen cihazlar"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> cihaz</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> cihaz</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> cihazınız bu araca bağlı olduğunda aracın kilidini açacaktır. <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> cihazınız bir kişinin eline geçerse bu kişi cihazınıza erişebilir."</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Onayla"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Güvenilen cihazı kaldır"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Bitti"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Güvenilen cihaz ayarlamak için tamamlayıcı uygulamayı kullanın. Ayarlama yapmanızın ardından, telefonunuz araç tarafından algılandığında kullanıcı profilinizin kilidini açabilirsiniz"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Tamamlayıcı uygulamayı telefonunuza indirin"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Cihazları eşlemek için telefonunuzda <xliff:g id="CAR_NAME">%1$s</xliff:g> seçimini yapın"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock, bu cihazın güvenlik özelliklerini algılayamıyor. Güvenilen cihaz, aracınızın korunmasına yardımcı olmak için yalnızca siz kilidini açtıktan sonra aracı açık tutabilecektir. Güvenilen cihazınız başkasının elinde olsa bile aracınız yakındayken aracın kilidini açık tutabilir."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> adlı cihazı güvenilen cihaz olarak ekle"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> güvenilen cihaz olarak başarıyla eklendi"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> kaydı başarısız oldu"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Güvenilen cihaz eklemek için kimlik doğrulama yöntemi belirlemeniz gerekir. Güvenilen cihazınız yanınızda değilse profilinize erişmek için kimlik doğrulama gerekecektir."</string>
     <string name="forget" msgid="3971143908183848527">"Unut"</string>
+    <string name="connect" msgid="5861699594602380150">"Bağlan"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Bağlantıyı kes"</string>
     <string name="delete_button" msgid="5840500432614610850">"Sil"</string>
     <string name="remove_button" msgid="6664656962868194178">"Kaldır"</string>
     <string name="cancel" msgid="750286395700355455">"İptal et"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Demo modundan çık"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Bu işlem, demo hesabını silecek ve sistemi fabrika verilerine sıfırlayacak. Tüm kullanıcı verileri kaybolacak."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Demodan çık"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"kurulumu bitir"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"şimdi değil"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"KAPAT"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Sürüş sırasında bu özellik kullanılamaz."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Sürüş sırasında kullanıcı eklenemez."</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index a69698a..6b05cd1 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"затемнений екран, сенсорний екран, акумулятор"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"затемнений екран, ніч, відтінок"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Нічний режим"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Мережа й Інтернет"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Мобільна мережа"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Мобільне передавання даних"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Доступ до даних через мобільну мережу"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Вимкнути мобільне передавання даних?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Використання трафіку"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Застереження про трафік і обмеження"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Цикл використання трафіку додатків"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Увімкнути сповіщення про трафік"</string>
+    <string name="data_warning" msgid="116776633806885370">"Застереження про трафік"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Налаштуйте обмеження трафіку"</string>
+    <string name="data_limit" msgid="227338836292511425">"Обмеження трафіку"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Обмежити використання трафіку"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Головний пристрій автомобіля вимкне мобільне передавання даних, коли буде досягнуто вказаного обмеження.\n\nОскільки головний пристрій і оператор можуть вимірювати трафік по-різному, радимо встановити занижене обмеження."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Налаштуйте бездротові точки доступу та керуйте ними"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Увімкнення Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Вимкнення Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Завантажується список мереж Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi вимкнено"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Не вдалося забути мережу"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Не вдалося під’єднатися до мережі"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Додати мережу"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi вимкнено"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Під’єднати"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Пароль"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Показати пароль"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Назва мережі"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Введіть ім’я мережі"</string>
     <string name="wifi_security" msgid="158358046038876532">"Безпека"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Рівень сигналу"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Потужність сигналу"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Статус"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Швидкість з’єднання"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Частота"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"ІР-адреса"</string>
+    <string name="show_password" msgid="2074628020371139240">"Показати пароль"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Введіть назву мережі"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Введіть пароль"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Слабкий"</item>
-    <item msgid="2032262610626057081">"Задовільний"</item>
-    <item msgid="3859756017461098953">"Добрий"</item>
-    <item msgid="1521103743353335724">"Відмінний"</item>
+    <item msgid="7683058295076342057">"Слабкий"</item>
+    <item msgid="1639222824821660744">"Задовільний"</item>
+    <item msgid="1838705897358163300">"Добрий"</item>
+    <item msgid="6067166649320533751">"Чудовий"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Увімкніть Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth вимкнено"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Мбіт/с"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 ГГц"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 ГГц"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Дані мережі"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC-адреса"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"ІР-адреса"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Маска підмережі"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Адреси IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Шлюз"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Параметри Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Автоматично вмикати Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi‑Fi вмикатиметься біля збережених мереж, як-от домашньої"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Недоступно, оскільки вимкнено "<annotation id="link">"передавання геоданих"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Увімкнути пошук мереж Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Увімкнути"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Пошук мереж Wi-Fi увімкнено"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Автоматично переходити на мобільне передавання даних"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Вмикати мобільне передавання даних, якщо мережа Wi-Fi не має доступу до Інтернету. Може стягуватися плата за використання трафіку."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Докладніше"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Керувати з’єднаннями, налаштувати назву та видимість пристрою"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Комп’ютер"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Гарнітура"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Телефон"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Візуалізація"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Навушники"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Периферійне введення"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Підключені пристрої"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Доступні пристрої"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Немає підключених пристроїв"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Немає доступних пристроїв"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Підключений пристрій"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Назва"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Використовувати для"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Змініть назву пристрою Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Пристрій без назви"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Пристрої, з якими створено пару"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Створити пару з новим пристроєм"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth увімкнеться, щоб створити пару"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Від’єднати пристрій?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Автомобіль від’єднається від пристрою <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Адреса Bluetooth автомобіля: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Адреса Bluetooth пристрою: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Назва автомобіля"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Перейменувати цей автомобіль"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Перейменувати пристрій"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Перейменувати"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Доступні пристрої"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Профілі"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Запит Bluetooth на створення пари"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Створити пару та підключитися"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Код підключення Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN-код містить літери чи символи"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Введіть код підключення та натисніть Return або Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Зазвичай 0000 або 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Запит на створення пари"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Торкніться, щоб підключитися до пристрою <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Мови"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Мови та введення"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Клавіатура"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Керуйте клавіатурами"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Вивід синтезу мовлення"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Бажана система"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Поточна система"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Темп мовлення"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Тон"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Скинути"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Звук"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Гучність дзвінка"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Гучність навігації"</string>
@@ -100,16 +140,27 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Медіа"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Налаштувати гучність для музики та відео"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Будильник"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Сигнал телефонного дзвінка"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Стандартний сигнал сповіщень"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Стандартний сигнал будильника"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Додатки та сповіщення"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Показати всі додатки"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Додатки за умовчанням"</string>
     <string name="applications_settings" msgid="794261395191035632">"Про додаток"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Примусово припинити роботу"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Примусово припинити роботу?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Після примусового припинення роботи додаток може працювати неналежним чином."</string>
     <string name="disable_text" msgid="4358165448648990820">"Вимкнути"</string>
     <string name="enable_text" msgid="1794971777861881238">"Увімкнути"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Видалити"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Якщо вимкнути цей додаток, система Android та інші додатки можуть працювати неналежним чином."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Вимкнути додаток"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Дозволи"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Версія: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Дозволи не надано"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Немає запитів на дозволи"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Використання трафіку"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Використання трафіку"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Примусово припинити роботу"</string>
     <string name="computing_size" msgid="5791407621793083965">"Обчислення…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> додатковий дозвіл</item>
@@ -117,15 +168,39 @@
       <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> додаткових дозволів</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> додаткового дозволу</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Асистент і голосовий ввід"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Помічник"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Використовувати текст з екрана"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Надати помічнику доступ до тексту на екрані"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Використовувати знімки екрана"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Надати помічнику доступ до знімків екрана"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Автозаповнення"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Немає"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Вибрано"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Асистент матиме доступ до інформації про додатки у вашій системі, зокрема до даних на екрані та в додатках."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Переконайтеся, що додаток надійний&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Автозаповнення Google&gt;%1$s&lt;/xliff:g&gt; використовує інформацію на екрані, щоб визначати поля, які можна заповнити."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Додати сервіс"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Місце"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Останні запити на геодані"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Немає останніх запитів на геодані"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Дозволи на рівні додатка"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Пошук"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Служби локації"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Пошук мереж Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Дозволити додаткам і службам будь-коли шукати мережі Wi-Fi, навіть коли Wi-Fi вимкнено. Це може покращити, наприклад, роботу функцій і служб, які використовують геодані."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Пошук пристроїв Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Дозволити додаткам і службам будь-коли шукати пристрої поруч, навіть коли Bluetooth вимкнено. Це може покращити, наприклад, роботу функцій і служб, які використовують геодані."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Система"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Оновлення системи"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Оновлення системи"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Версія Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Рівень виправлення системи безпеки Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Модель"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Версія каналу зв’язку"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Версія ядра"</string>
     <string name="build_number" msgid="3997326631001009102">"Номер складання"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Адреса Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Недоступно"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Статус"</string>
     <string name="device_status" msgid="267298179806290920">"Статус"</string>
@@ -142,12 +217,51 @@
     <string name="copyright_title" msgid="4220237202917417876">"Авторські права"</string>
     <string name="license_title" msgid="936705938435249965">"Ліцензія"</string>
     <string name="terms_title" msgid="5201471373602628765">"Умови використання"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Ліцензія компонента WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Ліцензії WebView"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Фонові малюнки"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Постачальники супутникових зображень:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Ліцензії сторонніх розробників"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Не вдалося завантажити ліцензії."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Завантаження…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Залишився лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> крок, щоб стати розробником.</item>
+      <item quantity="few">Залишилося лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроки, щоб стати розробником.</item>
+      <item quantity="many">Залишилося лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроків, щоб стати розробником.</item>
+      <item quantity="other">Залишилося лише <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> кроку, щоб стати розробником.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Тепер ви розробник."</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Непотрібно, ви вже розробник."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Параметри розробника"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Скинути параметри"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Скидання налаштувань мережі, додатків або пристрою"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Скинути налаштування мережі"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Буде скинуто налаштування всіх мереж, зокрема:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi-Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Мобільне передавання даних"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Видалити всі eSIM-карти автомобіля"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Ваш тарифний план не буде скасовано."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Не вдається скинути eSIM-карти"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Вибрати мережу"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Скинути налаштування"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Скинути?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Скинути налаштування всіх мереж? Цю дію не можна відмінити."</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Скинути налаштування"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Налаштування мереж скинуто"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Cкинути налаштування додатків"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Буде скинуто всі налаштування для:\n\n"<li>"вимкнених додатків;"</li>\n<li>"сповіщень вимкнених додатків;"</li>\n<li>"додатків для виконання дій за умовчанням;"</li>\n<li>"обмежень щодо використання даних додатками у фоновому режимі;"</li>\n<li>"усіх обмежень щодо дозволів."</li>\n\n"Ви не втратите жодних даних додатків."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Скинути налаштування додатків"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Налаштування додатків скинуто"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Стерти всі дані (скинути налаштування)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Буде видалено всі дані головного пристрою автомобіля, зокрема:\n\n"<li>"обліковий запис Google;"</li>\n<li>"дані й налаштування системи та додатків;"</li>\n<li>"завантажені додатки."</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Ви ввійшли в такі облікові записи:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"У цього автомобіля є інші користувачі."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Скинути дані автомобіля"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Скинути?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Видалити всю особисту інформацію та завантажені додатки? Цю дію не можна відмінити."</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Видалити все"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Видалення"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Зачекайте…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Дата й час"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Установити дату й час"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Установити дату, час, часовий пояс і формати"</string>
@@ -156,7 +270,7 @@
     <string name="zone_auto" msgid="3701878581920206160">"Автоматичний часовий пояс"</string>
     <string name="zone_auto_summary" msgid="4345856882906981864">"Використовувати часовий пояс, наданий мережею"</string>
     <string name="date_time_24hour_title" msgid="3025576547136168692">"24-годинний формат"</string>
-    <string name="date_time_24hour" msgid="1137618702556486913">"Використовувати 24-годинний формат"</string>
+    <string name="date_time_24hour" msgid="1137618702556486913">"24-годинний формат"</string>
     <string name="date_time_set_time_title" msgid="5884883050656937853">"Час"</string>
     <string name="date_time_set_time" msgid="6449555153906058248">"Установити час"</string>
     <string name="date_time_set_timezone_title" msgid="3001779256157093425">"Часовий пояс"</string>
@@ -167,23 +281,61 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Сортувати за часовим поясом"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Дата"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Час"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Додати користувача"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Додати обліковий запис"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Як видалити користувача"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Новий користувач"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Гість"</string>
     <string name="user_admin" msgid="1535484812908584809">"Адміністратор"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Ви ввійшли як адміністратор"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Усі дозволи адміністратора"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Зробити адміністратором"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Це дасть змогу видаляти користувачів, зокрема інших адміністраторів, і відновлювати заводські налаштування системи."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Цю дію не можна відмінити."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Так, зробити адміністратором"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Створювати нових користувачів"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Телефонувати"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Обмінюватися SMS з автомобіля"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Установлювати нові додатки"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Видаляти додатки"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Додати користувача"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Новий користувач"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Додати нового користувача?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Після створення новий профіль потрібно налаштувати."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Будь-який користувач може оновлювати додатки для решти людей."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Ви досягли ліміту користувачів"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Можна створити до <xliff:g id="COUNT">%d</xliff:g> користувача.</item>
+      <item quantity="few">Можна створити до <xliff:g id="COUNT">%d</xliff:g> користувачів.</item>
+      <item quantity="many">Можна створити до <xliff:g id="COUNT">%d</xliff:g> користувачів.</item>
+      <item quantity="other">Можна створити до <xliff:g id="COUNT">%d</xliff:g> користувача.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Не вдалося створити нового користувача"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Видалити користувача?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Усі додатки й дані буде видалено."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Не вдалося видалити користувача."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Закрити"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Повторити"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Видалити останнього користувача?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Коли ви видалите останнього користувача цього автомобіля, буде створено нового адміністратора."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Буде видалено всі дані, налаштування й додатки, зв’язані з цим користувачем. Потрібно буде знову налаштовувати систему."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Вибрати нового адміністратора"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"У вас має бути принаймні один адміністратор. Щоб видалити цього, спершу виберіть іншого."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Вибрати адміністратора"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Гість"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Гість"</string>
     <string name="user_switch" msgid="6544839750534690781">"Змінити користувача"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Ви (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ім’я"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Не налаштовано"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Змінити ім’я користувача"</string>
     <string name="users_list_title" msgid="770764290290240909">"Користувачі"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s отримує дозволи"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Облікові записи"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Користувач"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Додати обліковий запис"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Облікових записів не додано"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Облікові записи користувача <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Автоматично синхронізувати дані"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Дозволити додаткам автоматично оновлювати дані"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Увімкнути автосинхронізацію?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Будь-які зміни в облікових записах, внесені в Інтернеті, автоматично копіюватимуться на ваш пристрій.\n\nДеякі облікові записи також можуть автоматично копіювати в Інтернет зміни, внесені на телефоні. Так працює обліковий запис Google."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Вимкнути автосинхронізацію?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Це заощадить трафік, проте вам доведеться вручну синхронізувати кожний обліковий запис, щоб отримати останні дані. Сповіщення щодо оновлень також не надходитимуть."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Дані облікового запису"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Додати обліковий запис"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Додати обліковий запис"</string>
@@ -191,16 +343,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Видалити обліковий запис"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Видалити обліковий запис?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Якщо видалити цей обліковий запис, ви втратите всі його повідомлення, контакти й інші дані на пристрої."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Ця дія заборонена адміністратором"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Видалити користувача?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Усі додатки й дані буде видалено."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Не вдалося видалити користувача."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Повторити?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Закрити"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Повторити"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Додати нового користувача?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Після створення новий профіль потрібно налаштувати."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Будь-який користувач може оновлювати додатки для решти людей."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Не вдалося видалити обліковий запис."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Синхронізація облікового запису"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Увімкнено синхронізацію стількох елементів: <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Увімкнено синхронізацію всіх елементів"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Вимкнено синхронізацію всіх елементів"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Синхронізацію ВИМКНЕНО"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Помилка синхронізації"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Остання синхронізація: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Синхронізація…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Торкніться, щоб синхронізувати<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Синхронізувати"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Скасувати синхронізацію"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Виникли проблеми із синхронізацією. Незабаром вона відновиться."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Безпека"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Блокування екрана"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Немає"</string>
@@ -208,7 +364,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN-код"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Пароль"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Виберіть тип блокування"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Способи блокування екрана"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Параметри блокування"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Введіть ключ"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Підтвердити"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Перемалювати"</string>
@@ -218,7 +374,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Налаштуйте блокування екрана"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Придумайте PIN-код"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Створіть ключ"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Придумайте пароль"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Створіть пароль"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Поточне блокування екрана"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"З міркувань безпеки налаштуйте ключ"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Очистити"</string>
@@ -302,7 +458,30 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"IT-адміністратор заблокував загальні паролі. Введіть інший пароль."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Заборонено однакові цифри або в порядку зростання чи спадання."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Способи блокування екрана"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> дн. тому"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Додати надійний пристрій"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Надійні пристрої"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> пристрій</item>
+      <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> пристрої</item>
+      <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> пристроїв</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> пристрою</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> буде розблоковувати автомобіль, якщо його підключити. <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> надає доступ до цього пристрою в будь-чиїх руках"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Підтвердити"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Вилучити надійний пристрій"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Готово"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Налаштуйте надійний пристрій у супутньому додатку. Тоді ви зможете розблокувати профіль користувача, коли телефон підключиться до автомобіля."</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Завантажте супутній додаток на телефон"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. На телефоні виберіть <xliff:g id="CAR_NAME">%1$s</xliff:g>, щоб підключити пристрої"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock не може виявляти функцій безпеки цього пристрою. Щоб покращити захист, надійний пристрій може лише не дати автомобілю заблокуватись, якщо ви його розблокували. Ця функція працює, якщо пристрій поруч, навіть в іншої людини."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Додати пристрій <xliff:g id="DEVICE_NAME">%1$s</xliff:g> як надійний"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Пристрій <xliff:g id="DEVICE_NAME">%1$s</xliff:g> додано як надійний"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Не вдалося зареєструвати пристрій <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Додавши надійний пристрій, потрібно налаштувати спосіб автентифікації. Якщо пристрій не з вами, автентифікація знадобиться для доступу в профіль."</string>
     <string name="forget" msgid="3971143908183848527">"Забути"</string>
+    <string name="connect" msgid="5861699594602380150">"Підключити"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Від’єднати"</string>
     <string name="delete_button" msgid="5840500432614610850">"Видалити"</string>
     <string name="remove_button" msgid="6664656962868194178">"Видалити"</string>
     <string name="cancel" msgid="750286395700355455">"Скасувати"</string>
@@ -312,8 +491,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Вийти з демо-режиму"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Буде видалено демонстраційний обліковий запис і відновлено заводські налаштування системи. Усі дані користувача буде втрачено."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Вийти з демо-режиму"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"завершити налаштування"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"не зараз"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"ЗАКРИТИ"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Функція недоступна під час руху автомобіля."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Неможливо додати користувача під час руху автомобіля."</string>
 </resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 26832bd..b2d20b66 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"مدھم اسکرین، ٹچ اسکرین، بیٹری"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"مدھم اسکرین، رات، ہلکا رنگ"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"نائٹ موڈ"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"نیٹ ورک اور انٹرنیٹ"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"موبائل نیٹ ورک"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"موبائل ڈیٹا"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"موبائل نیٹ ورک کے ذریعے ڈیٹا تک رسائی حاصل کریں"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"موبائل ڈیٹا آف کریں؟"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"ڈیٹا کا استعمال"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"ڈیٹا وارننگ اور حد"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"ایپ کے ڈیٹا کے استعمال کی سائیکل"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"ڈیٹا وارننگ سیٹ کریں"</string>
+    <string name="data_warning" msgid="116776633806885370">"ڈیٹا وارننگ"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"ڈیٹا کی حد سیٹ کریں"</string>
+    <string name="data_limit" msgid="227338836292511425">"ڈیٹا کی حد"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"ڈیٹا کا استعمال محدود کرنا"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"آپ کی گاڑی کی ہیڈ یونٹ آپ کی مقرر کردہ حد کو پہنچ جانے پر موبائل ڈیٹا کو آف کر دے گی۔\n\nچونکہ ڈیٹا کے استعمال کی پیمائش ہیڈ یونٹ کے ذریعے کی جاتی ہے اور آپ کا کیریئر استعمال کا حساب مختلف طریقے سے کر سکتا ہے لہذا ایک محتاط حد مقرر کرنے پر غور کریں۔"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"وائرلیس رسائی پوائنٹس کو ترتیب دیں اور ان کا نظم کریں"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi آن ہو رہا ہے…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi آف ہو رہا ہے…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi-Fi کی فہرست لوڈ ہو رہی ہے"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi غیر فعال ہے"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"نیٹ ورک کو بھولنے میں ناکام ہوگیا"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"نیٹ ورک سے مربوط ہونے میں ناکام رہا"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"نیٹ ورک شامل کریں"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi غیر فعال ہے"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"منسلک کریں"</string>
     <string name="wifi_password" msgid="5565632142720292397">"پاس ورڈ"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"پاس ورڈ دکھائیں"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"نیٹ ورک کا نام"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"SSID درج کریں"</string>
     <string name="wifi_security" msgid="158358046038876532">"سیکیورٹی"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"سگنل کی قوت"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"سگنل کی قوت"</string>
     <string name="wifi_status" msgid="5688013206066543952">"صورتحال"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"لنک کی رفتار"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"تعدد"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP پتہ"</string>
+    <string name="show_password" msgid="2074628020371139240">"پاس ورڈ دکھائیں"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"نیٹ ورک کا نام درج کریں"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"پاس ورڈ درج کریں"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"ناقص"</item>
-    <item msgid="2032262610626057081">"مناسب"</item>
-    <item msgid="3859756017461098953">"اچھا"</item>
-    <item msgid="1521103743353335724">"عمدہ"</item>
+    <item msgid="7683058295076342057">"کمزور"</item>
+    <item msgid="1639222824821660744">"مناسب"</item>
+    <item msgid="1838705897358163300">"اچھا"</item>
+    <item msgid="6067166649320533751">"عمدہ"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"بلوٹوتھ"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"بلوٹوتھ آن کریں"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"بلوٹوتھ"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"بلوٹوتھ غیر فعال کر دیا گیا"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4‎ GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5‎ GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"نیٹ ورک کی تفصیلات"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC پتہ"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP پتہ"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"سب نیٹ ماسک"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 پتے"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"گیٹ وے"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi کی ترجیحات"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"خود کار طور پر Wi‑Fi آن کریں"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"ہوم نیٹ ورک جیسے اعلی معیاری محفوظ نیٹ ورکس کے قریب ہونے پر Wi‑Fi واپس آن ہو جائے گا"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"مقام آف ہونے کی وجہ سے غیر دستیاب ہے۔ "<annotation id="link">"مقام"</annotation>" آن کریں۔"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi اسکیننگ آن کریں؟"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"آن کریں"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi اسکیننگ آن ہے"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"خودکار طور پر موبائل ڈیٹا پر سوئچ کریں"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi پر انٹرنیٹ تک رسائی نہ ہونے کی صورت میں موبائل ڈیٹا استعمال کریں۔ ڈیٹا کے استعمال کے چارجز عائد ہو سکتے ہیں۔"</string>
+    <string name="learn_more" msgid="8214605928933358604">"مزید جانیں"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"بلوٹوتھ"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"کنکشنز کا نظم کریں، آلہ کا نام اور دریافتگی کو سیٹ کریں"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"کمپیوٹر"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"ہیڈ سیٹ"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"فون"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"تصویر کشی"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"ہیڈ فون"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"ان پٹ پیریفرل"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"بلوٹوتھ"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"جوڑا بنائے ہوئے آلات"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"دستیاب آلات"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"کوئی جوڑا بنایا گيا آلہ نہیں ہے"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"کوئی دستیاب آلہ نہیں ہے"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"جوڑا بنایا ہوا آلہ"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"نام"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"اس کے لئے استعمال کریں"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"بلوٹوتھ آلہ کا نام تبدیل کریں"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"بے نام آلہ"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"جوڑا بنائے ہوئے آلات"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"نئے آلہ کا جوڑا بنائیں"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"جوڑا بنانے کے لیے بلوٹوتھ آن ہو جائے گا"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"آلہ کو غیر منسلک کریں؟"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"آپ کی گاڑی <xliff:g id="DEVICE_NAME">%1$s</xliff:g> سے غیر منسلک ہو جائے گی۔"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"گاڑی کا بلوٹوتھ پتہ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"آلہ کا بلوٹوتھ پتہ: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"گاڑی کا نام"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"اس گاڑی کا نام تبدیل کریں"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"آلہ کا نام تبدیل کریں"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"نام بدلیں"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"دستیاب آلات"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"پروفائلز"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"بلوٹوتھ جوڑا بنانے کی درخواست"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"جوڑا بنائیں اور منسلک کریں"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"بلوٹوتھ"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"بلوٹوتھ جوڑا بنانے کا کوڈ"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN میں حروف یا علامات شامل ہیں"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"جوڑا بنانے کا کوڈ ٹائپ کریں پھر Return یا Enter دبائیں"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"عام طور پر 0000 یا 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"جوڑا بنانے کی درخواست"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> کے ساتھ جوڑا بنانے کیلئے تھپتھپائیں۔"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"زبانیں"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"زبانیں اور ان پٹ"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"کی بورڈ"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"کی بورڈز کا نظم کریں"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"ٹیکسٹ ٹو اسپیچ کا آؤٹ پٹ"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"ترجیحی انجن"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"موجودہ انجن"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"اسپیچ کی شرح"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"پِچ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"ری سیٹ کریں"</string>
     <string name="sound_settings" msgid="3072423952331872246">"آواز"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"رِنگ والیوم"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"نیویگیشن والیوم"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"میڈیا"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"موسیقی اور ویڈیوز کیلئے والیوم سیٹ کریں"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"الارم"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"فون کی رِنگ ٹون"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"اطلاع کی ڈیفالٹ آواز"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"الارم کی ڈیفالٹ آواز"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"ایپس اور اطلاعات"</string>
+    <string name="all_applications" msgid="7798210477486822168">"سبھی ایپس دکھائیں"</string>
+    <string name="default_applications" msgid="1558183275638697087">"ڈیفالٹ ایپس"</string>
     <string name="applications_settings" msgid="794261395191035632">"ایپ کی معلومات"</string>
+    <string name="force_stop" msgid="2153183697014720520">"زبردستی روکیں"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"زبردستی روکیں؟"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"اگر آپ کسی ایپ کو زبردستی روک دیتے ہیں تو یہ غلط برتاؤ کر سکتی ہے۔"</string>
     <string name="disable_text" msgid="4358165448648990820">"غیر فعال کریں"</string>
     <string name="enable_text" msgid="1794971777861881238">"فعال کریں"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"اَن انسٹال کریں"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"اگر آپ اس ایپ کو غیر فعال کر دیتے ہیں تو ہو سکتا ہے Android اور دیگر ایپس ٹھیک طرح سے کام نہ کریں۔"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"ایپ کو غیر فعال کریں"</string>
     <string name="permissions_label" msgid="2701446753515612685">"اجازتیں"</string>
     <string name="application_version_label" msgid="8556889839783311649">"ورژن: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"کوئی اجازت نہیں دی گئی"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"کسی اجازت کی درخواست نہیں کی گئی"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"ڈیٹا کا استعمال"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"ایپ ڈیٹا کا استعمال"</string>
-    <string name="force_stop" msgid="2153183697014720520">"زبردستی روکیں"</string>
     <string name="computing_size" msgid="5791407621793083965">"حساب کتاب کیا جا رہا ہے…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> اضافی اجازتیں</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> اضافی اجازت</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"معاون اور صوتی ان پٹ"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"معاون ایپ"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"سکرین سے متن استعمال کریں"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"معاون ایپ کو سکرین مشمولات تک بطور متن رسائی کرنے کی اجازت دیں"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"اسکرین شاٹ استعمال کریں"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"معاون ایپ کو اسکرین کی ایک تصویر تک رسائی کرنے کی اجازت دیں"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"آٹو فل سروس"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"کوئی نہیں"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"منتخب کردہ"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"اسسٹنٹ آپ کے سسٹم پر زیر استعمال ایپس کے بارے میں معلومات، بشمول آپ کی اسکرین پر نظر آنے والی یا ایپس کے اندر قابل رسائی معلومات پڑھ سکے گی۔"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;یہ یقینی بنائیں کہ آپ کو اس ایپ پر اعتماد ہے&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; آٹو فل کی جانے والی چیزوں کا تعین کرنے کے لیے آپ کی اسکرین پر موجود چیزوں کو استعمال کرتی ہے۔"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"سروس شامل کریں"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"مقام"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"مقام کی حالیہ درخواستیں"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"مقام کی کوئی حالیہ درخواست نہیں ہے"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"ایپ کی سطح کی اجازتیں"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"اسکیننگ"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"مقام کی سروسز"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi‑Fi اسکیننگ"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Wi‑Fi کے آف ہونے پر بھی ایپس اور سروسز کو کسی بھی وقت Wi‑Fi نیٹ ورکس اسکین کرنے کی اجازت دیں۔ مثال کے طور، اسے مقام پر مبنی خصوصیات اور سروسز کو بہتر بنانے کے لیے استعمال کیا جا سکتا ہے۔"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"بلوٹوتھ اسکیننگ"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"بلوٹوتھ کے آف ہونے پر بھی ایپس اور سروسز کو کسی بھی وقت قریبی آلات اسکین کرنے کی اجازت دیں۔ مثال کے طور، اسے مقام پر مبنی خصوصیات اور سروسز کو بہتر بنانے کے لیے استعمال کیا جا سکتا ہے۔"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"سسٹم"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"سسٹم اپ ڈیٹس"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"سسٹم اپ ڈیٹس"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android ورژن"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android سیکیورٹی پیچ کی سطح"</string>
     <string name="model_info" msgid="4966408071657934452">"ماڈل"</string>
     <string name="baseband_version" msgid="2370088062235041897">"بیس بینڈ ورژن"</string>
     <string name="kernel_version" msgid="7327212934187011508">"کرنل ورژن"</string>
     <string name="build_number" msgid="3997326631001009102">"بلڈ نمبر"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"بلوٹوتھ پتہ"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"دستیاب نہیں ہے"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"صورتحال"</string>
     <string name="device_status" msgid="267298179806290920">"صورتحال"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"کاپی رائٹ"</string>
     <string name="license_title" msgid="936705938435249965">"لائسنس"</string>
     <string name="terms_title" msgid="5201471373602628765">"شرائط و ضوابط"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"سسٹم WebView لائسنس"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"سسٹم WebView لائسنسز"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"وال پیپرز"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"سیٹلائٹ تصاویر کے فراہم کنندگان:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"فریق ثالث کے لائسنسز"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"لائسنسز لوڈ کرنے میں ایک مسئلہ ہے۔"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"لوڈ ہو رہا ہے…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">اب آپ ڈویلپر بننے سے <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> قدم دور ہیں۔</item>
+      <item quantity="one">اب آپ ڈویلپر بننے سے <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> قدم دور ہیں۔</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"اب آپ ایک ڈیولپر ہیں!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"کوئی ضرورت نہیں ہے، آپ پہلے سے ہی ایک ڈیولپر ہیں۔"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"ڈیولپر کے اختیارات"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"دوبارہ ترتیب دینے کے اختیارات"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"نیٹ ورک، ایپس یا آلہ کو دوبارہ ترتیب دینا"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"نیٹ ورک کو دوبارہ ترتیب دیں"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"اس سے نیٹ ورک کی تمام ترتیبات ری سیٹ ہو جائیں گی، بشمول:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"موبائل ڈیٹا"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"بلوٹوتھ"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"گاڑی کے سبھی eSIMs کو مٹائیں"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"اس سے آپ کا سروس پلان منسوخ نہیں ہوگا۔"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIMs کو دوبارہ ترتیب نہیں دیا جا سکتا"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"نیٹ ورک منتخب کریں"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"ترتیبات دوبارہ ترتیب دیں"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"دوبارہ ترتیب دیں؟"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"نیٹ ورک کی سبھی ترتیبات کو دوبارہ ترتیب دیں؟ آپ اس کارروائی کو کالعدم نہیں کر سکتے ہیں!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"ترتیبات دوبارہ ترتیب دیں"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"نیٹ ورک کی ترتیبات کو دوبارہ ترتیب دیا گیا ہے"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"ایپ کی ترجیحات ری سیٹ کریں"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"یہ مندرجہ ذیل کے لیے تمام ترجیحات کو دوبارہ ترتیب دے گا:\n\n"<li>"غیر فعال کردہ ایپس"</li>\n<li>"غیر فعال کردہ ایپس کی اطلاعات"</li>\n<li>"کارروائیوں کے لیے ڈیفالٹ ایپلیکیشنز"</li>\n<li>"ایپس کے لیے پس منظر کے ڈیٹا کی پابندیاں"</li>\n<li>"کوئی اجازتی پابندیاں"</li>\n\n"آپ کسی ایپ کے ڈیٹا سے محروم نہیں ہوں گے۔"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"ایپس کو ری سیٹ کریں"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"ایپ کی ترجیحات کو ری سیٹ کر دیا ہے"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"سبھی ڈیٹا کو حذف کریں (فیکٹری ری سیٹ)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"یہ آپ کی گاڑی کے ہیڈ یونٹ سے سبھی ڈیٹا کو صاف کر دے گا، بشمول:\n\n"<li>"آپ کا Google اکاؤنٹ"</li>\n<li>"سسٹم اور ایپ ڈیٹا اور ترتیبات"</li>\n<li>"ڈاؤن لوڈ کردہ ایپس"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"آپ فی الحال مندرجہ ذیل اکاؤنٹس میں سائن ان ہیں:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"اس آلہ پر دیگر صارفین موجود ہیں۔"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"گاڑی کو دوبارہ ترتیب دیں"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"دوبارہ ترتیب دیں؟"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"آپ کی سبھی ذاتی معلومات اور ڈاؤن لوڈ کردہ ایپس کو صاف کریں؟ آپ اس کارروائی کو کالعدم نہیں کر سکتے ہیں!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"ہر چیز صاف کریں"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"صاف ہو رہا ہے"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"براہ کرم انتظار کریں..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"تاریخ اور وقت"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"تاریخ اور وقت سیٹ کریں"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"تاریخ، وقت، ٹائم زون اور فارمیٹس کو سیٹ کریں"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"ٹائم زون کے لحاظ سے ترتیب دیں"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"تاریخ"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"وقت"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"صارف کو شامل کریں"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"اکاؤنٹ شامل کریں"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"صارف کو حذف کریں"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"نیا صارف"</string>
-    <string name="user_guest" msgid="3465399481257448601">"مہمان"</string>
     <string name="user_admin" msgid="1535484812908584809">"منتظم"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"منتظم کے طور پر سائن ان کردہ"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"منتظم کی سبھی اجازتیں"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"منتظم بنائیں"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"صارف دیگر منتظمین سمیت صارفین کو حذف اور سسٹم کو فیکٹری ری سیٹ نہیں کر سکے گا۔"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"یہ کارروائی منسوخ نہیں کی جا سکتی۔"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"جی ہاں، منتظم بنائیں"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"نئے صارفین بنائیں"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"فون کالز کریں"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"کار کے موبائل ڈیٹا کے ذریعے پیغام رسانی کی جا رہی ہے"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"نئی ایپس انسٹال کریں"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"ایپس کو اَن انسٹال کریں"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"صارف کو شامل کریں"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"نیا صارف"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"نیا صارف شامل کریں؟"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"کوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"صارف کی حد مکمل ہو گئی"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">آپ زیادہ سے زیادہ <xliff:g id="COUNT">%d</xliff:g> صارفین بنا سکتے ہیں۔</item>
+      <item quantity="one">صرف ایک صارف بنایا جا سکتا ہے۔</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"نیا صارف بنانا ناکام ہو گیا"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"اس صارف کو حذف کریں؟"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"سبھی ایپس اور ڈیٹا حذف ہو جائیں گے۔"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"صارف کو حذف کرنے میں ناکامی۔"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"برخاست کریں"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"دوبارہ کوشش کریں"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"آخری صارف کو حذف کریں؟"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"اس کار کیلئے صرف باقی صارف کو حذف کرنے کے بعد، ایک نیا منتظم صارف بنایا جائے گا۔"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"اس صارف سے وابستہ سبھی ڈیٹا، ترتیبات، اور ایپس کو حذف کر دیا جائے گا۔ آپ کو سسٹم دوبارہ ترتیب دینا ہوگا۔"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"نیا منتظم منتخب کریں"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"آپ کو کم از کم ایک منتظم کی ضرورت ہے۔ اسے حذف کرنے کیلئے، پہلے ایک متبادل کا انتخاب کریں۔"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"منتظم منتخب کریں"</string>
+    <string name="user_guest" msgid="3465399481257448601">"مہمان"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"مہمان"</string>
     <string name="user_switch" msgid="6544839750534690781">"سوئچ کریں"</string>
     <string name="current_user_name" msgid="3813671533249316823">"آپ (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"نام"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"ترتیب نہیں دیا گیا"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"صارف نام میں ترمیم کریں"</string>
     <string name="users_list_title" msgid="770764290290240909">"صارفین"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s کو اجازتیں دی گئیں"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"اکاؤنٹس"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"صارف"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"اکاؤنٹ شامل کریں"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"کوئی اکاؤنٹ شامل نہیں ہے"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> کے لئے اکاؤنٹس"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"خودکار طور پر ڈیٹا سِنک کریں"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"ایپس کو خودکار طور پر ڈیٹا ریفریش کرنے دیں"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"ڈیٹا آٹو سنک کریں کو آن کریں؟"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"آپ ویب پر اپنے اکاؤنٹس میں جو بھی تبدیلیاں کریں گے وہ آپ کے آلہ پر خودکار طور پر کاپی ہو جائیں گی۔\n\nایسی تبدیلیاں جو آپ فون پر کرتے ہیں انہیں کچھ اکاؤنٹس خودکار طور پر ویب پر بھی کاپی کر سکتے ہیں۔ Google اکاؤنٹ اس طریقے سے کام کرتا ہے۔"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"ڈیٹا آٹو سنک کریں کو آف کریں؟"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"اس سے ڈیٹا کی بچت ہوگی، لیکن آپ کو حالیہ معلومات اکٹھا کرنے کیلئے ہر ایک اکاؤنٹ کو دستی طور پر سنک کرنا ہوگا۔ اور اپ ڈیٹس ہونے پر آپ کو اطلاعات موصول نہیں ہوں گی۔"</string>
     <string name="account_details_title" msgid="7529571432258448573">"اکا‌‌‌ؤنٹ کی معلومات"</string>
     <string name="add_account_title" msgid="5988746086885210040">"اکاؤنٹ شامل کریں"</string>
     <string name="add_an_account" msgid="1072285034300995091">"ایک اکاؤنٹ شامل کریں"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"اکاؤنٹ ہٹائیں"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"اکاؤنٹ ہٹائیں؟"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"اس اکاؤنٹ کو ہٹانے سے اس کے تمام پیغامات، رابطے اور اس آلے کا دیگر ڈیٹا حذف ہو جائے گا!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"آپ کے منتظم کی طرف سے اس تبدیلی کی اجازت نہیں ہے"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"اس صارف کو ہٹا دیں؟"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"سبھی ایپس اور ڈیٹا حذف ہو جائیں گے۔"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"صارف کو ہٹانا ناکام ہو گیا۔"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"دوبارہ کوشش کریں؟"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"برخاست کریں"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"دوبارہ کوشش کریں"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"نیا صارف شامل کریں؟"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"کوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"اکاؤنٹ کو ہٹانے میں ناکامی۔"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"اکاؤنٹ کی مطابقت پذیری"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_2">%2$d</xliff:g> کے <xliff:g id="ID_1">%1$d</xliff:g> آئٹمز کیلئے مطابق پذیری آن ہے"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"سبھی آئٹمز کیلئے مطابقت پذیری آن ہے"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"سبھی آئٹمز کیلئے مطابقت پذیری آف ہے"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"مطابقت پذیری آف ہے"</string>
+    <string name="sync_error" msgid="6698021343089247914">"مطابقت پذیری کی خرابی"</string>
+    <string name="last_synced" msgid="4745124489150101529">"آخری مطابقت پذیری <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"ابھی مطابقت پذیری ہو رہی ہے…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"ابھی مطابقت پذیری کرنے کے لیے تھپتھپائیں<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"ابھی مطابقت پذیری کریں"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"مطابقت پذیری منسوخ کریں"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"مطابقت پذیری میں فی الحال دشواریاں پیش آ رہی ہیں۔ یہ جلد ہی واپس آ جائے گا۔"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"سیکیورٹی"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"اسکرین لاک"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"کوئی نہیں"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"پاس ورڈ"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"لاک کی قسم منتخب کریں"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"اسکرین لاک کے اختیارات"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"لاک کے اختیارات"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"اپنا پیٹرن درج کریں"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"تصدیق کریں"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"دوبارہ ڈرا کریں"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"اسکرین لاک سیٹ کریں"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"اپنا PIN منتخب کریں"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"اپنا پیٹرن منتخب کریں"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"اپنا پاس ورڈ منتخب کریں"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"اپنا پاسورڈ منتخب کریں"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"موجودہ اسکرین لاک"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"سیکیورٹی کیلئے پیٹرن سیٹ کریں"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"صاف کریں"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"آپ کے IT منتظم نے عمومی پاس ورڈز کو مسدود کر دیا ہے۔ کوئی دوسرا پاس ورڈ آزمائیں۔"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"ہندسوں کی صعودی، نزولی یا مکرر ترتیب کی اجازت نہیں ہے۔"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"اسکرین لاک کے اختیارات"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> دنوں پہلے"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"بھروسہ مند آلہ شامل کریں"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"بھروسہ مند آلات"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> آلات</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> آلہ</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"منسلک ہونے پر آپ کا <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> اس کار کو غیر مقفل کر دے گا۔ اگر کوئی شخص آپ کا <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> لیتا ہے تو اسے اس آلہ تک رسائی حاصل ہو سکتی ہے"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"تصدیق کریں"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"بھروسہ مند آلہ ہٹائیں"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"ہو گیا"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"بھروسہ مند آلہ کو سیٹ اپ کرنے کے لیے ساتھی ایپ کا استعمال کریں۔ ایک بار سیٹ اپ ہو جانے پر، وہیکل کے ذریعے آپ کا فون دریافت کر لینے پر آپ اپنے صارف پروفائل کو غیر مقفل کرنے کے اہل ہوں گے"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1۔ اپنے فون پر ساتھی ایپ ڈاؤن لوڈ کریں"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2۔ آلات کو جوڑنے کے لیے فون پر <xliff:g id="CAR_NAME">%1$s</xliff:g> منتخب کریں"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock اس آلہ کی سیکیورٹی کی خصوصیات کا پتا نہیں لگا سکتا ہے۔ اپنی کار کی حفاظت کی مدد کے لیے، آپ کے ذریعے پہلے سے ہی غیر مقفل کر دئے جانے پر صرف بھروسہ مند آلہ ہی آپ کی کار کو غیر مقفل رکھنے کا اہل ہوگا۔ آپ کا بھروسہ مند آلہ قریب ہونے پر کار کو غیر مقفل رکھ پائے گا، اس وقت بھی جب کوئی اور اسے پکڑے ہوئے ہے۔"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"بطور بھروسہ مند آلہ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> کو شامل کریں"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> کو بھروسہ مند آلہ کے طور پر کامیابی کے ساتھ شامل کر لیا گیا"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> اندراج ناکام ہوگیا"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"بھروسہ مند آلہ شامل کرنے کے لیے آپ کو آگے ایک تصدیقی طریقہ سیٹ کرنا ہوگا۔ اگر آپ کے پاس بھروسہ مند آلہ نہیں ہے تو آپ کے پروفائل تک رسائی حاصل کرنے کے لیے تصدیق درکار ہوگی۔"</string>
     <string name="forget" msgid="3971143908183848527">"بھول جائیں"</string>
+    <string name="connect" msgid="5861699594602380150">"منسلک کریں"</string>
+    <string name="disconnect" msgid="6140789953324820336">"غیر منسلک کریں"</string>
     <string name="delete_button" msgid="5840500432614610850">"حذف کریں"</string>
     <string name="remove_button" msgid="6664656962868194178">"ہٹائیں"</string>
     <string name="cancel" msgid="750286395700355455">"منسوخ کریں"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"ڈیمو موڈ سے باہر نکلیں"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"اس سے ڈیمو اکاؤنٹ اور فیکٹری ڈیٹا کی دوبارہ ترتیب کا سسٹم حذف ہو جائے گا۔ تمام صارف ڈیٹا غائب ہو جائیں گے۔"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"ڈیمو سے باہر نکلیں"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"سیٹ اپ مکمل کریں"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"ابھی نہیں"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"برخاست کریں"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"ڈرائیونگ کے دوران یہ خصوصیت دستیاب نہیں ہے۔"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"ڈرائیونگ کے دوران صارف کو شامل نہیں کیا جا سکتا۔"</string>
 </resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 4c7824a..0d7eb95 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"xira ekran, sensorli ekran, batareya"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"xira ekran, tun, tus"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Tungi rejim"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Tarmoq va Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mobil tarmoq"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Mobil internet"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Mobil internet trafik sarfi"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Mobil internet faolsizlantirilsinmi?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Trafik sarfi"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Ogohlantirish va limit"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Statistika davri"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Trafik sarfi ogohlantirishi"</string>
+    <string name="data_warning" msgid="116776633806885370">"Ogohlantirishlar"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Trafik cheklovini belgilash"</string>
+    <string name="data_limit" msgid="227338836292511425">"Trafik limiti"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Trafik sarfini cheklash"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Siz belgilagan cheklovga yetib kelgach, avtomobilingizning bosh qurilmasidagi mobil internet oʻchadi.\n\nInternetdan foydalanish miqdori avtomobilingizning bosh qurilmasi tomonidan hisoblangani uchun aloqa operatoringizning hisob-kitoblari undan farq qilishi mumkin. Shuning uchun, cheklov kiritishda zaxira miqdorini ham inobatga oling."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Ulanish nuqtalarini sozlash &amp; boshqarish"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Wi‑Fi yoqilmoqda…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Wi‑Fi faolsizlantirilmoqda…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Wi‑Fi roʻyxati yuklanmoqda"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi faolsizlantirildi"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Tarmoqni unutmadi"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Tarmoqqa ulanmadi"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Tarmoq qo‘shish"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi‑Fi faolsizlantirildi"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Ulanish"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Parol"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Parol berkitilmasin"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Tarmoq nomi"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Tarmoq nomini (SSID) kiriting"</string>
     <string name="wifi_security" msgid="158358046038876532">"Xavfsizlik"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Signal darajasi"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Signal darajasi"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Holati"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Ulanish tezligi"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Chastota"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP manzili"</string>
+    <string name="show_password" msgid="2074628020371139240">"Parol berkitilmasin"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Tarmoq nomini kiriting"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Parolni kiriting"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Juda past"</item>
-    <item msgid="2032262610626057081">"Past"</item>
-    <item msgid="3859756017461098953">"Yaxshi"</item>
-    <item msgid="1521103743353335724">"A’lo"</item>
+    <item msgid="7683058295076342057">"Juda past"</item>
+    <item msgid="1639222824821660744">"Past"</item>
+    <item msgid="1838705897358163300">"Yaxshi"</item>
+    <item msgid="6067166649320533751">"A’lo"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bluetoothni yoqing"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Bluetooth faolsizlantirildi"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbit/s"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GGs"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GGs"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Tarmoq tafsilotlari"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC manzil"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP manzil"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Quyi tarmoq niqobi"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 manzillar"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Shlyuz"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi sozlamalari"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Wi‑Fi aloqasini avtomatik yoqish"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Signal kuchli boʻlsa, Wi-Fi avtomatik yonadi (masalan, uyda)"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Ishlamaydi – "<annotation id="link">"Joylashuv"</annotation>" xizmati oʻchiq. Joylashuvni yoqing."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Wi‑Fi tarmoqlarni qidirish funksiyasi yoqilsinmi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Yoqish"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Wi‑Fi tarmoqlarni qidirish funksiyasi yoqildi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Mobil internetga avtomatik ulanish"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Wi-Fi orqali Internet aloqasi yoʻqligida mobil internetdan foydalanish. Sarflangan trafik uchun haq olinishi mumkin."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Batafsil"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Ulanishlar boshqaruvi, qurilmani nomlash va topiluvchanlik"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Kompyuter"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Garnitura"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Telefon"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Kamera"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Quloqchin"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Kiritish qurilmasi"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Ulangan qurilmalar"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Mavjud qurilmalar"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Hech qanday qurilma ulanmagan"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Hech qanday qurilma yo‘q"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Ulangan qurilma"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Nomi"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Foydalanish maqsadi"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Bluetooth qurilmasi nomini o‘zgartiring"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Nomsiz qurilma"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Ulangan qurilmalar"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Yangi qurilmani ulash"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Ulanish uchun Bluetooth yoqiladi"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Qurilma uzilsinmi?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Avtomobilingiz <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasidan uziladi."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Avtomobilning Bluetooth manzili: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Qurilmaning Bluetooth manzili: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Avtomobil nomi"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Bu avtomobilni qayta nomlang"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Qurilmani qayta nomlash"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Qayta nomlash"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Mavjud qurilmalar"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Profillar"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Bluetooth orqali ulanish so‘rovi"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Juftlash va ulash"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Bluetooth orqali ulanish kodi"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN kod harflar va belgilardan iborat bo‘ladi"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Ulanish kodini kiriting va keyin “Return” yoki “Enter” tugmasini bosing"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Odatda 0000 yoki 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Juftlash talabi"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasiga ulanish uchun bosing."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Tillar"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Tillar va matn kiritish"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Klaviatura"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Klaviaturalarni boshqarish"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Nutq sintezi"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Standart sintezator"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Joriy sintezator"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Nutq tezligi"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Ohang"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Asliga qaytarish"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Ovoz"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Chaqiruv tovushi"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Navigatsiya tovushi"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Media"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Musiqa va videolar uchun ovoz balandligini sozlash"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Signal"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Telefon ringtoni"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Standart bildirishnoma tovushi"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Standart signal"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Ilovalar va bildirishnomalar"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Barcha ilovalar"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Standart ilovalar"</string>
     <string name="applications_settings" msgid="794261395191035632">"Ilova haqida"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Majburan to‘xtatish"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Majburan toʻxtatilsinmi?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Ilovani majburan toʻxtatish uning ishlashiga taʼsir qilishi mumkin."</string>
     <string name="disable_text" msgid="4358165448648990820">"Faolsizlantirish"</string>
     <string name="enable_text" msgid="1794971777861881238">"Yoqish"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Oʻchirib tashlash"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Agar bu ilovani faolsizlantirsangiz, Android va boshqa ilovalar bundan buyon kutilganidek ishlamasligi mumkin."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Ilovani faolsizlantirish"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Ruxsatnomalar"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Versiyasi: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Hech qanday ruxsat berilmagan"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Hech qanday ruxsat so‘ralmagan"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Trafik sarfi"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Ilova sarflagan trafik"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Majburan to‘xtatish"</string>
     <string name="computing_size" msgid="5791407621793083965">"Hisoblanmoqda…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta qo‘shimcha ruxsat</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ta qo‘shimcha ruxsat</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Assistent va ovoz bilan yozish"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Yordamchi ilova"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Ekrandagi matndan foydalanish"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Yordamchi ilovaga ekrandagi matndan foydalanishga ruxsat bering"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Skrinshotdan foydalanish"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Yordamchi ilovaga skrinshotdan foydalanishga ruxsat bering"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Avtomatik kiritish xizmati"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Hech qanday"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Tanlangan"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Assistent tizimda ishlatilayotgan ilovalar haqidagi axborotni, masalan, ekranga chiqib turgan yoki ilovalar orqali kiriladigan axborotlarni oʻqiy oladi."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Bu ilova ishonchli ekanini tekshiring&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; ekraningizda nimani avtomatik kiritish kerakligini aniqlaydi."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Xizmat kiritish"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Joylashuv"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Oxirgi joylashuv axboroti talablari"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Hech qanday joylashuvga oid talablar olinmagan"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Ilovalar uchun ruxsatlar"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Qidiruv"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Joylashuv axborotiga asoslangan xizmatlar"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi orqali aniqlash"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Istalgan vaqt ilova va xizmatlarga hatto Wi-Fi yonmasa ham Wi-Fi tarmoqlarni qidirish uchun ruxsat berish mumkin. Joylashuv axborotiga asoslangan funksiya va xizmatlarni yaxshilashda ishlatilishi mumkin."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Bluetooth orqali aniqlash"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Istalgan vaqt ilova va xizmatlarga hatto Bluetooth yonmasa ham Wi-Fi tarmoqlarni qidirish uchun ruxsat berish mumkin. Joylashuv axborotiga asoslangan funksiya va xizmatlarni yaxshilashda ishlatilishi mumkin."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Tizim"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Tizimni yangilash"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Tizimni yangilash"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android versiyasi"</string>
     <string name="security_patch" msgid="4794276590178386903">"Tizim xavfsizligi uchun yangilanish"</string>
     <string name="model_info" msgid="4966408071657934452">"Modeli"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Aloqa moduli versiyasi"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Yadro versiyasi"</string>
     <string name="build_number" msgid="3997326631001009102">"Nashr raqami"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Bluetooth manzili"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Mavjud emas"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Holati"</string>
     <string name="device_status" msgid="267298179806290920">"Holati"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Mualliflik huquqi belgisi"</string>
     <string name="license_title" msgid="936705938435249965">"Litsenziya"</string>
     <string name="terms_title" msgid="5201471373602628765">"Foydalanish shartlari"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"WebView tizim litsenziyasi"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"WebView tizim litsenziyalari"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Orqa fon rasmlari"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Sun’iy yo‘ldosh tasvirlari:\n© CNES 2014/Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Uchinchi tomon litsenziyalari"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Litsenziyalarni yuklashda muammo yuz berdi."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Yuklanmoqda…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Dasturchi boʻlishingizga atigi <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> qadam qoldi.</item>
+      <item quantity="one">Dasturchi boʻlishingizga atigi <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> qadam qoldi.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Siz endi dasturchisiz!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Shart emas, siz allaqachon dasturchi rejimidasiz."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Ishlab chiquvchi sozlamalari"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Asliga qaytarish"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Tarmoq, ilovalar yoki qurilma sozlamalarini tiklash"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Tarmoqni asliga qaytarish"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Barcha sozlamalar asliga qaytariladi, shuningdek:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Mobil internet"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Mashinadagi barcha eSIMlarni tozalash"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Bunda xizmatining tarif rejasi bekor qilinmaydi."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"eSIM kartalar tiklanmadi"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Tarmoq tanlash"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Asliga qaytarish"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Asliga qaytarilsinmi?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Barcha tarmoq sozlamalari qayta tiklansinmi? Bu amalni ortga qaytarib bo‘lmaydi!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Asliga qaytarish"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Tarmoq sozlamalari qayta tiklandi"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Ilova parametrlarini tiklash"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Quyidagilar uchun barcha sozlamalar dastlabki holiga qaytariladi:\n\n"<li>"Nofaol ilovalar"</li>\n<li>"Nofaol ilova bildirishnomalari"</li>\n<li>"Standart ish ilovalari"</li>\n<li>"Ilovalar uchun fondagi trafik cheklovlari"</li>\n<li>"Har qanday ruxsat cheklovlari"</li>\n\n"Hech qanday maʼlumot tozalab tashlanmaydi."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"OK"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Ilova parametrlari tiklandi"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Barcha ma’lumotlarni tozalash (zavod sozlamalarini tiklash)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Bunda avtomobilning bosh qurilmasidagi barcha axborot, jumladan, quyidagilar tozalab tashlanadi:\n\n"<li>"Google hisobingiz"</li>\n<li>"Tizim va ilovaga oid axborot hamda sozlamalar"</li>\n<li>"Yuklab olingan ilovalar"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Siz hozir tizimga quyidagi hisoblardan kirgansiz:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Bu avtomobilda boshqa foydalanuvchilar ham bor."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Avtomobilni asliga qaytarish"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Asliga qaytarilsinmi?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Barcha shaxsiy maʼlumotlaringiz va yuklab olingan ilovalar oʻchirib tashlansinmi? Bu amalni ortga qaytarish imkonsiz!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Hammasini tozalash"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Tozalanmoqda"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Kutib turing..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Sana va vaqt"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Sana va vaqt o‘rnatish"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Sana, vaqt, vaqt zonasi, &amp; formatlarini o‘rnatish"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Vaqt mintaqasi bo‘yicha saralash"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Sana"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Vaqt"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Foydalanuvchi"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Hisob qo‘shish"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Foydalanuvchini o‘chirib tashlash"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Yangi foydalanuvchi"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Mehmon"</string>
     <string name="user_admin" msgid="1535484812908584809">"Administrator"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Administrator sifatida kirgansiz"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Barcha administrator ruxsatlari"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Administrator sifatida tayinlash"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Bu foydalanuvchi boshqa foydalanuvchilarni, jumladan, administratorlarni o‘chirib tashlashi hamda tizim sozlamalarini asliga qaytarishi mumkin."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Bu amalni ortga qaytarish imkonsiz."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Ha, administrator sifatida tayinlansin"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Yangi foydalanuvchilar yaratish"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Chaqiruvlarni amalga oshirish"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Avtomobil interneti orqali SMS"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Yangi ilovalar o‘rnatish"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Ilovalarni o‘chirib tashlash"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Foydalanuvchi"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Yangi foydalanuvchi"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Foydalanuvchi qo‘shilsinmi?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Yangi profil qo‘shilgach, uni sozlash lozim."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Limitga yetib keldi"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ta foydalanuvchi yaratish mumkin.</item>
+      <item quantity="one">Faqat bitta foydalanuvchi yaratish mumkin.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Yangi foydalanuvchi yaratilmadi"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Olib tashlansinmi?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Barcha ilovalar va ma’lumotlar o‘chirib tashlanadi."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Foydalanuvchi olib tashlanmadi."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Yopish"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Qayta urinish"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Olib tashlansinmi?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Bu avtomobil uchun oxirgi foydalanuvchi olib tashlangandan keyin yangi administrator yaratiladi."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Bu foydalanuvchiga aloqador barcha ma’lumotlar, sozlamalar va ilovalar o‘chirib tashlanadi. Tizimni qaytadan sozlashingiz lozim bo‘ladi."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Yangi adminisratorni tanlang"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Kamida bitta administrator lozim. Bunisini olib tashlasangiz, o‘rniga boshqasini tayinlang."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Administratorni tanlang"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Mehmon"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Mehmon"</string>
     <string name="user_switch" msgid="6544839750534690781">"Almashtirish"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Siz (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Ism"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Sozlanmagan"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Foydalanuvchi nomini tahrirlash"</string>
     <string name="users_list_title" msgid="770764290290240909">"Foydalanuvchilar"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"%1$s uchun ruxsatlar berildi"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Hisoblar"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Foydalanuvchi"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Hisob qo‘shish"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Hech qanday hisobga kirilmagan"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> – hisoblar"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Avtomatik sinxronlash"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Ilovalar maʼlumotlari avtomatik yangilanadi"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Avto-sinxronlash yoqilsinmi?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Internet orqali hisoblaringizda qilingan har qanday oʻzgarish avtomatik tarzda telefoningizda ham aks etadi.\n\n Ayrim hisoblar telefon orqali qilingan oʻzgarishlarni internetga nusxalash imkoniyati ham mavjud. Google hisobi xuddi shunday ishlaydi."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Avto-sinxronlash bas qilinsinmi?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Trafik tejaladi, lekin oxirgi axborotlarni yigʻish uchun har bir hisobni oʻzingiz sinxronlashingiz kerak. Shuningdek, oʻzgarishlar yuz berganda sizga bildirishnomalar keladi."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Hisob haqida"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Hisob qo‘shish"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Yangi hisob qo‘shish"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Hisobni olib tashlash"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Hisob olib tashlansinmi?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Ushbu hisob o‘chirilganda unga bog‘liq barcha xabar, kontakt va boshqa ma’lumotlar qurilmadan o‘chib ketadi."</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Ushbu o‘zgarishni amalga oshirish uchun administrator ruxsat bermagan"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Foyd-chi o‘chirilsinmi?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Barcha ilovalar va ma’lumotlar o‘chirib tashlanadi."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Foydalanuvchi olib tashlanmadi"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Takrorlansinmi?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Yopish"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Qayta urinish"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Foydalanuvchi qo‘shilsinmi?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Yangi profil qo‘shilgach, uni sozlash lozim."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Qurilmaning istalgan foydalanuvchisi ilovalarni barcha hisoblar uchun yangilashi mumkin."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Hisob olib tashlanmadi."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Hisobni sinxronlash"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Sinxronizatsiya ayrim elementlar uchun yoniq (<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>)"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Sinxronizatsiya barcha elementlar uchun yoniq"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Sinxronizatsiya hamma narsa uchun o‘chiq"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Sinxronizatsiya yoqilmagan"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Sinxronizatsiyada xato"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Oxirgi marta <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>da sinxronlandi"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Sinxronlanmoqda…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Hozir bosib sinxronlang <xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Hozir sinxronlash"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Sinxronizatsiyani bekor qilish"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Sinxronizatsiyada muammo bor. Tez orada qayta tiklanadi."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Xavfsizlik"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Ekran qulfi"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Hech qanday"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Parol"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Qulf turini tanlang"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Ekran qulfi parametrlari"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Qulflash parametrlari"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Grafik kalitni chizing"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Tasdiqlash"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Qayta chizish"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Ekran qulfini sozlang"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"PIN kod tanlang"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Grafik kalit yarating"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Parol tanlang"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Parol tanlang"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Joriy ekran qulfi"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Xavfsizlik uchun grafik kalit o‘rnating"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Tozalash"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Oddiy parollar AT admini tomonidan bloklangan. Murakkabroq parol tanlang."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Oshib boruvchi, kamayib boruvchi yoki qaytarilgan ketma-ket raqamlarga ruxsat berilmaydi."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Ekran qulfi parametrlari"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> kun oldin"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Ishonchli qurilma kiritish"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Ishonchli qurilmalar"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta qurilma</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ta qurilma</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> avtomobilga ulanishi bilan uning qulfini ochadi. <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> yordamida boshqalar ham bu qurilmaga kira oladi"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"OK"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Ishonchli qurilmani olib tashlash"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"OK"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Ishonchli qurilma sifatida sozlash uchun hamroh ilovadan foydalaning. Sozlangandan keyin telefoningizni avtomobil tanishi bilan foydalanuvchi profilingizni qulfdan chiqarish imkoni paydo boʻladi"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Telefoningiz orqali hamroh ilovani yuklab oling"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Qurilmalarni bir-biriga ulash uchun telefoningizdan <xliff:g id="CAR_NAME">%1$s</xliff:g> nomini tanlang"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock bu qurilmaning xavfsizlik funksiyalarini aniqlay olmadi. Avtomobilingizning qulfini aynan siz ochganingizda, himoyalash maqsadida ishonchli qurilma uni shu holda saqlab turadi. Ishonchli qurilmangizni boshqa odam ushlab turgan holda ham, avtomobilingizga yaqinlashgan vaqtda uni qulfdan chiqara oladi."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasi ishonchli qurilma sifatida kiritilsin"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ishonchli qurilma sifatida kiritildi."</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> qayd qilinmadi"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ishonchl qurilma kiritgandan keyin autentifikatsiya usulini sozlash talab qilinadi. Agar ishonchli qurilma yoningizda boʻlmasa, autentifikatsiya profilingizga kirishda talab etiladi."</string>
     <string name="forget" msgid="3971143908183848527">"Olib tashlash"</string>
+    <string name="connect" msgid="5861699594602380150">"Ulash"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Uzish"</string>
     <string name="delete_button" msgid="5840500432614610850">"O‘chirish"</string>
     <string name="remove_button" msgid="6664656962868194178">"Ha"</string>
     <string name="cancel" msgid="750286395700355455">"Bekor qilish"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Demo rejimdan chiqing"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Bunda demo hisob o‘chirib tashlanadi va tizim zavod sozlamalariga qaytariladi. Barcha foydalanuvchi ma’lumotlari tozalab tashlanadi."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Demodan chiqish"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"sozlashni tugatish"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"hozir emas"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"YOPISH"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Avtomobilda harakatlanayotganda bu funksiya ishlamaydi."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Avtomobilda harakatlanayotganda foydalanuvchi qo‘shilmaydi."</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 455af62..0953116 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"màn hình mờ, màn hình cảm ứng, pin"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"làm mờ màn hình, ban đêm, phủ màu"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Chế độ ban đêm"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Mạng và Internet"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Mạng di động"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Dữ liệu di động"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Truy cập dữ liệu bằng mạng di động"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Tắt dữ liệu di động?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Mức sử dụng dữ liệu"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Hạn mức và cảnh báo dữ liệu"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Chu kỳ dùng dữ liệu ứng dụng"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Đặt cảnh báo dữ liệu"</string>
+    <string name="data_warning" msgid="116776633806885370">"Cảnh báo dữ liệu"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Đặt hạn mức dữ liệu"</string>
+    <string name="data_limit" msgid="227338836292511425">"Hạn mức dữ liệu"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Giới hạn mức sử dụng dữ liệu"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Thiết bị đầu trên phương tiện của bạn sẽ tắt dữ liệu di động khi đạt đến hạn mức mà bạn đã đặt.\n\nVì mức sử dụng dữ liệu là do thiết bị đầu tính toán và nhà mạng có thể có cách tính khác, nên hãy cân nhắc đặt hạn mức vừa phải."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Thiết lập và quản lý điểm truy cập không dây"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Đang bật Wi‑Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Đang tắt Wi‑Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Đang tải danh sách Wi‑Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Đã tắt Wi-Fi"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Không bỏ qua mạng được"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Không kết nối được với mạng"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Thêm mạng"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Đã tắt Wi-Fi"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Kết nối"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Mật khẩu"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Hiển thị mật khẩu"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Tên mạng"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Nhập SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Bảo mật"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Cường độ tín hiệu"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Cường độ tín hiệu"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Trạng thái"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Tốc độ liên kết"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Tần số"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Địa chỉ IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Hiển thị mật khẩu"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Nhập tên mạng"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Nhập mật khẩu"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Kém"</item>
-    <item msgid="2032262610626057081">"Khá tốt"</item>
-    <item msgid="3859756017461098953">"Tốt"</item>
-    <item msgid="1521103743353335724">"Tuyệt vời"</item>
+    <item msgid="7683058295076342057">"Kém"</item>
+    <item msgid="1639222824821660744">"Khá tốt"</item>
+    <item msgid="1838705897358163300">"Tốt"</item>
+    <item msgid="6067166649320533751">"Tuyệt vời"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Bật Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"Đã tắt Bluetooth"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mb/giây"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2,4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Chi tiết mạng"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Địa chỉ MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Địa chỉ IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Mặt nạ mạng con"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Địa chỉ IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Cổng"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Tùy chọn Wi‑Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Tự động bật Wi-Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"Wi-Fi sẽ bật lại khi ở gần các mạng đã lưu chất lượng cao, như mạng gia đình của bạn"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Không hoạt động vì vị trí đang tắt. Hãy bật "<annotation id="link">"vị trí"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Bật tính năng quét tìm mạng Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Bật"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Đã bật tính năng quét tìm mạng Wi‑Fi"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Tự động chuyển sang dữ liệu di động"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Sử dụng dữ liệu di động khi Wi‑Fi không truy cập được Internet. Bạn có thể mất thêm phí sử dụng dữ liệu."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Tìm hiểu thêm"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Quản lý kết nối, đặt tên thiết bị và khả năng phát hiện thiết bị"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Máy tính"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Tai nghe"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Điện thoại"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Tạo ảnh"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Tai nghe"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Thiết bị ngoại vi vào"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Thiết bị được ghép nối"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Thiết bị có sẵn"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Không có thiết bị nào được ghép nối"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Không có thiết bị nào"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Thiết bị được ghép nối"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Tên"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Sử dụng cho"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Đổi tên thiết bị Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Thiết bị chưa có tên"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Thiết bị được ghép nối"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Ghép nối thiết bị mới"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"Bluetooth sẽ bật để ghép nối"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Ngắt kết nối thiết bị?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Xe của bạn sẽ ngắt kết nối khỏi <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Địa chỉ Bluetooth của xe: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Địa chỉ Bluetooth của thiết bị: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Tên xe"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Đổi tên thiết bị này"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Đổi tên thiết bị"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Đổi tên"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Thiết bị có sẵn"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Cấu hình"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Yêu cầu ghép nối Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Ghép nối và kết nối"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Mã ghép nối Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN chứa các ký tự hoặc biểu tượng"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Nhập mã ghép nối, sau đó nhấn Quay lại hoặc Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Thường là 0000 hoặc 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Yêu cầu ghép nối"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Nhấn để ghép nối với <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Ngôn ngữ"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Ngôn ngữ và phương thức nhập"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Bàn phím"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Quản lý bàn phím"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Đầu ra văn bản sang lời nói"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Công cụ ưu tiên"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Công cụ hiện tại"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Tốc độ nói"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Cao độ"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Đặt lại"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Âm báo"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Âm lượng chuông"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Âm lượng điều hướng"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Phương tiện"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Đặt âm lượng cho nhạc và video"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"Báo thức"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Nhạc chuông điện thoại"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Âm thanh thông báo mặc định"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Âm thanh báo thức mặc định"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Ứng dụng và thông báo"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Hiển thị tất cả các ứng dụng"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Ứng dụng mặc định"</string>
     <string name="applications_settings" msgid="794261395191035632">"Thông tin ứng dụng"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Buộc dừng"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Buộc dừng?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Nếu bạn buộc dừng một ứng dụng, thì ứng dụng đó có thể hoạt động sai."</string>
     <string name="disable_text" msgid="4358165448648990820">"Tắt"</string>
     <string name="enable_text" msgid="1794971777861881238">"Bật"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Gỡ cài đặt"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Nếu bạn tắt ứng dụng này, Android và các ứng dụng khác có thể không còn hoạt động như dự kiến."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Tắt ứng dụng"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Quyền"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Phiên bản: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Chưa được cấp quyền nào"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Không yêu cầu quyền"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Mức sử dụng dữ liệu"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Sử dụng dữ liệu ứng dụng"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Buộc dừng"</string>
     <string name="computing_size" msgid="5791407621793083965">"Đang tính toán…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> quyền bổ sung</item>
       <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> quyền bổ sung</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Trợ lý và nhập bằng giọng nói"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Ứng dụng trợ lý"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Sử dụng văn bản từ màn hình"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Cho phép ứng dụng trợ lý truy cập vào nội dung trên màn hình dưới dạng văn bản"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Sử dụng ảnh chụp màn hình"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Cho phép ứng dụng trợ lý truy cập vào hình ảnh màn hình"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Dịch vụ tự động điền"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Không có"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Đã chọn"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Trợ lý sẽ có thể đọc thông tin về ứng dụng mà bạn đang dùng trên hệ thống, bao gồm cả thông tin hiển thị trên màn hình hoặc thông tin có thể truy cập trong ứng dụng."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Hãy đảm bảo bạn tin tưởng ứng dụng này&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; sử dụng nội dung trên màn hình của bạn để xác định nội dung nào có thể được tự động điền."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Thêm dịch vụ"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Vị trí"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Yêu cầu vị trí gần đây"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Không có yêu cầu vị trí gần đây nào"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Quyền cấp ứng dụng"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Quét"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Dịch vụ vị trí"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Quét Wi‑Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Cho phép ứng dụng và dịch vụ quét tìm mạng Wi‑Fi bất kỳ lúc nào, ngay cả khi Wi-Fi tắt. Chẳng hạn, bạn có thể sử dụng tùy chọn cài đặt này để cải thiện các tính năng và dịch vụ dựa trên vị trí."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Quét Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Cho phép ứng dụng và dịch vụ quét tìm thiết bị lân cận bất kỳ lúc nào, ngay cả khi Bluetooth tắt. Chẳng hạn, bạn có thể sử dụng tùy chọn cài đặt này để cải thiện các tính năng và dịch vụ dựa trên vị trí."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Hệ thống"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Bản cập nhật hệ thống"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Bản cập nhật hệ thống"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Phiên bản Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Mức bản vá bảo mật của Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Kiểu máy"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Phiên bản băng tần cơ sở"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Phiên bản Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Số bản dựng"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Địa chỉ Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Không có"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Trạng thái"</string>
     <string name="device_status" msgid="267298179806290920">"Trạng thái"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"Bản quyền"</string>
     <string name="license_title" msgid="936705938435249965">"Giấy phép"</string>
     <string name="terms_title" msgid="5201471373602628765">"Điều khoản và điều kiện"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Giấy phép WebView hệ thống"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Giấy phép WebView hệ thống"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Hình nền"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Nhà cung cấp ảnh vệ tinh:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Giấy phép của bên thứ ba"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Đã xảy ra sự cố khi tải giấy phép."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Đang tải…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">Bây giờ, bạn chỉ cần thực hiện <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> bước nữa là sẽ trở thành nhà phát triển.</item>
+      <item quantity="one">Bây giờ, bạn chỉ cần thực hiện <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> bước nữa là sẽ trở thành nhà phát triển.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Bạn đã là nhà phát triển!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Không cần, bạn đã là nhà phát triển."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Tùy chọn của nhà phát triển"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Tùy chọn đặt lại"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Đặt lại mạng, ứng dụng hoặc thiết bị"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Đặt lại mạng"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Hành động này sẽ đặt lại tất cả tùy chọn cài đặt mạng, bao gồm:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Dữ liệu di động"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Xóa tất cả eSIM của xe"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Thao tác này sẽ không hủy gói dịch vụ của bạn."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Không thể đặt lại eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Chọn mạng"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Đặt lại cài đặt"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Bạn có muốn đặt lại không?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Bạn có muốn đặt lại tất cả cài đặt mạng không? Bạn không thể hoàn tác hành động này!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Đặt lại cài đặt"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Đã đặt lại cài đặt mạng"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Đặt lại tùy chọn ứng dụng"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Thao tác này sẽ đặt lại tất cả tùy chọn cho:\n\n"<li>"Ứng dụng bị tắt"</li>\n<li>"Thông báo ứng dụng bị tắt"</li>\n<li>"Ứng dụng mặc định cho các thao tác"</li>\n<li>"Giới hạn dữ liệu nền cho ứng dụng"</li>\n<li>"Bất kỳ giới hạn về quyền nào"</li>\n\n"Bạn sẽ không mất bất kỳ dữ liệu ứng dụng nào."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Đặt lại ứng dụng"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Đã đặt lại tùy chọn ứng dụng"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Xóa mọi dữ liệu (khôi phục cài đặt gốc)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Tác vụ này sẽ xóa tất cả dữ liệu trong thiết bị đầu trên phương tiện của bạn, bao gồm:\n\n"<li>"Tài khoản Google của bạn"</li>\n<li>"Dữ liệu cùng với tùy chọn cài đặt của ứng dụng và hệ thống"</li>\n<li>"Ứng dụng đã tải xuống"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Bạn hiện đã đăng nhập vào các tài khoản sau:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Có người dùng khác trên phương tiện này."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Đặt lại phương tiện"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Bạn có muốn đặt lại không?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Xóa tất cả thông tin cá nhân và ứng dụng đã tải xuống của bạn? Bạn không thể hủy thao tác này!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Xóa mọi thứ"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Đang xóa"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Vui lòng chờ..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Ngày và giờ"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Đặt ngày và giờ"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Đặt ngày, giờ, múi giờ và định dạng"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Sắp xếp theo múi giờ"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Ngày"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Thời gian"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Thêm người dùng"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Thêm tài khoản"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Xóa người dùng"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Người dùng mới"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Khách"</string>
     <string name="user_admin" msgid="1535484812908584809">"Quản trị viên"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Đã đăng nhập là quản trị viên"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Tất cả quyền quản trị viên"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Đặt làm quản trị viên"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Người dùng này có thể xóa những người dùng, bao gồm cả các Quản trị viên khác và khôi phục cài đặt gốc hệ thống."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Không thể hoàn tác hành động này."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Có, đặt làm quản trị viên"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Tạo người dùng mới"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Thực hiện cuộc gọi"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Nhắn tin qua dữ liệu di động của ô tô"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Cài đặt ứng dụng mới"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Gỡ cài đặt ứng dụng"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Thêm người dùng"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Người dùng mới"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Thêm người dùng mới?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Khi bạn thêm một người dùng mới, người đó cần thiết lập không gian của họ."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Bất kỳ người dùng nào cũng có thể cập nhật ứng dụng cho tất cả những người dùng khác."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Đã đạt đến giới hạn người dùng"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">Bạn có thể tạo tối đa <xliff:g id="COUNT">%d</xliff:g> người dùng.</item>
+      <item quantity="one">Bạn chỉ có thể tạo một người dùng.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Không thể tạo người dùng mới"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Xóa người dùng này?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Mọi ứng dụng và dữ liệu sẽ bị xóa."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Không xóa được người dùng."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Bỏ qua"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Thử lại"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Xóa người dùng cuối?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Sau khi xóa người dùng còn lại duy nhất của chiếc xe này, người dùng quản trị mới sẽ được tạo."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Tất cả dữ liệu, tùy chọn cài đặt và ứng dụng liên kết với người dùng này sẽ bị xóa. Bạn sẽ cần phải thiết lập lại hệ thống."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Chọn quản trị viên mới"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Bạn cần chọn ít nhất một quản trị viên. Để xóa người này, hãy chọn một người thay thế."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Chọn quản trị viên"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Khách"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Khách"</string>
     <string name="user_switch" msgid="6544839750534690781">"Nút chuyển"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Bạn (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Tên"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Chưa thiết lập"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Chỉnh sửa tên người dùng"</string>
     <string name="users_list_title" msgid="770764290290240909">"Người dùng"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Quyền được cấp cho %1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Tài khoản"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Người dùng"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Thêm tài khoản"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Chưa thêm tài khoản nào"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Tài khoản cho <xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Tự động đồng bộ hóa dữ liệu"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Cho phép ứng dụng tự động làm mới dữ liệu"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Bật tự động đồng bộ hóa dữ liệu?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Mọi thay đổi bạn thực hiện cho các tài khoản của mình trên web sẽ tự động được sao chép sang thiết bị của bạn.\n\nMột số tài khoản cũng có thể tự động sao chép mọi thay đổi bạn thực hiện trên điện thoại lên web. Tài khoản Google hoạt động theo cách này."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Tắt tự động đồng bộ hóa dữ liệu?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Việc này sẽ bảo toàn dữ liệu, tuy nhiên, bạn cần phải đồng bộ hóa từng tài khoản theo cách thủ công để thu thập thông tin gần đây. Đồng thời, bạn sẽ không nhận được thông báo khi quá trình cập nhật diễn ra."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Thông tin tài khoản"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Thêm tài khoản"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Thêm tài khoản"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Xóa tài khoản"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Bạn muốn xóa tài khoản?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Xóa tài khoản này sẽ xóa tất cả thư, danh bạ và dữ liệu khác khỏi thiết bị!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Quản trị viên của bạn không cho phép thực hiện thay đổi này"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Xóa người dùng này?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Mọi ứng dụng và dữ liệu sẽ bị xóa."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Không xóa được người dùng."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Bạn muốn thử lại?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Bỏ qua"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Thử lại"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Thêm người dùng mới?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Khi bạn thêm một người dùng mới, người đó cần thiết lập không gian của họ."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Bất kỳ người dùng nào cũng có thể cập nhật ứng dụng cho tất cả những người dùng khác."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Không xóa được tài khoản."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Đồng bộ hóa tài khoản"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Đã bật đồng bộ hóa cho <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g> mục"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Đã bật đồng bộ hóa cho tất cả các mục"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Đã tắt đồng bộ hóa cho tất cả các mục"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Đồng bộ hóa TẮT"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Lỗi đồng bộ hóa"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Đồng bộ hóa lần gần đây nhất vào <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Đang đồng bộ hóa…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Nhấn để đồng bộ hóa ngay<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Đồng bộ hóa ngay bây giờ"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Hủy đồng bộ hóa"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Tính năng đồng bộ hóa hiện đang gặp sự cố. Tính năng này sẽ sớm hoạt động trở lại."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Bảo mật"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Khóa màn hình"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Không"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"Mã PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Mật khẩu"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Chọn một cách khóa"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Tùy chọn khóa màn hình"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Tùy chọn khóa"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Nhập hình mở khóa của bạn"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Xác nhận"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Vẽ lại"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Đặt khóa màn hình"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Chọn mã PIN của bạn"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Chọn hình mở khóa của bạn"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Chọn mật khẩu của bạn"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Chọn mật khẩu của bạn"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Khóa màn hình hiện tại"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Để bảo mật, hãy đặt hình mở khóa"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Xóa"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Quản trị viên CNTT đã chặn những mật khẩu phổ biến. Hãy thử mật khẩu khác."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Không cho phép thứ tự chữ số tăng dần, giảm dần hoặc lặp lại."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Tùy chọn khóa màn hình"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> ngày trước"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Thêm thiết bị tin cậy"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Thiết bị tin cậy"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> thiết bị</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> thiết bị</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> của bạn sẽ mở khóa ô tô này khi kết nối với ô tô. Nếu người khác cầm <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g> của bạn, họ có thể truy cập vào thiết bị này"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Xác nhận"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Xóa thiết bị tin cậy"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Xong"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Dùng ứng dụng đồng hành để thiết lập thiết bị tin cậy. Sau khi thiết lập xong, bạn sẽ có thể mở khóa hồ sơ người dùng của mình khi xe phát hiện điện thoại của bạn"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Tải ứng dụng đồng hành xuống điện thoại"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Chọn <xliff:g id="CAR_NAME">%1$s</xliff:g> trên điện thoại để ghép nối các thiết bị"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock không thể phát hiện các tính năng bảo mật của thiết bị này. Để giúp bảo vệ ô tô của bạn, thiết bị tin cậy sẽ chỉ có thể giữ ô tô mở khóa sau khi bạn đã mở khóa ô tô này. Thiết bị tin cậy có thể giữ ô tô của bạn mở khóa khi ô tô đang ở gần, kể cả khi người khác đang giữ thiết bị này."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Thêm <xliff:g id="DEVICE_NAME">%1$s</xliff:g> làm thiết bị tin cậy"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"Đã thêm thành công <xliff:g id="DEVICE_NAME">%1$s</xliff:g> làm thiết bị tin cậy"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Không đăng ký được <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Sau khi thêm thiết bị tin cậy, bạn phải đặt một phương thức xác thực. Nếu không mang theo thiết bị tin cậy, bạn sẽ phải sử dụng phương thức xác thực này để truy cập hồ sơ của mình."</string>
     <string name="forget" msgid="3971143908183848527">"Xóa"</string>
+    <string name="connect" msgid="5861699594602380150">"Kết nối"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Ngắt kết nối"</string>
     <string name="delete_button" msgid="5840500432614610850">"Xóa"</string>
     <string name="remove_button" msgid="6664656962868194178">"Xóa"</string>
     <string name="cancel" msgid="750286395700355455">"Hủy"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Thoát chế độ demo"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Thao tác này sẽ xóa tài khoản demo và thiết lập lại dữ liệu ban đầu cho hệ thống. Tất cả dữ liệu người dùng sẽ bị mất."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Thoát chế độ demo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"hoàn tất thiết lập"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"để sau"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"BỎ QUA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Bạn không sử dụng được tính năng này khi đang lái xe."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Không thể thêm người dùng trong khi lái xe."</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a204017..0d20c25 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,89 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"屏幕变暗, 调暗屏幕, 触摸屏, 电池"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"屏幕变暗, 夜间, 色调"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"夜间模式"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"网络和互联网"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"移动网络"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"移动数据"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"通过移动网络访问数据"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"要关闭移动数据网络吗?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"流量消耗"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"数据流量警告和上限"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"应用流量用量周期"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"设置数据流量警告"</string>
+    <string name="data_warning" msgid="116776633806885370">"数据流量警告"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"设置数据流量上限"</string>
+    <string name="data_limit" msgid="227338836292511425">"数据流量上限"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"限制流量用量"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"当移动数据流量的用量达到您设置的上限时,您汽车的音响主机将关闭移动数据网络。\n\n由于流量用量是由音响主机计算的,而您的运营商对流量用量的计算方式可能有所不同,因此建议您设置一个保守的上限值。"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"WLAN"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"设置和管理无线接入点"</string>
     <string name="wifi_starting" msgid="473253087503153167">"正在开启 WLAN…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"正在关闭 WLAN…"</string>
+    <!-- no translation found for loading_wifi_list (8584901433195876465) -->
+    <skip />
+    <string name="wifi_disabled" msgid="5013262438128749950">"已停用 WLAN"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"无法取消保存网络"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"无法连接到网络"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"添加网络"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"已停用 WLAN"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"连接"</string>
     <string name="wifi_password" msgid="5565632142720292397">"密码"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"显示密码"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"网络名称"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"输入 SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"安全性"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"信号强度"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"信号强度"</string>
     <string name="wifi_status" msgid="5688013206066543952">"状态"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"连接速度"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"频率"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP 地址"</string>
+    <string name="show_password" msgid="2074628020371139240">"显示密码"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"输入网络名称"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"输入密码"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"微弱"</item>
-    <item msgid="2032262610626057081">"一般"</item>
-    <item msgid="3859756017461098953">"良好"</item>
-    <item msgid="1521103743353335724">"极佳"</item>
+    <item msgid="7683058295076342057">"微弱"</item>
+    <item msgid="1639222824821660744">"一般"</item>
+    <item msgid="1838705897358163300">"良好"</item>
+    <item msgid="6067166649320533751">"极佳"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"蓝牙"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"开启蓝牙"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"蓝牙"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"已停用蓝牙"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"网络详情"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC 地址"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP 地址"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"子网掩码"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 地址"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"网关"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"WLAN 偏好设置"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"自动开启 WLAN"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"位于已保存的高品质网络(例如您的家庭网络)附近时自动重新开启 WLAN"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"无法使用,因为位置信息服务已关闭。请开启"<annotation id="link">"位置信息服务"</annotation>"。"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"要开启 WLAN 扫描功能吗?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"开启"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"WLAN 扫描功能已开启"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"自动切换到移动数据网络"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"在 WLAN 网络无法连接到互联网时切换到移动数据网络(可能会消耗移动数据流量)。"</string>
+    <string name="learn_more" msgid="8214605928933358604">"了解详情"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"蓝牙"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"管理连接、设置设备名称和可检测性"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"计算机"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"耳机"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"手机"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"成像设备"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"耳机"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"外围输入设备"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"蓝牙"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"已配对的设备"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"可配对的设备"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"没有已配对的设备"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"无可用设备"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"已配对的设备"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"名称"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"用于"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"更改蓝牙设备的名称"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"未命名的设备"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"已配对的设备"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"与新设备配对"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"系统将开启蓝牙以进行配对"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"要断开该设备的连接吗?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"您的车辆将断开与<xliff:g id="DEVICE_NAME">%1$s</xliff:g>的连接。"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"车辆的蓝牙地址:<xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"设备的蓝牙地址:<xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"车辆名称"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"重命名此车辆"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"重命名设备"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"重命名"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"可配对的设备"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"配置文件"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"蓝牙配对请求"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"配对和连接"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"蓝牙"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"蓝牙配对码"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN 码由字母或符号组成"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"输入配对码,然后按回车键"</string>
@@ -90,8 +123,17 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"通常为 0000 或 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"配对请求"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"点按即可与 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 配对。"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"语言"</string>
+    <!-- no translation found for languages_and_input_settings (3672322610529408248) -->
+    <skip />
+    <string name="keyboard_settings" msgid="1959697870618278081">"键盘"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"管理键盘"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"文字转语音 (TTS) 输出"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"首选引擎"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"当前引擎"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"语速"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"音调"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"重置"</string>
     <string name="sound_settings" msgid="3072423952331872246">"提示音"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"铃声音量"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"导航音量"</string>
@@ -100,30 +142,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"媒体"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"设置音乐和视频的音量"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"闹钟"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"手机铃声"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"默认通知提示音"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"默认闹钟提示音"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"应用和通知"</string>
+    <string name="all_applications" msgid="7798210477486822168">"显示所有应用"</string>
+    <string name="default_applications" msgid="1558183275638697087">"默认应用"</string>
     <string name="applications_settings" msgid="794261395191035632">"应用信息"</string>
+    <string name="force_stop" msgid="2153183697014720520">"强行停止"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"要强行停止吗?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"如果您强行停止某个应用,可能会导致该应用无法正常运行。"</string>
     <string name="disable_text" msgid="4358165448648990820">"停用"</string>
     <string name="enable_text" msgid="1794971777861881238">"启用"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"卸载"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"如果您停用此应用,Android 和其他应用可能会无法正常运行。"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"停用应用"</string>
     <string name="permissions_label" msgid="2701446753515612685">"权限"</string>
     <string name="application_version_label" msgid="8556889839783311649">"版本:%1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"未授予任何权限"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"未请求任何权限"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"流量使用情况"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"应用的流量使用情况"</string>
-    <string name="force_stop" msgid="2153183697014720520">"强行停止"</string>
     <string name="computing_size" msgid="5791407621793083965">"正在计算…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">另外 <xliff:g id="COUNT_1">%d</xliff:g> 项权限</item>
       <item quantity="one">另外 <xliff:g id="COUNT_0">%d</xliff:g> 项权限</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"助手和语音输入"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"辅助应用"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"使用屏幕上的文字内容"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"允许辅助应用使用屏幕上的文字内容"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"使用屏幕截图"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"允许辅助应用使用屏幕截图"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"自动填充服务"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"无"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"已选择"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"辅助应用将可读取您系统中使用的应用的相关信息,其中包括您屏幕上显示的信息或应用中可使用的信息。"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;请确认这是您信任的应用&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt;会根据您的屏幕内容判断可自动填充哪些内容。"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"添加服务"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"位置信息"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近的位置信息请求"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近没有任何位置信息请求"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"应用级权限"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"扫描"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"位置信息服务"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"WLAN 扫描"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"允许应用和服务随时扫描 WLAN 网络(即使 WLAN 已关闭)。这可用于改进基于位置的功能和服务。"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"蓝牙扫描"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"允许应用和服务随时扫描附近的设备(即使蓝牙已关闭)。这可用于改进基于位置的功能和服务。"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"系统"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"系统更新"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"系统更新"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 版本"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android 安全补丁程序级别"</string>
     <string name="model_info" msgid="4966408071657934452">"型号"</string>
     <string name="baseband_version" msgid="2370088062235041897">"基带版本"</string>
     <string name="kernel_version" msgid="7327212934187011508">"内核版本"</string>
     <string name="build_number" msgid="3997326631001009102">"版本号"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"蓝牙地址"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"未提供"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"状态"</string>
     <string name="device_status" msgid="267298179806290920">"状态"</string>
@@ -140,12 +217,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"版权"</string>
     <string name="license_title" msgid="936705938435249965">"许可"</string>
     <string name="terms_title" msgid="5201471373602628765">"条款及条件"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"系统 WebView 许可"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"系统 WebView 许可"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"壁纸"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"卫星图像提供商:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"第三方许可"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"加载许可时出现问题。"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"正在加载…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">现在只需再执行 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> 步操作即可进入开发者模式。</item>
+      <item quantity="one">现在只需再执行 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> 步操作即可进入开发者模式。</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"您现在已处于开发者模式!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"您已处于开发者模式,无需进行此操作。"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"开发者选项"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"重置选项"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"重置网络、应用或设备"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"重置网络"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"这将重置所有网络设置,其中包括:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"WLAN"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"移动数据"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"蓝牙"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"清空所有车辆 eSIM"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"此操作不会取消您的服务套餐。"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"无法重置 eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"选择网络"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"重置设置"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"要重置吗?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"要重置所有网络设置吗?此操作无法撤消!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"重置设置"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"网络设置已重置"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"重置应用偏好设置"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"此操作将会重置以下所有偏好设置:\n\n"<li>"已停用的应用"</li>\n<li>"已停用的应用通知"</li>\n<li>"执行操作的默认应用"</li>\n<li>"应用的后台流量限制"</li>\n<li>"任何权限限制"</li>\n\n"您将不会丢失任何应用数据。"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"重置应用"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"已重置应用偏好设置"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"清空所有数据(恢复出厂设置)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"这样做将会清空您车辆音响主机中的所有数据,其中包括:\n\n"<li>"您的 Google 帐号"</li>\n<li>"系统与应用的数据和设置"</li>\n<li>"已下载的应用"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"您目前已登录以下帐号:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"此车辆目前还有其他用户。"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"重置车辆"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"要重置吗?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"要清空您的所有个人信息和下载的应用吗?此操作无法撤消!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"清空所有内容"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"正在清空"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"请稍候…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"日期和时间"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"设置日期和时间"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"设置日期、时间、时区和格式"</string>
@@ -165,23 +279,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"按时区排序"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"日期"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"时间"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"添加用户"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"添加帐号"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"删除用户"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"新用户"</string>
-    <string name="user_guest" msgid="3465399481257448601">"访客"</string>
     <string name="user_admin" msgid="1535484812908584809">"管理员"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"目前登录的是管理员帐号"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"所有管理员权限"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"指定为管理员"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"该用户将可以删除其他用户(包括其他管理员),并将系统恢复出厂设置。"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"此操作无法撤消。"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"是的,指定为管理员"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"创建新用户"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"拨打电话"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"使用汽车的移动数据收发短信"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"安装新应用"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"卸载应用"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"添加用户"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"新用户"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"要添加新用户吗?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"当您添加新用户时,该用户必须设置自己的空间。"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"任何用户均可为所有其他用户更新应用。"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"已达到用户数上限"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">您最多可以创建 <xliff:g id="COUNT">%d</xliff:g> 位用户。</item>
+      <item quantity="one">您只能创建一位用户。</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"无法创建新用户"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"要删除此用户吗?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"所有应用和数据都将随之删除。"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"无法删除用户。"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"关闭"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"重试"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"要删除最后一位用户吗?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"删除这量车唯一的用户后,系统便会创建新的管理员用户。"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"所有与此用户关联的数据、设置以及应用都将随之删除。您将需要重新设置系统。"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"选择新的管理员"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"您至少要有一位管理员。要删除现有的这位管理员,请先选择接替者。"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"选择管理员"</string>
+    <string name="user_guest" msgid="3465399481257448601">"访客"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"访客"</string>
     <string name="user_switch" msgid="6544839750534690781">"开关"</string>
     <string name="current_user_name" msgid="3813671533249316823">"您 (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"名称"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"未设置"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"修改用户名"</string>
     <string name="users_list_title" msgid="770764290290240909">"用户"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"已授予%1$s的权限"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"帐号"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"用户"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"添加帐号"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"未添加任何帐号"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>的帐号"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"自动同步数据"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"让应用自动刷新数据"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"要开启自动同步数据功能吗?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"您在网络上对自己的帐号进行的所有更改都会自动同步到您的设备。\n\n有些帐号还可以自动将您在手机上进行的所有更改同步到网络上。Google 帐号就支持这类双向同步。"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"要关闭自动同步数据功能吗?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"这样可以节省数据流量,但您需要手动同步每个帐号才能获得最新信息,并且在有更新时不会收到通知。"</string>
     <string name="account_details_title" msgid="7529571432258448573">"帐号信息"</string>
     <string name="add_account_title" msgid="5988746086885210040">"添加帐号"</string>
     <string name="add_an_account" msgid="1072285034300995091">"添加帐号"</string>
@@ -189,16 +339,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"移除帐号"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"要移除帐号吗?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"移除该帐号后,设备上的相关消息、联系人和其他数据也将全部删除!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"您的管理员不允许进行这项更改"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"要移除此用户吗?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"该用户名下的所有应用和数据都将随之删除。"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"无法移除用户。"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"要重试吗?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"关闭"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"重试"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"要添加新用户吗?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"当您添加新用户时,该用户必须设置自己的空间。"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"任何用户均可为所有其他用户更新应用。"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"无法移除帐号。"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"帐号同步"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"已开启 <xliff:g id="ID_1">%1$d</xliff:g> 项(共 <xliff:g id="ID_2">%2$d</xliff:g> 项)的同步功能"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"已开启所有项的同步功能"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"已关闭所有项的同步功能"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"已关闭同步功能"</string>
+    <string name="sync_error" msgid="6698021343089247914">"同步错误"</string>
+    <string name="last_synced" msgid="4745124489150101529">"上次同步时间:<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"目前正在同步…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"点按即可立即同步(<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"立即同步"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"取消同步"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"同步目前发生问题,将很快恢复正常。"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"安全"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"屏幕锁定"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"无"</string>
@@ -206,7 +360,8 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN 码"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"密码"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"选择一种锁定类型"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"屏幕锁定选项"</string>
+    <!-- no translation found for screen_lock_options (8531177937577168185) -->
+    <skip />
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"绘制您的图案"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"确认"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"重新绘制"</string>
@@ -216,7 +371,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"设置屏幕锁定"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"选择 PIN 码"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"选择您的图案"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"选择密码"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"选择您的密码"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"当前屏幕锁定设置"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"为了安全起见,请设置解锁图案"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"清除"</string>
@@ -288,7 +443,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"常用密码已被您的 IT 管理员屏蔽。请尝试一个不同的密码。"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"不允许使用以升序、降序或重复序列进行排列的一串数字。"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"屏幕锁定选项"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>:<xliff:g id="NUM_DAYS">%3$s</xliff:g> 天前"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"添加可信设备"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"可信设备"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 台设备</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 台设备</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"您的 <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> 会在连接到这辆车后将其解锁。如果有人拿到您的 <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>,对方也许能够访问此设备"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"确认"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"移除可信设备"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"完成"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"请使用配套应用来设置可信设备。设置成功后,您将可以在车辆检测到您的手机时解锁您的用户个人资料"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1.在手机上下载配套应用"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2.在手机上选择“<xliff:g id="CAR_NAME">%1$s</xliff:g>”以与相应设备配对"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock 未能检测到此设备的安全功能。为了保护您的汽车,只有当您将汽车解锁后,可信设备才会让汽车保持解锁状态。当您的可信设备在汽车附近时,就会让汽车保持解锁状态(即使是其他人拿着此设备也是如此)。"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"将 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 添加为可信设备"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> 已成功添加为可信设备"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> 注册失败"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"添加可信设备后,接下来您必须设置身份验证方法。如果您没有随身携带可信设备,则必须进行身份验证才能访问自己的个人资料。"</string>
     <string name="forget" msgid="3971143908183848527">"忽略"</string>
+    <string name="connect" msgid="5861699594602380150">"连接"</string>
+    <string name="disconnect" msgid="6140789953324820336">"断开连接"</string>
     <string name="delete_button" msgid="5840500432614610850">"删除"</string>
     <string name="remove_button" msgid="6664656962868194178">"移除"</string>
     <string name="cancel" msgid="750286395700355455">"取消"</string>
@@ -298,8 +474,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"退出演示模式"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"这项操作会删除演示帐号并将系统恢复出厂设置,且所有用户数据都会丢失。"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"退出演示模式"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"完成设置"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"以后再说"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"关闭"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"无法在驾驶时使用此功能。"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"驾车时无法添加用户。"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 8564a04..707b6b6 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -1,97 +1,137 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="settings_label" msgid="5147911978211079839">"設定"</string>
     <string name="more_settings_label" msgid="3867559443480110616">"更多"</string>
-    <string name="display_settings" msgid="5325515247739279185">"螢幕"</string>
+    <string name="display_settings" msgid="5325515247739279185">"顯示"</string>
     <string name="brightness" msgid="2919605130898772866">"亮度"</string>
-    <string name="auto_brightness_title" msgid="9124647862844666581">"自動調整亮度"</string>
-    <string name="auto_brightness_summary" msgid="4741887033140384352">"根據環境光源調整亮度"</string>
-    <string name="condition_night_display_title" msgid="3777509730126972675">"夜燈模式已開啟"</string>
+    <string name="auto_brightness_title" msgid="9124647862844666581">"自動調校光暗"</string>
+    <string name="auto_brightness_summary" msgid="4741887033140384352">"按環境光線優化亮度"</string>
+    <string name="condition_night_display_title" msgid="3777509730126972675">"已開啟「夜燈模式」"</string>
     <string name="keywords_display" msgid="3978416985146943922">"螢幕, 觸控螢幕"</string>
-    <string name="keywords_display_brightness_level" msgid="3956411572536209195">"調暗螢幕, 觸控螢幕, 電池"</string>
-    <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"調暗螢幕, 觸控螢幕, 電池"</string>
-    <string name="keywords_display_night_display" msgid="2922294576679769957">"調暗螢幕, 夜間, 色調"</string>
+    <string name="keywords_display_brightness_level" msgid="3956411572536209195">"螢幕變暗, 觸控螢幕, 電池"</string>
+    <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"螢幕變暗, 觸控螢幕, 電池"</string>
+    <string name="keywords_display_night_display" msgid="2922294576679769957">"螢幕變暗, 夜間, 轉色"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"夜間模式"</string>
-    <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"設定、管理無線網路存取點"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"網絡和互聯網"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"流動網絡"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"流動數據"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"使用流動網絡存取數據"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"要關閉流動數據嗎?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"數據用量"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"數據用量警告和上限"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"應用程式數據用量週期"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"設定數據用量警告"</string>
+    <string name="data_warning" msgid="116776633806885370">"數據用量警告"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"設定數據上限"</string>
+    <string name="data_limit" msgid="227338836292511425">"數據上限"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"正在限制數據用量"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"汽車音響主機在數據用量到達設定的上限後,便會關閉流動數據。\n\n由於數據用量由汽車音響主機計算,而流動網絡供應商的用量計算方式可能不同,因此建議您設定較保守的上限。"</string>
+    <string name="wifi_settings" msgid="7701477685273103841">"Wi-Fi"</string>
     <string name="wifi_starting" msgid="473253087503153167">"正在開啟 Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"正在關閉 Wi-Fi…"</string>
-    <string name="wifi_failed_forget_message" msgid="121732682699377206">"無法清除網路設定"</string>
-    <string name="wifi_failed_connect_message" msgid="4447498225022147324">"無法連上網路"</string>
-    <string name="wifi_setup_add_network" msgid="3660498520389954620">"新增網路"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"正在載入 Wi‑Fi 清單"</string>
     <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi 已停用"</string>
+    <string name="wifi_failed_forget_message" msgid="121732682699377206">"無法刪除網絡"</string>
+    <string name="wifi_failed_connect_message" msgid="4447498225022147324">"無法連接網絡"</string>
+    <string name="wifi_setup_add_network" msgid="3660498520389954620">"新增網絡"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"連線"</string>
     <string name="wifi_password" msgid="5565632142720292397">"密碼"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"顯示密碼"</string>
-    <string name="wifi_ssid" msgid="488604828159458741">"網路名稱"</string>
+    <string name="wifi_ssid" msgid="488604828159458741">"網絡名稱"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"請輸入 SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"安全性"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"訊號強度"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"訊號強度"</string>
     <string name="wifi_status" msgid="5688013206066543952">"狀態"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"連線速度"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"頻率"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP 位址"</string>
+    <string name="show_password" msgid="2074628020371139240">"顯示密碼"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"輸入網絡名稱"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"輸入密碼"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
-    <item msgid="4897376984576812606">"差"</item>
-    <item msgid="2032262610626057081">"一般"</item>
-    <item msgid="3859756017461098953">"良好"</item>
-    <item msgid="1521103743353335724">"極佳"</item>
+    <item msgid="4897376984576812606">"弱"</item>
+    <item msgid="7683058295076342057">"弱"</item>
+    <item msgid="1639222824821660744">"尚可"</item>
+    <item msgid="1838705897358163300">"強"</item>
+    <item msgid="6067166649320533751">"非常強"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"藍牙"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"開啟藍牙"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"藍牙"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"藍牙已停用"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"網絡詳細資料"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC 位址"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP 位址"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"子網絡遮罩"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"網域名稱系統 (DNS)"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 位址"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"閘道"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi 偏好設定"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"自動開啟 Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"附近有已儲存的高品質網絡 (例如住宅網絡) 時再開啟 Wi-Fi"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"由於位置資訊功能已關閉,因此無法使用。請開啟"<annotation id="link">"位置資訊"</annotation>"。"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"要開啟 Wi-Fi 掃瞄功能嗎?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"開啟"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"已開啟 Wi‑Fi 掃瞄功能"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"自動切換至流動數據網絡"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"當 Wi‑Fi 無法連線至互聯網時,切換至流動數據網絡 (可能需要支付數據用量費用)。"</string>
+    <string name="learn_more" msgid="8214605928933358604">"瞭解詳情"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"藍牙"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"管理連線,設定裝置名稱和可偵測性"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"電腦"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"耳機"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"手機"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"顯像裝置"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"耳機"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"周邊輸入裝置"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"藍牙"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"配對裝置"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"可用的裝置"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"沒有任何配對裝置"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"沒有可用的裝置"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"配對裝置"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"名稱"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"用於"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"變更藍牙裝置的名稱"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"未命名的裝置"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"已配對的裝置"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"配對新裝置"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"系統將開啟藍牙以配對裝置"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"要解除連結裝置嗎?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"您的汽車將會與「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」取消連結。"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"汽車的藍牙位址:<xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"裝置的藍牙位址:<xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"汽車名稱"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"重新命名汽車"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"重新命名裝置"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"重新命名"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"可用的裝置"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"設定檔"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"藍牙配對要求"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"配對並連線"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"藍牙"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"藍牙配對碼"</string>
-    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN 碼含有字母或符號"</string>
-    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"輸入配對碼,然後按下返回鍵或 Enter 鍵"</string>
+    <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN 中含有字母或符號"</string>
+    <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"輸入配對碼,然後按 [返回] 或 Enter 鍵"</string>
     <string name="bluetooth_pairing_request" msgid="4769675459526556801">"要與「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」配對嗎?"</string>
-    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」存取你的聯絡人和通話記錄"</string>
-    <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"你可能也必須在另一個裝置上輸入這組 PIN 碼。"</string>
-    <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"你可能也必須在另一個裝置上輸入這個密碼金鑰。"</string>
-    <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"必須是 16 位數的數字"</string>
-    <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"通常為 0000 或 1234"</string>
+    <string name="bluetooth_pairing_shares_phonebook" msgid="2015966932886300630">"允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」存取您的聯絡人和通話記錄"</string>
+    <string name="bluetooth_enter_pin_other_device" msgid="7825091249522704764">"您可能需要在另一部裝置上輸入這個 PIN。"</string>
+    <string name="bluetooth_enter_passkey_other_device" msgid="7147248221018865922">"您可能需要在另一部裝置上輸入這個密鑰。"</string>
+    <string name="bluetooth_pin_values_hint_16_digits" msgid="418776900816984778">"必需為 16 位數字"</string>
+    <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"一般是 0000 或 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"配對要求"</string>
-    <string name="bluetooth_notif_message" msgid="1060821000510108726">"輕觸即可與「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」配對。"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
+    <string name="bluetooth_notif_message" msgid="1060821000510108726">"輕按即可與「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」配對。"</string>
     <string name="language_settings" msgid="2079258598337245546">"語言"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"語言及輸入"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"鍵盤"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"管理鍵盤"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"文字轉語音輸出"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"偏好的引擎"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"目前選用的引擎"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"語速"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"音調"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"重設"</string>
     <string name="sound_settings" msgid="3072423952331872246">"音效"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"鈴聲音量"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"導航音量"</string>
@@ -100,195 +140,328 @@
     <string name="media_volume_title" msgid="6697416686272606865">"媒體"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"設定音樂和影片的音量"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"鬧鐘"</string>
-    <string name="applications_settings" msgid="794261395191035632">"應用程式資訊"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"手機鈴聲"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"預設通知音效"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"預設鬧鐘音效"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"應用程式及通知"</string>
+    <string name="all_applications" msgid="7798210477486822168">"顯示所有應用程式"</string>
+    <string name="default_applications" msgid="1558183275638697087">"預設應用程式"</string>
+    <string name="applications_settings" msgid="794261395191035632">"應用程式資料"</string>
+    <string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"要強制停止應用程式嗎?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"如果您強制停止應用程式,應用程式可能無法正常操作。"</string>
     <string name="disable_text" msgid="4358165448648990820">"停用"</string>
     <string name="enable_text" msgid="1794971777861881238">"啟用"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"解除安裝"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"如果您停用此應用程式,Android 和其他應用程式可能無法正常運作。"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"停用應用程式"</string>
     <string name="permissions_label" msgid="2701446753515612685">"權限"</string>
     <string name="application_version_label" msgid="8556889839783311649">"版本:%1$s"</string>
-    <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"未取得任何授權"</string>
-    <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"未要求任何權限"</string>
+    <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"沒有授予權限"</string>
+    <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"沒有要求權限"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"數據用量"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"應用程式數據用量"</string>
-    <string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
-    <string name="computing_size" msgid="5791407621793083965">"計算中…"</string>
+    <string name="computing_size" msgid="5791407621793083965">"正在計算…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
-      <item quantity="other">還有其他 <xliff:g id="COUNT_1">%d</xliff:g> 項權限</item>
-      <item quantity="one">還有其他 <xliff:g id="COUNT_0">%d</xliff:g> 項權限</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 個其他權限</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 個其他權限</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"輔助及語音輸入"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"小幫手應用程式"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"使用螢幕上的文字"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"允許小幫手應用程式存取螢幕的文字內容"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"使用螢幕擷圖畫面"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"允許小幫手應用程式存取螢幕上的圖片"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"自動填入服務"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"無"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"已選取"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"這個小幫手將能讀取系統目前使用的應用程式資料,包括螢幕顯示的資料或可在應用程式中存取的資料。"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;請確定您信任此應用程式&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; 應用程式會根據您畫面上的內容判斷可自動填入的資料。"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"新增服務"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"位置"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近的位置資訊要求"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近沒有位置資訊要求"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"應用程式層級權限"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"掃瞄"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"定位服務"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi 掃瞄"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"允許應用程式和服務隨時掃瞄 Wi-Fi 網絡 (即使 Wi-Fi 已關閉)。此操作可用來改善適地性功能和服務。"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"藍牙掃瞄"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"允許應用程式和服務隨時掃瞄附近的裝置 (即使藍牙功能已關閉)。此操作可用來改善適地性功能和服務。"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"系統"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"系統更新"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"系統更新"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 版本"</string>
-    <string name="security_patch" msgid="4794276590178386903">"Android 安全性修補程式等級"</string>
+    <string name="security_patch" msgid="4794276590178386903">"Android 安全性修補程式級別"</string>
     <string name="model_info" msgid="4966408071657934452">"型號"</string>
     <string name="baseband_version" msgid="2370088062235041897">"基頻版本"</string>
     <string name="kernel_version" msgid="7327212934187011508">"核心版本"</string>
     <string name="build_number" msgid="3997326631001009102">"版本號碼"</string>
-    <string name="device_info_not_available" msgid="2095601973977376655">"無法取得"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"藍牙位址"</string>
+    <string name="device_info_not_available" msgid="2095601973977376655">"未有資料"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"狀態"</string>
     <string name="device_status" msgid="267298179806290920">"狀態"</string>
-    <string name="device_status_summary" product="tablet" msgid="600543254608862075">"電池、網路狀態及其他資訊"</string>
+    <string name="device_status_summary" product="tablet" msgid="600543254608862075">"電池狀態、網絡及其他資訊"</string>
     <string name="device_status_summary" product="default" msgid="9130360324418117815">"電話號碼、訊號等。"</string>
     <string name="about_settings" msgid="4329457966672592345">"關於"</string>
     <string name="about_summary" msgid="5374623866267691206">"Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
-    <string name="about_settings_summary" msgid="7975072809083281401">"查看法律資訊、狀態、軟體版本"</string>
+    <string name="about_settings_summary" msgid="7975072809083281401">"查看法律資訊、狀態、軟件版本"</string>
     <string name="legal_information" msgid="1838443759229784762">"法律資訊"</string>
     <string name="contributors_title" msgid="7698463793409916113">"貢獻者"</string>
     <string name="manual" msgid="4819839169843240804">"手動"</string>
-    <string name="regulatory_labels" msgid="3165587388499646779">"法規標籤"</string>
-    <string name="safety_and_regulatory_info" msgid="1204127697132067734">"安全性和法規手冊"</string>
+    <string name="regulatory_labels" msgid="3165587388499646779">"監管標籤"</string>
+    <string name="safety_and_regulatory_info" msgid="1204127697132067734">"安全及監管手冊"</string>
     <string name="copyright_title" msgid="4220237202917417876">"版權"</string>
     <string name="license_title" msgid="936705938435249965">"授權"</string>
     <string name="terms_title" msgid="5201471373602628765">"條款及細則"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"系統 WebView 授權"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"系統 WebView 授權"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"桌布"</string>
-    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"衛星影像提供者:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
+    <string name="wallpaper_attributions_values" msgid="4292446851583307603">"衛星影像供應商:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"第三方授權"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"載入授權時發生問題。"</string>
-    <string name="settings_license_activity_loading" msgid="6163263123009681841">"載入中…"</string>
+    <string name="settings_license_activity_loading" msgid="6163263123009681841">"正在載入…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">您只需完成剩餘的 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> 個步驟,即可成為開發人員。</item>
+      <item quantity="one">您只需完成剩餘的 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> 個步驟,即可成為開發人員。</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"您現已成為開發人員!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"不需要了,您已經是開發人員。"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"開發人員選項"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"重設選項"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"網絡、應用程式或裝置重設"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"重設網絡"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"這項操作將會重設所有網絡設定,包括:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"流動數據"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"藍牙"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"清除所有汽車 eSIM 卡"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"此操作不會取消您的服務計劃。"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"無法重設 eSIM 卡"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"選擇網絡"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"重設設定"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"要重設嗎?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"您要重設所有網絡設定嗎?您將無法復原這項操作!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"重設設定"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"網絡設定已重設"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"重設應用程式偏好設定"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"此操作將會重設下列所有偏好設定:\n\n"<li>"已停用的應用程式"</li>\n<li>"已停用的應用程式通知"</li>\n<li>"執行操作的預設應用程式"</li>\n<li>"應用程式的背景數據限制"</li>\n<li>"任何權限限制"</li>\n\n"您將不會失去任何應用程式資料。"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"重設應用程式"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"已重設應用程式偏好設定"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"清除所有資料 (回復原廠設定)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"此操作將清除汽車音響主機的所有資料,包括:\n\n"<li>"您的 Google 帳戶"</li>\n<li>"系統和應用程式資料及設定"</li>\n<li>"已下載的應用程式"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"您目前已登入以下帳戶:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"此汽車上還有其他使用者。"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"重設汽車"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"要重設嗎?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"您要清除所有個人資訊和已下載的應用程式嗎?您無法復原這項操作!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"全部清除"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"正在清除"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"請稍候…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"日期和時間"</string>
-    <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"設定日期和時間"</string>
-    <string name="date_and_time_settings_summary" msgid="7669856855390804666">"設定日期、時間、時區及時間格式"</string>
-    <string name="date_time_auto" msgid="3570339569471779767">"自動判斷日期和時間"</string>
-    <string name="date_time_auto_summary" msgid="3311706425095342759">"使用網路提供的時間"</string>
-    <string name="zone_auto" msgid="3701878581920206160">"自動判定時區"</string>
-    <string name="zone_auto_summary" msgid="4345856882906981864">"使用網路提供的時區"</string>
+    <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"設定日期及時間"</string>
+    <string name="date_and_time_settings_summary" msgid="7669856855390804666">"設定日期、時間、時區和格式"</string>
+    <string name="date_time_auto" msgid="3570339569471779767">"自動設定日期和時間"</string>
+    <string name="date_time_auto_summary" msgid="3311706425095342759">"使用網絡提供的時間"</string>
+    <string name="zone_auto" msgid="3701878581920206160">"自動設定時區"</string>
+    <string name="zone_auto_summary" msgid="4345856882906981864">"使用網絡提供的時區"</string>
     <string name="date_time_24hour_title" msgid="3025576547136168692">"24 小時制"</string>
-    <string name="date_time_24hour" msgid="1137618702556486913">"使用 24 小時格式"</string>
+    <string name="date_time_24hour" msgid="1137618702556486913">"使用 24 小時制"</string>
     <string name="date_time_set_time_title" msgid="5884883050656937853">"時間"</string>
     <string name="date_time_set_time" msgid="6449555153906058248">"設定時間"</string>
     <string name="date_time_set_timezone_title" msgid="3001779256157093425">"時區"</string>
     <string name="date_time_set_timezone" msgid="4759353576185916944">"選取時區"</string>
     <string name="date_time_set_date_title" msgid="6834785820357051138">"日期"</string>
     <string name="date_time_set_date" msgid="2537494485643283230">"設定日期"</string>
-    <string name="zone_list_menu_sort_alphabetically" msgid="7041628618528523514">"依照字母排序"</string>
-    <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"依照時區排序"</string>
+    <string name="zone_list_menu_sort_alphabetically" msgid="7041628618528523514">"按英文字母排序"</string>
+    <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"按時區排序"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"日期"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"時間"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"新增使用者"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"新增帳戶"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"刪除使用者"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"新使用者"</string>
-    <string name="user_guest" msgid="3465399481257448601">"訪客"</string>
     <string name="user_admin" msgid="1535484812908584809">"管理員"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"已使用管理員身分登入"</string>
-    <string name="user_switch" msgid="6544839750534690781">"切換"</string>
-    <string name="current_user_name" msgid="3813671533249316823">"你 (%1$s)"</string>
-    <string name="user_name_label" msgid="3210832645046206845">"名稱"</string>
-    <string name="user_summary_not_set_up" msgid="1473688119241224145">"尚未設定"</string>
-    <string name="edit_user_name_title" msgid="6890782937520262478">"編輯使用者名稱"</string>
-    <string name="users_list_title" msgid="770764290290240909">"使用者"</string>
-    <string name="accounts_settings_title" msgid="436190037084293471">"帳戶"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"使用者"</string>
-    <string name="no_accounts_added" msgid="5148163140691096055">"未新增任何帳戶"</string>
-    <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> 的帳戶"</string>
-    <string name="account_details_title" msgid="7529571432258448573">"帳戶資訊"</string>
-    <string name="add_account_title" msgid="5988746086885210040">"新增帳戶"</string>
-    <string name="add_an_account" msgid="1072285034300995091">"新增帳戶"</string>
-    <string name="user_cannot_add_accounts_message" msgid="6775605884544906797">"設有限制的個人資料無法新增帳戶"</string>
-    <string name="remove_account_title" msgid="8840386525787836381">"移除帳戶"</string>
-    <string name="really_remove_account_title" msgid="3555164432587924900">"要移除帳戶嗎?"</string>
-    <string name="really_remove_account_message" msgid="4296769280849579900">"移除帳戶後,裝置上所有的訊息、聯絡人和其他資料將全部遭到刪除!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"你的管理員不允許這項變更"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"要移除這位使用者嗎?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"所有應用程式和資料都會遭到刪除。"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"無法移除使用者。"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"要再試一次嗎?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"關閉"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"重試"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"所有管理員權限"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"指定為管理員"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"此使用者可刪除使用者 (包括其他管理員),並可將系統回復原廠設定。"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"此操作將無法復原。"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"是,指定為管理員"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"建立新使用者"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"撥打電話"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"使用汽車的流動數據傳送訊息"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"安裝新的應用程式"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"解除安裝應用程式"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"新增使用者"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"新使用者"</string>
     <string name="user_add_user_title" msgid="7458813670614932479">"要新增使用者嗎?"</string>
     <string name="user_add_user_message_setup" msgid="6030901156040053106">"新增的使用者需要自行設定個人空間。"</string>
     <string name="user_add_user_message_update" msgid="1528170913388932459">"任何使用者都可以為所有其他使用者更新應用程式。"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"已達到使用者上限"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">您可以建立最多 <xliff:g id="COUNT">%d</xliff:g> 位使用者。</item>
+      <item quantity="one">只可建立一位使用者。</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"無法建立新使用者"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"要刪除這名使用者嗎?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"所有應用程式和資料都會被刪除。"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"無法刪除使用者。"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"關閉"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"重試"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"要刪除最後一名使用者嗎?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"在刪除此汽車最後一名使用者後,將建立一名新的管理員。"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"系統將刪除與此使用者相關的所有資料、設定和應用程式。您將需要重新設定系統。"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"選擇新的管理員"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"您需要最少一名管理員。如要刪除這名管理員,請先選擇替代的管理員。"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"選擇管理員"</string>
+    <string name="user_guest" msgid="3465399481257448601">"訪客"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"訪客"</string>
+    <string name="user_switch" msgid="6544839750534690781">"切換"</string>
+    <string name="current_user_name" msgid="3813671533249316823">"您 (%1$s)"</string>
+    <string name="user_name_label" msgid="3210832645046206845">"名稱"</string>
+    <string name="user_summary_not_set_up" msgid="1473688119241224145">"未設定"</string>
+    <string name="edit_user_name_title" msgid="6890782937520262478">"編輯使用者名稱"</string>
+    <string name="users_list_title" msgid="770764290290240909">"使用者"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"已向 %1$s 授予的權限"</string>
+    <string name="accounts_settings_title" msgid="436190037084293471">"帳戶"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"新增帳戶"</string>
+    <string name="no_accounts_added" msgid="5148163140691096055">"未新增任何帳戶"</string>
+    <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>的帳戶"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"自動同步處理資料"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"允許應用程式自動重新整理資料"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"要開啟資料自動同步功能嗎?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"您在網上對帳戶作出的任何更改都會自動複製到您的裝置。\n\n部分帳戶也可能自動將您在手機上作出的任何更改複製到網上。Google 帳戶會按照此方式運作。"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"要關閉資料自動同步功能嗎?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"這樣可以節省數據用量,但您需要手動同步每個帳戶才能獲得最新資料,而且在有更新時不會收到通知。"</string>
+    <string name="account_details_title" msgid="7529571432258448573">"帳戶資料"</string>
+    <string name="add_account_title" msgid="5988746086885210040">"新增帳戶"</string>
+    <string name="add_an_account" msgid="1072285034300995091">"新增帳戶"</string>
+    <string name="user_cannot_add_accounts_message" msgid="6775605884544906797">"受限設定檔無法新增帳戶"</string>
+    <string name="remove_account_title" msgid="8840386525787836381">"移除帳戶"</string>
+    <string name="really_remove_account_title" msgid="3555164432587924900">"要移除帳戶嗎?"</string>
+    <string name="really_remove_account_message" msgid="4296769280849579900">"移除此帳戶後,裝置上的訊息、聯絡人和其他資料將全部刪除!"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"無法移除帳戶。"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"帳戶同步"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"<xliff:g id="ID_1">%1$d</xliff:g> 個項目 (共 <xliff:g id="ID_2">%2$d</xliff:g> 個) 的同步功能已開啟"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"所有項目的同步功能已開啟"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"所有項目的同步功能已關閉"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"同步處理功能已關閉"</string>
+    <string name="sync_error" msgid="6698021343089247914">"同步處理錯誤"</string>
+    <string name="last_synced" msgid="4745124489150101529">"上次同步時間:<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"目前正在同步…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"輕按即可同步 (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"立即同步"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"取消同步處理"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"同步處理目前發生問題,將於短時間內恢復。"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"安全性"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"螢幕鎖定"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"無"</string>
-    <string name="security_lock_pattern" msgid="1174352995619563104">"圖案"</string>
+    <string name="security_lock_pattern" msgid="1174352995619563104">"鎖定圖案"</string>
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"密碼"</string>
-    <string name="lock_settings_picker_title" msgid="6590330165050361632">"選擇鎖定類型"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"螢幕鎖定選項"</string>
+    <string name="lock_settings_picker_title" msgid="6590330165050361632">"請選擇上鎖方式"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"上鎖選項"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"畫出您的圖案"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"確認"</string>
-    <string name="lockpattern_restart_button_text" msgid="9355771277617537">"重畫"</string>
+    <string name="lockpattern_restart_button_text" msgid="9355771277617537">"再畫一次"</string>
     <string name="continue_button_text" msgid="5129979170426836641">"繼續"</string>
     <string name="lockscreen_retry_button_text" msgid="5314212350698701242">"重試"</string>
     <string name="lockscreen_skip_button_text" msgid="3755748786396198091">"略過"</string>
     <string name="set_screen_lock" msgid="5239317292691332780">"設定螢幕鎖定"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"選擇 PIN"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"選擇圖案"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"選擇密碼"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"選擇密碼"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"目前的螢幕鎖定方式"</string>
-    <string name="choose_lock_pattern_message" msgid="6242765203541309524">"為了安全起見,請設定圖案"</string>
+    <string name="choose_lock_pattern_message" msgid="6242765203541309524">"為安全起見,請設定鎖定圖案"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"清除"</string>
     <string name="lockpattern_cancel_button_text" msgid="4068764595622381766">"取消"</string>
-    <string name="lockpattern_pattern_confirmed" msgid="5984306638250515385">"你的新解鎖圖案"</string>
+    <string name="lockpattern_pattern_confirmed" msgid="5984306638250515385">"新解鎖圖案"</string>
     <string name="lockpattern_recording_intro_header" msgid="7864149726033694408">"畫出解鎖圖案"</string>
-    <string name="lockpattern_recording_inprogress" msgid="1575019990484725964">"完成時請移開手指"</string>
+    <string name="lockpattern_recording_inprogress" msgid="1575019990484725964">"完成後請移開手指"</string>
     <string name="lockpattern_pattern_entered" msgid="6103071005285320575">"已記錄圖案"</string>
-    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"請再畫一次,以確認圖案無誤"</string>
-    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"圖案至少需連接 4 點,請再試一次。"</string>
+    <string name="lockpattern_need_to_confirm" msgid="4648070076022940382">"請再次畫出圖案以確認"</string>
+    <string name="lockpattern_recording_incorrect_too_short" msgid="2417932185815083082">"圖案至少要連接 4 點,請再試一次。"</string>
     <string name="lockpattern_pattern_wrong" msgid="929223969555399363">"圖案錯誤"</string>
     <string name="lockpattern_settings_help_how_to_record" msgid="4436556875843192284">"如何畫出解鎖圖案"</string>
-    <string name="error_saving_lockpattern" msgid="2933512812768570130">"儲存圖案時發生錯誤"</string>
+    <string name="error_saving_lockpattern" msgid="2933512812768570130">"儲存鎖定圖案時發生錯誤"</string>
     <string name="okay" msgid="4589873324439764349">"確定"</string>
     <string name="remove_screen_lock_title" msgid="1234382338764193387">"要移除螢幕鎖定嗎?"</string>
     <string name="remove_screen_lock_message" msgid="6675850371585564965">"這樣,任何人都能存取您的帳戶"</string>
     <string name="lock_settings_enter_pin" msgid="1669172111244633904">"請輸入 PIN"</string>
     <string name="lock_settings_enter_password" msgid="2636669926649496367">"請輸入密碼"</string>
-    <string name="choose_lock_pin_message" msgid="2963792070267774417">"為了安全起見,請設定 PIN 碼"</string>
-    <string name="confirm_your_pin_header" msgid="9096581288537156102">"請重新輸入 PIN 碼"</string>
-    <string name="choose_lock_pin_hints" msgid="7362906249992020844">"PIN 碼至少要有 4 個數字"</string>
+    <string name="choose_lock_pin_message" msgid="2963792070267774417">"為安全起見,請設定 PIN"</string>
+    <string name="confirm_your_pin_header" msgid="9096581288537156102">"請重新輸入 PIN"</string>
+    <string name="choose_lock_pin_hints" msgid="7362906249992020844">"PIN 必需有至少 4 個數字"</string>
     <string name="lockpin_invalid_pin" msgid="2149191577096327424">"PIN 無效,必須至少有 4 位數字。"</string>
-    <string name="confirm_pins_dont_match" msgid="4607110139373520720">"PIN 碼不符"</string>
-    <string name="error_saving_lockpin" msgid="9011960139736000393">"儲存 PIN 碼時發生錯誤"</string>
+    <string name="confirm_pins_dont_match" msgid="4607110139373520720">"PIN 不符"</string>
+    <string name="error_saving_lockpin" msgid="9011960139736000393">"儲存 PIN 時發生錯誤"</string>
     <string name="lockscreen_wrong_pin" msgid="4922465731473805306">"PIN 錯誤"</string>
     <string name="lockscreen_wrong_password" msgid="5757087577162231825">"密碼錯誤"</string>
-    <string name="choose_lock_password_message" msgid="6124341145027370784">"為了安全起見,請設定密碼"</string>
+    <string name="choose_lock_password_message" msgid="6124341145027370784">"為安全起見,請設定密碼"</string>
     <string name="confirm_your_password_header" msgid="7052891840366724938">"請重新輸入密碼"</string>
     <string name="confirm_passwords_dont_match" msgid="7300229965206501753">"密碼不符"</string>
     <string name="lockpassword_clear_label" msgid="6363680971025188064">"清除"</string>
     <string name="lockpassword_cancel_label" msgid="5791237697404166450">"取消"</string>
     <string name="lockpassword_confirm_label" msgid="5918463281546146953">"確認"</string>
     <string name="choose_lock_password_hints" msgid="3903696950202491593">"必須包含至少 4 個字元"</string>
-    <string name="lockpassword_password_too_short" msgid="6681218025001328405">"至少要有 <xliff:g id="COUNT">%d</xliff:g> 個字元"</string>
-    <string name="lockpassword_pin_too_short" msgid="6363004004424904218">"PIN 碼至少要有 <xliff:g id="COUNT">%d</xliff:g> 個數字"</string>
-    <string name="lockpassword_password_too_long" msgid="7530214940279491291">"長度必須少於 <xliff:g id="NUMBER">%d</xliff:g> 個字元"</string>
-    <string name="lockpassword_pin_too_long" msgid="62957683396974404">"長度必須少於 <xliff:g id="NUMBER">%d</xliff:g> 個數字"</string>
+    <string name="lockpassword_password_too_short" msgid="6681218025001328405">"必需有至少 <xliff:g id="COUNT">%d</xliff:g> 個字元"</string>
+    <string name="lockpassword_pin_too_short" msgid="6363004004424904218">"PIN 必需有至少 <xliff:g id="COUNT">%d</xliff:g> 個數字"</string>
+    <string name="lockpassword_password_too_long" msgid="7530214940279491291">"必需少於 <xliff:g id="NUMBER">%d</xliff:g> 個字元"</string>
+    <string name="lockpassword_pin_too_long" msgid="62957683396974404">"必需少於 <xliff:g id="NUMBER">%d</xliff:g> 個數字"</string>
     <string name="lockpassword_pin_contains_non_digits" msgid="3044526271686839923">"只可包含數字 0-9。"</string>
-    <string name="lockpassword_pin_recently_used" msgid="7901918311213276207">"裝置管理員不允許使用最近用過的 PIN 碼"</string>
-    <string name="lockpassword_pin_blacklisted_by_admin" msgid="7412709707800738442">"你的 IT 管理員已封鎖常見 PIN 碼,請改用其他 PIN 碼。"</string>
+    <string name="lockpassword_pin_recently_used" msgid="7901918311213276207">"裝置管理員不允許使用最近用過的 PIN"</string>
+    <string name="lockpassword_pin_blacklisted_by_admin" msgid="7412709707800738442">"您的 IT 管理員已禁止使用常用的 PIN,請嘗試輸入另一個 PIN。"</string>
     <string name="lockpassword_illegal_character" msgid="1984970060523635618">"不可包含無效字元。"</string>
     <string name="lockpassword_invalid_password" msgid="1690956113717418430">"密碼無效,必須包含至少 4 個字元。"</string>
     <plurals name="lockpassword_password_requires_letters" formatted="false" msgid="424616259312760303">
-      <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個字母</item>
-      <item quantity="one">至少必須包含 1 個字母</item>
+      <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個字母</item>
+      <item quantity="one">必需包含至少 1 個字母</item>
     </plurals>
     <plurals name="lockpassword_password_requires_lowercase" formatted="false" msgid="2267487180744744833">
-      <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個小寫字母</item>
-      <item quantity="one">至少必須包含 1 個小寫字母</item>
+      <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個小寫字母</item>
+      <item quantity="one">必需包含至少 1 個小寫字母</item>
     </plurals>
     <plurals name="lockpassword_password_requires_uppercase" formatted="false" msgid="7999264563026517898">
-      <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個大寫字母</item>
-      <item quantity="one">至少必須包含 1 個大寫字母</item>
+      <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個大寫字母</item>
+      <item quantity="one">必需包含至少 1 個大寫字母</item>
     </plurals>
     <plurals name="lockpassword_password_requires_numeric" formatted="false" msgid="7935079851855168646">
-      <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個數字</item>
-      <item quantity="one">至少必須包含 1 個數字</item>
+      <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個數字</item>
+      <item quantity="one">必需包含至少 1 個數字</item>
     </plurals>
     <plurals name="lockpassword_password_requires_symbols" formatted="false" msgid="3994046435150094132">
-      <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個特殊符號</item>
-      <item quantity="one">至少必須包含 1 個特殊符號</item>
+      <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個特別符號</item>
+      <item quantity="one">必需包含至少 1 個特別符號</item>
     </plurals>
     <plurals name="lockpassword_password_requires_nonletter" formatted="false" msgid="6878486326748506524">
-      <item quantity="other">至少必須包含 <xliff:g id="COUNT">%d</xliff:g> 個非字母字元</item>
-      <item quantity="one">至少必須包含 1 個非字母字元</item>
+      <item quantity="other">必需包含至少 <xliff:g id="COUNT">%d</xliff:g> 個非字母字元</item>
+      <item quantity="one">必需包含至少 1 個非字母字元</item>
     </plurals>
     <string name="lockpassword_password_recently_used" msgid="8255729487108602924">"裝置管理員不允許使用最近用過的密碼"</string>
     <string name="error_saving_password" msgid="8334882262622500658">"儲存密碼時發生錯誤"</string>
-    <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"你的 IT 管理員已封鎖常見密碼,請改用其他密碼。"</string>
+    <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"您的 IT 管理員已禁止使用常用的密碼,請嘗試輸入另一組密碼。"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"不可使用依遞增或遞減順序排列或重複的連續數字。"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"螢幕鎖定選項"</string>
-    <string name="forget" msgid="3971143908183848527">"清除"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>:<xliff:g id="NUM_DAYS">%3$s</xliff:g> 天前"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"加入信任的裝置"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"信任的裝置"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 部裝置</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 部裝置</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"您的 <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> 將在連接後為此汽車解鎖。如果有人取得您的 <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>,他們或許能存取此裝置。"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"確認"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"移除信任的裝置"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"完成"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"使用隨附應用程式設定信任的裝置。完成設定後,將可以在汽車偵測到手機時解鎖您的使用者設定檔"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1.在手機下載隨附應用程式"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2.在手機選取「<xliff:g id="CAR_NAME">%1$s</xliff:g>」以配對裝置"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock 無法偵測此裝置的安全功能。為保護您的汽車,信任的裝置只會在您解鎖後才保持汽車解鎖。即使信任的裝置在他人手上,仍可在靠近您的汽車時保持汽車解鎖。"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"新增「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」為信任的裝置"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"已成功新增「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」為信任的裝置"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」註冊失敗"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"如要加入信任的裝置,則需要在下一步設定驗證方法。如果未有攜帶信任的裝置,便需要通過驗證才可存取您的設定檔。"</string>
+    <string name="forget" msgid="3971143908183848527">"忘記"</string>
+    <string name="connect" msgid="5861699594602380150">"連接"</string>
+    <string name="disconnect" msgid="6140789953324820336">"解除連接"</string>
     <string name="delete_button" msgid="5840500432614610850">"刪除"</string>
     <string name="remove_button" msgid="6664656962868194178">"移除"</string>
     <string name="cancel" msgid="750286395700355455">"取消"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"結束示範模式"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"執行這項操作後,示範模式帳戶會刪除,而系統會回復原廠設定。所有使用者資料將會失去。"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"結束示範模式"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"完成設定"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"暫時不要"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"關閉"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"無法在駕駛時使用此功能。"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"無法在駕駛時新增使用者。"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 2655112..9b0f468 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"調暗螢幕, 觸控螢幕, 電池"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"調暗螢幕, 夜間, 色調"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"夜間模式"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"網路和網際網路"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"行動網路"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"行動數據"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"使用行動網路存取數據"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"要關閉行動數據嗎?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"數據用量"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"數據警告與限制"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"應用程式數據用量週期"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"設定數據用量警告"</string>
+    <string name="data_warning" msgid="116776633806885370">"數據用量警告"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"設定數據用量上限"</string>
+    <string name="data_limit" msgid="227338836292511425">"數據用量上限"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"限制數據用量"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"當行動數據用量達到你設定的上限時,車輛資訊娛樂主機將關閉行動數據功能。\n\n由於數據用量是由資訊娛樂主機自動計算,而電信業者對用量的計算方式可能有所不同,因此建議你設定保守的上限值。"</string>
     <string name="wifi_settings" msgid="7701477685273103841">"Wi‑Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"設定、管理無線網路存取點"</string>
     <string name="wifi_starting" msgid="473253087503153167">"正在開啟 Wi-Fi…"</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"正在關閉 Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"正在載入 Wi-Fi 清單"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi 已停用"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"無法清除網路設定"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"無法連上網路"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"新增網路"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"Wi-Fi 已停用"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"連線"</string>
     <string name="wifi_password" msgid="5565632142720292397">"密碼"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"顯示密碼"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"網路名稱"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"輸入 SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"安全性"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"訊號強度"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"訊號強度"</string>
     <string name="wifi_status" msgid="5688013206066543952">"狀態"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"連線速度"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"頻率"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"IP 位址"</string>
+    <string name="show_password" msgid="2074628020371139240">"顯示密碼"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"輸入網路名稱"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"輸入密碼"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"差"</item>
-    <item msgid="2032262610626057081">"一般"</item>
-    <item msgid="3859756017461098953">"良好"</item>
-    <item msgid="1521103743353335724">"極佳"</item>
+    <item msgid="7683058295076342057">"微弱"</item>
+    <item msgid="1639222824821660744">"一般"</item>
+    <item msgid="1838705897358163300">"良好"</item>
+    <item msgid="6067166649320533751">"極佳"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"藍牙"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"開啟藍牙"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"藍牙"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"藍牙已停用"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"網路詳細資料"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"MAC 位址"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"IP 位址"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"子網路遮罩"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"IPv6 位址"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"閘道"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Wi‑Fi 偏好設定"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"自動開啟 Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"位於已儲存的高品質 Wi‑Fi 網路範圍內 (例如家用網路) 時自動重新開啟 Wi‑Fi"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"定位服務已關閉,因此無法使用。請開啟 [定位]"<annotation id="link"></annotation>"。"</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"要開啟 Wi‑Fi 掃描功能嗎?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"開啟"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"已開啟 Wi‑Fi 掃描功能"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"自動切換到行動網路"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"當 Wi-Fi 功能無法連上網際網路時,使用行動數據 (可能會增加數據用量)。"</string>
+    <string name="learn_more" msgid="8214605928933358604">"瞭解詳情"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"藍牙"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"管理連線,設定裝置名稱和可偵測性"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"電腦"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"耳機"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"手機"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"顯像裝置"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"耳機"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"周邊輸入裝置"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"藍牙"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"配對裝置"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"可用的裝置"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"沒有任何配對裝置"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"沒有可用的裝置"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"配對裝置"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"名稱"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"用於"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"變更藍牙裝置的名稱"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"未命名的裝置"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"已配對的裝置"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"配對新裝置"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"系統將開啟藍牙以配對裝置"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"要中斷裝置連線嗎?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"你的車輛將中斷與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 的連線。"</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"車輛的藍牙位址:<xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"裝置的藍牙位址:<xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"車輛名稱"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"重新命名這輛車"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"重新命名裝置"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"重新命名"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"可配對的裝置"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"設定檔"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"藍牙配對要求"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"配對並連線"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"藍牙"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"藍牙配對碼"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"PIN 碼含有字母或符號"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"輸入配對碼,然後按下返回鍵或 Enter 鍵"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"通常為 0000 或 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"配對要求"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"輕觸即可與「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」配對。"</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"語言"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"語言與輸入設定"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"鍵盤"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"管理鍵盤"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"文字轉語音輸出"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"偏好的引擎"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"目前的引擎"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"語音速率"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"音調"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"重設"</string>
     <string name="sound_settings" msgid="3072423952331872246">"音效"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"鈴聲音量"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"導航音量"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"媒體"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"設定音樂和影片的音量"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"鬧鐘"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"手機鈴聲"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"預設通知音效"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"預設鬧鐘音效"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"應用程式和通知"</string>
+    <string name="all_applications" msgid="7798210477486822168">"顯示所有應用程式"</string>
+    <string name="default_applications" msgid="1558183275638697087">"預設應用程式"</string>
     <string name="applications_settings" msgid="794261395191035632">"應用程式資訊"</string>
+    <string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"要強制停止嗎?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"如果你強制停止應用程式,應用程式可能無法正常運作。"</string>
     <string name="disable_text" msgid="4358165448648990820">"停用"</string>
     <string name="enable_text" msgid="1794971777861881238">"啟用"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"解除安裝"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"如果你停用這個應用程式,Android 和其他應用程式可能無法正常運作。"</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"停用應用程式"</string>
     <string name="permissions_label" msgid="2701446753515612685">"權限"</string>
     <string name="application_version_label" msgid="8556889839783311649">"版本:%1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"未取得任何授權"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"未要求任何權限"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"數據用量"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"應用程式數據用量"</string>
-    <string name="force_stop" msgid="2153183697014720520">"強制停止"</string>
     <string name="computing_size" msgid="5791407621793083965">"計算中…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="other">還有其他 <xliff:g id="COUNT_1">%d</xliff:g> 項權限</item>
       <item quantity="one">還有其他 <xliff:g id="COUNT_0">%d</xliff:g> 項權限</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"小幫手和語音輸入"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"小幫手應用程式"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"使用畫面中的文字"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"允許小幫手應用程式使用畫面中的文字內容"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"使用螢幕擷取畫面"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"允許小幫手應用程式使用螢幕擷取畫面"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"自動填入服務"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"無"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"已選取"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"小幫手將可讀取系統目前使用中的應用程式相關資訊,包括裝置畫面上顯示的資訊及應用程式內提供存取的資訊。"</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;請確定這是你信任的應用程式&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; 應用程式會根據你的畫面內容判斷要自動填入的內容。"</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"新增服務"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"定位"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"最近的定位要求"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"最近沒有任何定位要求"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"應用程式層級權限"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"掃描"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"定位服務"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Wi-Fi 掃描"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"允許應用程式和服務隨時掃描 Wi‑Fi 網路 (即使 Wi-Fi 功能處於關閉狀態)。這可以用來改善適地性功能和服務。"</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"藍牙掃描"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"允許應用程式和服務隨時掃描附近裝置 (即使藍牙功能處於關閉狀態)。這可以用來改善適地性功能和服務。"</string>
     <string name="system_setting_title" msgid="6864599341809463440">"系統"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"系統更新"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"系統更新"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Android 版本"</string>
     <string name="security_patch" msgid="4794276590178386903">"Android 安全性修補程式等級"</string>
     <string name="model_info" msgid="4966408071657934452">"型號"</string>
     <string name="baseband_version" msgid="2370088062235041897">"基頻版本"</string>
     <string name="kernel_version" msgid="7327212934187011508">"核心版本"</string>
     <string name="build_number" msgid="3997326631001009102">"版本號碼"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"藍牙位址"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"無法取得"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"狀態"</string>
     <string name="device_status" msgid="267298179806290920">"狀態"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"版權"</string>
     <string name="license_title" msgid="936705938435249965">"授權"</string>
     <string name="terms_title" msgid="5201471373602628765">"條款及細則"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"系統 WebView 授權"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"系統 WebView 授權"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"桌布"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"衛星影像提供者:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"第三方授權"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"載入授權時發生問題。"</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"載入中…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="other">只要再 <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> 個步驟即可啟用開發人員設定。</item>
+      <item quantity="one">只要再 <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> 個步驟即可啟用開發人員設定。</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"你已啟用開發人員設定!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"你已啟用開發人員設定。"</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"開發人員選項"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"重設選項"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"重設網路、應用程式或裝置"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"重設網路"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"這麼做會重設所有網路設定,包括:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698"><li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"行動數據"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284"><li>"藍牙"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"清除所有車輛的 eSIM 卡"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"這項操作不會取消你的服務方案。"</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"無法重設 eSIM 卡"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"選取網路"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"重設設定"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"要重設嗎?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"要重設所有網路設定嗎?這個動作無法復原!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"重設設定"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"已重設網路設定"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"重設應用程式偏好設定"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"這麼做會重設下列項目的所有偏好設定:\n\n"<li>"已停用的應用程式"</li>\n<li>"已停用的應用程式通知"</li>\n<li>"執行動作的預設應用程式"</li>\n<li>"應用程式背景資料限制"</li>\n<li>"任何權限限制"</li>\n\n"你不會遺失任何應用程式資料。"</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"重設應用程式"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"已重設應用程式偏好設定"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"清除所有資料 (恢復原廠設定)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"這麼做將會清除車輛資訊娛樂主機的所有資料,包括:\n\n"<li>"你的 Google 帳戶"</li>\n<li>"系統與應用程式的資料和設定"</li>\n<li>"已下載的應用程式"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"你目前已登入下列帳戶:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"這輛車還有其他使用者。"</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"重設車輛"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"要重設嗎?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"要清除所有個人資訊和已下載的應用程式嗎?這個動作無法復原!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"全部清除"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"清除中"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"請稍候…"</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"日期和時間"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"設定日期和時間"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"設定日期、時間、時區及時間格式"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"依照時區排序"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"日期"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"時間"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"新增使用者"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"新增帳戶"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"刪除使用者"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"新使用者"</string>
-    <string name="user_guest" msgid="3465399481257448601">"訪客"</string>
     <string name="user_admin" msgid="1535484812908584809">"管理員"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"登入身分:管理員"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"所有管理員權限"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"設為管理員"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"這位使用者將可以刪除使用者 (包括其他管理員),以及將系統恢復原廠設定。"</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"這個動作無法復原。"</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"是,設為管理員"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"建立新使用者"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"撥打電話"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"使用車輛的行動數據網路收發簡訊"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"安裝新應用程式"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"解除安裝應用程式"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"新增使用者"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"新使用者"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"要新增使用者嗎?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"新增的使用者需要自行設定個人空間。"</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"任何使用者都可以為所有其他使用者更新應用程式。"</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"已達使用者數量上限"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="other">最多可建立 <xliff:g id="COUNT">%d</xliff:g> 位使用者。</item>
+      <item quantity="one">只能建立 1 位使用者。</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"無法建立新的使用者設定檔"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"要刪除這位使用者嗎?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"所有應用程式和資料都會遭到刪除。"</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"無法刪除使用者。"</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"關閉"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"重試"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"要刪除最後一位使用者嗎?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"刪除這輛車的唯一使用者後,系統會建立新的管理員使用者。"</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"所有與這位使用者相關聯的資料、設定和應用程式都會遭到刪除。你必須重新設定系統。"</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"選擇新管理員"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"你必須設定至少一位管理員。如要刪除這位管理員,請先選擇新的管理員。"</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"選擇管理員"</string>
+    <string name="user_guest" msgid="3465399481257448601">"訪客"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"訪客"</string>
     <string name="user_switch" msgid="6544839750534690781">"切換"</string>
     <string name="current_user_name" msgid="3813671533249316823">"你 (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"名稱"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"尚未設定"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"編輯使用者名稱"</string>
     <string name="users_list_title" msgid="770764290290240909">"使用者"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"已將權限授予%1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"帳戶"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"使用者"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"新增帳戶"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"未新增任何帳戶"</string>
     <string name="account_list_title" msgid="7631588514613843065">"<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g> 的帳戶"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"自動同步處理資料"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"允許應用程式自動重新整理資料"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"要啟用資料自動同步功能嗎?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"你在網路上對帳戶進行的所有變更都會自動複製到你的裝置。\n\n有些帳戶還可以自動將你在手機上進行的所有變更複製到網路上,Google 帳戶即是按照這種方式運作。"</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"要停用資料自動同步功能嗎?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"這樣可以節省數據用量,但你必須手動同步處理每個帳戶才能收集最新資訊。此外,系統進行更新時不會通知你。"</string>
     <string name="account_details_title" msgid="7529571432258448573">"帳戶資訊"</string>
     <string name="add_account_title" msgid="5988746086885210040">"新增帳戶"</string>
     <string name="add_an_account" msgid="1072285034300995091">"新增帳戶"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"移除帳戶"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"要移除帳戶嗎?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"移除帳戶後,裝置上所有的訊息、聯絡人和其他資料將全部遭到刪除!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"你的管理員不允許這項變更"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"要移除這位使用者嗎?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"所有應用程式和資料都會遭到刪除。"</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"無法移除使用者。"</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"再試一次?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"關閉"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"重試"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"要新增使用者嗎?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"新增的使用者需要自行設定個人空間。"</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"任何使用者都可以為所有其他使用者更新應用程式。"</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"無法移除帳戶。"</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"帳戶同步處理"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"已啟用 <xliff:g id="ID_1">%1$d</xliff:g> 個項目 (共 <xliff:g id="ID_2">%2$d</xliff:g> 個) 的同步處理功能"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"已啟用所有項目的同步處理功能"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"已停用所有項目的同步處理功能"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"已關閉同步處理功能"</string>
+    <string name="sync_error" msgid="6698021343089247914">"同步處理錯誤"</string>
+    <string name="last_synced" msgid="4745124489150101529">"上次同步處理時間:<xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"目前正在同步處理…"</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"輕觸即可立即同步處理 (<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>)"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"立即同步處理"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"取消同步處理"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"同步處理目前發生問題,將於短時間內恢復。"</string>
     <string name="security_settings_title" msgid="6955331714774709746">"安全性"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"螢幕鎖定"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"無"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"PIN 碼"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"密碼"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"選擇鎖定類型"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"螢幕鎖定選項"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"螢幕鎖定選項"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"畫出解鎖圖案"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"確認"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"重畫"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"設定螢幕鎖定"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"選擇 PIN 碼"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"選擇圖案"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"選擇密碼"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"選擇密碼"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"目前的螢幕鎖定方式"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"為了安全起見,請設定圖案"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"清除"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"你的 IT 管理員已封鎖常見密碼,請改用其他密碼。"</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"不得使用依遞增或遞減順序排列或是重複的數字。"</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"螢幕鎖定選項"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g>:<xliff:g id="NUM_DAYS">%3$s</xliff:g> 天前"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"新增信任的裝置"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"信任的裝置"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 部裝置</item>
+      <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 部裝置</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"如果你的 <xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> 與這輛車連結,就能將其解鎖。如果其他人取得你的 <xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>,對方或許能夠存取這個裝置"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"確認"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"移除信任的裝置"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"完成"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"請使用隨附應用程式設定信任的裝置。設定完成後,你就能在車輛偵測到你的手機時將使用者設定檔解鎖"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. 在手機上下載隨附應用程式"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. 在手機上選取 [<xliff:g id="CAR_NAME">%1$s</xliff:g>] 以便將裝置配對"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"Smart Lock 偵測不到這個裝置的安全性功能。為保護你的車輛,你必須先將信任的裝置解除鎖定,該裝置才能讓車輛保持解鎖狀態。只要信任的裝置位於車輛附近,就能讓車輛保持解鎖狀態,就算該裝置在其他人手中也一樣。"</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"將 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 新增為信任的裝置"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"已成功將 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 新增為信任的裝置"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"無法註冊 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"你必須在新增信任的裝置後設定驗證方法。如果你手邊沒有信任的裝置,就必須通過驗證才能存取自己的個人資料。"</string>
     <string name="forget" msgid="3971143908183848527">"清除"</string>
+    <string name="connect" msgid="5861699594602380150">"連線"</string>
+    <string name="disconnect" msgid="6140789953324820336">"中斷連線"</string>
     <string name="delete_button" msgid="5840500432614610850">"刪除"</string>
     <string name="remove_button" msgid="6664656962868194178">"移除"</string>
     <string name="cancel" msgid="750286395700355455">"取消"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"結束示範模式"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"這項操作會刪除示範帳戶並將系統恢復原廠設定,且所有使用者資料都會遺失。"</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"結束示範模式"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"完成設定"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"暫時不要"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"關閉"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"開車時無法使用這項功能。"</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"無法在開車期間新增使用者。"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 00a843e..5c67c6d 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -1,19 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
  -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
@@ -30,55 +29,88 @@
     <string name="keywords_display_auto_brightness" msgid="2700310050333468752">"fiphalisa isikrini, isikrini esithintwayo, ibhethri"</string>
     <string name="keywords_display_night_display" msgid="2922294576679769957">"fiphaza isikrini, ubusuku, i-tint"</string>
     <string name="night_mode_tile_label" msgid="6603597795502131664">"Imodi yasebusuku"</string>
+    <string name="network_and_internet" msgid="4229023630498537530">"Inethiwekhi ne-inthanethi"</string>
+    <string name="mobile_network_settings" msgid="1708621113321368597">"Inethiwekhi yeselula"</string>
+    <string name="mobile_network_toggle_title" msgid="3515647310810280063">"Idatha yeselula"</string>
+    <string name="mobile_network_toggle_summary" msgid="8698267487987697148">"Finyelela kudatha usebenzisa inethiwekhi yeselula"</string>
+    <string name="confirm_mobile_data_disable" msgid="826493998804496639">"Vala idatha yeselula?"</string>
+    <string name="data_usage_settings" msgid="7877132994777987848">"Ukusebenzisa idatha"</string>
+    <string name="data_warning_limit_title" msgid="4950868241810828601">"Isexwayiso sedatha nomkhawulo"</string>
+    <string name="app_usage_cycle" msgid="8445927080245880296">"Umjikelezo wokusetshenziswa kwedatha yohlelo lokusebenza"</string>
+    <string name="set_data_warning" msgid="6628236612886588097">"Setha isexwayiso sedatha"</string>
+    <string name="data_warning" msgid="116776633806885370">"Isexwayiso sedatha"</string>
+    <string name="set_data_limit" msgid="7136539812414500084">"Setha umkhawulo wedatha"</string>
+    <string name="data_limit" msgid="227338836292511425">"Umkhawulo wedatha"</string>
+    <string name="data_usage_limit_dialog_title" msgid="1864716658371721883">"Ilinganisela ukusebenza kwedatha"</string>
+    <string name="data_usage_limit_dialog_mobile" msgid="3633960011913085089">"Iyunithi enkulu yemoto yakho izovala idatha yeselula uma isifike kumkhawulo owusethile.\n\nNjengoba ukusetshenziswa kwedatha kulinganiselwa iyunithi eyinhloko, futhi inkampani yakho yenethiwekhi ingakhulumela ukusetshenziswa ngokuhlukile, cabanga ukusetha umkhawulo wakho wokugcinwa."</string>
     <string name="wifi_settings" msgid="7701477685273103841">"I-Wi-Fi"</string>
-    <string name="wifi_settings_summary" msgid="6095898149997291025">"Hlela futhi uphathe izindawo zokungena ezingenantambo"</string>
     <string name="wifi_starting" msgid="473253087503153167">"Ivula i-Wi-Fi..."</string>
     <string name="wifi_stopping" msgid="3534173972547890148">"Ivala i-Wi-Fi…"</string>
+    <string name="loading_wifi_list" msgid="8584901433195876465">"Ilayisha uhlu lwe-Wi-Fi"</string>
+    <string name="wifi_disabled" msgid="5013262438128749950">"I-Wi‑Fi ikhatshaziwe"</string>
     <string name="wifi_failed_forget_message" msgid="121732682699377206">"Yehlulekile ukukhohlwa inethiwekhi"</string>
     <string name="wifi_failed_connect_message" msgid="4447498225022147324">"Yehlulekile ukuxhuma kunethiwekhi"</string>
     <string name="wifi_setup_add_network" msgid="3660498520389954620">"Yengeza inethiwekhi"</string>
-    <string name="wifi_disabled" msgid="5013262438128749950">"I-Wi‑Fi ikhatshaziwe"</string>
     <string name="wifi_setup_connect" msgid="3512399573397979101">"Xhuma"</string>
     <string name="wifi_password" msgid="5565632142720292397">"Iphasiwedi"</string>
     <string name="wifi_show_password" msgid="8423293211933521097">"Bonisa iphasiwedi"</string>
     <string name="wifi_ssid" msgid="488604828159458741">"Igama lenethiwekhi"</string>
+    <string name="wifi_ssid_hint" msgid="3170608752313710099">"Faka i-SSID"</string>
     <string name="wifi_security" msgid="158358046038876532">"Ukuvikela"</string>
-    <string name="wifi_signal" msgid="1817579728350364549">"Amandla esiginali"</string>
+    <string name="wifi_signal_strength" msgid="8507318230553042817">"Amandla esiginali"</string>
     <string name="wifi_status" msgid="5688013206066543952">"Isimo"</string>
     <string name="wifi_speed" msgid="1650692446731850781">"Isivinini sesixhumanisi"</string>
     <string name="wifi_frequency" msgid="8951455949682864922">"Imvamisa"</string>
     <string name="wifi_ip_address" msgid="3128140627890954061">"Ikheli le-IP"</string>
+    <string name="show_password" msgid="2074628020371139240">"Bonisa iphasiwedi"</string>
+    <string name="default_network_name_summary" msgid="8148402439232464276">"Faka igama lenethiwekhi"</string>
+    <string name="default_password_summary" msgid="8789594645836902982">"Faka iphasiwedi"</string>
     <string name="access_point_tag_key" msgid="1517143378973053337">"access_point_tag_key"</string>
   <string-array name="wifi_signals">
     <item msgid="4897376984576812606">"Akukuhle"</item>
-    <item msgid="2032262610626057081">"Kulungile"</item>
-    <item msgid="3859756017461098953">"Kuhle"</item>
-    <item msgid="1521103743353335724">"Kuhle kakhulu"</item>
+    <item msgid="7683058295076342057">"Akukuhle"</item>
+    <item msgid="1639222824821660744">"Kulungile"</item>
+    <item msgid="1838705897358163300">"Kuhle"</item>
+    <item msgid="6067166649320533751">"Kuhle kakhulu"</item>
   </string-array>
-    <string name="bluetooth_quick_toggle_title" msgid="637869245038061523">"I-Bluetooth"</string>
-    <string name="bluetooth_quick_toggle_summary" msgid="4390699431893305353">"Vula i-Bluetooth"</string>
-    <string name="bluetooth_settings" msgid="3878243366013638982">"I-Bluetooth"</string>
-    <string name="bluetooth_disabled" msgid="4187409401590350572">"I-Bluetooth ikhutshaziwe"</string>
+    <string name="link_speed" msgid="7868861844075624445">"%1$d Mbps"</string>
+    <string name="wifi_band_24ghz" msgid="8972492390639295220">"2.4 GHz"</string>
+    <string name="wifi_band_5ghz" msgid="2023762623523105080">"5 GHz"</string>
+    <string name="wifi_network_detail" msgid="9070182553555487360">"Imininingwane yenethiwekhi"</string>
+    <string name="wifi_mac_address" msgid="1466178247802349180">"Ikheli le-MAC"</string>
+    <string name="wifi_ip_address_title" msgid="300539799594024884">"Ikheli le-IP"</string>
+    <string name="wifi_subnet_mask" msgid="6238171812379380608">"Imaski ye-subnet"</string>
+    <string name="wifi_dns" msgid="1841448353154932801">"DNS"</string>
+    <string name="wifi_details_ipv6_address_header" msgid="4707181386646531890">"Amakheli e-IPv6"</string>
+    <string name="wifi_gateway" msgid="4975799192860431013">"Indlela yokuphuma"</string>
+    <string name="wifi_preferences_title" msgid="772788844257225510">"Okuncamelayo kwe-Wi-Fi"</string>
+    <string name="wifi_wakeup" msgid="7451825226044542000">"Vula i-Wi‑Fi ngokuzenzakalelayo"</string>
+    <string name="wifi_wakeup_summary" msgid="7237521683331291414">"I-Wi‑Fi izovuleka eceleni kwamanethiwekhi alondolozwe ngekhwalithi ephezulu, njengenethiwekhi yakho yasekhaya"</string>
+    <string name="wifi_wakeup_summary_no_location" msgid="2821576525488435259">"Akutholakali ngoba indawo ivaliwe. Vula "<annotation id="link">"indawo"</annotation>"."</string>
+    <string name="wifi_settings_scanning_required_title" msgid="2726782203331704928">"Vula ukuskena kwe-Wi-Fi?"</string>
+    <string name="wifi_settings_scanning_required_turn_on" msgid="4464931023377210050">"Vula"</string>
+    <string name="wifi_settings_scanning_required_enabled" msgid="5457372118991438313">"Ukuskena kwe-Wi-Fi kuvuliwe"</string>
+    <string name="wifi_cellular_fallback_title" msgid="8322675436784870862">"Shintshela kudatha yeselula ngokuzenzakalela"</string>
+    <string name="wifi_cellular_fallback_summary" msgid="2433848528924203758">"Sebenzisa idatha yeselula uma i-Wi-Fi ingenakho ukufinyelela kwe-inthanethi. Ukusetshenziswa kwedatha kungasebenza."</string>
+    <string name="learn_more" msgid="8214605928933358604">"Funda kabanzi"</string>
     <string name="bluetooth_settings_title" msgid="3794688574569688649">"I-Bluetooth"</string>
-    <string name="bluetooth_settings_summary" msgid="4023303473646769835">"Lawula uxhumano, setha igama ledivaysi nokutholakala"</string>
-    <string name="bluetooth_talkback_computer" msgid="5223330129934365312">"Ikhompuyutha"</string>
-    <string name="bluetooth_talkback_headset" msgid="6155254514321149935">"Ihedisethi"</string>
-    <string name="bluetooth_talkback_phone" msgid="8833977851215000426">"Ifoni"</string>
-    <string name="bluetooth_talkback_imaging" msgid="8762390801115154654">"Ukwenza isithombe"</string>
-    <string name="bluetooth_talkback_headphone" msgid="5362155791551671490">"Amahedfoni"</string>
-    <string name="bluetooth_talkback_input_peripheral" msgid="868933277567862622">"Okokufaka okulawulwa yikhompuyutha"</string>
-    <string name="bluetooth_talkback_bluetooth" msgid="1715933297419387985">"I-Bluetooth"</string>
-    <string name="bluetooth_preference_paired_devices" msgid="5875643105380630583">"Amadivaysi abhanqene"</string>
-    <string name="bluetooth_preference_found_devices" msgid="125155123214560511">"Amadivayisi atholakalayo"</string>
-    <string name="bluetooth_preference_no_paired_devices" msgid="483742146117390001">"Awekho amadivayisi abhanqiwe"</string>
-    <string name="bluetooth_preference_no_found_devices" msgid="1391812056491062262">"Awekho amadivayisi atholakalayo"</string>
-    <string name="bluetooth_preference_paired_dialog_title" msgid="2470829827455850904">"Idivayisi ebhanqiwe"</string>
-    <string name="bluetooth_preference_paired_dialog_name_label" msgid="3528740139365123415">"Igama"</string>
-    <string name="bluetooth_device_advanced_profile_header_title" msgid="8165093257483965783">"Sebenzisela i-"</string>
-    <string name="wifi_ssid_hint" msgid="4155050863239489553">"Shintsha igama lesevisi ye-Bluetooth"</string>
+    <string name="bluetooth_device" msgid="3178478829314083240">"Idivayisi engenalo igama"</string>
+    <string name="bluetooth_paired_devices" msgid="6463199569164652410">"Amadivaysi abhanqene"</string>
+    <string name="bluetooth_pair_new_device" msgid="6948753485443263095">"Bhanqa idivayisi entsha"</string>
+    <string name="bluetooth_pair_new_device_summary" msgid="2497221247690369031">"I-Bluetooth izovula ukuze ibhanqe"</string>
+    <string name="bluetooth_disconnect_title" msgid="7675271355910637528">"Nqamula idivayisi?"</string>
+    <string name="bluetooth_disconnect_all_profiles" msgid="2017519733701757244">"Imoto yakho izinqamula kusuka ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="bluetooth_vehicle_mac_address" msgid="7069234636525805937">"Ikheli le-Bluetooth lemoto: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_device_mac_address" msgid="3949829271575045069">"Ikheli le-Bluetooth yedivayisi: <xliff:g id="ADDRESS">%1$s</xliff:g>"</string>
+    <string name="bluetooth_name" msgid="2609869978821094114">"Igama lemoto"</string>
+    <string name="bluetooth_rename_vehicle" msgid="5769424875066563154">"Qamba kabusha le moto"</string>
+    <string name="bluetooth_rename_device" msgid="8406868875363878712">"Qamba kabusha idivaysi"</string>
+    <string name="bluetooth_rename_button" msgid="2397892174725986383">"Qamba kabusha"</string>
+    <string name="bluetooth_available_devices" msgid="1854446368146061448">"Amadivayisi atholakalayo"</string>
+    <string name="bluetooth_profiles" msgid="5580372290862835951">"Amaphrofayli"</string>
+    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="bluetooth_notif_ticker" msgid="7192577740198156792">"Isicelo sokubhanqa i-Bluetooth"</string>
     <string name="bluetooth_device_context_pair_connect" msgid="3138105800372470422">"Pheya futhi uxhume"</string>
-    <string name="bluetooth" msgid="5235115159234688629">"I-Bluetooth"</string>
     <string name="bluetooth_pairing_key_msg" msgid="5066825929751599037">"Ikhodi yokumatanisa ye-Bluetooth"</string>
     <string name="bluetooth_enable_alphanumeric_pin" msgid="1636575922217263060">"Iphinikhodi iqukethe amaletha namasimbui"</string>
     <string name="bluetooth_enter_passkey_msg" msgid="5955236916732265593">"Thayipha ikhodi yokumatanisa bese ucindezela ku-Buyela noma ku-Enter"</string>
@@ -90,8 +122,16 @@
     <string name="bluetooth_pin_values_hint" msgid="1561325817559141687">"Ngokuvamile 0000 noma 1234"</string>
     <string name="bluetooth_notif_title" msgid="8374602799367803335">"Isicelo sokubhangqa"</string>
     <string name="bluetooth_notif_message" msgid="1060821000510108726">"Thepha ukuze ubhanqe ne-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
-    <string name="bluetooth_error_title" msgid="2341600997536511742"></string>
     <string name="language_settings" msgid="2079258598337245546">"Izilimi"</string>
+    <string name="languages_and_input_settings" msgid="3672322610529408248">"Izilimi nokokufaka"</string>
+    <string name="keyboard_settings" msgid="1959697870618278081">"Ikhibhodi"</string>
+    <string name="manage_keyboard" msgid="4045394766282200132">"Phatha amakhibhodi"</string>
+    <string name="text_to_speech_settings" msgid="811985746199507343">"Ukuphuma kombhalo ube inkulumo"</string>
+    <string name="text_to_speech_preferred_engine_settings" msgid="2766782925699132256">"Injini encanyelwayo"</string>
+    <string name="text_to_speech_current_engine" msgid="8133107484909612597">"Injini yamanje"</string>
+    <string name="tts_speech_rate" msgid="4512944877291943133">"Ukulinganisela kwenkulumo"</string>
+    <string name="tts_pitch" msgid="2389171233852604923">"Ukuphakama"</string>
+    <string name="tts_reset" msgid="6289481549801844709">"Setha kabusha"</string>
     <string name="sound_settings" msgid="3072423952331872246">"Umsindo"</string>
     <string name="ring_volume_title" msgid="3135241004980719442">"Ivolumu yokukhalisa"</string>
     <string name="navi_volume_title" msgid="946292066759195165">"Ivolomu yokuzula"</string>
@@ -100,30 +140,65 @@
     <string name="media_volume_title" msgid="6697416686272606865">"Imidiya"</string>
     <string name="media_volume_summary" msgid="2961762827637127239">"Hlela ivolumu yomculo namavidiyo"</string>
     <string name="alarm_volume_title" msgid="840384014895796587">"I-alamu"</string>
+    <string name="ringtone_title" msgid="8370531086214517972">"Ithoni yokukhala yefoni"</string>
+    <string name="notification_ringtone_title" msgid="8661716239594010288">"Umsindo wesaziso ozenzakalelayo"</string>
+    <string name="alarm_ringtone_title" msgid="3257364170646440908">"Umsindo we-alamu ozenzakalelayo"</string>
+    <string name="apps_and_notifications_settings" msgid="8704585874333781975">"Izinhlelo zokusebenza nezaziso"</string>
+    <string name="all_applications" msgid="7798210477486822168">"Bonisa zonke izinhlelo zokusebenza"</string>
+    <string name="default_applications" msgid="1558183275638697087">"Izinhlelo zokusebenza ezizenzakalelayo"</string>
     <string name="applications_settings" msgid="794261395191035632">"Ulwazi lohlelo lokusebenza"</string>
+    <string name="force_stop" msgid="2153183697014720520">"Phoqelela ukuma"</string>
+    <string name="force_stop_dialog_title" msgid="3342850939200388694">"Phoqelela ukumisa?"</string>
+    <string name="force_stop_dialog_text" msgid="4354954014318432599">"Uma uphoqa ukumisa uhlelo lokusebenza, kungenzeka ukuthi lungasebenzi."</string>
     <string name="disable_text" msgid="4358165448648990820">"Khubaza"</string>
     <string name="enable_text" msgid="1794971777861881238">"Nika amandla"</string>
+    <string name="uninstall_text" msgid="277907956072833012">"Khipha"</string>
+    <string name="app_disable_dialog_text" msgid="7731155411006654025">"Uma ukhubaza lolu hlelo lokusebenza, i-Android nezinye izinhlelo zokusebenza kungenzeka zingasasebenzi njengoba zihlosiwe."</string>
+    <string name="app_disable_dialog_positive" msgid="4448684722791563349">"Khubaza uhlelo lokusebenza"</string>
     <string name="permissions_label" msgid="2701446753515612685">"Izimvume"</string>
     <string name="application_version_label" msgid="8556889839783311649">"Inguqulo: %1$s"</string>
     <string name="runtime_permissions_summary_no_permissions_granted" msgid="6001439205270250021">"Azikho izimvume ezinikiwe"</string>
     <string name="runtime_permissions_summary_no_permissions_requested" msgid="4074220596273432442">"Azikho izimvume eziceliwe"</string>
     <string name="data_usage_summary_title" msgid="4368024763485916986">"Ukusebenzisa idatha"</string>
     <string name="data_usage_app_summary_title" msgid="5012851696585421420">"Ukusetshenziswa kwedatha yohlelo lokusebenza"</string>
-    <string name="force_stop" msgid="2153183697014720520">"Phoqelela ukuma"</string>
     <string name="computing_size" msgid="5791407621793083965">"Iyakhompyutha…"</string>
     <plurals name="runtime_permissions_additional_count" formatted="false" msgid="3513360187065317613">
       <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> izimvume ezingeziwe</item>
       <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> izimvume ezingeziwe</item>
     </plurals>
+    <string name="assist_and_voice_input_settings" msgid="8813195157136637132">"Umsizi nokokufaka kwezwi"</string>
+    <string name="assist_app_settings" msgid="9085261410166776497">"Uhlelo lokusebenza lokusiza"</string>
+    <string name="assist_access_context_title" msgid="8034851731390785301">"Sebenzisa umbhalo kusukela kusikrini"</string>
+    <string name="assist_access_context_summary" msgid="2374281280599443774">"Vumela uhlelo lokusebenza lokusiza ukuthi lufinyelele kokuqukethwe kwesikrini njengombhalo"</string>
+    <string name="assist_access_screenshot_title" msgid="2855956879971465044">"Sebenzisa isithombe-skrini"</string>
+    <string name="assist_access_screenshot_summary" msgid="6246496926635145782">"Vumela uhlelo lokusebenza lokusiza ukuthi lufinyelele kusithombe sesikrini"</string>
+    <!-- no translation found for voice_input_settings_title (3238707827815647526) -->
+    <skip />
+    <string name="autofill_settings_title" msgid="1188754272680049972">"Isevisi yokugcwalisa ngokuzenzakalela"</string>
+    <string name="app_list_preference_none" msgid="7753357799926715901">"Lutho"</string>
+    <string name="default_app_selected_app" msgid="5289396663745484773">"Ekhethiwe"</string>
+    <string name="assistant_security_warning" msgid="1844807956967428012">"Isilekeleli sizokwazi ukufunda ulwazi mayelana nezinhlelo zokusebenza ezisetshenziswayo kusistimu yakho, ezifaka ulwazi olubonakala kusikrini sakho noma ezifinyeleleka ngaphakathi kwezinhlelo zokusebenza."</string>
+    <string name="autofill_confirmation_message" msgid="1832984461556991378">"&lt;b&gt;Qiniseka ukuthi wethemba lolu hlelo lokusebenza&lt;/b&gt; &lt;br/&gt; &lt;br/&gt; &lt;xliff:g id=app_name example=Google Autofill&gt;%1$s&lt;/xliff:g&gt; isebenzisa okusesikrinini sakho ukunquma okungagcwaliswa ngokuzenzakalela."</string>
+    <string name="autofill_add_service" msgid="6413893366443609951">"Engeza isevisi"</string>
+    <string name="location_settings_title" msgid="901334356682423679">"Indawo"</string>
+    <string name="location_settings_recent_requests_title" msgid="6345634382240930628">"Izicelo zakamuva zendawo"</string>
+    <string name="location_settings_recent_requests_empty_message" msgid="7789667070033674910">"Azikho izicelo zakamuva zendawo"</string>
+    <string name="location_settings_app_permissions_title" msgid="6446735313354321564">"Izimvume zeleveli yohlelo lokusebenza"</string>
+    <string name="location_settings_scanning_title" msgid="4253945869911300740">"Iyaskena"</string>
+    <string name="location_settings_services_title" msgid="1186133632690970468">"Amasevisi endawo"</string>
+    <string name="location_settings_wifi_scanning_title" msgid="8021558840074023719">"Ukuskena kwe-Wi-Fi"</string>
+    <string name="location_settings_wifi_scanning_summary" msgid="2116283960258671324">"Vumela izinhlelo zokusebenza namasevisi ukuthi askenele amanethiwekhi e-Wi-Fi noma kunini, nanoma i-Wi-Fi ivaliwe. Lokhu kungasetshenziselwa, njengesibonelo, ukuthuthukisa izici ezisuselwa endaweni namasevisi."</string>
+    <string name="location_settings_bluetooth_scanning_title" msgid="2969682902241932059">"Ukuskena kwe-Bluetooth"</string>
+    <string name="location_settings_bluetooth_scanning_summary" msgid="9158101751700727062">"Vumela izinhlelo zokusebenza namasevisi ukuthi askenele amadivayisi aseduze noma kunini, nanoma i-Bluetooth ivaliwe. Lokhu kungasetshenziselwa, njengesibonelo, ukuthuthukisa izici ezisuselwa endaweni namasevisi."</string>
     <string name="system_setting_title" msgid="6864599341809463440">"Isistimu"</string>
-    <string name="system_update_settings_list_item_title" msgid="5182439376921868735">"Izibuyekezo zesistimu"</string>
-    <string name="system_update_settings_list_item_summary" msgid="7395202602021608371"></string>
+    <string name="system_update_settings_title" msgid="8448588267784138855">"Izibuyekezo zesistimu"</string>
     <string name="firmware_version" msgid="8491753744549309333">"Inguqulo ye-Android"</string>
     <string name="security_patch" msgid="4794276590178386903">"Ileveli yokuvikeleka ye-Android"</string>
     <string name="model_info" msgid="4966408071657934452">"Imodeli"</string>
     <string name="baseband_version" msgid="2370088062235041897">"Inguqulo ye-Baseband"</string>
     <string name="kernel_version" msgid="7327212934187011508">"Inguqulo ye-Kernel"</string>
     <string name="build_number" msgid="3997326631001009102">"Yakha inombolo"</string>
+    <string name="bluetooth_mac_address" msgid="7641425947941688072">"Ikheli le-Bluetooth"</string>
     <string name="device_info_not_available" msgid="2095601973977376655">"Ayitholakali"</string>
     <string name="device_status_activity_title" msgid="4083567497305368200">"Isimo"</string>
     <string name="device_status" msgid="267298179806290920">"Isimo"</string>
@@ -140,12 +215,49 @@
     <string name="copyright_title" msgid="4220237202917417876">"I-Copyright"</string>
     <string name="license_title" msgid="936705938435249965">"Ilayisensi"</string>
     <string name="terms_title" msgid="5201471373602628765">"Imigomo nemibandela"</string>
-    <string name="webview_license_title" msgid="2531829466541104826">"Ilayisense yesistimu ye-WebView"</string>
+    <string name="webview_license_title" msgid="6442372337052056463">"Amalayisense we-WebView wesistimu"</string>
     <string name="wallpaper_attributions" msgid="9201272150014500697">"Izithombe zangemuva"</string>
     <string name="wallpaper_attributions_values" msgid="4292446851583307603">"Abanikezeli bezithombe zesathelayithi:\n2014 CNES / Astrium, DigitalGlobe, Bluesky"</string>
     <string name="settings_license_activity_title" msgid="8499293744313077709">"Amalayisense enkampani yangaphandle"</string>
     <string name="settings_license_activity_unavailable" msgid="6104592821991010350">"Kunenkinga yokulayisha amalayisensi."</string>
     <string name="settings_license_activity_loading" msgid="6163263123009681841">"Iyalayisha…"</string>
+    <plurals name="show_dev_countdown" formatted="false" msgid="2968627665608969405">
+      <item quantity="one">Manje usalelwe yizinyathelo ezingu-<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ukuthi ube ngunjiniyela.</item>
+      <item quantity="other">Manje usalelwe yizinyathelo ezingu-<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ukuthi ube ngunjiniyela.</item>
+    </plurals>
+    <string name="show_dev_on" msgid="5339077400040834808">"Manje ungunjiniyela!"</string>
+    <string name="show_dev_already" msgid="1678087328973865736">"Asikho isidingo, usuvele ungunjiniyela."</string>
+    <string name="developer_options_settings" msgid="1530739225109118480">"Izinketho zonjiniyela"</string>
+    <string name="reset_options_title" msgid="4388902952861833420">"Izinketho zokusetha kabusha"</string>
+    <string name="reset_options_summary" msgid="5508201367420359293">"Inethiwekhi, izinhlelo zokusebenza, noma ukusetha kabusha idivayisi"</string>
+    <string name="reset_network_title" msgid="1284233059990797263">"Setha kabusha inethiwekhi"</string>
+    <string name="reset_network_desc" msgid="602381374544634925">"Lokhu kuzosetha kabusha zonke izilungiselelo zenethiwekhi, okufaka:"</string>
+    <string name="reset_network_item_wifi" msgid="7569481589699982698">"I-"<li>"Wi‑Fi"</li></string>
+    <string name="reset_network_item_mobile" msgid="5747282716664480997"><li>"Idatha yeselula"</li></string>
+    <string name="reset_network_item_bluetooth" msgid="6035019931106921284">"I-"<li>"Bluetooth"</li></string>
+    <string name="reset_esim_title" msgid="8132107637911831211">"Sula onke ama-eSIM emoto"</string>
+    <string name="reset_esim_desc" msgid="1437276625485586740">"Lokhu ngeke kukhansele uhlelo lwakho lwesevisi."</string>
+    <string name="reset_esim_error_title" msgid="7245109418130525492">"Ayikwazi ukusetha kabusha ama-eSIM"</string>
+    <string name="reset_network_select" msgid="2433825874868038739">"Khetha inethiwekhi"</string>
+    <string name="reset_network_button_text" msgid="8374174455632765033">"Setha kabusha izilungiselelo"</string>
+    <string name="reset_network_confirm_title" msgid="5255502723840197663">"Setha kabusha?"</string>
+    <string name="reset_network_confirm_desc" msgid="7721698076856330212">"Setha kabusha zonke izilungiselelo zenethiwekhi? Awukwazi ukuhlehlisa lesi senzo!"</string>
+    <string name="reset_network_confirm_button_text" msgid="5246859685069024851">"Setha kabusha izilungiselelo"</string>
+    <string name="reset_network_complete_toast" msgid="3804108209431416865">"Izilungiselelo zenethiwekhi zisethwe kabusha"</string>
+    <string name="reset_app_pref_title" msgid="5855420038951743992">"Setha kabusha izintandokazi zezinhlelo zokusebenza"</string>
+    <string name="reset_app_pref_desc" msgid="579392665146962149">"Lokhu kuzosetha kabusha konke okuncamelayo kwe-:\n\n"<li>"Izinhlelo zokusebenza ezikhutshaziwe"</li>\n<li>"Izaziso zezinhlelo zokusebenza ezikhutshaziwe"</li>\n<li>"Izinhlelo zokusebenza ezizenzakalelayo zezenzo"</li>\n<li>"Imikhawulo yedatha yangemuva yezinhlelo zokusebenza"</li>\n<li>"Noma yimiphi imikhawulo yemvume"</li>\n\n"Ngeke uze ulahlekelwe noma iyiphi idatha yohlelo lokusebenza."</string>
+    <string name="reset_app_pref_button_text" msgid="6270820447321231609">"Setha kabusha izinhlelo zokusebenza"</string>
+    <string name="reset_app_pref_complete_toast" msgid="8709072932243594166">"Izintandokazi zohlelo lokusebenza zisethwe kabusha"</string>
+    <string name="master_clear_title" msgid="8515335233363214414">"Sula yonke idatha (ukusethwa kabusha kwasekuqaleni)"</string>
+    <string name="master_clear_desc" msgid="9058719802779893535">"Lokhu kuzosusa yonke idatha kusukela kuyunithi eyinhloko yemoto yakho, efaka:\n\n"<li>"I-akhawunti yakho ye-Google"</li>\n<li>"Isistimu nedatha yohlelo lokusebenza nezilungiselelo"</li>\n<li>"Izinhlelo zokusebenza ezilandiwe"</li></string>
+    <string name="master_clear_accounts" msgid="7797522012993567494">"Manje ungene ngemvume kuma-akhawunti alandelayo:"</string>
+    <string name="master_clear_other_users_present" msgid="8383376863095743337">"Kukhona abanye abasebenzisi abakhona kule moto."</string>
+    <string name="master_clear_button_text" msgid="8010754220392741160">"Setha kabusha imoto"</string>
+    <string name="master_clear_confirm_title" msgid="8646455623132887370">"Setha kabusha?"</string>
+    <string name="master_clear_confirm_desc" msgid="8920446291698038558">"Sula lonke ulwazi lakho lomuntu siqu kanye nezinhlelo zokusebenza ezilandiwe? Awukwazi ukuhlehlisa lesi senzo!"</string>
+    <string name="master_clear_confirm_button_text" msgid="7981254968588121786">"Sula yonke into"</string>
+    <string name="master_clear_progress_title" msgid="7087480656932674774">"Iyasula"</string>
+    <string name="master_clear_progress_text" msgid="3440789441935303176">"Sicela ulinde..."</string>
     <string name="date_and_time_settings_title" msgid="4058492663544475485">"Idethi nesikhathi"</string>
     <string name="date_and_time_settings_title_setup_wizard" msgid="7580119979694174107">"Setha idethi nesikhathi"</string>
     <string name="date_and_time_settings_summary" msgid="7669856855390804666">"Setha idethi, isikhathi, umkhwawulo wesikhathi namafomethi"</string>
@@ -165,23 +277,59 @@
     <string name="zone_list_menu_sort_by_timezone" msgid="4944880536057914136">"Hlunga ngesikhathi somkhawulo"</string>
     <string name="date_picker_title" msgid="1533614225273770178">"Idethi"</string>
     <string name="time_picker_title" msgid="7436045944320504639">"Isikhathi"</string>
-    <string name="user_add_user_menu" msgid="5319151436895941496">"Engeza umsebenzisi"</string>
-    <string name="user_add_account_menu" msgid="6625351983590713721">"Engeza i-akhawunti"</string>
-    <string name="user_delete_user_description" msgid="2300280525351142435">"Susa umsebenzisi"</string>
-    <string name="user_new_user_name" msgid="7115771396412339662">"Umsebenzisi omusha"</string>
-    <string name="user_guest" msgid="3465399481257448601">"Isivakashi"</string>
     <string name="user_admin" msgid="1535484812908584809">"Mqondisi"</string>
     <string name="signed_in_admin_user" msgid="1267225622818673274">"Ungene ngemvume njengomlawuli"</string>
+    <string name="grant_admin_permissions_title" msgid="4628430467359951437">"Zonke izimvume zomphathi"</string>
+    <string name="grant_admin_permissions_button_text" msgid="988239414372882401">"Yenza umphathi"</string>
+    <string name="grant_admin_permissions_message" msgid="1751910369004774830">"Umsebenzisi uzokwazi ukususa abasebenzisi, kufaka phakathi abanye abaphathi, nokusetha kabusha isistimu njengasekuqaleni."</string>
+    <string name="action_not_reversible_message" msgid="740401337875726973">"Lesi senzo asiphindeli emuva."</string>
+    <string name="confirm_grant_admin" msgid="7852596890218647682">"Yebo, yenza umphathi"</string>
+    <string name="create_user_permission_title" msgid="7781550880565935298">"Dala abasebenzisi abasha"</string>
+    <string name="outgoing_calls_permission_title" msgid="1230180443712099293">"Yenza amakholi wefoni"</string>
+    <string name="sms_messaging_permission_title" msgid="6099328509729071243">"Imilayezo ngedatha yeselula yemoto"</string>
+    <string name="install_apps_permission_title" msgid="3099705360827925296">"Faka izinhlelo zokusebenza ezintsha"</string>
+    <string name="uninstall_apps_permission_title" msgid="8448422340567430659">"Khipha izinhlelo zokusebenza"</string>
+    <string name="user_add_user_menu" msgid="5319151436895941496">"Engeza umsebenzisi"</string>
+    <string name="user_new_user_name" msgid="7115771396412339662">"Umsebenzisi omusha"</string>
+    <string name="user_add_user_title" msgid="7458813670614932479">"Engeza umsebenzisi omusha?"</string>
+    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha izikhala zakhe."</string>
+    <string name="user_add_user_message_update" msgid="1528170913388932459">"Noma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza zabanye abasebenzisi."</string>
+    <string name="user_limit_reached_title" msgid="8803355734556061238">"Kufinyelelwe kumkhawulo womsebenzisi"</string>
+    <plurals name="user_limit_reached_message" formatted="false" msgid="2651922256448824747">
+      <item quantity="one">Ungadala kufikela kubasebenzisi abangu-<xliff:g id="COUNT">%d</xliff:g>.</item>
+      <item quantity="other">Ungadala kufikela kubasebenzisi abangu-<xliff:g id="COUNT">%d</xliff:g>.</item>
+    </plurals>
+    <string name="add_user_error_title" msgid="3206300411663817038">"Yehlulekile ukudala umsebenzisi omusha"</string>
+    <string name="delete_user_dialog_title" msgid="3422867434431562007">"Susa lo msebenzisi?"</string>
+    <string name="delete_user_dialog_message" msgid="4346777604351785057">"Zonke izinhlelo zokusebenza nedatha kuzosuswa."</string>
+    <string name="delete_user_error_title" msgid="7609819398530124827">"Yehlulekile ukususa umsebenzisi."</string>
+    <string name="delete_user_error_dismiss" msgid="429156446763738273">"Chitha"</string>
+    <string name="delete_user_error_retry" msgid="5116434895572670563">"Zama futhi"</string>
+    <string name="delete_last_user_dialog_title" msgid="3644392025675369680">"Susa umsebenzisi wokugcina?"</string>
+    <string name="delete_last_user_admin_created_message" msgid="1856897729010319054">"Ngemuva kokususa umsebenzisi osele wale moto, umsebenzisi omusha womlawuli uzodalwa."</string>
+    <string name="delete_last_user_system_setup_required_message" msgid="8550730509371697989">"Yonke idatha, izilungiselelo, kanye nezinhlelo zokusebenza eziphathelene nalo msebenzisi kuzosuswa. Uzodinga ukusetha isistimu futhi."</string>
+    <string name="choose_new_admin_title" msgid="1915428454917699587">"Khetha umlawuli omusha"</string>
+    <string name="choose_new_admin_message" msgid="7468286545352043354">"Udinga okungenani umlawuli oyedwa. Ukuze ususe lo, qala ngokukhetha ukumiselela."</string>
+    <string name="choose_new_admin_label" msgid="5987653639387437939">"Khetha umlawuli"</string>
+    <string name="user_guest" msgid="3465399481257448601">"Isivakashi"</string>
+    <string name="start_guest_session" msgid="4438752398760283201">"Isivakashi"</string>
     <string name="user_switch" msgid="6544839750534690781">"Shintsha"</string>
     <string name="current_user_name" msgid="3813671533249316823">"Wena (%1$s)"</string>
     <string name="user_name_label" msgid="3210832645046206845">"Igama"</string>
     <string name="user_summary_not_set_up" msgid="1473688119241224145">"Akusethiwe"</string>
     <string name="edit_user_name_title" msgid="6890782937520262478">"Hlela igama lomsebenzisi"</string>
     <string name="users_list_title" msgid="770764290290240909">"Abasebenzisi"</string>
+    <string name="user_details_admin_title" msgid="3530292857178371891">"Izimvume zinikwe ku-%1$s"</string>
     <string name="accounts_settings_title" msgid="436190037084293471">"Ama-akhawunti"</string>
-    <string name="user_details_title" msgid="1104762783367701498">"Umsebenzisi"</string>
+    <string name="user_add_account_menu" msgid="6625351983590713721">"Engeza i-akhawunti"</string>
     <string name="no_accounts_added" msgid="5148163140691096055">"Awekho ama-akhawunti angeziwe"</string>
     <string name="account_list_title" msgid="7631588514613843065">"Ama-akhawunti e-<xliff:g id="CURRENT_USER_NAME">%1$s</xliff:g>"</string>
+    <string name="account_auto_sync_title" msgid="3238816995364191432">"Vumelanisa ngokuzenzakalelayo idatha"</string>
+    <string name="account_auto_sync_summary" msgid="6963837893148304128">"Vumela izinhlelo zokusebenza ziqalise kabusha idatha"</string>
+    <string name="data_usage_auto_sync_on_dialog_title" msgid="6027487764261344033">"Vula ukuvumelanisa idatha?"</string>
+    <string name="data_usage_auto_sync_on_dialog" msgid="2770233931307606956">"Noma yiziphi izinguquko ozenzayo kuma-akhawunti wakho kuwebhu kuzokopishelwa ngokuzenzakalela kufoni yakho.\n\nAmanye ama-akhawunti angahle akopishe ngokuzenzakalelayo noma yiziphi izinguquko ozenzayo kufoni kuya kuwebhu. I-Akhawunti ye-Google isebenza ngale ndlela."</string>
+    <string name="data_usage_auto_sync_off_dialog_title" msgid="1235955038330202536">"Vala ukuvumelanisa idatha?"</string>
+    <string name="data_usage_auto_sync_off_dialog" msgid="5040873073016183315">"Lokhu kuzosebenzisa idatha, kodwa uzodinga ukuvumelanisa i-akhawunti ngayinye ukuze uqoqe ulwazi lwakamuva. Futhi ngeke uthole izaziso uma izibuyekezo zivela."</string>
     <string name="account_details_title" msgid="7529571432258448573">"Ulwazi lwe-akhawunti"</string>
     <string name="add_account_title" msgid="5988746086885210040">"Engeza i-akhawunti"</string>
     <string name="add_an_account" msgid="1072285034300995091">"Engeza i-akhawunti"</string>
@@ -189,16 +337,20 @@
     <string name="remove_account_title" msgid="8840386525787836381">"Susa i-akhawunti"</string>
     <string name="really_remove_account_title" msgid="3555164432587924900">"Susa i-akhawunti?"</string>
     <string name="really_remove_account_message" msgid="4296769280849579900">"Ingabe ngempela ufuna ukukhipha le-akhawunti? Ukukukhipha kuzosusa yonke imiyalezo yayo, othintana nabo, neminye imininingo esuka kudivayisi!"</string>
-    <string name="remove_account_failed" msgid="7472511529086294087">"Lolu shintsho aluvunyelwe umlawuli wakho"</string>
-    <string name="really_remove_user_title" msgid="4990029019291756762">"Khipha lomsebenzisi?"</string>
-    <string name="really_remove_user_message" msgid="3828090902833944533">"Zonke izinhlelo zokusebenza nedatha kuzosuswa."</string>
-    <string name="remove_user_error_title" msgid="2038275458657689420">"Yehlulekile ukususa umsebenzisi."</string>
-    <string name="remove_user_error_message" msgid="6803947507134323358">"Zama futhi?"</string>
-    <string name="remove_user_error_dismiss" msgid="4006591159426844335">"Cashisa"</string>
-    <string name="remove_user_error_retry" msgid="8291692909396995093">"Zama futhi"</string>
-    <string name="user_add_user_title" msgid="7458813670614932479">"Engeza umsebenzisi omusha?"</string>
-    <string name="user_add_user_message_setup" msgid="6030901156040053106">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha izikhala zakhe."</string>
-    <string name="user_add_user_message_update" msgid="1528170913388932459">"Noma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza zabanye abasebenzisi."</string>
+    <string name="remove_account_error_title" msgid="8368044943174826635">"Yehlulekile ukususa i-akhawunti."</string>
+    <string name="account_sync_title" msgid="6541844336300236915">"Ukuvumelanisa kwe-akhawunti"</string>
+    <string name="account_sync_summary_some_on" msgid="4525960296068027182">"Ukuvumelanisa kuvulelwe okungu-<xliff:g id="ID_1">%1$d</xliff:g> kuzinto ezingu-<xliff:g id="ID_2">%2$d</xliff:g>"</string>
+    <string name="account_sync_summary_all_on" msgid="3652264471870312725">"Ukuvumelanisa kuvulelwe zonke izinto"</string>
+    <string name="account_sync_summary_all_off" msgid="6550959714035312414">"Ukuvumelanisa kuvalelwe zonke izinto"</string>
+    <string name="sync_disabled" msgid="393531064334628258">"Ukuvumelanisa KUVALIWE"</string>
+    <string name="sync_error" msgid="6698021343089247914">"Iphutha lokuvumelanisa"</string>
+    <string name="last_synced" msgid="4745124489150101529">"Ukuvumelanisa kokugcina <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+    <string name="sync_in_progress" msgid="1237573373537382416">"Vumelanisa manje..."</string>
+    <string name="sync_one_time_sync" msgid="491707183321353107">"Thepha ukuze uvumelanise manje<xliff:g id="LAST_SYNC_TIME">
+%1$s</xliff:g>"</string>
+    <string name="sync_button_sync_now" msgid="5767643057970371315">"Vumelanisa manje"</string>
+    <string name="sync_button_sync_cancel" msgid="7739510554513641393">"Khansela ukuvumelanisa"</string>
+    <string name="sync_is_failing" msgid="5766255460901806206">"Ukuvumelanisa okwamanje kubhekene nenkinga. Kuzobuya maduze."</string>
     <string name="security_settings_title" msgid="6955331714774709746">"Ukuvikela"</string>
     <string name="security_settings_subtitle" msgid="2244635550239273229">"Isikrini sivaliwe"</string>
     <string name="security_lock_none" msgid="1054645093754839638">"Lutho"</string>
@@ -206,7 +358,7 @@
     <string name="security_lock_pin" msgid="4891899974369503200">"I-PIN"</string>
     <string name="security_lock_password" msgid="4420203740048322494">"Iphasiwedi"</string>
     <string name="lock_settings_picker_title" msgid="6590330165050361632">"Khetha uhlobo lokukhiya"</string>
-    <string name="screen_lock_options" msgid="7023338635352915768">"Izinketho zokukhiya isikrini"</string>
+    <string name="screen_lock_options" msgid="8531177937577168185">"Izinketho zokukhiya"</string>
     <string name="lock_settings_enter_pattern" msgid="4826034565853171624">"Faka iphethini yakho"</string>
     <string name="lockpattern_confirm_button_text" msgid="7784925958324484965">"Qinisekisa"</string>
     <string name="lockpattern_restart_button_text" msgid="9355771277617537">"Dweba kabusha"</string>
@@ -216,7 +368,7 @@
     <string name="set_screen_lock" msgid="5239317292691332780">"Setha ukukhiya kwesikrini"</string>
     <string name="lockscreen_choose_your_pin" msgid="1645229555410061526">"Khetha i-PIN yakho"</string>
     <string name="lockscreen_choose_your_pattern" msgid="6801175111142593404">"Khetha iphathini yakho"</string>
-    <string name="lockscreen_choose_your_password" msgid="5703747830308181428">"Khetha iphasiwedi yakho"</string>
+    <string name="lockscreen_choose_your_password" msgid="4487577710136014069">"Khetha iphasiwedi yakho"</string>
     <string name="current_screen_lock" msgid="637651611145979587">"Ukukhiya isikrini kwamanje"</string>
     <string name="choose_lock_pattern_message" msgid="6242765203541309524">"Ngokuphepha, setha iphethini"</string>
     <string name="lockpattern_retry_button_text" msgid="4655398824001857843">"Sula"</string>
@@ -288,7 +440,28 @@
     <string name="lockpassword_password_blacklisted_by_admin" msgid="7965893810326503891">"Amaphasiwedi avamile avinjelwe umlawuli wakho we-IT. Zama iphasiwedi ehlukile."</string>
     <string name="lockpassword_pin_no_sequential_digits" msgid="38813552228809240">"Ukwenyuka, ukwehla, noma ukulandelana okuphindiwe kwamadijithi akuvunyelwe."</string>
     <string name="setup_lock_settings_options_button_label" msgid="3337845811029780896">"Izinketho zokukhiya isikrini"</string>
+    <string name="build_info_fmt" msgid="5592554123908086426">"<xliff:g id="FINGERPRINT">%1$s</xliff:g>\n<xliff:g id="DATE">%2$s</xliff:g> : <xliff:g id="NUM_DAYS">%3$s</xliff:g> izinsuku ezedlule"</string>
+    <string name="add_device_title" msgid="8452168024017866232">"Engeza idivayisi ethenjiwe"</string>
+    <string name="trusted_device" msgid="5637378361866787603">"Amadivayisi athenjwa"</string>
+    <plurals name="trusted_device_subtitle" formatted="false" msgid="462041049834264945">
+      <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> amadivayisi</item>
+      <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> amadivayisi</item>
+    </plurals>
+    <string name="remove_device_message" msgid="6447820559674148349">"I-<xliff:g id="CONNECTED_DEVICE_NAME_0">%1$s</xliff:g> yakho izovula le moto uma ixhunyiwe. Uma omunye umuntu athatha i-<xliff:g id="CONNECTED_DEVICE_NAME_1">%1$s</xliff:g>, angakwazi ukufinyelela le divayisi"</string>
+    <string name="trusted_device_confirm_button" msgid="102354635014627996">"Qinisekisa"</string>
+    <string name="trusted_device_remove_button" msgid="6140476996063415420">"Susa idivayisi ethenjiwe"</string>
+    <string name="trusted_device_done_button" msgid="8481956533222625296">"Kwenziwe"</string>
+    <string name="add_trusted_device_instruction" msgid="109228038968439923">"Sebenzisa uhlelo lokusebenza elingumngane ukuze usethe idivayisi ethembekile. Uma ususethile, uzokwazi ukuvula iphrofayela yakho yomsebenszisi uma ifoni yakho itholwe imoto"</string>
+    <string name="trusted_device_download_app" msgid="6971096140154499983">"1. Landa uhlelo lokusebenza elingumngane efonini yakho"</string>
+    <string name="trusted_device_select_device" msgid="198902765179270739">"2. Khetha u-<xliff:g id="CAR_NAME">%1$s</xliff:g> efonini yakho ukuze ubhanqe amadivayisi"</string>
+    <string name="trusted_device_safety_alert" msgid="8937542424166378247">"I-Smart Lock ayikwazi ukuthola izici zokuphepha zale divayisi. Ukuze usize ukuvikela imoto yakho, idivayisi ethembekile izokwazi kuphela ukugcina imoto yakho ivulekile uma isivele ivulwe nguwe. Idivayisi yakho ethembekile ingagcina imoto yakho ivuliwe uma iseduze, ngisho noma othile ayibambile."</string>
+    <string name="trusted_device_pairing_code_dialog_title" msgid="6551880047490332731">"Engeza i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> njengedivayisi ethenjiwe"</string>
+    <string name="trusted_device_success_enrollment_toast" msgid="3275482710090416690">"I-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ingezwe ngempumelelo njengedivayisi ethembekile"</string>
+    <string name="trusted_device_fail_enrollment_toast" msgid="6801324174861209092">"Ukubhaliswa kwe-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> kwehlulekiile"</string>
+    <string name="trusted_device_set_authentication_reminder" msgid="5947077589994822305">"Ukungeza idivayisi ethembekile kudinga ukuthi usethe indlela yokugunyaza elandelayo. Uma ungenayo idivayisi yakho ethembekile, ukugunyaza kuzodingeka ukufinyelela iphrofayela yakho."</string>
     <string name="forget" msgid="3971143908183848527">"Khohlwa"</string>
+    <string name="connect" msgid="5861699594602380150">"Xhuma"</string>
+    <string name="disconnect" msgid="6140789953324820336">"Nqamula"</string>
     <string name="delete_button" msgid="5840500432614610850">"Susa"</string>
     <string name="remove_button" msgid="6664656962868194178">"Susa"</string>
     <string name="cancel" msgid="750286395700355455">"Khansela"</string>
@@ -298,8 +471,7 @@
     <string name="exit_retail_mode_dialog_title" msgid="7970631760237469168">"Phuma kumodi yedemo"</string>
     <string name="exit_retail_mode_dialog_body" msgid="8314316171782527301">"Lokhu kuzosusa i-akhawunti ye-demo futhi isethe kabusha idatha yesistimu. Yonke idatha yomsebenzisi izolahleka."</string>
     <string name="exit_retail_mode_dialog_confirmation_button_text" msgid="3147249675355968649">"Phuma kudemo"</string>
-    <string name="suggestion_primary_button" msgid="6421115494714083020">"qedela ukusetha"</string>
-    <string name="suggestion_secondary_button" msgid="7075088546904464681">"hhayi manje"</string>
+    <string name="suggestion_dismiss_button" msgid="4539412646977050641">"CASHISA"</string>
     <string name="restricted_while_driving" msgid="6217369093121968299">"Isici asitholakali ngenkathi ushayela."</string>
     <string name="add_user_restricted_while_driving" msgid="6384004350628271556">"Ayikwazi ukungeza umsebenzisi ngenkathi ushayela."</string>
 </resources>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
new file mode 100644
index 0000000..62cb3be
--- /dev/null
+++ b/res/values/arrays.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<resources>
+
+    <!-- Values for premium SMS permission selector [CHAR LIMIT=30] -->
+    <string-array name="premium_sms_access_values">
+        <!-- Ask user before sending to premium SMS short code. -->
+        <item>Ask</item>
+        <!-- Never allow app to send to premium SMS short code. -->
+        <item>Never allow</item>
+        <!-- Always allow app to send to premium SMS short code. -->
+        <item>Always allow</item>
+    </string-array>
+
+</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 9ed19a7..c22af54 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -1,23 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
-** Copyright 2018, 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.
-*/
+    Copyright 2018 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.
 -->
 
-<!-- Defines the attributes and values used in res/xml/car_volume_items.xml -->
 <resources>
     <declare-styleable name="carVolumeItems"/>
 
@@ -45,11 +42,44 @@
         </attr>
 
         <!-- Title and icon resource ids to render on UI -->
-        <attr name="title" format="reference"/>
+        <attr name="titleText" format="reference"/>
         <attr name="icon" format="reference"/>
     </declare-styleable>
 
     <declare-styleable name="PinPadView">
-        <attr name="enterKeyDrawable" format="reference"/>
+        <attr name="layout" format="reference"/>
     </declare-styleable>
+
+    <declare-styleable name="Preference">
+        <!-- Classname of a PreferenceController corresponding to the preference -->
+        <attr name="controller" format="string"/>
+    </declare-styleable>
+
+    <declare-styleable name="TwoActionPreference">
+        <!-- Determines if the secondary action is initially shown -->
+        <attr name="actionShown" format="boolean"/>
+    </declare-styleable>
+
+    <declare-styleable name="ProgressBarPreference">
+        <attr name="min" format="integer"/>
+        <attr name="max" format="integer"/>
+        <attr name="progress" format="integer"/>
+        <attr name="minLabel" format="string"/>
+        <attr name="maxLabel" format="string"/>
+    </declare-styleable>
+
+    <attr name="wifiSignalColor" format="color"/>
+    <attr name="iconColor" format="color"/>
+    <attr name="dividerColor" format="color"/>
+    <attr name="userSwitcherBackground" format="reference"/>
+    <attr name="userSwitcherCurrentUserColor" format="color"/>
+    <attr name="userSwitcherAddIconColor" format="color"/>
+    <attr name="userSwitcherNameTextAppearance" format="reference"/>
+    <attr name="userSwitcherAddIconBackgroundColor" format="color"/>
+    <attr name="quickSettingsEnabledColor" format="color"/>
+    <attr name="quickSettingsDisabledColor" format="color"/>
+    <attr name="quickSettingsIconEnabledColor" format="color"/>
+    <attr name="quickSettingsIconDisabledColor" format="color"/>
+    <attr name="suggestionsPrimaryColor" format="color"/>
+    <attr name="suggestionsSecondaryColor" format="color"/>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
deleted file mode 100644
index 4197d04..0000000
--- a/res/values/colors.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2018 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.
--->
-<resources>
-    <color name="lock_pattern_background">#353839</color>
-
-    <color name="toggle_bg_disabled">@color/car_grey_400</color>
-    <color name="toggle_icon_disabled">@color/car_grey_800</color>
-    <color name="seekbar_track">@color/car_grey_700</color>
-
-    <color name="google_blue_600_dark">#1A73E8</color>
-    <color name="google_blue_600_light">#2581DF</color>
-    <color name="google_blue_600">@color/google_blue_600_dark</color>
-
-    <!-- colors for user switcher -->
-    <color name="car_user_switcher_background_color">@color/car_card</color>
-    <color name="car_user_switcher_name_text_color">@color/car_body1</color>
-    <color name="car_user_switcher_add_user_background_color">@color/car_grey_200</color>
-    <color name="car_user_switcher_add_user_add_sign_color">@color/car_body1</color>
-    <color name="car_user_switcher_current_user_color">@color/car_teal_700</color>
-</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
new file mode 100644
index 0000000..9a31b51
--- /dev/null
+++ b/res/values/config.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<resources>
+    <!-- The fully qualified class name of the fragment to launch when the settings application starts. -->
+    <string name="config_settings_hierarchy_root_fragment" translatable="false">com.android.car.settings.quicksettings.QuickSettingFragment</string>
+    <!-- Whether system_update_settings should be shown or not. -->
+    <bool name="config_show_system_update_settings">true</bool>
+    <!-- Whether Wi-Fi Mac address should be shown or not. -->
+    <bool name="config_show_wifi_mac_address">true</bool>
+    <!-- Whether to show regulatory info or not. -->
+    <bool name="config_show_regulatory_info">true</bool>
+    <!-- Whether premium SMS should be shown or not. -->
+    <bool name="config_show_premium_sms">true</bool>
+    <!-- Whether exit button in settings' root action bar should be shown or not -->
+    <bool name="config_show_settings_root_exit_icon">true</bool>
+    <!-- Whether all preferences should always ignore UX Restrictions -->
+    <bool name="config_always_ignore_ux_restrictions">false</bool>
+    <!-- Array of Preference Keys that ignore UX Restrictions -->
+    <string-array name="config_ignore_ux_restrictions">
+        <item>@string/pk_display_settings_entry</item>
+        <item>@string/pk_sound_settings_entry</item>
+        <item>@string/pk_storage_settings_entry</item>
+        <item>@string/pk_network_and_internet_entry</item>
+        <item>@string/pk_wifi_settings_entry</item>
+        <item>@string/pk_bluetooth_settings_entry</item>
+    </string-array>
+
+    <!-- The component which listens for the enabling of developer options. -->
+    <string name="config_dev_options_module" translatable="false">com.android.car.developeroptions/.Settings$DevelopmentSettingsDashboardActivity</string>
+</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 9105065..9e7cba8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -1,51 +1,134 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!--
+    Copyright 2018 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
+    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
+         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.
+    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.
 -->
 
-
 <resources>
-    <dimen name="seekbar_track_height">6dp</dimen>
-    <dimen name="seekbar_track_corner">3dp</dimen>
-    <dimen name="seekbar_padding_top">10dp</dimen>
-    <dimen name="switch_end_padding">5dp</dimen>
-    <dimen name="double_icon_size">112dp</dimen>
+    <dimen name="icon_size">@*android:dimen/car_primary_icon_size</dimen>
+    <dimen name="touch_target_size">@*android:dimen/car_touch_target_size</dimen>
+    <dimen name="divider_height">@*android:dimen/car_list_divider_height</dimen>
+    <dimen name="divider_inset_left">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="divider_inset_right">@*android:dimen/car_keyline_1</dimen>
 
-    <dimen name="action_bar_end_widget_margin_end">46dp</dimen>
-    <dimen name="optical_center_offset">1dp</dimen>
+    <dimen name="button_min_width">@*android:dimen/car_button_min_width</dimen>
+    <dimen name="button_fading_edge_length">40dp</dimen>
+    <dimen name="button_ripple_radius">@*android:dimen/car_radius_1</dimen>
 
-    <dimen name="tile_top_bottom_padding">15dp</dimen>
-    <dimen name="line_item_top_margin">25dp</dimen>
+    <!-- Action Bar -->
+    <dimen name="action_bar_height">@*android:dimen/car_app_bar_height</dimen>
+    <!-- Guideline begin margin for when not showing exit icon -->
+    <dimen name="action_bar_no_icon_start_margin">@*android:dimen/action_bar_button_margin</dimen>
 
-    <integer name="bluetooth_name_length">32</integer>
+    <!-- Suggestions -->
+    <dimen name="suggestions_top_bottom_margin">@*android:dimen/car_padding_4</dimen>
+    <dimen name="suggestions_corner_radius">@*android:dimen/car_radius_3</dimen>
+    <!-- Padding between the top of the card and the text -->
+    <dimen name="suggestions_text_padding_top">@*android:dimen/car_padding_2</dimen>
+    <!-- Padding between the bottom of the text and the action bar -->
+    <dimen name="suggestions_text_padding_bottom">@*android:dimen/car_padding_2</dimen>
+    <!-- The margin between the main suggestion text and the subtext -->
+    <dimen name="suggestions_subtext_margin_top">@*android:dimen/car_padding_1</dimen>
+    <dimen name="suggestions_padding_start">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="suggestions_padding_end">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="suggestions_action_bar_height">@*android:dimen/car_card_action_bar_height</dimen>
 
+    <!-- Quick Settings -->
+    <dimen name="brightness_seekbar_margin_bottom">@*android:dimen/car_padding_4</dimen>
+    <dimen name="brightness_seekbar_height">@*android:dimen/car_single_line_list_item_height</dimen>
+    <dimen name="brightness_seekbar_track_height">6dp</dimen>
+    <dimen name="brightness_seekbar_track_corner">3dp</dimen>
+    <dimen name="brightness_knob_size">44dp</dimen>
+    <dimen name="tile_margin_start">@*android:dimen/car_padding_2</dimen>
+    <dimen name="tile_margin_end">@*android:dimen/car_padding_2</dimen>
+    <dimen name="tile_margin_bottom">@*android:dimen/car_padding_5</dimen>
+    <dimen name="tile_padding">10dp</dimen>
+    <dimen name="tile_icon_margin_bottom">@*android:dimen/car_padding_4</dimen>
+    <dimen name="circle_ripple_bg_radius">90dp</dimen>
+
+    <!-- Bluetooth -->
+    <dimen name="bluetooth_pin_dialog_margin_start">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="bluetooth_pin_dialog_margin_end">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="bluetooth_pin_dialog_section_height">
+        @*android:dimen/car_single_line_list_item_height
+    </dimen>
+    <dimen name="bluetooth_pin_dialog_text_margin_start">@*android:dimen/car_keyline_3</dimen>
+    <dimen name="bluetooth_pin_dialog_text_margin_end">@*android:dimen/car_keyline_3</dimen>
+    <dimen name="bluetooth_pin_dialog_subtext_margin_top">@*android:dimen/car_padding_1</dimen>
+
+    <!-- Edit Username -->
+    <dimen name="edit_username_padding_start">@*android:dimen/car_margin</dimen>
+    <dimen name="edit_username_padding_end">@*android:dimen/car_margin</dimen>
+    <dimen name="edit_username_text_padding_start">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="edit_username_text_padding_end">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="edit_username_text_padding_top">@*android:dimen/car_padding_3</dimen>
+
+    <!-- Security -->
+    <dimen name="choose_title_text_margin_bottom">@*android:dimen/car_padding_2</dimen>
+    <dimen name="choose_pin_title_text_margin_bottom">@*android:dimen/car_padding_5</dimen>
+    <dimen name="pin_password_entry_padding_horizontal">@*android:dimen/car_padding_2</dimen>
     <dimen name="pin_pad_key_width">120dp</dimen>
     <dimen name="pin_pad_key_height">80dp</dimen>
     <dimen name="pin_pad_key_margin">12dp</dimen>
     <dimen name="confirm_pattern_dimension">350dp</dimen>
-    <dimen name="pin_pad_icon_size">32dp</dimen>
+    <dimen name="confirm_lock_message_vertical_spacing">@*android:dimen/car_padding_2</dimen>
 
-    <dimen name="toggle_padding">10dp</dimen>
-    <dimen name="toggle_ripple">90dp</dimen>
-    <dimen name="brightness_knob_size">44dp</dimen>
+    <!-- User Switcher -->
+    <dimen name="user_switcher_image_avatar_size">96dp</dimen>
+    <dimen name="user_switcher_vertical_spacing_between_users">@*android:dimen/car_padding_5
+    </dimen>
+    <dimen name="user_switcher_vertical_spacing_between_name_and_avatar">
+        @*android:dimen/car_padding_4
+    </dimen>
+    <dimen name="user_switcher_current_user_circle_width">126dp</dimen>
+    <dimen name="user_switcher_current_user_circle_stroke_width">7dp</dimen>
 
-    <!-- dimensions for the car user switcher -->
-    <dimen name="car_user_switcher_name_text_size">@dimen/car_body1_size</dimen>
-    <dimen name="car_user_switcher_image_avatar_size">@dimen/car_large_avatar_size</dimen>
-    <dimen name="car_user_switcher_vertical_spacing_between_users">@dimen/car_padding_5</dimen>
-    <dimen name="car_user_switcher_vertical_spacing_between_name_and_avatar">@dimen/car_padding_4</dimen>
-    <dimen name="car_user_switcher_margin_top">@dimen/car_padding_4</dimen>
-    <dimen name="car_user_switcher_current_user_circle_width">126dp</dimen>
-    <dimen name="car_user_switcher_current_user_circle_stroke_width">7dp</dimen>
-</resources>
\ No newline at end of file
+    <!-- Preferences -->
+    <dimen name="preference_padding_top">@dimen/car_padding_2</dimen>
+    <dimen name="preference_padding_bottom">@dimen/car_padding_2</dimen>
+    <dimen name="two_action_preference_divider_width">1dp</dimen>
+    <dimen name="usage_indicator_preference_title_margin_top">@*android:dimen/car_padding_2</dimen>
+    <dimen name="usage_indicator_preference_title_margin_bottom">@*android:dimen/car_padding_2</dimen>
+    <dimen name="usage_indicator_preference_progressbar_height">32dp</dimen>
+    <dimen name="usage_indicator_preference_label_margin_top">@*android:dimen/car_padding_1</dimen>
+    <dimen name="usage_indicator_preference_label_margin_bottom">@*android:dimen/car_padding_4</dimen>
+    <dimen name="usage_indicator_preference_summary_margin_bottom">@*android:dimen/car_padding_2</dimen>
+    <dimen name="data_usage_summary_preference_padding_bottom">@*android:dimen/car_padding_2</dimen>
+    <dimen name="data_usage_summary_preference_button_margin_top">@*android:dimen/car_padding_2</dimen>
+    <dimen name="data_usage_summary_preference_button_height">@*android:dimen/car_button_height</dimen>
+    <dimen name="data_usage_summary_preference_button_min_width">@*android:dimen/car_button_min_width</dimen>
+    <dimen name="progress_bar_preference_progressbar_margin_top">@*android:dimen/car_padding_1</dimen>
+    <dimen name="progress_bar_preference_label_margin_top">@*android:dimen/car_padding_0</dimen>
+    <dimen name="progress_bar_preference_padding_top">@*android:dimen/car_padding_1</dimen>
+    <dimen name="progress_bar_preference_padding_bottom">@*android:dimen/car_padding_1</dimen>
+
+    <!-- Data usage -->
+    <dimen name="usage_number_text_size">36sp</dimen>
+    <dimen name="usage_pickers_margin_vertical">@*android:dimen/car_padding_2</dimen>
+    <dimen name="usage_pickers_text_margin_end">@*android:dimen/car_padding_5</dimen>
+    <dimen name="usage_bytes_picker_margin_horizontal">@*android:dimen/car_padding_5</dimen>
+    <dimen name="usage_bytes_picker_edit_text_min_width">360dp</dimen>
+
+    <!-- Alert Dialog -->
+    <dimen name="alert_dialog_margin_top">@*android:dimen/car_padding_4</dimen>
+    <dimen name="alert_dialog_margin_bottom">@*android:dimen/car_padding_4</dimen>
+    <dimen name="alert_dialog_title_margin_bottom">@*android:dimen/car_padding_4</dimen>
+    <dimen name="alert_dialog_title_margin_start">@*android:dimen/car_padding_3</dimen>
+    <dimen name="alert_dialog_title_margin_end">@*android:dimen/car_padding_3</dimen>
+    <dimen name="alert_dialog_edit_text_margin_start">@*android:dimen/car_padding_3</dimen>
+    <dimen name="alert_dialog_edit_text_margin_end">@*android:dimen/car_padding_3</dimen>
+    <dimen name="alert_dialog_password_checkbox_margin_end">@*android:dimen/car_padding_3</dimen>
+    <dimen name="alert_dialog_password_checkbox_margin_start">@*android:dimen/car_padding_3</dimen>
+    <dimen name="alert_dialog_password_checkbox_margin_top">@*android:dimen/car_padding_1</dimen>
+</resources>
diff --git a/res/values/floats.xml b/res/values/floats.xml
index 5db06cb..cbc4001 100644
--- a/res/values/floats.xml
+++ b/res/values/floats.xml
@@ -1,22 +1,22 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
+<!--
+    Copyright 2018 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
+    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
+         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.
+    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.
 -->
 
-
 <resources>
-  <!-- opacity -->
-  <item name="opacity_disabled" format="float" type="dimen">0.5</item>
-  <item name="opacity_enabled" format="float" type="dimen">1</item>
+    <!-- opacity -->
+    <item name="opacity_disabled" format="float" type="dimen">0.5</item>
+    <item name="opacity_enabled" format="float" type="dimen">1</item>
 </resources>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index cbaa8f2..91c9522 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-    Copyright (C) 2018 The Android Open Source Project
+    Copyright 2018 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
+         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,
@@ -14,6 +14,7 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
+
 <resources>
     <!-- Weight of the main content in the illustration_layout -->
     <integer name="content_weight">7</integer>
@@ -29,4 +30,19 @@
 
     <!-- user switcher column number TODO: move to support library-->
     <integer name="user_switcher_num_col">3</integer>
-</resources>
\ No newline at end of file
+
+    <!-- Number of times to select build number before enabling developer settings -->
+    <integer name="enable_developer_settings_click_count">7</integer>
+
+    <!-- Number of times to select build number before toast appears -->
+    <integer name="enable_developer_settings_clicks_to_show_toast_count">3</integer>
+
+    <!-- Maximum ems value for all settings buttons -->
+    <integer name="button_max_ems">9</integer>
+
+    <!-- Ems value for data usage bytes threshold picker -->
+    <integer name="data_usage_bytes_threshold_ems">15</integer>
+
+    <!-- Maximum size in pixels of default app icons -->
+    <integer name="default_app_safe_icon_size">500</integer>
+</resources>
diff --git a/res/values/internal_resources.xml b/res/values/internal_resources.xml
new file mode 100644
index 0000000..73286d4
--- /dev/null
+++ b/res/values/internal_resources.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<resources>
+    <bool name="config_automatic_brightness_available">@*android:bool/config_automatic_brightness_available</bool>
+    <integer name="config_networkAvoidBadWifi">@*android:integer/config_networkAvoidBadWifi</integer>
+
+    <!-- Progress bar preference resources -->
+    <color name="config_progress_background_tint">@*android:color/config_progress_background_tint</color>
+    <color name="white_disabled_material">@*android:color/white_disabled_material</color>
+</resources>
diff --git a/res/values/preference_keys.xml b/res/values/preference_keys.xml
new file mode 100644
index 0000000..5dcf88c
--- /dev/null
+++ b/res/values/preference_keys.xml
@@ -0,0 +1,392 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<!--
+    Identifiers for preferences. Namespaced with "pk" (Preference Key) to avoid conflicts.
+    Key values should be unique.
+-->
+<resources>
+    <!-- Homepage -->
+    <string name="pk_suggestions" translatable="false">suggestions</string>
+    <string name="pk_display_settings_entry" translatable="false">display_settings_entry</string>
+    <string name="pk_sound_settings_entry" translatable="false">sound_settings_entry</string>
+    <string name="pk_network_and_internet_entry" translatable="false">network_and_internet_entry
+    </string>
+    <string name="pk_wireless_extra_settings" translatable="false">wireless_extra_settings</string>
+    <string name="pk_bluetooth_settings_entry" translatable="false">bluetooth_settings_entry
+    </string>
+    <string name="pk_location_settings_entry" translatable="false">location_settings_entry</string>
+    <string name="pk_apps_and_notifications_settings_entry" translatable="false">
+        apps_and_notifications_settings_entry
+    </string>
+    <string name="pk_date_time_settings_entry" translatable="false">date_time_settings_entry
+    </string>
+    <string name="pk_users_settings_entry" translatable="false">users_settings_entry</string>
+    <string name="pk_accounts_settings_entry" translatable="false">accounts_settings_entry</string>
+    <string name="pk_storage_settings_entry" translatable="false">storage_settings_entry</string>
+    <string name="pk_security_settings_entry" translatable="false">security_settings_entry</string>
+    <string name="pk_system_settings_entry" translatable="false">system_settings_entry</string>
+    <string name="pk_device_extra_settings" translatable="false">device_extra_settings</string>
+    <string name="pk_personal_extra_settings" translatable="false">personal_extra_settings</string>
+
+    <!-- Network -->
+    <string name="pk_mobile_network_settings_entry" translatable="false">
+        mobile_network_settings_entry
+    </string>
+    <string name="pk_network_and_internet_extra_settings" translatable="false">
+        network_and_internet_extra_settings
+    </string>
+    <string name="pk_mobile_network_list" translatable="false">mobile_network_list</string>
+    <string name="pk_mobile_network_list_add_more" translatable="false">
+        mobile_network_list_add_more
+    </string>
+    <string name="pk_mobile_data_toggle" translatable="false">mobile_data_toggle</string>
+    <string name="pk_mobile_roaming_toggle" translatable="false">mobile_roaming_toggle</string>
+    <string name="pk_data_usage_settings_entry" translatable="false">data_usage_settings_entry
+    </string>
+    <string name="pk_data_usage_summary" translatable="false">data_usage_summary</string>
+    <string name="pk_data_warning_and_limit" translatable="false">data_warning_and_limit</string>
+    <string name="pk_data_usage_cycle" translatable="false">data_usage_cycle</string>
+    <string name="pk_data_warning_group" translatable="false">data_warning_group</string>
+    <string name="pk_data_set_warning" translatable="false">data_set_warning</string>
+    <string name="pk_data_warning" translatable="false">data_warning</string>
+    <string name="pk_data_limit_group" translatable="false">data_limit_group</string>
+    <string name="pk_data_set_limit" translatable="false">data_set_limit</string>
+    <string name="pk_data_limit" translatable="false">data_limit</string>
+    <string name="pk_app_data_usage" translatable="false">app_data_usage</string>
+    <string name="pk_app_data_usage_detail" translatable="false">app_data_usage_detail</string>
+    <string name="pk_wifi_tether_settings_entry" translatable="false">wifi_tether_settings_entry
+    </string>
+    <string name="pk_wifi_tether_security" translatable="false">wifi_tether_security</string>
+    <string name="pk_wifi_tether_ap_band" translatable="false">wifi_tether_ap_band</string>
+    <string name="pk_wifi_tether_auto_off" translatable="false">wifi_tether_auto_off</string>
+    <string name="pk_wifi_tether_password" translatable="false">wifi_tether_password</string>
+    <string name="pk_wifi_tether_name" translatable="false">wifi_tether_name</string>
+
+    <!-- WIFI -->
+    <string name="pk_wifi_settings_entry" translatable="false">wifi_settings_entry</string>
+    <string name="pk_wifi_frequency" translatable="false">wifi_frequency</string>
+    <string name="pk_wifi_signal_strength" translatable="false">wifi_signal_strength</string>
+    <string name="pk_wifi_security" translatable="false">wifi_security</string>
+    <string name="pk_wifi_mac_address" translatable="false">wifi_mac_address</string>
+    <string name="pk_wifi_ip" translatable="false">wifi_ip</string>
+    <string name="pk_wifi_ipv6" translatable="false">wifi_ipv6</string>
+    <string name="pk_wifi_gateway" translatable="false">wifi_gateway</string>
+    <string name="pk_wifi_subnet_mask" translatable="false">wifi_subnet_mask</string>
+    <string name="pk_wifi_dns" translatable="false">wifi_dns</string>
+    <string name="pk_wifi_link_speed" translatable="false">wifi_link_speed</string>
+    <string name="pk_wifi_list" translatable="false">wifi_list</string>
+    <string name="pk_add_wifi" translatable="false">add_wifi</string>
+    <string name="pk_wifi_status" translatable="false">wifi_status</string>
+    <string name="pk_add_wifi_network_name" translatable="false">add_wifi_network_name</string>
+    <string name="pk_add_wifi_security" translatable="false">add_wifi_security</string>
+    <string name="pk_add_wifi_password" translatable="false">add_wifi_password</string>
+    <string name="pk_wifi_preferences" translatable="false">wifi_preferences</string>
+    <string name="pk_wifi_cellular_fallback" translatable="false">wifi_cellular_fallback</string>
+    <string name="pk_enable_wifi_wakeup" translatable="false">enable_wifi_wakeup</string>
+
+    <!-- Bluetooth -->
+    <string name="pk_bluetooth_paired_devices" translatable="false">bluetooth_paired_devicesd
+    </string>
+    <string name="pk_bluetooth_pair_new_device" translatable="false">bluetooth_pair_new_device
+    </string>
+    <string name="pk_bluetooth_name" translatable="false">bluetooth_name</string>
+    <string name="pk_bluetooth_address" translatable="false">bluetooth_address</string>
+    <string name="pk_bluetooth_available_devices" translatable="false">bluetooth_available_devices
+    </string>
+    <string name="pk_bluetooth_device_name" translatable="false">bluetooth_device_name</string>
+    <string name="pk_bluetooth_device_profiles" translatable="false">bluetooth_device_profiles
+    </string>
+    <string name="pk_bluetooth_device_address" translatable="false">bluetooth_device_address
+    </string>
+    <string name="pk_bluetooth_device_picker" translatable="false">bluetooth_device_picker</string>
+
+    <!-- Applications and Notifications Settings -->
+    <string name="pk_applications_settings_screen_entry" translatable="false">
+        applications_settings_screen_entry
+    </string>
+    <string name="pk_default_applications_settings_entry" translatable="false">
+        default_applications_entry
+    </string>
+    <string name="pk_app_permissions_entry" translatable="false">app_permissions_entry</string>
+    <string name="pk_special_access_entry" translatable="false">special_access_entry</string>
+
+    <!-- Applications Settings -->
+    <string name="pk_all_applications_settings_list" translatable="false">
+        all_applications_settings_list
+    </string>
+    <string name="pk_application_extra_settings" translatable="false">
+        application_extra_settings
+    </string>
+
+    <!-- Application Details -->
+    <string name="pk_application_details_app" translatable="false">application_details_app</string>
+    <string name="pk_application_details_notifications" translatable="false">
+        application_details_notifications
+    </string>
+    <string name="pk_application_details_permissions" translatable="false">
+        application_details_permissions
+    </string>
+    <string name="pk_application_details_version" translatable="false">
+        application_details_version
+    </string>
+
+    <!-- Default apps Settings -->
+    <string name="pk_default_assist_and_voice" translatable="false">default_assist_and_voice
+    </string>
+    <string name="pk_default_assist" translatable="false">default_assist</string>
+    <string name="pk_assist_use_text_context" translatable="false">assist_use_text_context</string>
+    <string name="pk_assist_use_screenshot" translatable="false">assist_use_screenshot</string>
+    <string name="pk_default_voice_input" translatable="false">default_voice_input</string>
+    <string name="pk_default_voice_input_options" translatable="false">default_voice_input_options
+    </string>
+    <string name="pk_default_autofill_options" translatable="false">default_autofill_options
+    </string>
+    <string name="pk_opening_links_entry" translatable="false">opening_links_entry</string>
+    <string name="pk_opening_links_options" translatable="false">opening_links_options</string>
+    <string name="pk_opening_links_app_details_entry" translatable="false">
+        opening_links_app_details_entry
+    </string>
+    <string name="pk_opening_links_app_details" translatable="false">opening_links_app_details
+    </string>
+    <string name="pk_opening_links_app_details_state" translatable="false">
+        opening_links_app_details_state
+    </string>
+    <string name="pk_opening_links_app_details_urls" translatable="false">
+        opening_links_app_details_urls
+    </string>
+    <string name="pk_opening_links_app_details_reset" translatable="false">
+        opening_links_app_details_reset
+    </string>
+
+    <!-- Special App Access Settings -->
+    <string name="pk_modify_system_settings_entry" translatable="false">
+        modify_system_settings_entry
+    </string>
+    <string name="pk_modify_system_settings" translatable="false">modify_system_settings</string>
+    <string name="pk_modify_system_settings_description" translatable="false">
+        modify_system_settings_description
+    </string>
+    <string name="pk_notification_access_entry" translatable="false">notification_access_entry
+    </string>
+    <string name="pk_notification_access" translatable="false">notification_access</string>
+    <string name="pk_premium_sms_access_entry" translatable="false">premium_sms_access_entry
+    </string>
+    <string name="pk_premium_sms_access" translatable="false">premium_sms_access</string>
+    <string name="pk_premium_sms_access_description" translatable="false">
+        premium_sms_access_description
+    </string>
+    <string name="pk_usage_access_entry" translatable="false">usage_access_entry</string>
+    <string name="pk_usage_access" translatable="false">usage_access</string>
+    <string name="pk_usage_access_description" translatable="false">usage_access_description
+    </string>
+    <string name="pk_wifi_control_entry" translatable="false">wifi_control_entry</string>
+    <string name="pk_wifi_control" translatable="false">wifi_control</string>
+    <string name="pk_wifi_control_description" translatable="false">wifi_control_description
+    </string>
+    <string name="pk_more_special_access" translatable="false">more_special_access</string>
+
+    <!-- DateTime Settings -->
+    <string name="pk_auto_datetime_switch" translatable="false">auto_datetime_switch</string>
+    <string name="pk_auto_timezone_switch" translatable="false">auto_timezone_switch</string>
+    <string name="pk_date_picker_entry" translatable="false">date_picker_entry</string>
+    <string name="pk_time_picker_entry" translatable="false">time_picker_entry</string>
+    <string name="pk_timezone_picker_screen_entry" translatable="false">
+        timezone_picker_screen_entry
+    </string>
+    <string name="pk_use_24hour_switch" translatable="false">use_24hour_switch</string>
+    <string name="pk_timezone_picker_screen" translatable="false">timezone_picker_screen</string>
+
+    <!-- Accounts -->
+    <string name="pk_account_list" translatable="false">account_list</string>
+    <string name="pk_account_settings" translatable="false">account_settings</string>
+    <string name="pk_accounts_extra_settings" translatable="false">accounts_extra_settings</string>
+    <string name="pk_account_auto_sync" translatable="false">account_auto_sync</string>
+    <string name="pk_add_account" translatable="false">add_account</string>
+    <string name="pk_account_details" translatable="false">account_details</string>
+    <string name="pk_account_sync" translatable="false">account_sync</string>
+    <string name="pk_account_details_with_sync" translatable="false">account_details_with_sync
+    </string>
+    <string name="pk_account_sync_details" translatable="false">account_sync_details</string>
+
+    <!-- Storage -->
+    <string name="pk_storage_music_audio" translatable="false">storage_music_audio</string>
+    <string name="pk_storage_music_audio_files" translatable="false">storage_music_audio_files
+    </string>
+    <string name="pk_storage_music_audio_details" translatable="false">storage_music_audio_details
+    </string>
+    <string name="pk_storage_other_apps" translatable="false">storage_other_apps</string>
+    <string name="pk_storage_other_apps_details" translatable="false">storage_other_apps_details
+    </string>
+    <string name="pk_storage_application_size" translatable="false">storage_application_size
+    </string>
+    <string name="pk_storage_application_total_size" translatable="false">
+        storage_application_total_size
+    </string>
+    <string name="pk_storage_application_data_size" translatable="false">
+        storage_application_data_size
+    </string>
+    <string name="pk_storage_application_cache_size" translatable="false">
+        storage_application_cache_size
+    </string>
+    <string name="pk_storage_application_details" translatable="false">storage_application_details
+    </string>
+    <string name="pk_storage_files" translatable="false">storage_files</string>
+    <string name="pk_storage_system" translatable="false">storage_system</string>
+
+    <!-- Display Settings -->
+    <string name="pk_adaptive_brightness_switch" translatable="false">adaptive_brightness_switch
+    </string>
+    <string name="pk_brightness_level" translatable="false">brightness_level</string>
+    <string name="pk_display_extra_settings" translatable="false">display_extra_settings</string>
+
+    <!-- Sound Settings -->
+    <string name="pk_volume_settings" translatable="false">volume_settings</string>
+    <string name="pk_default_ringtone" translatable="false">default_ringtone</string>
+    <string name="pk_default_notification" translatable="false">default_notification</string>
+    <string name="pk_default_alarm" translatable="false">default_alarm</string>
+    <string name="pk_sounds_extra_settings" translatable="false">sounds_extra_settings</string>
+
+    <!-- Units Settings -->
+    <string name="pk_units_settings_entry" translatable="false">units_settings_entry</string>
+    <string name="pk_units_distance" translatable="false">units_distance</string>
+    <string name="pk_units_speed" translatable="false">units_speed</string>
+    <string name="pk_units_fuel_consumption" translatable="false">units_fuel_consumption</string>
+    <string name="pk_units_energy_consumption" translatable="false">units_energy_consumption</string>
+    <string name="pk_units_temperature" translatable="false">units_temperature</string>
+    <string name="pk_units_volume" translatable="false">units_volume</string>
+    <string name="pk_units_pressure" translatable="false">units_pressure</string>
+
+    <!-- Location Settings -->
+    <string name="pk_location_recent_requests_entry" translatable="false">
+        location_recent_requests_entry
+    </string>
+    <string name="pk_location_recent_requests_screen" translatable="false">
+        location_recent_requests_screen
+    </string>
+    <string name="pk_location_app_permissions" translatable="false">location_app_permissions
+    </string>
+    <string name="pk_location_scanning" translatable="false">location_scanning</string>
+    <string name="pk_location_scanning_wifi" translatable="false">location_scanning_wifi</string>
+    <string name="pk_location_scanning_bluetooth" translatable="false">location_scanning_bluetooth
+    </string>
+    <string name="pk_location_services" translatable="false">location_services</string>
+    <string name="pk_location_footer" translatable="false">location_footer</string>
+
+    <!-- Users Settings -->
+    <string name="pk_users_list" translatable="false">users_list</string>
+    <string name="pk_choose_new_admin" translatable="false">choose_new_admin</string>
+    <string name="pk_edit_user_name_entry" translatable="false">edit_user_name_entry</string>
+    <string name="pk_make_user_admin" translatable="false">make_user_admin</string>
+    <string name="pk_user_permissions" translatable="false">user_permissions</string>
+
+    <!-- Security Settings -->
+    <string name="pk_no_lock" translatable="false">no_lock</string>
+    <string name="pk_pattern_lock" translatable="false">pattern_lock</string>
+    <string name="pk_password_lock" translatable="false">password_lock</string>
+    <string name="pk_pin_lock" translatable="false">pin_lock</string>
+    <string name="pk_choose_lock_type" translatable="false">choose_lock_type</string>
+    <string name="pk_trusted_device" translatable="false">trusted_device</string>
+    <string name="pk_car_ble_name" translatable="false">car_ble_name</string>
+    <string name="pk_add_trusted_device" translatable="false">add_trusted_device</string>
+    <string name="pk_trusted_device_list" translatable="false">trusted_device_list</string>
+    <string name="pk_add_device_instruction" translatable="false">add_device_instruction</string>
+    <string name="pk_companion_app_download" translatable="false">companion_app_download</string>
+    <string name="pk_trusted_device_safety_alert" translatable="false">trusted_device_safety_alert
+    </string>
+
+    <!-- System Settings -->
+    <string name="pk_languages_and_input_settings" translatable="false">
+        languages_and_input_settings
+    </string>
+    <string name="pk_system_update_settings" translatable="false">system_update_settings</string>
+    <string name="pk_system_extra_settings" translatable="false">system_extra_settings</string>
+    <string name="pk_about_settings_entry" translatable="false">about_settings_entry</string>
+    <string name="pk_legal_information_entry" translatable="false">legal_information_entry</string>
+    <string name="pk_reset_options_entry" translatable="false">reset_options_entry</string>
+    <string name="pk_developer_options_entry" translatable="false">developer_options_entry</string>
+
+    <!-- Language Settings -->
+    <string name="pk_language_settings_entry" translatable="false">language_settings_entry</string>
+    <string name="pk_language_and_input_extra_settings" translatable="false">
+        pk_language_and_input_extra_settings
+    </string>
+    <string name="pk_current_languages" translatable="false">current_languages</string>
+    <string name="pk_add_language" translatable="false">add_language</string>
+    <string name="pk_language_picker" translatable="false">language_picker</string>
+    <string name="pk_child_locale_picker" translatable="false">child_locale_picker</string>
+    <string name="pk_autofill_picker_entry" translatable="false">autofill_picker_entry</string>
+
+    <!-- Keyboard Settings -->
+    <string name="pk_keyboard_entry" translatable="false">keyboard_entry</string>
+    <string name="pk_enabled_keyboards" translatable="false">enabled_keyboards</string>
+    <string name="pk_manage_keyboard" translatable="false">manage_keyboard</string>
+    <string name="pk_keyboard_management" translatable="false">keyboard_management</string>
+
+    <!-- TTS Settings -->
+    <string name="pk_tts_settings_entry" translatable="false">tts_settings_entry</string>
+    <string name="pk_tts_preferred_engine_entry" translatable="false">tts_preferred_engine_entry
+    </string>
+    <string name="pk_tts_preferred_engine_options" translatable="false">
+        tts_preferred_engine_options
+    </string>
+    <string name="pk_tts_playback_group" translatable="false">tts_playback_group</string>
+    <string name="pk_tts_default_language" translatable="false">tts_default_language</string>
+    <string name="pk_tts_speech_rate" translatable="false">tts_speech_rate</string>
+    <string name="pk_tts_pitch" translatable="false">tts_pitch</string>
+    <string name="pk_tts_reset" translatable="false">tts_reset</string>
+
+    <!-- Legal information -->
+    <string name="pk_system_license_entry" translatable="false">system_license_entry</string>
+    <string name="pk_third_party_license_entry" translatable="false">third_party_license_entry
+    </string>
+
+    <!-- About Settings -->
+    <string name="pk_model_info" translatable="false">model_info</string>
+    <string name="pk_firmware_version" translatable="false">firmware_version</string>
+    <string name="pk_security_patch" translatable="false">security_patch</string>
+    <string name="pk_kernel_version" translatable="false">kernel_version</string>
+    <string name="pk_build_number" translatable="false">build_number</string>
+    <string name="pk_regulatory_labels" translatable="false">regulatory_labels</string>
+    <string name="pk_about_bluetooth_mac_address" translatable="false">about_bluetooth_mac_address
+    </string>
+
+    <!-- Reset Options -->
+    <string name="pk_reset_network" translatable="false">reset_network</string>
+    <string name="pk_reset_app_pref" translatable="false">reset_app_pref</string>
+    <string name="pk_master_clear" translatable="false">master_clear</string>
+
+    <!-- Reset Network -->
+    <string name="pk_reset_network_items" translatable="false">reset_network_items</string>
+    <string name="pk_reset_esim" translatable="false">reset_esim</string>
+    <string name="pk_reset_network_subscription" translatable="false">reset_network_subscription
+    </string>
+
+    <!-- Master Clear -->
+    <string name="pk_master_clear_desc" translatable="false">master_clear_desc</string>
+    <string name="pk_master_clear_account_list" translatable="false">master_clear_account_list
+    </string>
+    <string name="pk_master_clear_other_users_present" translatable="false">
+        master_clear_other_users_present
+    </string>
+    <string name="pk_master_clear_reset_esim" translatable="false">master_clear_reset_esim</string>
+    <string name="pk_master_clear_confirm_desc" translatable="false">master_clear_confirm_desc
+    </string>
+
+    <!-- Developer Options -->
+    <string name="pk_usb_debugging_toggle" translatable="false">usb_debugging_toggle</string>
+</resources>
diff --git a/res/values/string_arrays.xml b/res/values/string_arrays.xml
index c933ee0..50028ad 100644
--- a/res/values/string_arrays.xml
+++ b/res/values/string_arrays.xml
@@ -1,19 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2017 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
-  -->
+    Copyright 2017 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.
+-->
 
 <resources>
     <string-array name="wifi_security_method">
@@ -21,4 +21,37 @@
         <item>@string/wifi_security_wep</item>
         <item>@string/wifi_security_wpa_wpa2</item>
     </string-array>
+
+    <!-- Security types for wireless tether -->
+    <string-array translatable="false" name="wifi_tether_security">
+        <item>@string/wifi_security_wpa2</item>
+        <item>@string/wifi_security_none</item>
+    </string-array>
+
+    <!-- Wi-Fi AP band settings.  Either Auto, 2.4GHz or 5GHz. -->
+    <!-- Note that adding/removing/moving the items will need wifi settings code change. -->
+    <string-array translatable="false" name="wifi_ap_band_config_full">
+        <item>0</item>
+        <item>1</item>
+    </string-array>
+
+    <string-array translatable="false" name="wifi_ap_band_summary_full">
+        <item>@string/wifi_ap_choose_2G</item>
+        <item>@string/wifi_ap_choose_5G</item>
+    </string-array>
+
+    <string-array translatable="false" name="wifi_ap_band_dual_mode">
+        <item>0</item>
+        <item>-1</item>
+    </string-array>
+
+    <string-array translatable="false" name="wifi_ap_band_dual_mode_summary">
+        <item>@string/wifi_ap_choose_2G</item>
+        <item>@string/wifi_ap_prefer_5G</item>
+    </string-array>
+
+    <string-array translatable="false" name="wifi_ap_band_config_2G_only">
+        <item>@string/wifi_ap_choose_auto</item>
+        <item>@string/wifi_ap_choose_2G</item>
+    </string-array>
 </resources>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7ca240e..78e3941 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1,23 +1,22 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
- * Copyright (c) 2017, 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.
-*/
+    Copyright 2018 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.
 -->
+
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Application name, temporarily misspelled to allow it to live alongside the regular
-         android settings without confusion. -->
+    <!-- Application name -->
     <string name="settings_label">Settings</string>
     <string name="more_settings_label">More</string>
     <string name="display_settings">Display</string>
@@ -36,39 +35,165 @@
     <!-- Label for night mode toggle tile in quick setting [CHAR LIMIT=20] -->
     <string name="night_mode_tile_label">Night mode</string>
 
-    <!-- wifi settings--><skip />
+    <!-- Network and internet settings [CHAR LIMIT=40] -->
+    <string name="network_and_internet">Network &amp; internet</string>
+    <!-- Mobile network settings [CHAR LIMIT=30] -->
+    <string name="mobile_network_settings">Mobile network</string>
+    <!-- Summary of the 'Mobile network' item on the Network & internet page when there is more than
+         one mobile service configured (aka "dual SIM") - it shows a count of SIM/eSIM and tapping
+         it leads to a page showing a list of the mobile service subscriptions. [CHAR LIMIT=40] -->
+    <plurals name="mobile_network_summary_count">
+        <item quantity="one"><xliff:g id="count" example="1">%1$d</xliff:g> SIM</item>
+        <item quantity="other"><xliff:g id="count" example="2">%1$d</xliff:g> SIMs</item>
+    </plurals>
+    <!-- Summary for an item in the page listing multiple mobile service subscriptions, indicating
+         that service is active and is tied to a physical SIM card [CHAR LIMIT=40] -->
+    <string name="mobile_network_active_sim">Active / SIM</string>
+    <!-- Summary for an item in the page listing multiple mobile service subscriptions, indicating
+         that service is inactive and is tied to a physical SIM card [CHAR LIMIT=40] -->
+    <string name="mobile_network_inactive_sim">Inactive / SIM</string>
+    <!-- Summary for an item in the page listing multiple mobile service subscriptions, indicating
+         that service is active and is tied to an eSIM profile [CHAR LIMIT=40] -->
+    <string name="mobile_network_active_esim">Active / Downloaded SIM</string>
+    <!-- Summary for an item in the page listing multiple mobile service subscriptions, indicating
+         that service is inactive and is tied to an eSIM profile [CHAR LIMIT=40] -->
+    <string name="mobile_network_inactive_esim">Inactive / Downloaded SIM</string>
+    <!-- Title of item shown at the bottom of the page listing multiple mobile service
+         subscriptions; tapping it leads to a UI to add more [CHAR LIMIT=40] -->
+    <string name="mobile_network_list_add_more">Add more</string>
+    <!-- Mobile network screen, toggle mobile data title [CHAR LIMIT=30] -->
+    <string name="mobile_network_toggle_title">Mobile data</string>
+    <!-- Mobile network screen, toggle mobile data summary [CHAR LIMIT=50] -->
+    <string name="mobile_network_toggle_summary">Access data using mobile network</string>
+    <!-- Mobile network screen, confirmation dialog to turn off mobile data [CHAR LIMIT=50] -->
+    <string name="confirm_mobile_data_disable">Turn off mobile data?</string>
+    <!-- When a SIM preference hasn't been selected yet, this string is displayed as the pref summary until the user chooses a SIM subscription from the preference list. [CHAR LIMIT=50] -->
+    <string name="sim_selection_required_pref">Selection required</string>
+    <!-- Title asking user if they wish to change the default sim for cellular data. [CHAR LIMIT=60] -->
+    <string name="sim_change_data_title">
+        Use <xliff:g id="carrier" example="Google Fi">%1$s</xliff:g> for mobile data?
+    </string>
+    <!-- Message confirming that the user wishes to change the default data SIM from one to another.  [CHAR LIMIT=NONE] -->
+    <string name="sim_change_data_message">
+        You\u0027re using <xliff:g id="carrier2" example="Google Fi">%2$s</xliff:g> for mobile data.
+        If you switch to <xliff:g id="carrier1" example="Verizon">%1$s</xliff:g>,
+        <xliff:g id="carrier2" example="Google Fi">%2$s</xliff:g> will no longer be used for mobile
+        data.
+    </string>
+    <!-- Ok button label confirming the user wishes to change the default data SIM from one to another. [CHAR LIMIT=25] -->
+    <string name="sim_change_data_ok">
+        Use <xliff:g id="carrier" example="Verizon">%1$s</xliff:g>
+    </string>
+    <!-- Mobile network screen, preference title for toggle to enable roaming [CHAR LIMIT=30] -->
+    <string name="roaming_title">Roaming</string>
+    <!-- Mobile network screen, preference summary for toggle to enable roaming [CHAR LIMIT=60] -->
+    <string name="roaming_summary">Connect to data services when roaming</string>
+    <!-- Mobile network settings screen, dialog message title when user selects the Data roaming toggle [CHAR LIMIT=60] -->
+    <string name="roaming_alert_title">Allow data roaming?</string>
+    <!-- Mobile network settings screen, message in dialog box that appears when you select the Data roaming toggle [CHAR LIMIT=80] -->
+    <string name="roaming_warning">You may incur significant charges.</string>
+    <!-- Data usage settings [CHAR LIMIT=30] -->
+    <string name="data_usage_settings">Data usage</string>
+    <!-- Data usage title text [CHAR LIMIT=30] -->
+    <string name="data_usage_title">Primary data</string>
+    <!-- Data usage, amount used [CHAR LIMIT=30] -->
+    <string name="data_used_formatted"><xliff:g name="value" example="500">^1</xliff:g> <xliff:g name="units" example="GB">^2</xliff:g> used</string>
+    <!-- Format for a summary describing the amount of data before the user is warned [CHAR LIMIT=40] -->
+    <string name="cell_data_warning"><xliff:g name="amount" example="1 GB">^1</xliff:g> data warning</string>
+    <!-- Format for a summary describing the amount of data the limit is set to [CHAR LIMIT=40] -->
+    <string name="cell_data_limit"><xliff:g name="amount" example="1 GB">^1</xliff:g> data limit</string>
+    <!-- Format for a summary describing the amount of data before the user is warned or limited [CHAR LIMIT=80] -->
+    <string name="cell_data_warning_and_limit"><xliff:g name="amount" example="1 GB">^1</xliff:g> data warning / <xliff:g name="amount" example="2 GB">^2</xliff:g> data limit</string>
+    <!-- Informational text about time left in billing cycle [CHAR LIMIT=40] -->
+    <plurals name="billing_cycle_days_left">
+        <item quantity="one">%d day left</item>
+        <item quantity="other">%d days left</item>
+    </plurals>
+    <!-- Informational text about time left in billing cycle [CHAR LIMIT=40] -->
+    <string name="billing_cycle_none_left">No time remaining</string>
+    <!-- Informational text about time left in billing cycle [CHAR LIMIT=40] -->
+    <string name="billing_cycle_less_than_one_day_left">Less than 1 day left</string>
+    <!-- Informational text about carrier and update time [CHAR LIMIT=32] -->
+    <string name="carrier_and_update_text">Updated by <xliff:g name="carrier" example="Google Fi">^1</xliff:g> <xliff:g name="time" example="3m">^2</xliff:g> ago</string>
+    <!-- Informational text about update time only, without carrier. First argument intentionally skipped. [CHAR LIMIT=30] -->
+    <string name="no_carrier_update_text">Updated <xliff:g name="time" example="3m">^2</xliff:g> ago</string>
+    <!-- Informational text about a recent carrier and update time [CHAR LIMIT=34] -->
+    <string name="carrier_and_update_now_text">Updated by <xliff:g name="carrier" example="Google Fi">^1</xliff:g> just now</string>
+    <!-- Informational text about recent update time only, without carrier [CHAR LIMIT=30] -->
+    <string name="no_carrier_update_now_text">Updated just now</string>
+    <!-- Button to launch external data plan app [CHAR LIMIT=30] -->
+    <string name="launch_manage_plan_text">View plan</string>
+    <!-- Title for mobile data preference, to display the mobile data usage for each app. [CHAR LIMIT=30] -->
+    <string name="app_data_usage">App data usage</string>
+    <!-- Label for application which has its data usage restricted. [CHAR LIMIT=16] -->
+    <string name="data_usage_app_restricted">restricted</string>
+
+    <!-- Title of dialog for editing data usage cycle reset date. [CHAR LIMIT=48] -->
+    <string name="cycle_reset_day_of_month_picker_title">Usage cycle reset date</string>
+    <!-- Subtitle of dialog for editing data usage cycle reset date. [CHAR LIMIT=32] -->
+    <string name="cycle_reset_day_of_month_picker_subtitle">Date of each month:</string>
+    <!-- Positive button title for data usage cycle reset date picker, confirming that changes should be saved. [CHAR LIMIT=32] -->
+    <string name="cycle_reset_day_of_month_picker_positive_button">Set</string>
+    <!-- Title of button and screen for billing cycle preferences [CHAR LIMIT=40] -->
+    <string name="data_warning_limit_title">Data warning &amp; limit</string>
+    <!-- Title of button for application usage cycle preferences [CHAR LIMIT=40] -->
+    <string name="app_usage_cycle">App data usage cycle</string>
+    <!-- Label for switch about whether to warn user about usage [CHAR LIMIT=40] -->
+    <string name="set_data_warning">Set data warning</string>
+    <!-- Label for button to set the amount of data before user is warned about usage [CHAR LIMIT=30] -->
+    <string name="data_warning">Data warning</string>
+    <!-- Label for switch about whether to limit how much data can be used [CHAR LIMIT=30] -->
+    <string name="set_data_limit">Set data limit</string>
+    <!-- Label for button to set the amount of data before user is limited [CHAR LIMIT=30] -->
+    <string name="data_limit">Data limit</string>
+    <!-- Title of dialog shown before user limits data usage. [CHAR LIMIT=48] -->
+    <string name="data_usage_limit_dialog_title">Limiting data usage</string>
+    <!-- Body of dialog shown before user limits mobile data usage. [CHAR LIMIT=NONE] -->
+    <string name="data_usage_limit_dialog_mobile" >Your vehicle\u2019s head unit will turn off mobile data once it reaches the limit you set.\n\nSince data usage is measured by the head unit, and your carrier may account for usage differently, consider setting a conservative limit.</string>
+    <!-- Title of dialog for editing data usage warning in bytes. [CHAR LIMIT=48] -->
+    <string name="data_usage_warning_editor_title">Set data usage warning</string>
+    <!-- Title of dialog for editing data usage limit in bytes. [CHAR LIMIT=48] -->
+    <string name="data_usage_limit_editor_title">Set data usage limit</string>
+    <!-- Positive button title for data usage bytes threshold picker, confirming that changes should be saved. [CHAR LIMIT=32] -->
+    <string name="usage_bytes_threshold_picker_positive_button">Set</string>
+    <string-array name="bytes_picker_sizes" translatable="false">
+        <item>@*android:string/megabyteShort</item>
+        <item>@*android:string/gigabyteShort</item>
+    </string-array>
+
+    <!-- wifi settings--><skip/>
     <!-- Used in the 1st-level settings screen to go to the 2nd-level settings screen  [CHAR LIMIT=20]-->
     <string name="wifi_settings">Wi\u2011Fi</string>
-    <!-- Summary text of the Wi-fi settings screen -->
-    <string name="wifi_settings_summary">Set up &amp; manage wireless access points</string>
     <!-- Summary text when turning Wi-Fi or bluetooth on -->
     <string name="wifi_starting">Turning Wi\u2011Fi on\u2026</string>
     <!-- Summary text when turning Wi-Fi or bluetooth off -->
     <string name="wifi_stopping">Turning off Wi\u2011Fi\u2026</string>
+    <!-- Summary text when loading Wi-Fi list -->
+    <string name="loading_wifi_list">Loading Wi\u2011Fi list</string>
+    <!-- Summary text shown in place of the Wi-Fi list when wifi is off -->
+    <string name="wifi_disabled">Wi\u2011Fi disabled</string>
     <!-- Failured notification for forget -->
     <string name="wifi_failed_forget_message">Failed to forget network</string>
     <!-- Failured notification for connect -->
     <string name="wifi_failed_connect_message">Failed to connect to network</string>
-    <!-- Button message shown on the button adding manual setting.
-     Used in Wifi Setup For Setup Wizard with XL screen. -->
+    <!-- Button message shown on the button adding manual setting. -->
     <string name="wifi_setup_add_network">Add network</string>
-    <!-- Summary text when Wi-Fi is turned off -->
-    <string name="wifi_disabled">Wi\u2011Fi disabled</string>
-    <!-- Button label to connect to a Wi-Fi network.
-     Used in SetupWizard for XLarge screen [CHAR LIMIT=10] -->
+    <!-- Button label to connect to a Wi-Fi network. [CHAR LIMIT=10] -->
     <string name="wifi_setup_connect">Connect</string>
     <!-- Label for the password of the secured network -->
     <string name="wifi_password">Password</string>
     <!-- Label for the check box to show password -->
     <string name="wifi_show_password">Show password</string>
+    <!-- Toast message when trying to connect to a hidden wifi network without a network name. [CHAR LIMIT=NONE] -->
+    <string name="wifi_no_network_name">Please enter a network name</string>
     <!-- Label for the SSID of the network -->
     <string name="wifi_ssid">Network name</string>
     <!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] -->
-    <!-- <string name="wifi_ssid_hint">Enter the SSID</string> -->
+    <string name="wifi_ssid_hint">Enter the SSID</string>
     <!-- Label for the security of the connection -->
     <string name="wifi_security">Security</string>
     <!-- Label for the signal strength of the connection -->
-    <string name="wifi_signal">Signal strength</string>
+    <string name="wifi_signal_strength">Signal strength</string>
     <!-- Label for the status of the connection -->
     <string name="wifi_status">Status</string>
     <!-- Label for the link speed of the connection -->
@@ -77,76 +202,170 @@
     <string name="wifi_frequency">Frequency</string>
     <!-- Label for the IP address of the connection -->
     <string name="wifi_ip_address">IP address</string>
+    <!-- Text for show password ListItem -->
+    <string name="show_password">Show password</string>
+    <!-- Summary for wifi network name. [CHAR LIMIT=40] -->
+    <string name="default_network_name_summary">Enter network name</string>
+    <!-- Summary for wifi password dialog. [CHAR LIMIT=40] -->
+    <string name="default_password_summary">Enter password</string>
     <!-- Key for the tag to store UI info for access point -->
     <string name="access_point_tag_key">access_point_tag_key</string>
-    <!-- Match this with drawable.wifi_signal. --> <skip />
+    <!-- Match this with drawable.wifi_signal. --><skip/>
     <!-- Wi-Fi settings. The signal strength a Wi-Fi network has. -->
     <string-array name="wifi_signals">
         <item>Poor</item>
+        <item>Poor</item>
         <item>Fair</item>
         <item>Good</item>
         <item>Excellent</item>
     </string-array>
+    <!-- Link speed on Wifi Status screen -->
+    <string name="link_speed">%1$d Mbps</string>
+    <!-- Wifi 2.4GHz is used as an universal itendifier for 2.4GHz band -->
+    <string name="wifi_band_24ghz">2.4 GHz</string>
+    <!-- Wifi Internal 5GHz as an universal itendifier for 5GHz band -->
+    <string name="wifi_band_5ghz">5 GHz</string>
+    <!-- Label to the section to show details about a Wi-Fi settings -->
+    <string name="wifi_network_detail">Network details</string>
+    <!-- Wi-Fi settings screen, advanced, title of the item to show the Wi-Fi device's MAC address. -->
+    <string name="wifi_mac_address">MAC address</string>
+    <!-- Wi-Fi settings screen, advanced, title of the item to show the Wi-Fi device's current IP address. -->
+    <string name="wifi_ip_address_title">IP address</string>
+    <!-- Wifi details preference title to display router IP subnet mask -->
+    <string name="wifi_subnet_mask">Subnet mask</string>
+    <!-- Wifi details preference title to display router DNS info -->
+    <string name="wifi_dns">DNS</string>
+    <!-- Wifi details preference category title for IPv6 information -->
+    <string name="wifi_details_ipv6_address_header">IPv6 addresses</string>
+    <!-- Label for the gateway of the network -->
+    <string name="wifi_gateway">Gateway</string>
+    <!-- Title of wifi specific settings, which control advanced behaviors of wifi. [CHAR LIMIT=30] -->
+    <string name="wifi_preferences_title">Wi\u2011Fi preferences</string>
+    <!-- Preference title for option to enable Wi-Fi when saved networks are nearby [CHAR LIMIT=40] -->
+    <string name="wifi_wakeup">Turn on Wi\u2011Fi automatically</string>
+    <!-- Preference summary for option to enable Wi-Fi when high quality saved networks are nearby [CHAR LIMIT=120] -->
+    <string name="wifi_wakeup_summary">Wi\u2011Fi will turn back on near high\u2011quality saved networks, like your home network</string>
+    <!-- Preference summary for auto-wifi when user needs to enable location scanning to toggle it [CHAR LIMIT=100] -->
+    <string name="wifi_wakeup_summary_no_location">Unavailable because location is turned off. Turn on <annotation id="link">location</annotation>.</string>
+    <!-- Wi-Fi settings dialog. Title of dialog displayed asking user to enable Wi-Fi Scanning [CHAR LIMIT=60]-->
+    <string name="wifi_settings_scanning_required_title">Turn on Wi\u2011Fi scanning?</string>
+    <!-- Wi-Fi settings dialog. Text for the confirmation button to enable Wi-Fi scanning. [CHAR LIMIT = 20]-->
+    <string name="wifi_settings_scanning_required_turn_on">Turn on</string>
+    <!-- Wi-Fi settings dialog. Text to show in toast for when user turns on wifi scanning. [CHAR LIMIT=NONE] -->
+    <string name="wifi_settings_scanning_required_enabled">Wi\u2011Fi scanning turned on</string>
+    <!-- Preference title for option to automatically switch away from bad wifi networks [CHAR LIMIT=60]-->
+    <string name="wifi_cellular_fallback_title">Switch to mobile data automatically</string>
+    <!-- Preference summary to automatically switch away from bad wifi networks [CHAR LIMIT=None]-->
+    <string name="wifi_cellular_fallback_summary">Use mobile data when Wi\u2011Fi has no internet access. Data usage charges may apply.</string>
+    <!-- url for the wifi scanning required dialog help page -->
+    <string name="help_uri_wifi_scanning_required" translatable="false"></string>
+    <!-- Button label to allow the user to view additional information [CHAR LIMIT=NONE] -->
+    <string name="learn_more">Learn more</string>
+    <!-- Wifi hotspot settings -->
+    <!-- Label for Wifi hotspot name. [CHAR LIMIT=20]-->
+    <string name="wifi_hotspot_name_title">Hotspot name</string>
+    <!-- Summary for Wifi hotspot name when connection is in progress. [CHAR LIMIT=25]-->
+    <string name="wifi_hotspot_name_summary_connecting">Turning on <xliff:g id="wifi_hotspot_name">%1$s</xliff:g>...</string>
+    <!-- Summary for Wifi hotspot name when connected. [CHAR LIMIT=NONE]-->
+    <string name="wifi_hotspot_name_summary_connected">Other devices can connect to <xliff:g id="wifi_hotspot_name">%1$s</xliff:g></string>
+    <!-- Label for Wifi hotspot password. [CHAR LIMIT=30]-->
+    <string name="wifi_hotspot_password_title">Hotspot password</string>
+    <!-- Label for Wifi security type title [CHAR LIMIT=15]-->
+    <string name="wifi_hotspot_security_title">Security</string>
+    <!-- Label for Wifi security type WPA2-Personal [CHAR LIMIT=25]-->
+    <string name="wifi_hotspot_wpa2_personal">WPA2-Personal</string>
+    <!-- Label for Wifi security type WPA2-Personal [CHAR LIMIT=25]-->
+    <string name="wifi_hotspot_security_none">None</string>
+    <!-- Label for Wifi hotspot AP Band. [CHAR LIMIT=15]-->
+    <string name="wifi_hotspot_ap_band_title">AP Band</string>
+    <!-- Label for the RadioGroup to choose wifi ap band [CHAR LIMIT=25]-->
+    <string name="wifi_ap_band_config">Select AP Band</string>
+    <!-- Label for the radio button to choose wifi ap channel automatically [CHAR LIMIT=10]-->
+    <string name="wifi_ap_choose_auto">Auto</string>
+    <!-- Label for the radio button to choose wifi ap 2.4 GHz band [CHAR LIMIT=25]-->
+    <string name="wifi_ap_choose_2G">2.4 GHz Band</string>
+    <!-- Label for the radio button to only choose wifi ap 5GHz band [CHAR LIMIT=25]-->
+    <string name="wifi_ap_choose_5G">5.0 GHz Band</string>
+    <!-- Label for the radio button to prefer 5GHz wifi ap band  [CHAR LIMIT=80]-->
+    <string name="wifi_ap_prefer_5G">5.0 GHz Band preferred</string>
+    <!-- Label for adding to the list of selected bands when 2.4 GHz is selected [CHAR LIMIT=15]-->
+    <string name="wifi_ap_2G">2.4 GHz</string>
+    <!-- Label for adding to the list of selected bands when 5.0 GHz is selected [CHAR LIMIT=15]-->
+    <string name="wifi_ap_5G">5.0 GHz</string>
+    <!-- Label that is shown as a dialog summary informing users they must pick at LEAST one band for their hotspot [CHAR LIMIT=25]-->
+    <string name="wifi_ap_band_select_one">Choose at least one band for Wi\u2011Fi hotspot:</string>
+    <!-- Tethering controls, item title to go into the tethering settings when USB, Bluetooth and Wifi tethering are available [CHAR LIMIT=60]-->
+    <string name="tether_settings_title_all">Hotspot &amp; tethering</string>
+    <!-- Title for the toggle to turn off hotspot automatically [CHAR LIMIT=50]-->
+    <string name="wifi_hotspot_auto_off_title">Turn off hotspot automatically</string>
+    <!-- Summary for the toggle to turn off hotspot automatically [CHAR LIMIT=100]-->
+    <string name="wifi_hotspot_auto_off_summary">Wi\u2011Fi hotspot will turn off if no devices are connected</string>
+    <!-- This string asks the user whether or not to allow an app to enable WiFi. [CHAR LIMIT=NONE] -->
+    <string name="wifi_ask_enable"><xliff:g id="requester" example="FancyApp">%s</xliff:g> wants to turn on Wi-Fi</string>
+    <!-- This string asks the user whether or not to allow an app to disable WiFi. [CHAR LIMIT=NONE] -->
+    <string name="wifi_ask_disable"><xliff:g id="requester" example="FancyApp">%s</xliff:g> wants to turn off Wi-Fi</string>
+    <!-- Summary text when Wi-Fi has error -->
+    <string name="wifi_error">Error</string>
 
-    <!-- Bluetooth settings --><skip />
-    <!-- Bluetooth settings check box title on Main Settings screen -->
-    <string name="bluetooth_quick_toggle_title">Bluetooth</string>
-    <!-- Bluetooth settings check box summary for turning on bluetooth -->
-    <string name="bluetooth_quick_toggle_summary">Turn on Bluetooth</string>
-    <!--Used as title on second screen after selecting Bluetooth settings -->
-    <string name="bluetooth_settings">Bluetooth</string>
-    <!--Bluetooth was disabled. -->
-    <string name="bluetooth_disabled">Bluetooth disabled</string>
-    <!--Wireless controls screen, settings title for the item to take you to the bluetooth settings screen -->
+    <!-- Bluetooth settings --><skip/>
+    <!-- Title of Bluetooth settings pages. [CHAR LIMIT=30] -->
     <string name="bluetooth_settings_title">Bluetooth</string>
-    <!--Wireless controls screen, settings summary for the item tot ake you to the bluetooth settings screen -->
-    <string name="bluetooth_settings_summary">Manage connections, set device name &amp; discoverability</string>
+    <!--Bluetooth settings screen, text for Bluetooth device with no name. [CHAR LIMIT=40] -->
+    <string name="bluetooth_device">Unnamed device</string>
+    <!-- Category title for paired Bluetooth devices. [CHAR LIMIT=40] -->
+    <string name="bluetooth_paired_devices">Paired devices</string>
+    <!-- Title for option to pair a new Bluetooth device. [CHAR LIMIT=40] -->
+    <string name="bluetooth_pair_new_device">Pair new device</string>
+    <!-- Summary for option to pair a new Bluetooth device; alerts user that selecting the option enables Bluetooth. [CHAR LIMIT=NONE]-->
+    <string name="bluetooth_pair_new_device_summary">Bluetooth will turn on to pair</string>
+    <!-- Dialog title to confirm disconnecting from all profiles of a Bluetooth device. [CHAR LIMIT=40] -->
+    <string name="bluetooth_disconnect_title">Disconnect device?</string>
+    <!-- Message for disconnecting a vehicle from all profiles of a Bluetooth device. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_disconnect_all_profiles">Your vehicle will disconnect from "<xliff:g example="Pixel" id="device_name">%1$s</xliff:g>."</string>
+    <!-- Description of a vehicle's Bluetooth MAC address. [CHAR LIMIT=50] -->
+    <string name="bluetooth_vehicle_mac_address">Vehicle\'s Bluetooth address: <xliff:g example="12:34:56:AB:CD:EF" id="address">%1$s</xliff:g></string>
+    <!-- Description of a remote device's Bluetooth MAC address. [CHAR LIMIT=50] -->
+    <string name="bluetooth_device_mac_address">Device\'s Bluetooth address: <xliff:g example="12:34:56:AB:CD:EF" id="address">%1$s</xliff:g></string>
+    <!-- Title for the vehicle's current Bluetooth name, e.g. "My Car". [CHAR LIMIT=30] -->
+    <string name="bluetooth_name">Vehicle name</string>
+    <!-- Dialog title to change the vehicle's Bluetooth name. [CHAR LIMIT=30] -->
+    <string name="bluetooth_rename_vehicle">Rename this vehicle</string>
+    <!-- Dialog title to change a remote device's Bluetooth name. [CHAR LIMIT=30] -->
+    <string name="bluetooth_rename_device">Rename device</string>
+    <!-- Confirmation button in dialog to rename a Bluetooth device. [CHAR LIMIT=20] -->
+    <string name="bluetooth_rename_button">Rename</string>
+    <!-- Category title for Bluetooth devices available for pairing. [CHAR LIMIT=40] -->
+    <string name="bluetooth_available_devices">Available devices</string>
+    <!-- Category title for Bluetooth profiles. [CHAR LIMIT=40] -->
+    <string name="bluetooth_profiles">Profiles</string>
+    <!-- Title for BT error dialogs. -->
+    <string name="bluetooth_error_title"></string>
+    <!-- Strings for msg to display to user while bluetooth is turning on [CHAR LIMIT=60] -->
+    <string name="bluetooth_turning_on">"Turning Bluetooth on\u2026"</string>
+    <!-- Strings for msg to display to user while bluetooth is turning off [CHAR LIMIT=60] -->
+    <string name="bluetooth_turning_off">"Turning Bluetooth off\u2026"</string>
+    <!-- This string asks the user whether or not to allow an app to enable bluetooth. [CHAR LIMIT=100] -->
+    <string name="bluetooth_ask_enablement"><xliff:g id="app_name" example="FancyApp">%1$s</xliff:g> wants to turn on Bluetooth</string>
+    <!-- This string asks the user whether or not to allow an app to disable bluetooth. [CHAR LIMIT=100] -->
+    <string name="bluetooth_ask_disablement"><xliff:g id="app_name" example="FancyApp">%1$s</xliff:g> wants to turn off Bluetooth</string>
+    <!-- This string asks the user whether or not to allow an app to enable bluetooth. [CHAR LIMIT=100] -->
+    <string name="bluetooth_ask_enablement_no_name">An app wants to turn on Bluetooth</string>
+    <!-- This string asks the user whether or not to allow an app to disable bluetooth. [CHAR LIMIT=100] -->
+    <string name="bluetooth_ask_disablement_no_name">An app wants to turn off Bluetooth</string>
+    <!-- Strings for asking to the user whether to allow an app to enable discovery mode. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_ask_discovery"><xliff:g id="app_name">%1$s</xliff:g> wants to make your headunit visible to other Bluetooth devices for <xliff:g id="timeout">%2$d</xliff:g> seconds.</string>
+    <!-- Strings for asking to the user whether to allow an app to enable discovery mode. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_ask_discovery_no_name">An app wants to make your headunit visible to other Bluetooth devices for <xliff:g id="timeout">%1$d</xliff:g> seconds.</string>
+    <!-- Strings for asking to the user whether to allow an app to enable bluetooth and discovery mode. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_ask_enablement_and_discovery"><xliff:g id="app_name">%1$s</xliff:g> wants to turn on Bluetooth and make your headunit visible to other devices for <xliff:g id="timeout">%2$d</xliff:g> seconds.</string>
+    <!-- Strings for asking to the user whether to allow an app to enable bluetooth and discovery mode. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_ask_enablement_and_discovery_no_name">An app wants to turn on Bluetooth and make your headunit visible to other devices for <xliff:g id="timeout">%1$d</xliff:g> seconds.</string>
 
-    <!-- Message for telling the user the kind of BT device being displayed in list. -->
-    <string name="bluetooth_talkback_computer">Computer</string>
-
-    <!-- Message for telling the user the kind of BT device being displayed in list. -->
-    <string name="bluetooth_talkback_headset">Headset</string>
-
-    <!-- Message for telling the user the kind of BT device being displayed in list. -->
-    <string name="bluetooth_talkback_phone">Phone</string>
-
-    <!-- Message for telling the user the kind of BT device being displayed in list. -->
-    <string name="bluetooth_talkback_imaging">Imaging</string>
-
-    <!-- Message for telling the user the kind of BT device being displayed in list. -->
-    <string name="bluetooth_talkback_headphone">Headphone</string>
-
-    <!-- Message for telling the user the kind of BT device being displayed in list. -->
-    <string name="bluetooth_talkback_input_peripheral">Input Peripheral</string>
-
-    <!-- Message for telling the user the kind of BT device being displayed in list. -->
-    <string name="bluetooth_talkback_bluetooth">Bluetooth</string>
-    <!-- Bluetooth settings: The sub heading for devices which have already been paired with this device. [CHAR LIMIT=40] -->
-    <string name="bluetooth_preference_paired_devices">Paired devices</string>
-    <!-- Bluetooth settings: The sub heading for available devices during and after scanning. [CHAR LIMIT=40] -->
-    <string name="bluetooth_preference_found_devices">Available devices</string>
-    <!-- Bluetooth settings: The sub heading for no bluetooth device has been paired with this device. [CHAR LIMIT=40] -->
-    <string name="bluetooth_preference_no_paired_devices">No paired devices</string>
-    <!-- Bluetooth settings: The sub heading for no available bluetooth devices during and after scanning. [CHAR LIMIT=40] -->
-    <string name="bluetooth_preference_no_found_devices">No available devices</string>
-    <!-- Bluetooth settings: Paired dialog title [CHAR LIMIT=40] -->
-    <string name="bluetooth_preference_paired_dialog_title">Paired device</string>
-    <!-- Bluetooth settings: Name label [CHAR LIMIT=40] -->
-    <string name="bluetooth_preference_paired_dialog_name_label">Name</string>
-    <!-- Bluetooth settings.  Connection options screen.  The title of the header that is above all of the profiles.
-     When a user decides what Bluetooth capabilities to use with the device.  -->
-    <string name="bluetooth_device_advanced_profile_header_title">Use for</string>
-    <!-- Hint for a text field to change the name of the Bluetooth device. [CHAR LIMIT=35] -->
-    <string name="wifi_ssid_hint">Change the name of the Bluetooth device</string>
-
-    <!-- Bluetooth pairing -->
+    <!-- Bluetooth pairing --><skip/>
     <!-- Notification ticker text (shown in the status bar) when a Bluetooth device wants to pair with us -->
     <string name="bluetooth_notif_ticker">Bluetooth pairing request</string>
     <!-- Bluetooth settings.  Context menu item for a device.  Action will first pair, and then connect to all profiles on the device. -->
     <string name="bluetooth_device_context_pair_connect">Pair &amp; connect</string>
-    <!-- Used as setting title (for checkbox) on second screen after selecting Bluetooth settings -->
-    <string name="bluetooth">Bluetooth</string>
     <!-- Message when bluetooth is informing the user of the pairing key. [CHAR LIMIT=NONE] -->
     <string name="bluetooth_pairing_key_msg">Bluetooth pairing code</string>
     <!-- Checkbox label for alphanumeric PIN entry (default is numeric PIN). [CHAR LIMIT=50] -->
@@ -154,9 +373,9 @@
     <!-- Message when bluetooth dialog for passkey entry is showing. [CHAR LIMIT=NONE] -->
     <string name="bluetooth_enter_passkey_msg">Type the pairing code then press Return or Enter</string>
     <!-- Title for the dialog to enter PIN. [CHAR LIMIT=40] -->
-    <string name="bluetooth_pairing_request">Pair with <xliff:g id="device_name">%1$s</xliff:g>?</string>
+    <string name="bluetooth_pairing_request">Pair with <xliff:g example="Pixel" id="device_name">%1$s</xliff:g>?</string>
     <!-- Checkbox message in pairing dialogs.  [CHAR LIMIT=NONE] -->
-    <string name="bluetooth_pairing_shares_phonebook">Allow <xliff:g id="device_name">%1$s</xliff:g> to access your contacts and call history</string>
+    <string name="bluetooth_pairing_shares_phonebook">Allow <xliff:g example="Pixel" id="device_name">%1$s</xliff:g> to access your contacts and call history</string>
     <!-- Pairing dialog text to remind user to enter the PIN on the other device. [CHAR LIMIT=NONE] -->
     <string name="bluetooth_enter_pin_other_device">You may also need to type this PIN on the other device.</string>
     <!-- Pairing dialog text to remind user to enter the passkey on the other device. [CHAR LIMIT=NONE] -->
@@ -169,13 +388,31 @@
     <string name="bluetooth_notif_title">Pairing request</string>
     <!-- Notification message when a Bluetooth device wants to pair with us -->
     <string name="bluetooth_notif_message">Tap to pair with <xliff:g id="device_name">%1$s</xliff:g>.</string>
-    <!-- Title for BT error dialogs. -->
-    <string name="bluetooth_error_title"></string>
+    <!-- Title for page which supports selecting a Bluetooth device from other applications. [CHAR_LIMIT=40]-->
+    <string name="bluetooth_device_picker">Choose Bluetooth device</string>
 
     <!-- Language settings screen heading. [CHAR LIMIT=30] -->
     <string name="language_settings">Languages</string>
+    <!-- Title of Languages & input settings screen. [CHAR LIMIT=30] -->
+    <string name="languages_and_input_settings">Languages &amp; input</string>
+    <!-- Title for the 'Keyboard' preference sub-screen. [CHAR LIMIT=30] -->
+    <string name="keyboard_settings">Keyboard</string>
+    <!-- Title for the 'Available keyboards' preference sub-screen, where the user can turn on/off installed keyboards.[CHAR LIMIT=35] -->
+    <string name="manage_keyboard">Manage keyboards</string>
+    <!-- Title of the main TTS settings screen. [CHAR LIMIT=50] -->
+    <string name="text_to_speech_settings">Text-to-speech output</string>
+    <!-- Title of preferred TTS settings screen. [CHAR LIMIT=30] -->
+    <string name="text_to_speech_preferred_engine_settings">Preferred engine</string>
+    <!-- Summay which identifies the currently selected preferred engine. [CHAR LIMIT=30] -->
+    <string name="text_to_speech_current_engine">Current engine</string>
+    <!-- Title for the seek bar which controls the TTS speech rate. [CHAR LIMIT=40] -->
+    <string name="tts_speech_rate">Speech Rate</string>
+    <!-- Title for the seek bar which controls the TTS pitch. [CHAR LIMIT=30] -->
+    <string name="tts_pitch">Pitch</string>
+    <!-- Name for button that resets speech rate and pitch for synthesized voice to default values in the text to speech settings. [CHAR LIMIT=30] -->
+    <string name="tts_reset">Reset</string>
 
-    <!-- sound settings --><skip />
+    <!-- sound settings --><skip/>
     <!-- Sound settings screen heading -->
     <string name="sound_settings">Sound</string>
     <!-- Sound settings screen, setting option name -->
@@ -192,16 +429,176 @@
     <string name="media_volume_summary">Set volume for music and videos</string>
     <!-- Sound settings screen, alarm volume slider title -->
     <string name="alarm_volume_title">Alarm</string>
+    <!-- Sound settings screen, title for the option defining the phone ringtone. [CHAR LIMIT=30] -->
+    <string name="ringtone_title">Phone ringtone</string>
+    <!-- Sound settings screen, title for the option defining the default notification sound. [CHAR LIMIT=40] -->
+    <string name="notification_ringtone_title">Default notification sound</string>
+    <!-- Sound settings screen, title for the option defining the default alarm sound. [CHAR LIMIT=30] -->
+    <string name="alarm_ringtone_title">Default alarm sound</string>
 
-    <!-- applications --><skip />
-    <!-- Applications settings title, on main settings screen. If clicked, the user is taken to a settings screen full of application settings-->
+    <!-- Units Settings -->
+    <!-- Units Settings title [CHAR LIMIT=10] -->
+    <string name="units_settings">Units</string>
+    <string name="units_speed_title">Speed</string>
+    <string name="units_distance_title">Distance</string>
+    <string name="units_fuel_consumption_title">Fuel consumption</string>
+    <string name="units_energy_consumption_title">Energy consumption</string>
+    <string name="units_temperature_title">Temperature</string>
+    <string name="units_volume_title">Volume</string>
+    <string name="units_pressure_title">Pressure</string>
+
+    <!--Units list entry, it shows the unit abbreviation (not translated) and then the same unit as it is pronounced, in that order. (e.g. mph - Miles per hour) [CHAR LIMIT = 120] -->
+    <string name="units_list_entry"><xliff:g example="mph" id="unit_abbreviation">%1$s</xliff:g> - <xliff:g example="Miles per hour" id="unit_pronunciation">%2$s</xliff:g></string>
+    <!--Units template for ratio units with numerators and denominators [CHAR LIMIT = 50]-->
+    <string name="units_ratio"><xliff:g example="km" id="unit_numerator">%1$s</xliff:g>/<xliff:g example="h" id="unit_denominator">%2$s</xliff:g></string>
+    <!--Units numerator part that can be used in ratio units string template-->
+    <string name="units_ratio_numerator"><xliff:g example="10" id="unit_numerator_quantity">%1$d</xliff:g><xliff:g example="kWh" id="unit_numerator_unit">%2$s</xliff:g></string>
+    <!--Units denominator part that can be used in ratio units string template-->
+    <string name="units_ratio_denominator"><xliff:g example="100" id="unit_denominator_quantity">%1$d</xliff:g><xliff:g example="mi" id="unit_denominator_unit">%2$s</xliff:g></string>
+    <!-- Meter per Second Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_meter_per_sec">Meter per Second</string>
+    <!-- Revolutions per Minute Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_rpm">Revolutions per Minute</string>
+    <!-- Hertz Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_hertz">Hertz</string>
+    <!-- Percentile Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_percentile">Percentile</string>
+    <!-- Millimeter Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_millimeter">Millimeter</string>
+    <!-- Meter Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_meter">Meter</string>
+    <!-- Kilometer Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_kilometer">Kilometer</string>
+    <!-- Mile Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_mile">Mile</string>
+    <!-- Celsius Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_celsius">Celsius</string>
+    <!-- Fahrenheit Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_fahrenheit">Fahrenheit</string>
+    <!-- Kelvin Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_kelvin">Kelvin</string>
+    <!-- Milliliter Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_milliliter">Milliliter</string>
+    <!-- Liter Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_liter">Liter</string>
+    <!-- Gallon Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_us_gallon">Gallon</string>
+    <!-- Imperial Gallon Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_imperial_gallon">Imperial Gallon</string>
+    <!-- Nanosecond Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_nano_secs">Nanosecond</string>
+    <!-- Second Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_secs">Second</string>
+    <!-- Year Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_year">Year</string>
+    <!-- Kilopascal Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_kilopascal">Kilopascal</string>
+    <!-- Watt Hour Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_watt_hour">Watt Hour</string>
+    <!-- Milliampere Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_milliampere">Milliampere</string>
+    <!-- Millivolt Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_millivolt">Millivolt</string>
+    <!-- Milliwatt Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_milliwatts">Milliwatt</string>
+    <!-- Ampere hour Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_ampere_hour">Ampere hour</string>
+    <!-- Kilowatt hour Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_kilowatt_hour">Kilowatt hour</string>
+    <!-- Pounds per square inch Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_psi">Pounds per square inch</string>
+    <!-- Miles per hour Unit as it is pronounced [CHAR LIMIT = 50]-->
+    <string name="units_unit_name_miles_per_hour">Miles per hour</string>
+    <!-- Kilometers per hour Unit as it is pronounced [CHAR LIMIT = 50]-->
+    <string name="units_unit_name_kilometers_per_hour">Kilometers per hour</string>
+    <!-- Bar Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_bar">Bar</string>
+    <!-- Degree Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_degrees">Degree</string>
+    <!-- Miles per Kilowatt Unit as it is pronounced [CHAR LIMIT=80]-->
+    <string name="units_unit_name_kilowatt_per_hundred_miles">Kilowatt per hundred Miles</string>
+    <!-- Kilometers per Kilowatt Unit as it is pronounced [CHAR LIMIT=80]-->
+    <string name="units_unit_name_kilowatt_per_hundred_kilometers">Kilowatt per hundred Kilometers</string>
+    <!--Miles per gallon Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_miles_per_gallon_us">Miles per Gallon (US)</string>
+    <!--Miles per gallon Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_miles_per_gallon_uk">Miles per Gallon (UK)</string>
+    <!--Kilometers per liter Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_kilometers_per_liter">Kilometers per Liter</string>
+    <!--Kilometers per liter Unit as it is pronounced [CHAR LIMIT=50]-->
+    <string name="units_unit_name_liter_per_hundred_kilometers">Liters per hundred Kilometers</string>
+
+    <!-- Units in abbreviated form -->
+    <string name="units_unit_abbreviation_meter_per_sec" translatable="false">m/s</string>
+    <string name="units_unit_abbreviation_rpm" translatable="false">RPM</string>
+    <string name="units_unit_abbreviation_hertz" translatable="false">Hz</string>
+    <string name="units_unit_abbreviation_percentile" translatable="false">%</string>
+    <string name="units_unit_abbreviation_millimeter" translatable="false">mm</string>
+    <string name="units_unit_abbreviation_meter" translatable="false">m</string>
+    <string name="units_unit_abbreviation_kilometer" translatable="false">km</string>
+    <string name="units_unit_abbreviation_mile" translatable="false">mi</string>
+    <string name="units_unit_abbreviation_celsius" translatable="false">°C</string>
+    <string name="units_unit_abbreviation_fahrenheit" translatable="false">°F</string>
+    <string name="units_unit_abbreviation_kelvin" translatable="false">K</string>
+    <string name="units_unit_abbreviation_milliliter" translatable="false">ml</string>
+    <string name="units_unit_abbreviation_liter" translatable="false">L</string>
+    <string name="units_unit_abbreviation_us_gallon" translatable="false">gal</string>
+    <string name="units_unit_abbreviation_imperial_gallon" translatable="false">IG</string>
+    <string name="units_unit_abbreviation_nano_secs" translatable="false">ns</string>
+    <string name="units_unit_abbreviation_secs" translatable="false">s</string>
+    <string name="units_unit_abbreviation_year" translatable="false">y</string>
+    <string name="units_unit_abbreviation_kilopascal" translatable="false">kPa</string>
+    <string name="units_unit_abbreviation_watt_hour" translatable="false">Wh</string>
+    <string name="units_unit_abbreviation_milliampere" translatable="false">mA</string>
+    <string name="units_unit_abbreviation_millivolt" translatable="false">mV</string>
+    <string name="units_unit_abbreviation_milliwatts" translatable="false">mW</string>
+    <string name="units_unit_abbreviation_ampere_hour" translatable="false">Ah</string>
+    <string name="units_unit_abbreviation_kilowatt_hour" translatable="false">kWh</string>
+    <string name="units_unit_abbreviation_psi" translatable="false">PSI</string>
+    <string name="units_unit_abbreviation_bar" translatable="false">bar</string>
+    <string name="units_unit_abbreviation_degrees" translatable="false">°</string>
+    <string name="units_unit_abbreviation_miles_per_hour" translatable="false">mph</string>
+    <string name="units_unit_abbreviation_kilometers_per_hour" translatable="false">km/h</string>
+    <string name="units_unit_abbreviation_miles_per_gallon_us" translatable="false">mpg (US)</string>
+    <string name="units_unit_abbreviation_miles_per_gallon_uk" translatable="false">mpg (UK)</string>
+    <string name="units_unit_abbreviation_kilometers_per_liter" translatable="false">km/L</string>
+    <string name="units_unit_abbreviation_liters_per_hundred_kilometers" translatable="false">L/100km</string>
+
+    <!-- applications --><skip/>
+    <!-- Apps and notifications settings title, on main settings screen. If clicked, the user is taken to a settings screen full of apps and notifications settings [CHAR LIMIT=40] -->
+    <string name="apps_and_notifications_settings">Apps &amp; notifications</string>
+    <!-- Preference which opens application settings when clicked [CHAR LIMIT=40] -->
+    <string name="all_applications">Show all apps</string>
+    <!-- Default app settings title, which allows user to select defaults for certain application types. [CHAR LIMIT=40] -->
+    <string name="default_applications">Default apps</string>
+    <!-- Label for list that shows all permissions [CHAR LIMIT=40] -->
+    <string name="app_permissions">App permissions</string>
+    <!-- Summary of permissions currently granted to apps [CHAR LIMIT=60] -->
+    <string name="app_permissions_summary">Apps using <xliff:g id="apps" example="location">%1$s</xliff:g></string>
+    <!-- Applications settings title. If clicked, the user is taken to the list of installed applications. [CHAR LIMIT=40] -->
     <string name="applications_settings">App info</string>
-    <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to disable an existing application. -->
+    <!-- Manage applications, text label for button to kill / force stop an application. [CHAR LIMIT=30] -->
+    <string name="force_stop">Force stop</string>
+    <!-- Manage applications, title for dialog when killing persistent apps. [CHAR LIMIT=40] -->
+    <string name="force_stop_dialog_title">Force stop?</string>
+    <!-- Manage applications, text for dialog when killing persistent apps. [CHAR LIMIT=200] -->
+    <string name="force_stop_dialog_text">If you force stop an app, it may misbehave.</string>
+    <!-- Manage applications, individual application info screen. Button to disable an existing application. [CHAR LIMIT=25] -->
     <string name="disable_text">Disable</string>
-    <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to re-enable an existing application. -->
+    <!-- Manage applications, individual application info screen. Button to re-enable an existing application. [CHAR LIMIT=25] -->
     <string name="enable_text">Enable</string>
+    <!-- Manage applications, individual application info screen. Button to remove the application from the system. [CHAR LIMIT=25] -->
+    <string name="uninstall_text">Uninstall</string>
+    <!-- Manage applications, text for dialog when disabling apps. [CHAR LIMIT=200] -->
+    <string name="app_disable_dialog_text">If you disable this app, Android and other apps may no longer function as intended.</string>
+    <!-- Manage applications, label for option to disable app. [CHAR LIMIT=30] -->
+    <string name="app_disable_dialog_positive">Disable app</string>
+    <!-- Manage applications, text informing that an application is not installed for the current user. [CHAR_LIMIT=NONE] -->
+    <string name="not_installed">Not installed for this user</string>
     <!-- Manage applications, individual application info screen, heading for settings related to the app's permissions. for example, it may list all the permissions the app has. -->
     <string name="permissions_label">Permissions</string>
+    <!-- Label for the toggle that enables/disables an app's notifications. [CHAR LIMIT=20] -->
+    <string name="notifications_label">Notifications</string>
     <!-- Label for displaying application version. -->
     <string name="application_version_label">Version: %1$s</string>
     <!-- Runtime permissions preference summary, shown when the app has no permissions granted. [CHAR LIMIT=40] -->
@@ -212,23 +609,145 @@
     <string name="data_usage_summary_title">Data usage</string>
     <!-- Activity title for Appk data usage summary. [CHAR LIMIT=25] -->
     <string name="data_usage_app_summary_title">App data usage</string>
-    <!-- Manage applications, text label for button to kill / force stop an application -->
-    <string name="force_stop">Force stop</string>
     <string name="computing_size">Computing\u2026</string>
     <!-- Runtime permissions preference summary.  Number of additional permissions granted. [CHAR LIMIT=40] -->
     <plurals name="runtime_permissions_additional_count">
-        <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> additional permission</item>
-        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> additional permissions</item>
+        <item quantity="one"><xliff:g example="1" id="count">%d</xliff:g> additional permission</item>
+        <item quantity="other"><xliff:g example="10" id="count">%d</xliff:g> additional permissions</item>
     </plurals>
+    <!-- Dialog body explaining that the app just selected by the user will not work after a reboot until after the user enters their credentials, such as a PIN or password. [CHAR LIMIT=NONE] -->
+    <string name="direct_boot_unaware_dialog_message_car">Note: After a reboot, this app can\'t start until you unlock your vehicle.</string>
+    <!-- Assistant and voice input settings title. This setting goes into the manage assistant settings page. [CHAR LIMIT=40] -->
+    <string name="assist_and_voice_input_settings">Assist &amp; voice input</string>
+    <!-- Default assistant settings title. This setting allows users to select the default assistant for the device. [CHAR LIMIT=40] -->
+    <string name="assist_app_settings">Assist app</string>
+    <!-- Title for the text context preference to determine whether assist can access the data currently displayed on-screen [CHAR LIMIT=40] -->
+    <string name="assist_access_context_title">Use text from screen</string>
+    <!-- Summary for the text context preference to determine whether assist can access the data currently displayed on-screen [CHAR LIMIT=NONE] -->
+    <string name="assist_access_context_summary">Allow the assist app to access the screen contents as text</string>
+    <!-- Title for the screenshot context preference to determine whether assist can access the screenshot of your screen [CHAR LIMIT=40] -->
+    <string name="assist_access_screenshot_title">Use screenshot</string>
+    <!-- Summary for the screenshot context preference to determine whether assist can access the screenshot of your screen [CHAR LIMIT=NONE] -->
+    <string name="assist_access_screenshot_summary">Allow the assist app to access an image of the screen</string>
+    <!-- Title of the screen of the voice input settings [CHAR_LIMIT=40]-->
+    <string name="voice_input_settings_title">Voice input</string>
+    <!-- Title of the autofill service settings screen. [CHAR LIMIT=40] -->
+    <string name="autofill_settings_title">Autofill service</string>
+    <!-- Title of the option to remove the default application. [CHAR LIMIT=30] -->
+    <string name="app_list_preference_none">None</string>
+    <!-- Label to show which application is chosen as the default application. [CHAR LIMIT=30] -->
+    <string name="default_app_selected_app">Selected</string>
+    <!-- Warning message about security implications of setting an assistant, displayed as a dialog message when the user selects an assistant. [CHAR_LIMIT=NONE]  -->
+    <string name="assistant_security_warning">The assistant will be able to read information about apps in use on your system, including information visible on your screen or accessible within the apps.</string>
+    <!-- Message of the warning dialog for setting the auto-fill app. [CHAR_LIMIT=NONE] -->
+    <string name="autofill_confirmation_message">
+        <![CDATA[
+        <b>Make sure you trust this app</b>
+        <br/>
+        <br/>
+        <xliff:g id="app_name" example="Google Autofill">%1$s</xliff:g> uses what\'s on
+        your screen to determine what can be autofilled.
+        ]]>
+    </string>
+    <!-- Title of preference to add new autofill services. [CHAR_LIMIT=30] -->
+    <string name="autofill_add_service">Add service</string>
+    <!-- Title of setting to change the handled domain urls [CHAR LIMIT=60]-->
+    <string name="app_launch_domain_links_title">Opening links</string>
+    <!-- Section title for the Domain URL app preference list [CHAR LIMIT=60]-->
+    <string name="domain_url_section_title">Installed apps</string>
+    <!-- Summary for an app that doesn't open any domain URLs [CHAR LIMIT=45] -->
+    <string name="domain_urls_summary_none">Don\u2019t open supported links</string>
+    <!-- Summary of an app that can open URLs for exactly one domain [CHAR LIMIT=45] -->
+    <string name="domain_urls_summary_one">Open <xliff:g id="domain" example="mail.google.com">%s</xliff:g></string>
+    <!-- Summary of an app that can open several domain's URLs [CHAR LIMIT=45] -->
+    <string name="domain_urls_summary_some">Open <xliff:g id="domain" example="mail.google.com">%s</xliff:g> and other URLs</string>
+    <!-- Title of app specific setting to view and modify app launch settings. [CHAR LIMIT=40] -->
+    <string name="app_launch_title">Open by default</string>
+    <!-- Sub heading for preferences not related to managed domain urls. [CHAR LIMIT=40] -->
+    <string name="app_launch_other_defaults_title">Other defaults</string>
+    <!-- Text if the app is NOT a default for actions. [CHAR LIMIT=40] -->
+    <string name="auto_launch_disable_text">No defaults set.</string>
+    <!-- Text if the app is set as a default for some actions. [CHAR LIMIT=80] -->
+    <string name="auto_launch_enable_text">You\u2019ve chosen to launch this app by default for some actions.</string>
+    <!-- Summary to indicate to user that the preference can be clicked to clear the default app preference. [CHAR LIMIT=40] -->
+    <string name="auto_launch_reset_text">Clear defaults</string>
+    <!-- Title of preference to pick how the app should open related urls [CHAR LIMIT=60] -->
+    <string name="app_launch_open_domain_urls_title">Open supported links</string>
+    <!-- Explanation that the app that will ALWAYS be launched to open web links to domains that it understands [CHAR LIMIT=40] -->
+    <string name="app_link_open_always">Open in this app</string>
+    <!-- Explanation that the user will be asked whether to launch the app to open web links to domains that it understands [CHAR LIMIT=40] -->
+    <string name="app_link_open_ask">Ask every time</string>
+    <!-- Explanation that the app that will NEVER be launched to open web links to domains that it understands [CHAR LIMIT=60] -->
+    <string name="app_link_open_never">Don\u2019t open in this app</string>
+    <!-- Title of dialog showing the supported link domains [CHAR LIMIT=40] -->
+    <string name="app_launch_supported_domain_urls_title">Supported links</string>
 
+    <!-- Label for screen where user can grant applications special access to various systems. [CHAR_LIMIT=60] -->
+    <string name="special_access">Special app access</string>
+    <!-- Text for toggle button to control whether system processes are shown in app lists. [CHAR_LIMIT=30] -->
+    <string name="show_system">Show system</string>
+    <!-- Text for toggle button to control whether system processes are hidden in app lists. [CHAR_LIMIT=30] -->
+    <string name="hide_system">Hide system</string>
+    <!-- Title for managing apps which can modify system settings. [CHAR_LIMIT=40] -->
+    <string name="modify_system_settings_title">Modify system settings</string>
+    <!-- Description of modifying system settings. [CHAR_LIMIT=NONE] -->
+    <string name="modify_system_settings_description">This permission allows an app to modify system settings.</string>
+    <!-- Title for managing components which can listen to notifications. [CHAR_LIMIT=30] -->
+    <string name="notification_access_title">Notification access</string>
+    <!-- Title for a warning message about security implications of enabling a notification listener, displayed as a dialog message. [CHAR_LIMIT=NONE] -->
+    <string name="notification_listener_security_warning_title">Allow notification access for <xliff:g id="service" example="NotificationReader">%1$s</xliff:g>?</string>
+    <!-- Summary for a warning message about security implications of enabling a notification listener, displayed as a dialog message. [CHAR_LIMIT=NONE] -->
+    <string name="notification_listener_security_warning_summary"><xliff:g id="notification_listener_name">%1$s</xliff:g> will be able to read all notifications, including personal information such as contact names and the text of messages you receive. It will also be able to dismiss notifications or trigger action buttons they contain.\n\nThis will also give the app the ability to turn Do Not Disturb on or off and change related settings.</string>
+    <!-- Summary for a warning message about revoking notification listener access, displayed as a dialog message. [CHAR_LIMIT=NONE] -->
+    <string name="notification_listener_revoke_warning_summary">If you turn off notification access for <xliff:g id="notification_listener_name">%1$s</xliff:g>, Do Not Disturb access may also be turned off.</string>
+    <!-- Positive button for a dialog warning message about revoking notification listener access. [CHAR_LIMIT=30] -->
+    <string name="notification_listener_revoke_warning_confirm">Turn off</string>
+    <!-- Negative button for a dialog warning message about revoking notification listener access. [CHAR_LIMIT=30] -->
+    <string name="notification_listener_revoke_warning_cancel">Cancel</string>
+    <!-- Title for screen controlling which apps have access to send premium sms messages. [CHAR_LIMIT=60] -->
+    <string name="premium_sms_access_title">Premium SMS access</string>
+    <!-- Message shown for option to enable Premium SMS for an app. [CHAR_LIMIT=NONE] -->
+    <string name="premium_sms_access_description">Premium SMS may cost you money and will add up to your carrier bills. If you enable permission for an app, you will be able to send premium SMS using that app.</string>
+    <!-- Title for managing apps which can query usage data. [CHAR_LIMIT=30] -->
+    <string name="usage_access_title">Usage access</string>
+    <!-- Description of the usage access permission. [CHAR_LIMIT=NONE] -->
+    <string name="usage_access_description">Usage access allows an app to track what other apps you\u2019re using and how often, as well as your carrier, language settings, and other details.</string>
+    <!-- Title for managing apps which can change Wi-Fi state. [CHAR_LIMIT=30] -->
+    <string name="wifi_control_title">Wi-Fi control</string>
+    <!-- Description of the change wifi state permission. [CHAR_LIMIT=NONE] -->
+    <string name="wifi_control_description">Wi-Fi control allows an app to turn Wi-Fi on or off, scan and connect to Wi-Fi networks, add or remove networks, or start a local-only hotspot.</string>
+    <!-- Title for item that when selected will launch into additional special access settings. [CHAR_LIMIT=30] -->
+    <string name="more_special_access_title">More</string>
 
-    <!-- System --><skip />
+    <!-- Location --><skip/>
+    <!-- Main setting menu item to go into location settings [CHAR LIMIT=40] -->
+    <string name="location_settings_title">Location</string>
+    <!-- Title of Recent Location Requests setting [CHAR LIMIT=60] -->
+    <string name="location_settings_recent_requests_title">Recent Location Requests</string>
+    <!-- Message indicating that no apps have requested location recently [CHAR LIMIT=60] -->
+    <string name="location_settings_recent_requests_empty_message">No recent location requests</string>
+    <!-- Title of Location App-level Permissions setting [CHAR LIMIT=60] -->
+    <string name="location_settings_app_permissions_title">App-level permissions</string>
+    <!-- Title of Location Scanning setting [CHAR LIMIT=60] -->
+    <string name="location_settings_scanning_title">Scanning</string>
+    <!-- Title of Location Services category [CHAR LIMIT=60] -->
+    <string name="location_settings_services_title">Location Services</string>
+
+    <!-- Location Scanning --><skip/>
+    <!-- Title of Wi-Fi scanning preference [CHAR LIMIT=60] -->
+    <string name="location_settings_wifi_scanning_title">Wi\u2011Fi scanning</string>
+    <!-- Summary of Wi-Fi scanning preference [CHAR LIMIT=240] -->
+    <string name="location_settings_wifi_scanning_summary">Allow apps and services to scan for Wi\u2011Fi networks at any time, even when Wi\u2011Fi is off. This can be used, for example, to improve location-based features and services.</string>
+    <!-- Title of Bluetooth scanning preference [CHAT LIMIT=60]-->
+    <string name="location_settings_bluetooth_scanning_title">Bluetooth scanning</string>
+    <!-- Summary of Bluetooth scanning preference [CHAR LIMIT=240] -->
+    <string name="location_settings_bluetooth_scanning_summary">Allow apps and services to scan for nearby devices at any time, even when Bluetooth is off. This can be used, for example, to improve location-based features and services.</string>
+
+    <!-- System --><skip/>
     <!-- Main setting menu item to go into system settings -->
     <string name="system_setting_title">System</string>
-    <!-- About phone screen, list item title.  Takes the user to the screen for seeing and installing system updates. [CHAR LIMIT=40] -->
-    <string name="system_update_settings_list_item_title">System updates</string>
-    <!-- About phone screen, list item summary.  Takes the user to the screen for seeing and installing system updates. [CHAR LIMIT=40] -->
-    <string name="system_update_settings_list_item_summary">""</string>
+    <!-- System updates title.  Takes the user to the screen for seeing and installing system updates. [CHAR LIMIT=40] -->
+    <string name="system_update_settings_title">System updates</string>
 
     <!-- About phone screen, status item label  [CHAR LIMIT=40] -->
     <string name="firmware_version">Android version</string>
@@ -242,6 +761,8 @@
     <string name="kernel_version">Kernel version</string>
     <!-- About phone screen,  setting option name  [CHAR LIMIT=40] -->
     <string name="build_number">Build number</string>
+    <!-- About phone screen,  setting option name  [CHAR LIMIT=40] -->
+    <string name="bluetooth_mac_address">Bluetooth address</string>
 
     <!-- About phone screen, show when a value of some status item is unavailable. -->
     <string name="device_info_not_available">Not available</string>
@@ -254,11 +775,11 @@
     <!-- About phone screen, summary of the item to go into the phone status screen -->
     <string name="device_status_summary" product="default">Phone number, signal, etc.</string>
 
-    <!-- About --> <skip />
+    <!-- About --><skip/>
     <!-- Main settings screen, setting title for the user to go into the About phone screen -->
     <string name="about_settings">About</string>
     <!-- Summary of device info page [CHAR LIMIT=NONE] -->
-    <string name="about_summary">Android <xliff:g id="version" example="6.0">%1$s</xliff:g></string>
+    <string name="about_summary">Android <xliff:g example="6.0" id="version">%1$s</xliff:g></string>
     <!-- Main settings screen, setting summary for the user to go into the About phone screen-->
     <string name="about_settings_summary">View legal info, status, software version</string>
     <!-- About phone settings screen, setting option name to go to dialog that shows legal info -->
@@ -271,24 +792,27 @@
     <string name="regulatory_labels">Regulatory labels</string>
     <!-- About phone settings screen, setting option name to show the safety and regulatory manual [CHAR LIMIT=40] -->
     <string name="safety_and_regulatory_info">Safety &amp; regulatory manual</string>
-    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --> <skip />
+    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --><skip/>
     <!-- About phone settings screen, setting option name to see copyright-related info -->
     <string name="copyright_title">Copyright</string>
-    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --> <skip />
+    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --><skip/>
     <!-- About phone settings screen, setting option name to see licensing info -->
     <string name="license_title">License</string>
-    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --> <skip />
+    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --><skip/>
     <!-- About phone settings screen, setting option name to see terms and conditions -->
     <string name="terms_title">Terms and conditions</string>
-    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --> <skip />
+    <!-- Note: this may be replaced by a more-specific title of the activity that will get launched --><skip/>
     <!-- About phone settings screen, setting option name to see licensing info for WebView component. [CHAR LIMIT=35] -->
-    <string name="webview_license_title">System WebView License</string>
+    <string name="webview_license_title">System WebView licenses</string>
     <!-- About phone settings screen, setting option name to see wallpapers attributions -->
     <string name="wallpaper_attributions">Wallpapers</string>
     <!-- About phone settings screen, setting option name to see wallpapers attributions values -->
     <string name="wallpaper_attributions_values">Satellite imagery providers:\n©2014 CNES / Astrium, DigitalGlobe, Bluesky</string>
 
-    <!-- Title for actual Settings license activity. --> <skip />
+    <!-- Text to display in regulatory info screen (from device overlay). [CHAR LIMIT=NONE] -->
+    <string name="regulatory_info_text"></string>
+
+    <!-- Title for actual Settings license activity. --><skip/>
     <!-- About phone settings, Legal information setting option name and title of dialog box holding license info -->
     <string name="settings_license_activity_title">Third-party licenses</string>
     <!-- About phone settings screen, Open source license dialog message when licenses cannot be loaded -->
@@ -296,23 +820,101 @@
     <!-- About phone settings screen, Open source license dialog title until license is fully loaded -->
     <string name="settings_license_activity_loading">Loading\u2026</string>
 
+    <!-- Developer Settings -->
+    <!-- Device Info screen. Countdown for user taps to enable development settings. [CHAR LIMIT=NONE] -->
+    <plurals name="show_dev_countdown">
+        <item quantity="one">You are now <xliff:g id="step_count">%1$d</xliff:g> step away from being a developer.</item>
+        <item quantity="other">You are now <xliff:g id="step_count">%1$d</xliff:g> steps away from being a developer.</item>
+    </plurals>
+    <!-- Device Info screen. Confirmation that developer settings are enabled. [CHAR LIMIT=NONE] -->
+    <string name="show_dev_on">You are now a developer!</string>
+    <!-- Device Info screen. Okay we get it, stop pressing, you already have it on. [CHAR LIMIT=NONE] -->
+    <string name="show_dev_already">No need, you are already a developer.</string>
+    <!-- Title of Developer options preference screen. [CHAR LIMIT=30] -->
+    <string name="developer_options_settings">Developer options</string>
 
-    <!-- Date and time settings --><skip />
+    <!-- Reset options --><skip/>
+    <!-- Title for a screen containing all device reset options. [CHAR LIMIT=50] -->
+    <string name="reset_options_title">Reset options</string>
+    <!-- Summary text for a screen containing all device reset options. [CHAR LIMIT=NONE] -->
+    <string name="reset_options_summary">Network, apps, or device reset</string>
+
+    <!-- Reset Network --><skip/>
+    <!-- Button title to reset Wi-Fi settings, mobile data settings, and Bluetooth settings. [CHAR LIMIT=40] -->
+    <string name="reset_network_title">Reset network</string>
+    <!-- Message on screen after user selects reset network settings. [CHAR LIMIT=NONE] -->
+    <string name="reset_network_desc">This will reset all network settings, including:</string>
+    <!-- List item for Wi-Fi on screen after user selects reset network settings. [CHAR LIMIT=NONE] -->
+    <string name="reset_network_item_wifi"><li>Wi\u2011Fi</li></string>
+    <!-- List item for Mobile data on screen after user selects reset network settings. [CHAR LIMIT=NONE] -->
+    <string name="reset_network_item_mobile"><li>Mobile data</li></string>
+    <!-- List item for Bluetooth on screen after user selects reset network settings. [CHAR LIMIT=NONE] -->
+    <string name="reset_network_item_bluetooth"><li>Bluetooth</li></string>
+    <!-- Title for option to reset all eSIMs for the vehicle. [CHAR LIMIT=50] -->
+    <string name="reset_esim_title">Erase all vehicle eSIMs</string>
+    <!-- Description text for option to reset all eSIMs for the vehicle. [CHAR LIMIT=NONE] -->
+    <string name="reset_esim_desc">This will not cancel your service plan.</string>
+    <!-- Title for error dialog when esim reset fails. [CHAR LIMIT=NONE] -->
+    <string name="reset_esim_error_title">Can\u2019t reset eSIMs</string>
+    <!-- Fallback representation of a network subscription that does not supply a display name, number, or carrier name. -->
+    <string name="reset_network_fallback_subscription_name" translatable="false">MCC:%s MNC:%s Slot:%s Id:%s</string>
+    <!-- Title of dialog to select network to reset. [CHAR LIMIT=30] -->
+    <string name="reset_network_select">Select network</string>
+    <!-- Button on screen after user selects reset network settings. [CHAR LIMIT=30] -->
+    <string name="reset_network_button_text">Reset settings</string>
+    <!-- Reset settings confirmation screen title. [CHAR LIMIT=30] -->
+    <string name="reset_network_confirm_title">Reset?</string>
+    <!-- Message on screen after user selects Reset settings button. [CHAR LIMIT=NONE] -->
+    <string name="reset_network_confirm_desc">Reset all network settings? You can\u2019t undo this action!</string>
+    <!-- Button on screen after user selects Reset settings button. [CHAR LIMIT=30] -->
+    <string name="reset_network_confirm_button_text">Reset settings</string>
+    <!-- Reset settings complete toast text. [CHAR LIMIT=75] -->
+    <string name="reset_network_complete_toast">Network settings have been reset</string>
+
+    <!-- Reset apps --><skip/>
+    <!-- Button title to reset all of user's app preferences. [CHAR LIMIT=40] -->
+    <string name="reset_app_pref_title">Reset app preferences</string>
+    <!-- Message on screen after user selects reset app preferences. [CHAR LIMIT=NONE] -->
+    <string name="reset_app_pref_desc">This will reset all preferences for:\n\n<li>Disabled apps</li>\n<li>Disabled app notifications</li>\n<li>Default applications for actions</li>\n<li>Background data restrictions for apps</li>\n<li>Any permission restrictions</li>\n\nYou will not lose any app data.
+    </string>
+    <!-- Button on screen after user selects reset app preferences. [CHAR LIMIT=30] -->
+    <string name="reset_app_pref_button_text">Reset apps</string>
+    <!-- Reset app preferences complete toast text. [CHAR LIMIT=75] -->
+    <string name="reset_app_pref_complete_toast">App preferences have been reset</string>
+
+    <!-- Master Clear --><skip/>
+    <!-- Button title to factory data reset the entire device. The "(factory reset)" part is optional for translation. [CHAR LIMIT=40]-->
+    <string name="master_clear_title">Erase all data (factory reset)</string>
+    <!-- Message on screen after user selects factory reset. [CHAR LIMIT=NONE] -->
+    <string name="master_clear_desc">This will erase all data from your vehicle\u2019s head unit, including:\n\n<li>Your Google account</li>\n<li>System and app data and settings</li>\n<li>Downloaded apps</li></string>
+    <!-- The list of current accounts follows this text. [CHAR LIMIT=NONE] -->
+    <string name="master_clear_accounts">You are currently signed into the following accounts:</string>
+    <!-- Message on screen if other users are present on the device after user selects factory reset. [CHAR LIMIT=NONE] -->
+    <string name="master_clear_other_users_present">There are other users present on this vehicle.</string>
+    <!-- Button on screen after user selects factory reset. [CHAR LIMIT=30] -->
+    <string name="master_clear_button_text">Reset vehicle</string>
+    <!-- Master clear confirmation screen title. [CHAR LIMIT=30] -->
+    <string name="master_clear_confirm_title">Reset?</string>
+    <!-- Message on screen after user selects Reset device button. [CHAR LIMIT=NONE] -->
+    <string name="master_clear_confirm_desc">Erase all your personal information and downloaded apps?  You can\u2019t undo this action!</string>
+    <string name="master_clear_confirm_button_text">Erase everything</string>
+    <!-- Master clear progress screen title. [CHAR LIMIT=30] -->
+    <string name="master_clear_progress_title" >Erasing</string>
+    <!-- Master clear progress screen text. [CHAR LIMIT=75] -->
+    <string name="master_clear_progress_text">Please wait...</string>
+
+    <!-- Date and time settings --><skip/>
     <!-- Main Settings screen setting option name to go into the date and time settings-->
     <string name="date_and_time_settings_title">Date &amp; time</string>
-    <!-- Title for Date & Time settings screen in SetupWizard [CHAR LIMIT=40] -->
-    <string name="date_and_time_settings_title_setup_wizard">Set date and time</string>
     <!-- Main Settings screen setting option summary text for the item to go into the date and time settings. -->
     <string name="date_and_time_settings_summary">Set date, time, time zone, &amp; formats</string>
     <!-- Date & time setting screen setting check box title if the date and time should be determined automatically [CHAR LIMIT=30] -->
     <string name="date_time_auto">Automatic date &amp; time</string>
-    <!-- Date & time setting screen setting option summary text when Automatic check box is selected
-        (that is, when date and time should be determined automatically) [CHAR LIMIT=100] -->
+    <!-- Date & time setting screen setting option summary text when Automatic check box is selected (that is, when date and time should be determined automatically) [CHAR LIMIT=100] -->
     <string name="date_time_auto_summary">Use network-provided time</string>
     <!-- Date & time setting screen setting check box title if the time zone should be determined automatically [CHAR LIMIT=30] -->
     <string name="zone_auto">Automatic time zone</string>
-    <!-- Date & time setting screen setting option summary text when Automatic time zone check box is selected (that is, when date and time should be determined automatically)
-        [CHAR LIMIT=100]  -->
+    <!-- Date & time setting screen setting option summary text when Automatic time zone check box is selected (that is, when date and time should be determined automatically) [CHAR LIMIT=100]  -->
     <string name="zone_auto_summary">Use network-provided time zone</string>
     <!-- Date & time setting screen setting check box title [CHAR LIMIT=30] -->
     <string name="date_time_24hour_title">24\u2011hour format</string>
@@ -334,27 +936,96 @@
     <string name="zone_list_menu_sort_alphabetically">Sort alphabetically</string>
     <!-- Menu item on Select time zone screen -->
     <string name="zone_list_menu_sort_by_timezone">Sort by time zone</string>
-    <!-- Title string shown above DatePicker, letting a user select system date
-         [CHAR LIMIT=20] -->
+    <!-- Title string shown above DatePicker, letting a user select system date [CHAR LIMIT=20] -->
     <string name="date_picker_title">Date</string>
-    <!-- Title string shown above TimePicker, letting a user select system time
-         [CHAR LIMIT=20] -->
+    <!-- Title string shown above TimePicker, letting a user select system time [CHAR LIMIT=20] -->
     <string name="time_picker_title">Time</string>
 
-    <!-- User settings add user menu [CHAR LIMIT=35] -->
-    <string name="user_add_user_menu">Add user</string>
-    <!-- Button title for adding an account [CHAR LIMIT=35] -->
-    <string name="user_add_account_menu">Add account</string>
-    <!-- Spoken content description for delete icon beside a user [CHAR LIMIT=none] -->
-    <string name="user_delete_user_description">Delete user</string>
-    <!-- User details new user name [CHAR LIMIT=30] -->
-    <string name="user_new_user_name">New user</string>
-    <!-- Title for Guest user [CHAR LIMIT=35] -->
-    <string name="user_guest">Guest</string>
+    <!-- Admin user management --><skip/>
     <!-- Title for Admin user [CHAR LIMIT=35] -->
     <string name="user_admin">Admin</string>
-    <!-- User summary to indicate Admin user is currently logged in[CHAR LIMIT=35] -->
+    <!-- User summary to be displayed next to the currently logged-in user if they are also an admin. [CHAR LIMIT=35] -->
     <string name="signed_in_admin_user">Signed in as admin</string>
+    <!-- Title for the dialog that grants the user admin permissions. [CHAR LIMIT=50]-->
+    <string name="grant_admin_permissions_title">All admin permissions</string>
+    <!-- Button text for granting admin permissions to a user [CHAR LIMIT=35]-->
+    <string name="grant_admin_permissions_button_text">Make Admin</string>
+    <!-- Message to inform the user of what will happen when another user is upgraded to Admin status. [CHAR LIMIT=NONE]-->
+    <string name="grant_admin_permissions_message">The user will be able to delete users, including other Admins, and factory reset the system.</string>
+    <!-- Message to inform the user that granting admin permissions to another user is not reversible. [CHAR LIMIT=100]-->
+    <string name="action_not_reversible_message">This action is not reversible.</string>
+    <!-- Button text to confirm granting admin permissions to another user. [CHAR LIMIT=40]-->
+    <string name="confirm_grant_admin">Yes, make admin</string>
+
+    <!-- User Restrictions --><skip/>
+    <!-- Creating Users --><skip/>
+    <!-- Title for toggle that controls whether a user is able to create other users [CHAR LIMIT=35] -->
+    <string name="create_user_permission_title">Create new users</string>
+
+    <!-- Outgoing Calls --><skip/>
+    <!-- Title for toggle that controls whether a user is able to make outgoing calls [CHAR LIMIT=35] -->
+    <string name="outgoing_calls_permission_title">Make phone calls</string>
+
+    <!-- SMS Messaging --><skip/>
+    <!-- Title for toggle that controls whether a user is able to send and receive sms messages using the car's mobile data [CHAR LIMIT=55] -->
+    <string name="sms_messaging_permission_title">Messaging via car\u0027s mobile data</string>
+
+    <!-- Apps --><skip/>
+    <!-- Title for toggle that controls whether a user is able to install new apps [CHAR LIMIT=35] -->
+    <string name="install_apps_permission_title">Install new apps</string>
+    <!-- Title for toggle that controls whether a user is able to uninstall apps [CHAR LIMIT=35] -->
+    <string name="uninstall_apps_permission_title">Uninstall apps</string>
+
+    <!-- Adding new users --><skip/>
+    <!-- User settings add user menu [CHAR LIMIT=35] -->
+    <string name="user_add_user_menu">Add user</string>
+    <!-- User details new user name [CHAR LIMIT=30] -->
+    <string name="user_new_user_name">New user</string>
+    <!-- Title of the alert dialog to ask user to confirm creation of new user. [CHAR LIMIT=30] -->
+    <string name="user_add_user_title">"Add new user?"</string>
+    <!-- Message to inform user that creation of new user requires that user to set up their space. [CHAR LIMIT=100] -->
+    <string name="user_add_user_message_setup">When you add a new user, that person needs to set up their space.</string>
+    <!-- Message to inform user that the newly created user will have permissions to update apps for all other users. [CHAR LIMIT=100] -->
+    <string name="user_add_user_message_update">Any user can update apps for all other users.</string>
+    <!-- Title for the dialog that lets users know that the maximum allowed number of users on the device has been reached. [CHAR LIMIT=35]-->
+    <string name="user_limit_reached_title">User limit reached</string>
+    <!-- Message that tells people what's the maximum number of uses allowed on the device. [CHAR_LIMIT=NONE]-->
+    <plurals name="user_limit_reached_message">
+        <item quantity="one">Only one user can be created.</item>
+        <item quantity="other">You can create up to <xliff:g example="3" id="count">%d</xliff:g> users.</item>
+    </plurals>
+    <!-- Title of the alert dialog to notify that the creation of new user has failed. [CHAR LIMIT=40] -->
+    <string name="add_user_error_title">Failed to create a new user</string>
+
+    <!-- Deleting users --><skip/>
+    <!-- Title of the alert dialog to ask user to confirm user deletion [CHAR LIMIT=40] -->
+    <string name="delete_user_dialog_title">Delete this user?</string>
+    <!-- Message to inform user that all of user's data will be deleted if confirmed [CHAR LIMIT=NONE] -->
+    <string name="delete_user_dialog_message">"All apps and data will be deleted."</string>
+    <!-- Title of the alert dialog to notify that user deletion has failed. [CHAR LIMIT=40] -->
+    <string name="delete_user_error_title">Failed to delete user.</string>
+    <!-- Button label to dismiss user deletion error [CHAR LIMIT=25] -->
+    <string name="delete_user_error_dismiss">Dismiss</string>
+    <!-- Button label to retry user deletion [CHAR LIMIT=25] -->
+    <string name="delete_user_error_retry">Retry</string>
+    <!-- Title of the alert dialog to ask user to confirm deletion of the last user on the device. [CHAR LIMIT=40] -->
+    <string name="delete_last_user_dialog_title">Delete last user?</string>
+    <!-- Message to inform user that deletion of the last user will prompt the creation of a new admin user. [CHAR LIMIT=NONE] -->
+    <string name="delete_last_user_admin_created_message">"After deleting the only remaining user for this car, a new admin user will be created."</string>
+    <!-- Message to inform user that deletion of the last user will require new system setup. [CHAR LIMIT=NONE] -->
+    <string name="delete_last_user_system_setup_required_message">"All data, settings, and apps associated with this user will be deleted. You'll need to set up the system again."</string>
+    <!-- Title of the alert dialog to notify that new admin should be chosen. [CHAR LIMIT=40] -->
+    <string name="choose_new_admin_title">Choose new admin</string>
+    <!-- Message to notify that new admin must be chosen in order to delete the current one. [CHAR LIMIT=150] -->
+    <string name="choose_new_admin_message">You need at least one admin. To delete this one, first choose a replacement.</string>
+    <!-- Label for choosing new admin. [CHAR LIMIT=30] -->
+    <string name="choose_new_admin_label">Choose admin</string>
+
+    <!-- User info --><skip/>
+    <!-- Title for Guest user [CHAR LIMIT=35] -->
+    <string name="user_guest">Guest</string>
+    <!-- Title for button for starting a new guest session [CHAR LIMIT=35] -->
+    <string name="start_guest_session">Guest</string>
     <!-- Description for icon to switch user [CHAR LIMIT=35] -->
     <string name="user_switch">Switch</string>
     <!-- Description for user name that is currently in use -->
@@ -365,17 +1036,71 @@
     <string name="user_summary_not_set_up">Not set up</string>
     <!-- Title for edit user name page [CHAR LIMIT=30] -->
     <string name="edit_user_name_title">Edit user name</string>
-
     <!-- User settings header for list of users on the system. [CHAR LIMIT=35] -->
     <string name="users_list_title">Users</string>
+    <!-- Title for the user details page that shows the permissions granted to the user. The parameter is the name of the user. [CHAR LIMIT=40] -->
+    <string name="user_details_admin_title">Permissions granted to %1$s</string>
+
+    <!-- Storage management --><skip/>
+    <!-- Title for settings that lead into information about device storage [CHAR LIMIT=35] -->
+    <string name="storage_settings_title">Storage</string>
+    <!-- Preference label for the Music & Audio storage section. [CHAR LIMIT=50] -->
+    <string name="storage_music_audio">Music &amp; audio</string>
+    <!-- Preference label for the Other apps storage section. [CHAR LIMIT=50] -->
+    <string name="storage_other_apps">Other apps</string>
+    <!-- Preference label for the Files storage section. [CHAR LIMIT=50] -->
+    <string name="storage_files">Files</string>
+    <!-- Preference label for the System storage section. [CHAR LIMIT=50] -->
+    <string name="storage_system">System</string>
+    <!-- Body of dialog informing user about the storage used by the Android System [CHAR LIMIT=NONE]-->
+    <string name="storage_detail_dialog_system">System includes files used to run Android version <xliff:g id="version" example="8.0">%s</xliff:g></string>
+    <!-- Car storage settings summary. Displayed when the total memory usage is being calculated. Will be replaced with a number like "12.3 GB" when finished calculating. [CHAR LIMIT=30] -->
+    <!-- Title for preference on storage usage page that opens audio file browsing. [CHAR LIMIT=50] -->
+    <string name="storage_audio_files_title">Audio files</string>
+   <!-- Car storage settings summary. Displayed when the total memory usage is being calculated. Will be replaced with a number like "12.3 GB" when finished calculating. [CHAR LIMIT=30] -->
+    <string name="memory_calculating_size">Calculating\u2026</string>
+    <!-- Individual application info screen, label under Storage heading. The amount of space taken up by the application itself (for example, the java compiled files) [CHAR LIMIT=35] -->
+    <string name="storage_application_size_label">App size</string>
+    <!-- Individual application info screen, label under Storage heading.  The amount of space taken up by the app's data (for example, downloaded emails) [CHAR LIMIT=35] -->
+    <string name="storage_data_size_label">User data</string>
+    <!-- Label that appears next to the cache size [CHAR LIMIT=35] -->
+    <string name="storage_cache_size_label">Cache</string>
+    <!-- Individual application info screen,label under Storage heading.  The total storage space taken up by this app. [CHAR LIMIT=35] -->
+    <string name="storage_total_size_label">Total</string>
+    <!-- Individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for example, remove all cached emails for an Email app) [CHAR LIMIT=35] -->
+    <string name="storage_clear_user_data_text">Clear storage</string>
+    <!-- Individual application info screen, button label under Storage heading. Text label for button [CHAR LIMIT=35] -->
+    <string name="storage_clear_cache_btn_text">Clear cache</string>
+    <!-- Individual application screen, confirmation dialog title. Displays when user selects to "Clear data". [CHAR LIMIT=45] -->
+    <string name="storage_clear_data_dlg_title">Delete app data?</string>
+    <!-- Individual application screen, confirmation dialog message. Displays when user selects to "Clear data". It warns the user of the consequences of clearing the data for an app. [CHAR LIMIT=200] -->
+    <string name="storage_clear_data_dlg_text">All this app\u2019s data will be deleted permanently. This includes all files, settings, accounts, databases, etc.</string>
+    <!-- Text for dialog if clear data fails. [CHAR LIMIT=55] -->
+    <string name="storage_clear_failed_dlg_text">Couldn\u2019t clear storage for app.</string>
+
+    <!-- Account management --><skip/>
     <!-- Title for settings that lead into information about User's accounts [CHAR LIMIT=35] -->
     <string name="accounts_settings_title">Accounts</string>
-    <!-- Title for detailed user information page [CHAR LIMIT=25] -->
-    <string name="user_details_title">User</string>
+    <!-- Button title for adding an account [CHAR LIMIT=35] -->
+    <string name="user_add_account_menu">Add account</string>
     <!-- Text to display in Accounts settings if the user has not added any accounts yet [CHAR LIMIT=40] -->
     <string name="no_accounts_added">No accounts added</string>
     <!-- Account settings header for list of added accounts [CHAR LIMIT=40] -->
-    <string name="account_list_title">Accounts for <xliff:g id="current_user_name">%1$s</xliff:g></string>
+    <string name="account_list_title">Accounts for
+        <xliff:g id="current_user_name">%1$s</xliff:g>
+    </string>
+    <!-- Switch label to enable auto sync account [CHAR LIMIT=60] -->
+    <string name="account_auto_sync_title">Automatically sync data</string>
+    <!-- Switch summary to enable auto sync account [CHAR LIMIT=60] -->
+    <string name="account_auto_sync_summary">Let apps refresh data automatically</string>
+    <!--  Title of dialog shown when user enables global auto sync [CHAR LIMIT=50] -->
+    <string name="data_usage_auto_sync_on_dialog_title">Turn auto-sync data on?</string>
+    <!--  Body of dialog shown when user enables global auto sync [CHAR LIMIT=NONE] -->
+    <string name="data_usage_auto_sync_on_dialog">Any changes you make to your accounts on the web will be automatically copied to your device.\n\nSome accounts may also automatically copy any changes you make on the phone to the web. A Google Account works this way.</string>
+    <!--  Title of dialog shown when user disables global auto sync [CHAR LIMIT=50] -->
+    <string name="data_usage_auto_sync_off_dialog_title">Turn auto-sync data off?</string>
+    <!--  Body of dialog shown when user disables global auto sync [CHAR LIMIT=NONE] -->
+    <string name="data_usage_auto_sync_off_dialog">This will conserve data, but you\u2019ll need to sync each account manually to collect recent information. And you won\u2019t receive notifications when updates occur.</string>
     <!-- Account details in Settings screen title [CHAR LIMIT=25] -->
     <string name="account_details_title">Account info</string>
     <!-- Account details in Settings screen title [CHAR LIMIT=25] -->
@@ -390,28 +1115,34 @@
     <string name="really_remove_account_title">Remove account?</string>
     <!-- Remove account message in dialog [CHAR LIMIT=NONE] -->
     <string name="really_remove_account_message">Removing this account will delete all of its messages, contacts, and other data from the device!</string>
-    <!-- This is shown if the authenticator for a given account fails to remove it. [CHAR LIMIT=NONE] -->
-    <string name="remove_account_failed">This change isn\'t allowed by your admin</string>
-    <!-- Title of the alert dialog to ask user to confirm user deletion [CHAR LIMIT=25] -->
-    <string name="really_remove_user_title">Remove this user?</string>
-    <!-- Message to inform user that all of user's data will be deleted if confirmed [CHAR LIMIT=NONE] -->
-    <string name="really_remove_user_message">"All apps and data will be deleted."</string>
-    <!-- Title of the alert dialog to ask user to confirm user deletion [CHAR LIMIT=40] -->
-    <string name="remove_user_error_title">Failed to remove user.</string>
-    <!-- Message to ask to retry user deletion [CHAR LIMIT=30] -->
-    <string name="remove_user_error_message">Try again?</string>
-    <!-- Button label to dismiss user deletion error [CHAR LIMIT=25] -->
-    <string name="remove_user_error_dismiss">Dismiss</string>
-    <!-- Button label to retry user deletion [CHAR LIMIT=25] -->
-    <string name="remove_user_error_retry">Retry</string>
-    <!-- Title of the alert dialog to ask user to confirm creation of new user. [CHAR LIMIT=30] -->
-    <string name="user_add_user_title">"Add new user?"</string>
-    <!-- Message to inform user that creation of new user requires that user to set up their space. [CHAR LIMIT=100] -->
-    <string name="user_add_user_message_setup">When you add a new user, that person needs to set up their space.</string>
-    <!-- Message to inform user that the newly created user will have permissions to update apps for all other users. [CHAR LIMIT=100] -->
-    <string name="user_add_user_message_update">Any user can update apps for all other users.</string>
+    <!-- Title of the alert dialog to notify that account deletion has failed. [CHAR LIMIT=40] -->
+    <string name="remove_account_error_title">Failed to remove account.</string>
+    <!-- Preference label to sync account [CHAR LIMIT=60] -->
+    <string name="account_sync_title">Account sync</string>
+    <!-- Preference summary for account sync when syncing is on for some items [CHAR LIMIT=NONE] -->
+    <string name="account_sync_summary_some_on">Sync on for <xliff:g name="count" example="5">%1$d</xliff:g> of <xliff:g name="total" example="8">%2$d</xliff:g> items</string>
+    <!-- Preference summary for account sync when syncing is on for everything [CHAR LIMIT=NONE] -->
+    <string name="account_sync_summary_all_on">Sync on for all items</string>
+    <!-- Preference summary for account sync when syncing is off for everything [CHAR LIMIT=NONE] -->
+    <string name="account_sync_summary_all_off">Sync off for all items</string>
+    <!-- Sync status shown when sync is disabled [CHAR LIMIT=25] -->
+    <string name="sync_disabled">Sync is OFF</string>
+    <!-- Sync status shown when last sync resulted in an error [CHAR LIMIT=25] -->
+    <string name="sync_error">Sync error</string>
+    <!-- Last synced date/time for accounts that synced [CHAR LIMIT=none] -->
+    <string name="last_synced">Last synced <xliff:g id="last_sync_time" example="12/05/18, 12:30 PM">%1$s</xliff:g></string>
+    <!-- Sync status shown when sync is in progress [CHAR LIMIT=30] -->
+    <string name="sync_in_progress">Syncing now\u2026</string>
+    <!-- Data synchronization settings screen, summary of a sync provider (for example, Gmail) when autosync is off and the user wants to do a one-time sync. The last synced time will be shown on a new line. [CHAR LIMIT=none] -->
+    <string name="sync_one_time_sync">Tap to sync now<xliff:g id="last_sync_time" example="\nLast synced 12/05/18, 12:30 PM">\n%1$s</xliff:g></string>
+    <!-- Data synchronization settings screen, text for button that allows the user to immediately start sync [CHAR LIMIT=30]-->
+    <string name="sync_button_sync_now">Sync now</string>
+    <!-- Data synchronization settings screen, text for button that allows the user to cancel sync [CHAR LIMIT=30]-->
+    <string name="sync_button_sync_cancel">Cancel sync</string>
+    <!-- Message when sync is currently failing [CHAR LIMIT=100] -->
+    <string name="sync_is_failing">Sync is currently experiencing problems. It will be back shortly.</string>
 
-    <!-- security lock -->
+    <!-- security lock --><skip/>
     <!-- Title for security settings [CHAR LIMIT=20] -->
     <string name="security_settings_title">Security</string>
     <!-- Subtitle for security settings [CHAR LIMIT=20] -->
@@ -426,8 +1157,8 @@
     <string name="security_lock_password">Password</string>
     <!--  Title for security picker to choose the unlock method: None/Pattern/PIN/Password [CHAR LIMIT=30] -->
     <string name="lock_settings_picker_title">Choose a lock type</string>
-    <!--  Button caption to open a dialog for user to choose an screen lock method: Pattern/PIN/Password [CHAR LIMIT=40] -->
-    <string name="screen_lock_options">Screen lock options</string>
+    <!--  Button caption to open a dialog for user to choose an screen lock method: Pattern/PIN/Password [CHAR LIMIT=20] -->
+    <string name="screen_lock_options">Lock options</string>
     <!--  Title for screen asking user to enter their existing lock pattern [CHAR LIMIT=30] -->
     <string name="lock_settings_enter_pattern">Enter your pattern</string>
     <!-- Security & location settings screen, change unlock pattern screen button, on bottom of screen.  After they draw a pattern and release their finger, we display the pattern so they remember.  When they are ready to draw it once again to confirm it, they press this button. -->
@@ -447,7 +1178,7 @@
     <!-- Title string shown in choose lock pattern [CHAR LIMIT=40] -->
     <string name="lockscreen_choose_your_pattern">Choose your pattern</string>
     <!-- Title string shown in choose lock password [CHAR LIMIT=40] -->
-    <string name="lockscreen_choose_your_password">Choose your passowrd</string>
+    <string name="lockscreen_choose_your_password">Choose your password</string>
     <!-- Subtitle indicating the current screen lock type (none/PIN/pattern/password) [CHAR LIMIT=40] -->
     <string name="current_screen_lock">Current screen lock</string>
     <!-- Message on first screen of choose pattern flow [CHAR LIMIT=40] -->
@@ -516,16 +1247,14 @@
     <!-- Hints for Choose Lock Password Screen [CHAR_LIMIT=73] -->
     <string name="choose_lock_password_hints">Must be at least 4 characters</string>
     <!-- Hint shown in dialog screen when password is too short [CHAR LIMIT=40] -->
-    <string name="lockpassword_password_too_short">Must be at least <xliff:g id="count" example="3">%d</xliff:g> characters</string>
+    <string name="lockpassword_password_too_short">Must be at least <xliff:g example="3" id="count">%d</xliff:g> characters</string>
     <!-- Hint shown in dialog screen when PIN is too short [CHAR LIMIT=44] -->
-    <string name="lockpassword_pin_too_short">PIN must be at least <xliff:g id="count" example="3">%d</xliff:g> digits</string>
+    <string name="lockpassword_pin_too_short">PIN must be at least <xliff:g example="3" id="count">%d</xliff:g> digits</string>
 
     <!-- Error shown in popup when password is too long [CHAR LIMIT=42] -->
-    <string name="lockpassword_password_too_long">Must be fewer than
-        <xliff:g id="number" example="17">%d</xliff:g> characters</string>
+    <string name="lockpassword_password_too_long">Must be fewer than <xliff:g example="17" id="number">%d</xliff:g> characters</string>
     <!-- Error shown in popup when PIN is too long [CHAR LIMIT=42] -->
-    <string name="lockpassword_pin_too_long">Must be fewer than
-        <xliff:g id="number" example="17">%d</xliff:g> digits</string>
+    <string name="lockpassword_pin_too_long">Must be fewer than <xliff:g example="17" id="number">%d</xliff:g> digits</string>
 
     <!-- Error shown when in PIN mode and user enters a non-digit. Because this may be concatenated with other messages, please make sure there's a period at the end of the sentence. [CHAR LIMIT=40] -->
     <string name="lockpassword_pin_contains_non_digits">Must contain only digits 0-9.</string>
@@ -545,42 +1274,41 @@
     <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of letters [CHAR LIMIT=NONE] -->
     <plurals name="lockpassword_password_requires_letters">
         <item quantity="one">Must contain at least 1 letter</item>
-        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> letters</item>
+        <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> letters</item>
     </plurals>
 
     <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of lowercase letters [CHAR LIMIT=NONE] -->
     <plurals name="lockpassword_password_requires_lowercase">
         <item quantity="one">Must contain at least 1 lowercase letter</item>
-        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> lowercase letters</item>
+        <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> lowercase letters</item>
     </plurals>
 
     <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of uppercase letters [CHAR LIMIT=NONE] -->
     <plurals name="lockpassword_password_requires_uppercase">
         <item quantity="one">Must contain at least 1 uppercase letter</item>
-        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> uppercase letters</item>
+        <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> uppercase letters</item>
     </plurals>
 
     <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of numerical digits [CHAR LIMIT=NONE] -->
     <plurals name="lockpassword_password_requires_numeric">
         <item quantity="one">Must contain at least 1 numerical digit</item>
-        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> numerical digits</item>
+        <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> numerical digits</item>
     </plurals>
 
     <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of special symbols [CHAR LIMIT=NONE] -->
     <plurals name="lockpassword_password_requires_symbols">
         <item quantity="one">Must contain at least 1 special symbol</item>
-        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> special symbols</item>
+        <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> special symbols</item>
     </plurals>
 
     <!-- Error shown when in PASSWORD mode and password doesn't contain the required number of non-letter characters [CHAR LIMIT=NONE] -->
     <plurals name="lockpassword_password_requires_nonletter">
         <item quantity="one">Must contain at least 1 non-letter character</item>
-        <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> non-letter characters</item>
+        <item quantity="other">Must contain at least <xliff:g example="3" id="count">%d</xliff:g> non-letter characters</item>
     </plurals>
 
     <!-- Error shown when in PASSWORD mode and password has been used recently. Please keep this string short! [CHAR LIMIT=NONE] -->
-    <string name="lockpassword_password_recently_used">Device admin doesn\'t allow using a recent
-        password</string>
+    <string name="lockpassword_password_recently_used">Device admin doesn\'t allow using a recent password</string>
 
     <!-- Message shown when error is encountered when saving password [CHAR LIMIT=50] -->
     <string name="error_saving_password">Error saving password</string>
@@ -594,15 +1322,66 @@
     <!-- Label for button in screen lock settings, allowing users to choose other types of screen locks. [CHAR LIMIT=40] -->
     <string name="setup_lock_settings_options_button_label">Screen lock options</string>
 
-    <!-- generic -->
+    <!-- Format of the message displayed at the bottom of the quick settings page, that shows build information in
+         user-debug and eng builds. -->
+    <string name="build_info_fmt"><xliff:g example="google/gcar_emu_x86/..." id="fingerprint">%1$s</xliff:g>\n<xliff:g example="Thu Aug 30" id="date">%2$s</xliff:g> : <xliff:g example="4" id="num_days">%3$s</xliff:g> days ago</string>
+
+    <!-- security trusted device --><skip/>
+    <!-- Label for button to add a trusted device [CHAR LIMIT=50] -->
+    <string name="add_device_title">Add trusted device</string>
+    <!-- Label for button to add a trusted device [CHAR LIMIT=100] -->
+    <string name="add_device_summary">Bluetooth will turn on to add trusted device</string>
+    <!-- Screen title and label for button of trusted device [CHAR LIMIT=30]> -->
+    <string name="trusted_device">Trusted devices</string>
+    <!-- Subtitle of trusted device button in security page which displays the number of devices that are considered trusted[CHAR LIMIT=30]-->
+    <plurals name="trusted_device_subtitle">
+        <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> device</item>
+        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> devices</item>
+    </plurals>
+    <!-- Message in dialog which will remind the user what a trusted device can do. [CHAR LIMIT=NONE]-->
+    <string name="remove_device_message">Your <xliff:g id="connected_device_name" example="Pixel2">%1$s</xliff:g> will unlock this car when it\'s connected. If someone takes your <xliff:g id="connected_device_name" example="Pixel2">%1$s</xliff:g>, they may be able to access this device</string>
+    <!-- Confirm button label of confirm pairing code dialog [CHAR LIMIT=30]-->
+    <string name="trusted_device_confirm_button">Confirm</string>
+    <!-- Confirm button label of confirm remove device dialog [CHAR LIMIT=40]-->
+    <string name="trusted_device_remove_button">Remove trusted device</string>
+    <!-- Cancel button label of confirm remove device dialog [CHAR LIMIT=20]-->
+    <string name="trusted_device_done_button">Done</string>
+    <!-- Message shown on the add trusted device page [CHAR LIMIT=NONE]-->
+    <string name="add_trusted_device_instruction">Use the companion app to set up a trusted device. Once set up, your user profile will unlock automatically when your phone is detected near the vehicle.</string>
+    <!-- Step one of adding a trusted device [CHAR LIMIT=NONE]-->
+    <string name="trusted_device_download_app">1. Download the companion app on your phone</string>
+    <!-- Step two of adding a trusted device [CHAR LIMIT=NONE]-->
+    <string name="trusted_device_select_device">2. Select <xliff:g id="car_name" example="MyCar">%1$s</xliff:g> on your phone to pair the devices</string>
+    <!-- Messages shown to alert user about the safety of the trusted device feature [CHAR LIMIT=NONE]-->
+    <string name="trusted_device_safety_alert">A trusted device nearby your car will unlock the user profile upon ignition, even if someone else is holding the device.</string>
+    <!-- Confirm pairing code dialog title [CHAR LIMIT=60]-->
+    <string name="trusted_device_pairing_code_dialog_title">Please confirm that the pairing codes match</string>
+    <!-- Toast shown when user enrolls a device successfully [CHAR LIMIT=100]-->
+    <string name="trusted_device_success_enrollment_toast">Phone has been enrolled successfully</string>
+    <!-- Toast shown when enrolling a device fails [CHAR LIMIT=50]-->
+    <string name="trusted_device_fail_enrollment_toast"><xliff:g id="device_name" example="Pixel2">%1$s</xliff:g> enrollment failed</string>
+    <!-- Message shown when user have not set authentication [CHAR LIMIT=NONE]-->
+    <string name="trusted_device_set_authentication_reminder">Adding a trusted device requires you to set an authentication method next. If you do not have your trusted device with you, authentication will be required to access your profile.</string>
+    <!-- Toast shown when phone is disconnected [CHAR LIMIT=50]-->
+    <string name="trusted_device_disconnected_toast">Device disconnected.</string>
+
+    <!-- generic --><skip/>
     <!-- Button label for generic forget action [CHAR LIMIT=20] -->
     <string name="forget">Forget</string>
+    <!-- Button label for generic connect action [CHAR LIMIT=20] -->
+    <string name="connect">Connect</string>
+    <!-- Button label for generic disconnect action [CHAR LIMIT=20] -->
+    <string name="disconnect">Disconnect</string>
     <!-- Delete button text [CHAR LIMIT=20] -->
     <string name="delete_button">Delete</string>
     <!-- Remove button text [CHAR LIMIT=20] -->
     <string name="remove_button">Remove</string>
     <!-- Cancel button text [CHAR LIMIT=20] -->
     <string name="cancel">Cancel</string>
+    <!-- Generic dialog allow button. [CHAR_LIMIT=20] -->
+    <string name="allow">Allow</string>
+    <!-- Generic dialog deny button. [CHAR_LIMIT=20] -->
+    <string name="deny">Deny</string>
 
     <!-- Accessibility description for the backspace key in the PIN pad [CHAR LIMIT=NONE] -->
     <string name="backspace_key">Backspace key</string>
@@ -621,26 +1400,21 @@
     <string name="nine" translatable="false">9</string>
     <string name="zero" translatable="false">0</string>
 
-    <!-- Demo/Retail-related strings -->
+    <!-- Demo/Retail-related strings --><skip/>
     <!-- Text of button the user presses to exit Retail/Demo mode [CHAR LIMIT=25]-->
     <string name="exit_retail_button_text">Exit Demo</string>
-    <!-- Title of dialog asking the user if they really want to exit the demo, which requires a
-         factory reset [CHAR LIMIT=30]-->
+    <!-- Title of dialog asking the user if they really want to exit the demo, which requires a factory reset [CHAR LIMIT=30]-->
     <string name="exit_retail_mode_dialog_title">Exit demo mode</string>
-    <!-- Message in dialog asking the user if they really want to exit the demo, which requires a
-         factory reset [CHAR LIMIT=150]-->
+    <!-- Message in dialog asking the user if they really want to exit the demo, which requires a factory reset [CHAR LIMIT=150]-->
     <string name="exit_retail_mode_dialog_body">This will delete the demo account and factory data reset the system. All user data will be lost.</string>
     <!-- Text of confirmation button in dialog that appears to confirm that Demo Mode should be exited. [CHAR LIMIT=25]-->
     <string name="exit_retail_mode_dialog_confirmation_button_text">Exit Demo</string>
 
-    <!-- String values for settings suggestions. -->
-    <!-- Button that allows users to re-open the setup wizard (changed to all caps so case doesn't matter) [CHAR_LIMIT=30] -->
-    <string name="suggestion_primary_button">finish setup</string>
-    <!-- Button that dismisses the suggestion to finish setting up their device (changed to all caps so case doesn't matter) [CHAR_LIMIT=30] -->
-    <string name="suggestion_secondary_button">not now</string>
+    <!-- String values for settings suggestions. --><skip/>
+    <!-- Button that dismisses the suggestion to finish setting up their device [CHAR_LIMIT=30] -->
+    <string name="suggestion_dismiss_button">DISMISS</string>
 
-    <!-- Warn user that the action they are trying to perform is blocked while the car is in
-         motion [CHAR LIMIT=60] -->
+    <!-- Warn user that the action they are trying to perform is blocked while the car is in motion [CHAR LIMIT=60] -->
     <string name="restricted_while_driving">Feature not available while driving.</string>
     <!-- Warn user that adding a user is blocked while the car is in motion [CHAR LIMIT=60] -->
     <string name="add_user_restricted_while_driving">Can\'t add user while driving.</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index fb9b96a..fa0195c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -1,90 +1,66 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!--
+    Copyright 2018 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
+    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
+         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.
+    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.
 -->
 
 <resources>
-    <style name="Theme.SettingsBase" parent="@android:style/Theme.Material.Settings" />
-
-    <attr name="WifiSignalColor" format="reference" />
-
-    <style name="CarSettingTheme" parent="Theme.Car.Light.NoActionBar">
-        <item name="wifi_signal">@drawable/wifi_signal</item>
-        <item name="WifiSignalColor">?android:attr/colorAccent</item>
-        <item name="android:windowBackground">@color/car_card</item>
-        <item name="android:windowAnimationStyle">@style/SettingAnimationStyle</item>
-        <item name="android:borderlessButtonStyle">@style/Widget.Car.Settings.ActionBar.Button.Borderless.Colored</item>
+    <style name="PreferenceButtonTextAppearance"
+           parent="@*android:style/TextAppearance.DeviceDefault.Widget.Button.Borderless.Colored">
+        <item name="android:fadingEdgeLength">@dimen/button_fading_edge_length</item>
+        <item name="android:ellipsize">none</item>
+        <item name="android:requiresFadingEdge">horizontal</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:textAllCaps">false</item>
     </style>
 
-    <style name="SettingAnimationStyle">
-        <item name="android:windowEnterAnimation">@anim/trans_fade_in</item>
-        <item name="android:windowExitAnimation">@anim/trans_fade_out</item>
-    </style>
-
-    <style name="ActionBarStyle.Car" parent="Widget.Car.Toolbar">
-        <item name="actionBarSize">@dimen/car_app_bar_height</item>
-    </style>
-
-    <style name="TrimmedHorizontalProgressBar" parent="android:Widget.Material.ProgressBar.Horizontal">
-        <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material_trimmed</item>
+    <style name="TrimmedHorizontalProgressBar"
+           parent="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal">
+        <item name="android:indeterminateDrawable">
+            @drawable/progress_indeterminate_horizontal_material_trimmed
+        </item>
         <item name="android:minHeight">3dp</item>
         <item name="android:maxHeight">3dp</item>
     </style>
 
-    <style name="ListIcon.ActionBar" parent="ListIcon">
-        <item name="android:layout_gravity">center</item>
-        <item name="android:src">@drawable/ic_arrow_back</item>
-    </style>
-
-    <style name="SettingsListHeader" parent="TextAppearance.Car.Body2">
-        <item name="android:textColor">@color/car_accent</item>
-    </style>
-
-    <style name="Widget.Car.Settings.ActionBar.Button.Borderless.Colored"
-           parent="Widget.Car.Button.Borderless.Colored">
-        <item name="android:minWidth">@dimen/car_button_min_width</item>
-        <item name="android:fontFamily">roboto-regular</item>
-    </style>
-
-    <style name="SetupWizardButton.Negative" parent="@style/SuwGlifButton.Secondary">
-        <!-- Negative margin to offset for padding of the button itself. We want the label to be
-             aligned with the text above it -->
-        <item name="android:layout_marginStart">-16dp</item>
-    </style>
-
-    <style name="SetupWizardButton.Positive" parent="@style/SuwGlifButton.Primary" />
-
-    <!-- Style for security lock pattern. -->
-    <style name="LockPatternStyle">
-        <item name="*android:regularColor">@color/lock_pattern_regular</item>
-        <item name="*android:successColor">@color/lock_pattern_success</item>
+    <style name="LockPattern">
+        <item name="*android:regularColor">@*android:color/car_body1</item>
+        <item name="*android:successColor">@*android:color/car_blue_500</item>
         <item name="*android:errorColor">?android:attr/colorError</item>
     </style>
 
     <style name="PinPadKey">
-        <item name="android:layout_width">@dimen/pin_pad_key_width</item>
-        <item name="android:layout_height">@dimen/pin_pad_key_height</item>
-        <item name="android:layout_margin">@dimen/pin_pad_key_margin</item>
         <item name="android:gravity">center</item>
         <item name="android:textStyle">normal</item>
-        <item name="android:textSize">@dimen/car_body1_size</item>
-        <item name="android:textColor">@color/car_body3</item>
+        <item name="android:textSize">@*android:dimen/car_body1_size</item>
+        <item name="android:textColor">@*android:color/car_body3</item>
+        <item name="android:tint">@*android:color/car_body3</item>
         <item name="android:clickable">true</item>
-        <item name="android:background">@drawable/car_button_ripple_background</item>
+        <item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
     </style>
 
-    <style name="SettingList">
-        <item name="gutter">both</item>
+    <style name="DataUsageSummaryCarrierInfoTextAppearance"
+           parent="@android:style/TextAppearance.DeviceDefault.Small">
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
+        <item name="android:fontFamily">sans-serif</item>
+        <item name="android:textStyle">normal</item>
+    </style>
+
+    <style name="DataUsageSummaryCarrierInfoWarningTextAppearance"
+           parent="@android:style/TextAppearance.DeviceDefault.Small">
+        <item name="android:textColor">?android:attr/colorError</item>
+        <item name="android:fontFamily">sans-serif-medium</item>
+        <item name="android:textStyle">normal</item>
     </style>
 </resources>
diff --git a/res/values/styles_preference.xml b/res/values/styles_preference.xml
new file mode 100644
index 0000000..6e8918c
--- /dev/null
+++ b/res/values/styles_preference.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<resources>
+    <style name="PreferenceFragment.Settings">
+        <item name="android:layout">@layout/settings_fragment</item>
+        <item name="android:divider">@drawable/divider</item>
+        <item name="allowDividerAfterLastItem">false</item>
+    </style>
+
+    <style name="PreferenceFragmentList.Settings">
+        <item name="android:paddingTop">0dp</item>
+        <item name="android:paddingBottom">0dp</item>
+        <item name="android:paddingStart">0dp</item>
+        <item name="android:paddingEnd">0dp</item>
+        <item name="android:paddingLeft">0dp</item>
+        <item name="android:paddingRight">0dp</item>
+    </style>
+
+    <style name="Preference.Settings" parent="@*android:style/Preference.DeviceDefault">
+        <item name="allowDividerAbove">true</item>
+        <item name="allowDividerBelow">true</item>
+    </style>
+
+    <style name="Preference.Settings.Category"
+           parent="@*android:style/Preference.DeviceDefault.Category">
+        <item name="allowDividerAbove">true</item>
+        <item name="allowDividerBelow">true</item>
+    </style>
+
+    <style name="Preference.Settings.CheckBoxPreference"
+           parent="@*android:style/Preference.DeviceDefault.CheckBoxPreference">
+        <item name="allowDividerAbove">true</item>
+        <item name="allowDividerBelow">true</item>
+    </style>
+
+    <style name="Preference.Settings.DialogPreference"
+           parent="@*android:style/Preference.DeviceDefault.DialogPreference">
+        <item name="allowDividerAbove">true</item>
+        <item name="allowDividerBelow">true</item>
+    </style>
+
+    <style name="Preference.Settings.DialogPreference.EditTextPreference"
+           parent="@*android:style/Preference.DeviceDefault.DialogPreference.EditTextPreference">
+        <item name="dialogLayout">@layout/preference_dialog_edittext</item>
+        <item name="allowDividerAbove">true</item>
+        <item name="allowDividerBelow">true</item>
+    </style>
+
+    <style name="Preference.Settings.SeekBarPreference"
+           parent="@*android:style/Preference.DeviceDefault.SeekBarPreference">
+        <item name="layout">@layout/seekbar_preference</item>
+        <item name="allowDividerAbove">true</item>
+        <item name="allowDividerBelow">true</item>
+    </style>
+
+    <style name="Preference.Settings.SwitchPreference"
+           parent="@*android:style/Preference.DeviceDefault.SwitchPreference">
+        <item name="allowDividerAbove">true</item>
+        <item name="allowDividerBelow">true</item>
+    </style>
+</resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
new file mode 100644
index 0000000..d2dc80e
--- /dev/null
+++ b/res/values/themes.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<resources>
+    <style name="CarSettingTheme" parent="@android:style/Theme.DeviceDefault.NoActionBar">
+        <item name="preferenceTheme">@style/PreferenceTheme</item>
+        <item name="wifi_signal">@drawable/wifi_signal</item>
+        <item name="wifiSignalColor">?android:attr/textColorPrimary</item>
+        <item name="iconColor">?android:attr/textColorPrimary</item>
+        <item name="dividerColor">@*android:color/car_list_divider</item>
+        <item name="userSwitcherBackground">?android:attr/colorPrimary</item>
+        <item name="userSwitcherCurrentUserColor">?android:attr/colorAccent</item>
+        <item name="userSwitcherAddIconColor">@*android:color/car_tint</item>
+        <item name="userSwitcherAddIconBackgroundColor">?android:attr/colorPrimaryDark</item>
+        <item name="userSwitcherNameTextAppearance">?android:attr/textAppearanceLarge</item>
+        <item name="quickSettingsEnabledColor">?android:attr/colorControlActivated</item>
+        <item name="quickSettingsDisabledColor">?android:attr/colorControlNormal</item>
+        <item name="quickSettingsIconEnabledColor">?android:attr/colorPrimary</item>
+        <item name="quickSettingsIconDisabledColor">?android:attr/colorPrimaryDark</item>
+        <item name="suggestionsPrimaryColor">?android:attr/colorPrimaryDark</item>
+        <item name="suggestionsSecondaryColor">@android:color/black</item>
+        <item name="android:windowEnterAnimation">@anim/trans_fade_in</item>
+        <item name="android:windowExitAnimation">@anim/trans_fade_out</item>
+        <item name="android:fragmentOpenEnterAnimation">@animator/trans_right_in</item>
+        <item name="android:fragmentOpenExitAnimation">@animator/trans_left_out</item>
+        <item name="android:fragmentCloseEnterAnimation">@animator/trans_left_in</item>
+        <item name="android:fragmentCloseExitAnimation">@animator/trans_right_out</item>
+    </style>
+
+    <style name="PreferenceTheme">
+        <item name="preferenceFragmentCompatStyle">@style/PreferenceFragment.Settings</item>
+        <item name="preferenceFragmentListStyle">@style/PreferenceFragmentList.Settings</item>
+        <item name="preferenceStyle">@style/Preference.Settings</item>
+        <item name="preferenceCategoryStyle">@style/Preference.Settings.Category</item>
+        <item name="checkBoxPreferenceStyle">@style/Preference.Settings.CheckBoxPreference</item>
+        <item name="dialogPreferenceStyle">@style/Preference.Settings.DialogPreference</item>
+        <item name="editTextPreferenceStyle">@style/Preference.Settings.DialogPreference.EditTextPreference</item>
+        <item name="seekBarPreferenceStyle">@style/Preference.Settings.SeekBarPreference</item>
+        <item name="switchPreferenceStyle">@style/Preference.Settings.SwitchPreference</item>
+    </style>
+
+    <style name="FallbackHome" parent="@android:style/Theme.DeviceDefault.NoActionBar">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:colorBackgroundCacheHint">@null</item>
+        <item name="android:windowShowWallpaper">true</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowTranslucentStatus">false</item>
+        <item name="android:windowTranslucentNavigation">false</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+        <item name="android:statusBarColor">#00000000</item>
+        <item name="android:navigationBarColor">#00000000</item>
+    </style>
+
+    <style name="ActionDialogTheme" parent="@android:style/Theme.DeviceDefault.NoActionBar">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:colorBackgroundCacheHint">@null</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowAnimationStyle">@android:style/Animation</item>
+    </style>
+
+    <!-- Themes for Setup Wizard -->
+
+    <style name="FallbackHome.SetupWizard"
+           parent="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen">
+        <item name="android:windowBackground">@android:color/black</item>
+        <item name="android:colorBackgroundCacheHint">@null</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+        <item name="android:statusBarColor">#00000000</item>
+        <item name="android:navigationBarColor">#00000000</item>
+    </style>
+</resources>
diff --git a/res/xml/about_settings_fragment.xml b/res/xml/about_settings_fragment.xml
new file mode 100644
index 0000000..7dae157
--- /dev/null
+++ b/res/xml/about_settings_fragment.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/about_settings">
+    <Preference
+        android:key="@string/pk_model_info"
+        android:title="@string/model_info"
+        settings:controller="com.android.car.settings.system.ModelInfoPreferenceController"/>
+    <Preference
+        android:key="@string/pk_firmware_version"
+        android:title="@string/firmware_version"
+        settings:controller="com.android.car.settings.system.FirmwareVersionPreferenceController"/>
+    <Preference
+        android:key="@string/pk_security_patch"
+        android:title="@string/security_patch"
+        settings:controller="com.android.car.settings.system.SecurityPatchPreferenceController"/>
+    <Preference
+        android:key="@string/pk_kernel_version"
+        android:title="@string/kernel_version"
+        settings:controller="com.android.car.settings.system.KernelVersionPreferenceController"/>
+    <Preference
+        android:key="@string/pk_build_number"
+        android:title="@string/build_number"
+        settings:controller="com.android.car.settings.system.BuildNumberPreferenceController"/>
+    <Preference
+        android:key="@string/pk_regulatory_labels"
+        android:title="@string/regulatory_labels"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
+        <intent android:action="android.settings.SHOW_REGULATORY_INFO"/>
+    </Preference>
+    <Preference
+        android:key="@string/pk_about_bluetooth_mac_address"
+        android:title="@string/bluetooth_mac_address"
+        settings:controller="com.android.car.settings.system.BluetoothMacAddressPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/account_details_fragment.xml b/res/xml/account_details_fragment.xml
new file mode 100644
index 0000000..b6214f0
--- /dev/null
+++ b/res/xml/account_details_fragment.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <Preference
+        android:key="@string/pk_account_details"
+        android:selectable="false"
+        settings:controller="com.android.car.settings.accounts.AccountDetailsPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_account_settings"
+        settings:controller="com.android.car.settings.accounts.AccountDetailsSettingController">
+        <intent android:action="com.android.settings.action.IA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.account_detail"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+    <Preference
+        android:key="@string/pk_account_sync"
+        android:title="@string/account_sync_title"
+        settings:controller="com.android.car.settings.accounts.AccountSyncPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/account_settings_fragment.xml b/res/xml/account_settings_fragment.xml
new file mode 100644
index 0000000..0280760
--- /dev/null
+++ b/res/xml/account_settings_fragment.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/accounts_settings_title">
+    <PreferenceCategory
+        android:key="@string/pk_account_list"
+        android:title="@string/account_list_title"
+        settings:controller="com.android.car.settings.accounts.AccountListPreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_account_auto_sync"
+        android:title="@string/account_auto_sync_title"
+        android:summary="@string/account_auto_sync_summary"
+        settings:controller="com.android.car.settings.accounts.AccountAutoSyncPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_accounts_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.accounts"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/account_sync_details_fragment.xml b/res/xml/account_sync_details_fragment.xml
new file mode 100644
index 0000000..60e3244
--- /dev/null
+++ b/res/xml/account_sync_details_fragment.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/account_sync_title">
+    <Preference
+        android:key="@string/pk_account_details_with_sync"
+        android:selectable="false"
+        settings:controller="com.android.car.settings.accounts.AccountDetailsWithSyncStatusPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_account_sync_details"
+        settings:controller="com.android.car.settings.accounts.AccountSyncDetailsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/add_trusted_device_progress_fragment.xml b/res/xml/add_trusted_device_progress_fragment.xml
new file mode 100644
index 0000000..a7921f3
--- /dev/null
+++ b/res/xml/add_trusted_device_progress_fragment.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/add_device_title">
+    <Preference
+        android:key="@string/pk_add_device_instruction"
+        android:summary="@string/add_trusted_device_instruction"/>
+    <Preference
+        android:key="@string/pk_companion_app_download"
+        android:title="@string/trusted_device_download_app"/>
+    <Preference
+        android:key="@string/pk_car_ble_name"
+        settings:controller="com.android.car.settings.security.ChooseDeviceInstructionPreferenceController"/>
+    <Preference
+        android:key="@string/pk_trusted_device_safety_alert"
+        android:summary="@string/trusted_device_safety_alert"/>
+</PreferenceScreen>
diff --git a/res/xml/add_wifi_fragment.xml b/res/xml/add_wifi_fragment.xml
new file mode 100644
index 0000000..d0eafa3
--- /dev/null
+++ b/res/xml/add_wifi_fragment.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/wifi_setup_add_network">
+    <EditTextPreference
+        android:key="@string/pk_add_wifi_network_name"
+        android:persistent="false"
+        android:title="@string/wifi_ssid"
+        settings:controller="com.android.car.settings.wifi.NetworkNamePreferenceController"/>
+    <ListPreference
+        android:dialogTitle="@string/wifi_security"
+        android:key="@string/pk_add_wifi_security"
+        android:persistent="false"
+        android:title="@string/wifi_security"
+        settings:controller="com.android.car.settings.wifi.NetworkSecurityPreferenceController"/>
+    <com.android.car.settings.wifi.NetworkNameRestrictedPasswordEditTextPreference
+        android:dialogTitle="@string/wifi_password"
+        android:key="@string/pk_add_wifi_password"
+        android:persistent="false"
+        android:summary="@string/default_password_summary"
+        android:title="@string/wifi_password"
+        settings:controller="com.android.car.settings.wifi.NetworkPasswordPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/app_data_usage_fragment.xml b/res/xml/app_data_usage_fragment.xml
new file mode 100644
index 0000000..647b7d4
--- /dev/null
+++ b/res/xml/app_data_usage_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/app_data_usage">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_app_data_usage_detail"
+        settings:controller="com.android.car.settings.datausage.AppDataUsagePreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/app_storage_settings_details_fragment.xml b/res/xml/app_storage_settings_details_fragment.xml
new file mode 100644
index 0000000..b9eeb41
--- /dev/null
+++ b/res/xml/app_storage_settings_details_fragment.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/storage_settings_title">
+    <Preference
+        android:key="@string/pk_storage_application_details"
+        settings:controller="com.android.car.settings.storage.StorageApplicationPreferenceController"/>
+    <com.android.car.settings.storage.StorageAppDetailPreference
+        android:key="@string/pk_storage_application_size"
+        android:selectable="false"
+        android:title="@string/storage_application_size_label"
+        settings:controller="com.android.car.settings.storage.StorageApplicationSizePreferenceController"/>
+    <com.android.car.settings.storage.StorageAppDetailPreference
+        android:key="@string/pk_storage_application_data_size"
+        android:selectable="false"
+        android:title="@string/storage_data_size_label"
+        settings:controller="com.android.car.settings.storage.StorageApplicationUserDataPreferenceController"/>
+    <com.android.car.settings.storage.StorageAppDetailPreference
+        android:key="@string/pk_storage_application_cache_size"
+        android:selectable="false"
+        android:title="@string/storage_cache_size_label"
+        settings:controller="com.android.car.settings.storage.StorageApplicationCacheSizePreferenceController"/>
+    <com.android.car.settings.storage.StorageAppDetailPreference
+        android:key="@string/pk_storage_application_total_size"
+        android:selectable="false"
+        android:title="@string/storage_total_size_label"
+        settings:controller="com.android.car.settings.storage.StorageApplicationTotalSizePreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/application_details_fragment.xml b/res/xml/application_details_fragment.xml
new file mode 100644
index 0000000..2f4ac1a
--- /dev/null
+++ b/res/xml/application_details_fragment.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/applications_settings">
+    <Preference
+        android:key="@string/pk_application_details_app"
+        settings:controller="com.android.car.settings.applications.ApplicationPreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_application_details_notifications"
+        android:title="@string/notifications_label"
+        settings:controller="com.android.car.settings.applications.NotificationsPreferenceController"/>
+    <Preference
+        android:key="@string/pk_application_details_permissions"
+        android:title="@string/permissions_label"
+        settings:controller="com.android.car.settings.applications.PermissionsPreferenceController"/>
+    <Preference
+        android:key="@string/pk_application_details_version"
+        settings:controller="com.android.car.settings.applications.VersionPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/application_launch_settings_fragment.xml b/res/xml/application_launch_settings_fragment.xml
new file mode 100644
index 0000000..d5e0dcd
--- /dev/null
+++ b/res/xml/application_launch_settings_fragment.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/app_launch_title">
+    <Preference
+        android:key="@string/pk_opening_links_app_details"
+        settings:controller="com.android.car.settings.applications.managedomainurls.ApplicationWithVersionPreferenceController"/>
+    <PreferenceCategory android:title="@string/app_launch_domain_links_title">
+        <ListPreference
+            android:key="@string/pk_opening_links_app_details_state"
+            android:title="@string/app_launch_open_domain_urls_title"
+            android:summary="%s"
+            settings:controller="com.android.car.settings.applications.managedomainurls.AppLinkStatePreferenceController"/>
+        <Preference
+            android:key="@string/pk_opening_links_app_details_urls"
+            android:title="@string/app_launch_supported_domain_urls_title"
+            android:dependency="@string/pk_opening_links_app_details_state"
+            settings:controller="com.android.car.settings.applications.managedomainurls.DomainUrlsPreferenceController"/>
+    </PreferenceCategory>
+    <PreferenceCategory android:title="@string/app_launch_other_defaults_title">
+        <Preference
+            android:key="@string/pk_opening_links_app_details_reset"
+            settings:controller="com.android.car.settings.applications.managedomainurls.ClearDefaultsPreferenceController"/>
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/res/xml/applications_settings_fragment.xml b/res/xml/applications_settings_fragment.xml
new file mode 100644
index 0000000..46d7a82
--- /dev/null
+++ b/res/xml/applications_settings_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/applications_settings">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_all_applications_settings_list"
+        settings:controller="com.android.car.settings.applications.ApplicationsSettingsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/apps_and_notifications_fragment.xml b/res/xml/apps_and_notifications_fragment.xml
new file mode 100644
index 0000000..9bd08f7
--- /dev/null
+++ b/res/xml/apps_and_notifications_fragment.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/apps_and_notifications_settings">
+    <Preference
+        android:fragment="com.android.car.settings.applications.ApplicationsSettingsFragment"
+        android:key="@string/pk_applications_settings_screen_entry"
+        android:title="@string/all_applications"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:key="@string/pk_default_applications_settings_entry"
+        android:title="@string/default_applications"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
+        <intent android:action="android.settings.MANAGE_DEFAULT_APPS_SETTINGS"/>
+    </Preference>
+    <Preference
+        android:key="@string/pk_app_permissions_entry"
+        android:title="@string/app_permissions"
+        settings:controller="com.android.car.settings.applications.AppPermissionsEntryPreferenceController">
+        <intent android:action="android.intent.action.MANAGE_PERMISSIONS"/>
+    </Preference>
+    <Preference
+        android:fragment="com.android.car.settings.applications.specialaccess.SpecialAccessSettingsFragment"
+        android:key="@string/pk_special_access_entry"
+        android:title="@string/special_access"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/bluetooth_device_details_fragment.xml b/res/xml/bluetooth_device_details_fragment.xml
new file mode 100644
index 0000000..e6f0483
--- /dev/null
+++ b/res/xml/bluetooth_device_details_fragment.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/bluetooth_settings_title">
+    <Preference
+        android:key="@string/pk_bluetooth_device_name"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothDeviceNamePreferenceController"/>
+    <PreferenceCategory
+        android:key="@string/pk_bluetooth_device_profiles"
+        android:title="@string/bluetooth_profiles"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothDeviceProfilesPreferenceController"/>
+    <Preference
+        android:icon="@drawable/ic_settings_about"
+        android:key="@string/pk_bluetooth_device_address"
+        android:selectable="false"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothDeviceAddressPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/bluetooth_device_picker_fragment.xml b/res/xml/bluetooth_device_picker_fragment.xml
new file mode 100644
index 0000000..95dcacd
--- /dev/null
+++ b/res/xml/bluetooth_device_picker_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/bluetooth_device_picker">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_bluetooth_device_picker"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothDevicePickerPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/bluetooth_pairing_selection_fragment.xml b/res/xml/bluetooth_pairing_selection_fragment.xml
new file mode 100644
index 0000000..4613c53
--- /dev/null
+++ b/res/xml/bluetooth_pairing_selection_fragment.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/bluetooth_pair_new_device">
+    <Preference
+        android:key="@string/pk_bluetooth_name"
+        android:title="@string/bluetooth_name"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothNamePreferenceController"/>
+    <PreferenceCategory
+        android:key="@string/pk_bluetooth_available_devices"
+        android:title="@string/bluetooth_available_devices"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothUnbondedDevicesPreferenceController"/>
+    <Preference
+        android:icon="@drawable/ic_settings_about"
+        android:key="@string/pk_bluetooth_address"
+        android:selectable="false"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothAddressPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/bluetooth_settings_fragment.xml b/res/xml/bluetooth_settings_fragment.xml
new file mode 100644
index 0000000..ccd041b
--- /dev/null
+++ b/res/xml/bluetooth_settings_fragment.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/bluetooth_settings_title">
+    <PreferenceCategory
+        android:key="@string/pk_bluetooth_paired_devices"
+        android:title="@string/bluetooth_paired_devices"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothBondedDevicesPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.bluetooth.BluetoothPairingSelectionFragment"
+        android:icon="@drawable/ic_add"
+        android:key="@string/pk_bluetooth_pair_new_device"
+        android:title="@string/bluetooth_pair_new_device"
+        settings:controller="com.android.car.settings.bluetooth.PairNewDevicePreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/car_volume_items.xml b/res/xml/car_volume_items.xml
index 08ab4f9..9228e02 100644
--- a/res/xml/car_volume_items.xml
+++ b/res/xml/car_volume_items.xml
@@ -1,20 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-/*
-** Copyright 2018, 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.
-*/
+    Copyright 2018 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.
 -->
 
 <!--
@@ -32,52 +30,68 @@
   car_volume_groups.xml, which is read by car audio service.
 -->
 <carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
-    <item car:usage="voice_communication"
-          car:title="@*android:string/volume_call"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="voice_communication_signalling"
-          car:title="@*android:string/volume_call"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="media"
-          car:title="@*android:string/volume_music"
-          car:icon="@*android:drawable/ic_audio_media"/>
-    <item car:usage="game"
-          car:title="@*android:string/volume_music"
-          car:icon="@*android:drawable/ic_audio_media"/>
-    <item car:usage="alarm"
-          car:title="@*android:string/volume_alarm"
-          car:icon="@*android:drawable/ic_audio_alarm"/>
-    <item car:usage="assistance_navigation_guidance"
-          car:title="@string/navi_volume_title"
-          car:icon="@drawable/ic_audio_navi"/>
-    <item car:usage="notification_ringtone"
-          car:title="@*android:string/volume_ringtone"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="assistant"
-          car:title="@*android:string/volume_unknown"
-          car:icon="@*android:drawable/ic_audio_vol"/>
-    <item car:usage="notification"
-          car:title="@*android:string/volume_notification"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="notification_communication_request"
-          car:title="@*android:string/volume_notification"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="notification_communication_instant"
-          car:title="@*android:string/volume_notification"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="notification_communication_delayed"
-          car:title="@*android:string/volume_notification"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="notification_event"
-          car:title="@*android:string/volume_notification"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="assistance_accessibility"
-          car:title="@*android:string/volume_notification"
-          car:icon="@*android:drawable/ic_audio_ring_notif"/>
-    <item car:usage="assistance_sonification"
-          car:title="@*android:string/volume_unknown"
-          car:icon="@*android:drawable/ic_audio_vol"/>
-    <item car:usage="unknown"
-          car:title="@*android:string/volume_unknown"
-          car:icon="@*android:drawable/ic_audio_vol"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_call"
+        car:usage="voice_communication"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_call"
+        car:usage="voice_communication_signalling"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_media"
+        car:titleText="@*android:string/volume_music"
+        car:usage="media"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_media"
+        car:titleText="@*android:string/volume_music"
+        car:usage="game"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_alarm"
+        car:titleText="@*android:string/volume_alarm"
+        car:usage="alarm"/>
+    <item
+        car:icon="@drawable/car_ic_navigation"
+        car:titleText="@string/navi_volume_title"
+        car:usage="assistance_navigation_guidance"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_ringtone"
+        car:usage="notification_ringtone"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_vol"
+        car:titleText="@*android:string/volume_unknown"
+        car:usage="assistant"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_notification"
+        car:usage="notification"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_notification"
+        car:usage="notification_communication_request"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_notification"
+        car:usage="notification_communication_instant"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_notification"
+        car:usage="notification_communication_delayed"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_notification"
+        car:usage="notification_event"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_ring_notif"
+        car:titleText="@*android:string/volume_notification"
+        car:usage="assistance_accessibility"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_vol"
+        car:titleText="@*android:string/volume_unknown"
+        car:usage="assistance_sonification"/>
+    <item
+        car:icon="@*android:drawable/ic_audio_vol"
+        car:titleText="@*android:string/volume_unknown"
+        car:usage="unknown"/>
 </carVolumeItems>
diff --git a/res/xml/child_locale_picker_fragment.xml b/res/xml/child_locale_picker_fragment.xml
new file mode 100644
index 0000000..43a727e
--- /dev/null
+++ b/res/xml/child_locale_picker_fragment.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_child_locale_picker"
+        settings:controller="com.android.car.settings.language.ChildLocalePickerPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/choose_account_fragment.xml b/res/xml/choose_account_fragment.xml
new file mode 100644
index 0000000..e154bd3
--- /dev/null
+++ b/res/xml/choose_account_fragment.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/add_an_account">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_add_account"
+        settings:controller="com.android.car.settings.accounts.ChooseAccountPreferenceController"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/choose_lock_type_fragment.xml b/res/xml/choose_lock_type_fragment.xml
new file mode 100644
index 0000000..a4a10a1
--- /dev/null
+++ b/res/xml/choose_lock_type_fragment.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/lock_settings_picker_title">
+    <Preference
+        android:key="@string/pk_no_lock"
+        android:title="@string/security_lock_none"
+        settings:controller="com.android.car.settings.security.NoLockPreferenceController"/>
+    <Preference
+        android:key="@string/pk_pattern_lock"
+        android:title="@string/security_lock_pattern"
+        settings:controller="com.android.car.settings.security.PatternLockPreferenceController"/>
+    <Preference
+        android:key="@string/pk_password_lock"
+        android:title="@string/security_lock_password"
+        settings:controller="com.android.car.settings.security.PasswordLockPreferenceController"/>
+    <Preference
+        android:key="@string/pk_pin_lock"
+        android:title="@string/security_lock_pin"
+        settings:controller="com.android.car.settings.security.PinLockPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/choose_new_admin_fragment.xml b/res/xml/choose_new_admin_fragment.xml
new file mode 100644
index 0000000..04a1d0c
--- /dev/null
+++ b/res/xml/choose_new_admin_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/choose_new_admin_label">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_choose_new_admin"
+        settings:controller="com.android.car.settings.users.ChooseNewAdminPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/choose_trusted_device_fragment.xml b/res/xml/choose_trusted_device_fragment.xml
new file mode 100644
index 0000000..261b9b9
--- /dev/null
+++ b/res/xml/choose_trusted_device_fragment.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Copyright 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/trusted_device">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_trusted_device_list"
+        settings:controller="com.android.car.settings.security.TrustedDeviceListPreferenceController"/>
+    <Preference
+        android:icon="@drawable/ic_add"
+        android:key="@string/pk_add_trusted_device"
+        android:title="@string/add_device_title"
+        settings:controller="com.android.car.settings.security.AddTrustedDevicePreferenceController">
+        <intent
+            android:targetClass="com.android.car.settings.security.AddTrustedDeviceActivity"
+            android:targetPackage="com.android.car.settings"/>
+    </Preference>
+</PreferenceScreen>
diff --git a/res/xml/data_usage_fragment.xml b/res/xml/data_usage_fragment.xml
new file mode 100644
index 0000000..6ca27c0
--- /dev/null
+++ b/res/xml/data_usage_fragment.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/data_usage_settings">
+    <com.android.car.settings.datausage.DataUsageSummaryPreference
+        android:key="@string/pk_data_usage_summary"
+        settings:controller="com.android.car.settings.datausage.DataUsageSummaryPreferenceController"
+        settings:singleLineTitle="false"/>
+    <Preference
+        android:key="@string/pk_app_data_usage"
+        android:title="@string/app_data_usage"
+        settings:controller="com.android.car.settings.datausage.DataUsagePreferenceController"/>
+    <Preference
+        android:key="@string/pk_data_warning_and_limit"
+        android:title="@string/data_warning_limit_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
+        <intent android:targetPackage="com.android.car.settings"
+                android:targetClass="com.android.car.settings.datausage.DataWarningAndLimitActivity"/>
+    </Preference>
+</PreferenceScreen>
diff --git a/res/xml/data_warning_and_limit_fragment.xml b/res/xml/data_warning_and_limit_fragment.xml
new file mode 100644
index 0000000..8933d6c
--- /dev/null
+++ b/res/xml/data_warning_and_limit_fragment.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/data_warning_limit_title">
+    <Preference
+        android:key="@string/pk_data_usage_cycle"
+        android:title="@string/app_usage_cycle"
+        settings:controller="com.android.car.settings.datausage.CycleResetDayOfMonthPickerPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_data_warning_group"
+        settings:controller="com.android.car.settings.datausage.DataWarningPreferenceController">
+        <SwitchPreference
+            android:key="@string/pk_data_set_warning"
+            android:title="@string/set_data_warning"/>
+        <Preference
+            android:key="@string/pk_data_warning"
+            android:title="@string/data_warning"/>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_data_limit_group"
+        settings:controller="com.android.car.settings.datausage.DataLimitPreferenceController">
+        <SwitchPreference
+            android:key="@string/pk_data_set_limit"
+            android:title="@string/set_data_limit"/>
+        <Preference
+            android:key="@string/pk_data_limit"
+            android:title="@string/data_limit"/>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/datetime_settings_fragment.xml b/res/xml/datetime_settings_fragment.xml
new file mode 100644
index 0000000..6a4902e
--- /dev/null
+++ b/res/xml/datetime_settings_fragment.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/date_and_time_settings_title">
+    <SwitchPreference
+        android:key="@string/pk_auto_datetime_switch"
+        android:summary="@string/date_time_auto_summary"
+        android:title="@string/date_time_auto"
+        settings:controller="com.android.car.settings.datetime.AutoDatetimeTogglePreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_auto_timezone_switch"
+        android:summary="@string/zone_auto_summary"
+        android:title="@string/zone_auto"
+        settings:controller="com.android.car.settings.datetime.AutoTimeZoneTogglePreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.datetime.DatePickerFragment"
+        android:key="@string/pk_date_picker_entry"
+        android:title="@string/date_time_set_date"
+        settings:controller="com.android.car.settings.datetime.DatePickerPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.datetime.TimePickerFragment"
+        android:key="@string/pk_time_picker_entry"
+        android:title="@string/date_time_set_time"
+        settings:controller="com.android.car.settings.datetime.TimePickerPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.datetime.TimeZonePickerScreenFragment"
+        android:key="@string/pk_timezone_picker_screen_entry"
+        android:title="@string/date_time_set_timezone"
+        settings:controller="com.android.car.settings.datetime.TimeZonePickerPreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_use_24hour_switch"
+        android:title="@string/date_time_24hour"
+        settings:controller="com.android.car.settings.datetime.TimeFormatTogglePreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/default_autofill_picker_fragment.xml b/res/xml/default_autofill_picker_fragment.xml
new file mode 100644
index 0000000..e465461
--- /dev/null
+++ b/res/xml/default_autofill_picker_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/autofill_settings_title">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_default_autofill_options"
+        settings:controller="com.android.car.settings.applications.defaultapps.DefaultAutofillPickerPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/default_voice_input_picker_fragment.xml b/res/xml/default_voice_input_picker_fragment.xml
new file mode 100644
index 0000000..042d5be
--- /dev/null
+++ b/res/xml/default_voice_input_picker_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/voice_input_settings_title">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_default_voice_input_options"
+        settings:controller="com.android.car.settings.applications.assist.DefaultVoiceInputPickerPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/developer_options_fragment.xml b/res/xml/developer_options_fragment.xml
new file mode 100644
index 0000000..ebe578b
--- /dev/null
+++ b/res/xml/developer_options_fragment.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/developer_options_settings">
+    <PreferenceCategory
+        android:title="@string/debug_debugging_category">
+        <SwitchPreference
+            android:key="@string/pk_usb_debugging_toggle"
+            android:title="@string/enable_adb"
+            android:summary="@string/enable_adb_summary"
+            settings:controller="com.android.car.settings.development.debugging.EnableAdbPreferenceController"/>
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/res/xml/display_settings_fragment.xml b/res/xml/display_settings_fragment.xml
new file mode 100644
index 0000000..7932f89
--- /dev/null
+++ b/res/xml/display_settings_fragment.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/display_settings">
+    <SwitchPreference
+        android:key="@string/pk_adaptive_brightness_switch"
+        android:summary="@string/auto_brightness_summary"
+        android:title="@string/auto_brightness_title"
+        settings:controller="com.android.car.settings.display.AdaptiveBrightnessTogglePreferenceController"/>
+    <com.android.car.settings.common.SeekBarPreference
+        android:key="@string/pk_brightness_level"
+        android:title="@string/brightness"
+        settings:controller="com.android.car.settings.display.BrightnessLevelPreferenceController"
+        settings:showSeekBarValue="false"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_display_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.display"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/file_paths.xml b/res/xml/file_paths.xml
new file mode 100644
index 0000000..7971793
--- /dev/null
+++ b/res/xml/file_paths.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<paths>
+    <!-- Offer access to files under Context.getCacheDir() -->
+    <cache-path name="my_cache"/>
+</paths>
diff --git a/res/xml/homepage_fragment.xml b/res/xml/homepage_fragment.xml
new file mode 100644
index 0000000..2a69c32
--- /dev/null
+++ b/res/xml/homepage_fragment.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/settings_label">
+    <!-- TODO: Re-enable once more suggestion use cases are supported.
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_suggestions"
+        settings:controller="com.android.car.settings.suggestions.SuggestionsPreferenceController"/>
+    -->
+    <Preference
+        android:fragment="com.android.car.settings.display.DisplaySettingsFragment"
+        android:icon="@drawable/ic_settings_display"
+        android:key="@string/pk_display_settings_entry"
+        android:title="@string/display_settings"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.sound.SoundSettingsFragment"
+        android:icon="@drawable/ic_settings_sound"
+        android:key="@string/pk_sound_settings_entry"
+        android:title="@string/sound_settings"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.units.UnitsSettingsFragment"
+        android:icon="@drawable/ic_settings_units"
+        android:key="@string/pk_units_settings_entry"
+        android:title="@string/units_settings"/>
+    <Preference
+        android:fragment="com.android.car.settings.network.NetworkAndInternetFragment"
+        android:icon="@drawable/ic_settings_wifi"
+        android:key="@string/pk_network_and_internet_entry"
+        android:title="@string/network_and_internet"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_wireless_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.wireless"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+    <Preference
+        android:fragment="com.android.car.settings.bluetooth.BluetoothSettingsFragment"
+        android:icon="@drawable/ic_settings_bluetooth"
+        android:key="@string/pk_bluetooth_settings_entry"
+        android:title="@string/bluetooth_settings_title"
+        settings:controller="com.android.car.settings.bluetooth.BluetoothEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.location.LocationSettingsFragment"
+        android:icon="@drawable/ic_settings_location"
+        android:key="@string/pk_location_settings_entry"
+        android:title="@string/location_settings_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.applications.AppsAndNotificationsFragment"
+        android:icon="@drawable/ic_settings_applications"
+        android:key="@string/pk_apps_and_notifications_settings_entry"
+        android:title="@string/apps_and_notifications_settings"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.datetime.DatetimeSettingsFragment"
+        android:icon="@drawable/ic_settings_date_time"
+        android:key="@string/pk_date_time_settings_entry"
+        android:title="@string/date_and_time_settings_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:icon="@drawable/ic_user"
+        android:key="@string/pk_users_settings_entry"
+        android:title="@string/users_list_title"
+        settings:controller="com.android.car.settings.users.UsersEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.accounts.AccountSettingsFragment"
+        android:icon="@drawable/ic_account"
+        android:key="@string/pk_accounts_settings_entry"
+        android:title="@string/accounts_settings_title"
+        settings:controller="com.android.car.settings.accounts.AccountsEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.storage.StorageSettingsFragment"
+        android:icon="@drawable/ic_storage"
+        android:key="@string/pk_storage_settings_entry"
+        android:title="@string/storage_settings_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.security.SecuritySettingsFragment"
+        android:icon="@drawable/ic_lock"
+        android:key="@string/pk_security_settings_entry"
+        android:title="@string/security_settings_title"
+        settings:controller="com.android.car.settings.security.SecurityEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.system.SystemSettingsFragment"
+        android:icon="@drawable/ic_settings_about"
+        android:key="@string/pk_system_settings_entry"
+        android:title="@string/system_setting_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_device_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.device"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_personal_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.personal"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/keyboard_fragment.xml b/res/xml/keyboard_fragment.xml
new file mode 100644
index 0000000..0ba6b25
--- /dev/null
+++ b/res/xml/keyboard_fragment.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/keyboard_settings">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_enabled_keyboards"
+        settings:controller="com.android.car.settings.inputmethod.EnabledKeyboardPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.inputmethod.KeyboardManagementFragment"
+        android:icon="@drawable/ic_add"
+        android:key="@string/pk_manage_keyboard"
+        android:title="@string/manage_keyboard"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/keyboard_management_fragment.xml b/res/xml/keyboard_management_fragment.xml
new file mode 100644
index 0000000..e82ebe1
--- /dev/null
+++ b/res/xml/keyboard_management_fragment.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/manage_keyboard">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_keyboard_management"
+        settings:controller="com.android.car.settings.inputmethod.KeyboardManagementPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/language_picker_fragment.xml b/res/xml/language_picker_fragment.xml
new file mode 100644
index 0000000..64978bb
--- /dev/null
+++ b/res/xml/language_picker_fragment.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/language_settings">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_language_picker"
+        settings:controller="com.android.car.settings.language.LanguagePickerPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/languages_and_input_fragment.xml b/res/xml/languages_and_input_fragment.xml
new file mode 100644
index 0000000..424eceb
--- /dev/null
+++ b/res/xml/languages_and_input_fragment.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/languages_and_input_settings">
+    <Preference
+        android:fragment="com.android.car.settings.language.LanguagePickerFragment"
+        android:icon="@drawable/ic_translate"
+        android:key="@string/pk_language_settings_entry"
+        android:title="@string/language_settings"
+        settings:controller="com.android.car.settings.language.LanguageSettingsEntryPreferenceController"/>
+    <com.android.car.settings.common.ButtonPreference
+        android:fragment="com.android.car.settings.applications.defaultapps.DefaultAutofillPickerFragment"
+        android:key="@string/pk_autofill_picker_entry"
+        android:summary="@string/app_list_preference_none"
+        android:title="@string/autofill_settings_title"
+        android:widgetLayout="@layout/details_preference_widget"
+        settings:controller="com.android.car.settings.applications.defaultapps.DefaultAutofillPickerEntryPreferenceController"
+        settings:iconSpaceReserved="true"/>
+    <Preference
+        android:fragment="com.android.car.settings.inputmethod.KeyboardFragment"
+        android:key="@string/pk_keyboard_entry"
+        android:title="@string/keyboard_settings"
+        settings:controller="com.android.car.settings.inputmethod.KeyboardPreferenceController"
+        settings:iconSpaceReserved="true"/>
+    <Preference
+        android:fragment="com.android.car.settings.tts.TextToSpeechOutputFragment"
+        android:key="@string/pk_tts_settings_entry"
+        android:title="@string/text_to_speech_settings"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
+        settings:iconSpaceReserved="true"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_language_and_input_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.language"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/legal_information_fragment.xml b/res/xml/legal_information_fragment.xml
new file mode 100644
index 0000000..e7e343f
--- /dev/null
+++ b/res/xml/legal_information_fragment.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/legal_information">
+
+    <!-- Terms and conditions -->
+    <Preference
+        android:key="terms"
+        android:title="@string/terms_title"
+        settings:controller="com.android.car.settings.system.legal.TermsPreferenceController"/>
+
+    <!-- System WebView License information -->
+    <Preference
+        android:key="@string/pk_system_license_entry"
+        android:title="@string/webview_license_title"
+        settings:controller="com.android.car.settings.system.legal.WebViewLicensePreferenceController"/>
+
+    <Preference
+        android:key="@string/pk_third_party_license_entry"
+        android:title="@string/settings_license_activity_title"
+        settings:controller="com.android.car.settings.system.legal.ThirdPartyLicensePreferenceController"/>
+
+</PreferenceScreen>
diff --git a/res/xml/location_recent_requests_fragment.xml b/res/xml/location_recent_requests_fragment.xml
new file mode 100644
index 0000000..982cd63
--- /dev/null
+++ b/res/xml/location_recent_requests_fragment.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:key="@string/pk_location_recent_requests_screen"
+                  android:title="@string/location_settings_recent_requests_title"
+                  settings:controller="com.android.car.settings.location.RecentLocationRequestsPreferenceController"/>
\ No newline at end of file
diff --git a/res/xml/location_scanning_fragment.xml b/res/xml/location_scanning_fragment.xml
new file mode 100644
index 0000000..f71f246
--- /dev/null
+++ b/res/xml/location_scanning_fragment.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/location_settings_scanning_title">
+    <SwitchPreference
+        android:key="@string/pk_location_scanning_wifi"
+        android:summary="@string/location_settings_wifi_scanning_summary"
+        android:title="@string/location_settings_wifi_scanning_title"
+        settings:controller="com.android.car.settings.location.WifiScanningPreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_location_scanning_bluetooth"
+        android:summary="@string/location_settings_bluetooth_scanning_summary"
+        android:title="@string/location_settings_bluetooth_scanning_title"
+        settings:controller="com.android.car.settings.location.BluetoothScanningPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/location_settings_fragment.xml b/res/xml/location_settings_fragment.xml
new file mode 100644
index 0000000..4f1b57c
--- /dev/null
+++ b/res/xml/location_settings_fragment.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/location_settings_title">
+    <Preference
+        android:fragment="com.android.car.settings.location.RecentLocationRequestsFragment"
+        android:key="@string/pk_location_recent_requests_entry"
+        android:title="@string/location_settings_recent_requests_title"
+        settings:controller="com.android.car.settings.location.RecentLocationRequestsEntryPreferenceController"/>
+    <Preference
+        android:key="@string/pk_location_app_permissions"
+        android:title="@string/location_settings_app_permissions_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController">
+        <intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
+            <extra android:name="android.intent.extra.PERMISSION_NAME"
+                   android:value="android.permission-group.LOCATION"/>
+        </intent>
+    </Preference>
+    <Preference
+        android:fragment="com.android.car.settings.location.LocationScanningFragment"
+        android:key="@string/pk_location_scanning"
+        android:title="@string/location_settings_scanning_title"
+        settings:controller="com.android.car.settings.location.LocationScanningPreferenceController"/>
+    <PreferenceCategory
+        android:key="@string/pk_location_services"
+        android:title="@string/location_settings_services_title"
+        settings:controller="com.android.car.settings.location.LocationServicesPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_location_footer"
+        settings:controller="com.android.car.settings.location.LocationFooterPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/manage_assist_fragment.xml b/res/xml/manage_assist_fragment.xml
new file mode 100644
index 0000000..e5010f8
--- /dev/null
+++ b/res/xml/manage_assist_fragment.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/assist_and_voice_input_settings">
+    <com.android.car.settings.common.ButtonPreference
+        android:key="@string/pk_default_assist"
+        android:title="@string/assist_app_settings"
+        android:widgetLayout="@layout/details_preference_widget"
+        settings:controller="com.android.car.settings.applications.defaultapps.DefaultAssistantPickerEntryPreferenceController"
+        settings:iconSpaceReserved="true"/>
+    <SwitchPreference
+        android:key="@string/pk_assist_use_text_context"
+        android:summary="@string/assist_access_context_summary"
+        android:title="@string/assist_access_context_title"
+        settings:controller="com.android.car.settings.applications.assist.TextContextPreferenceController"
+        settings:iconSpaceReserved="true"/>
+    <SwitchPreference
+        android:key="@string/pk_assist_use_screenshot"
+        android:summary="@string/assist_access_screenshot_summary"
+        android:title="@string/assist_access_screenshot_title"
+        settings:controller="com.android.car.settings.applications.assist.ScreenshotContextPreferenceController"
+        settings:iconSpaceReserved="true"/>
+    <com.android.car.settings.common.ButtonPreference
+        android:fragment="com.android.car.settings.applications.assist.DefaultVoiceInputPickerFragment"
+        android:key="@string/pk_default_voice_input"
+        android:title="@string/voice_input_settings_title"
+        android:widgetLayout="@layout/details_preference_widget"
+        settings:controller="com.android.car.settings.applications.assist.DefaultVoiceInputPickerEntryPreferenceController"
+        settings:iconSpaceReserved="true"/>
+</PreferenceScreen>
diff --git a/res/xml/manage_domain_urls_fragment.xml b/res/xml/manage_domain_urls_fragment.xml
new file mode 100644
index 0000000..525fdd5
--- /dev/null
+++ b/res/xml/manage_domain_urls_fragment.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/app_launch_domain_links_title">
+    <PreferenceCategory
+        android:key="@string/pk_opening_links_options"
+        android:title="@string/domain_url_section_title"
+        settings:controller="com.android.car.settings.applications.managedomainurls.DomainAppPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/master_clear_confirm_fragment.xml b/res/xml/master_clear_confirm_fragment.xml
new file mode 100644
index 0000000..0ed99ff
--- /dev/null
+++ b/res/xml/master_clear_confirm_fragment.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/master_clear_confirm_title">
+    <Preference
+        android:key="@string/pk_master_clear_confirm_desc"
+        android:selectable="false"
+        android:title="@string/master_clear_confirm_desc"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
+        settings:singleLineTitle="false"/>
+</PreferenceScreen>
diff --git a/res/xml/master_clear_fragment.xml b/res/xml/master_clear_fragment.xml
new file mode 100644
index 0000000..28375be
--- /dev/null
+++ b/res/xml/master_clear_fragment.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/master_clear_title">
+    <Preference
+        android:key="@string/pk_master_clear_desc"
+        android:selectable="false"
+        android:title="@string/master_clear_desc"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
+        settings:singleLineTitle="false"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_master_clear_account_list"
+        android:selectable="false"
+        android:title="@string/master_clear_accounts"
+        settings:controller="com.android.car.settings.system.MasterClearAccountsPreferenceController"/>
+    <Preference
+        android:key="@string/pk_master_clear_other_users_present"
+        android:selectable="false"
+        android:title="@string/master_clear_other_users_present"
+        settings:controller="com.android.car.settings.system.MasterClearOtherUsersPresentPreferenceController"
+        settings:singleLineTitle="false"/>
+    <CheckBoxPreference
+        android:defaultValue="true"
+        android:key="@string/pk_master_clear_reset_esim"
+        android:summary="@string/reset_esim_desc"
+        android:title="@string/reset_esim_title"
+        settings:controller="com.android.car.settings.system.MasterClearResetEsimPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/mobile_network_fragment.xml b/res/xml/mobile_network_fragment.xml
new file mode 100644
index 0000000..1b59b1c
--- /dev/null
+++ b/res/xml/mobile_network_fragment.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/mobile_network_settings">
+    <SwitchPreference
+        android:key="@string/pk_mobile_data_toggle"
+        android:summary="@string/mobile_network_toggle_summary"
+        android:title="@string/mobile_network_toggle_title"
+        settings:controller="com.android.car.settings.network.MobileDataTogglePreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_mobile_roaming_toggle"
+        android:summary="@string/roaming_summary"
+        android:title="@string/roaming_title"
+        settings:controller="com.android.car.settings.network.RoamingPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/mobile_network_list_fragment.xml b/res/xml/mobile_network_list_fragment.xml
new file mode 100644
index 0000000..3c7d769
--- /dev/null
+++ b/res/xml/mobile_network_list_fragment.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/mobile_network_settings">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_mobile_network_list"
+        settings:controller="com.android.car.settings.network.MobileNetworkListPreferenceController"/>
+    <Preference
+        android:icon="@drawable/ic_add"
+        android:key="@string/pk_mobile_network_list_add_more"
+        android:title="@string/mobile_network_list_add_more"
+        android:visibility="gone"
+        settings:controller="com.android.car.settings.network.AddMobileNetworkPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/modify_system_settings_fragment.xml b/res/xml/modify_system_settings_fragment.xml
new file mode 100644
index 0000000..7aa22b4
--- /dev/null
+++ b/res/xml/modify_system_settings_fragment.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/modify_system_settings_title">
+    <Preference
+        android:key="@string/pk_modify_system_settings_description"
+        android:selectable="false"
+        android:summary="@string/modify_system_settings_description"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_modify_system_settings"
+        settings:controller="com.android.car.settings.applications.specialaccess.AppOpsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/network_and_internet_fragment.xml b/res/xml/network_and_internet_fragment.xml
new file mode 100644
index 0000000..9539977
--- /dev/null
+++ b/res/xml/network_and_internet_fragment.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/network_and_internet">
+    <com.android.car.settings.common.MasterSwitchPreference
+        android:fragment="com.android.car.settings.wifi.WifiSettingsFragment"
+        android:icon="@drawable/ic_settings_wifi"
+        android:key="@string/pk_wifi_settings_entry"
+        android:title="@string/wifi_settings"
+        settings:controller="com.android.car.settings.wifi.WifiEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.wifi.WifiTetherFragment"
+        android:key="@string/pk_wifi_tether_settings_entry"
+        android:title="@string/tether_settings_title_all"
+        android:icon="@drawable/ic_wifi_tethering"
+        settings:controller="com.android.car.settings.wifi.WifiTetherPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.network.MobileNetworkFragment"
+        android:icon="@drawable/ic_settings_cellular"
+        android:key="@string/pk_mobile_network_settings_entry"
+        android:title="@string/mobile_network_settings"
+        settings:controller="com.android.car.settings.network.MobileNetworkEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.datausage.DataUsageFragment"
+        android:icon="@drawable/ic_settings_data_usage"
+        android:key="@string/pk_data_usage_settings_entry"
+        android:title="@string/data_usage_settings"
+        settings:controller="com.android.car.settings.datausage.DataUsageEntryPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_network_and_internet_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.wireless"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/notification_access_fragment.xml b/res/xml/notification_access_fragment.xml
new file mode 100644
index 0000000..2637bce
--- /dev/null
+++ b/res/xml/notification_access_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/notification_access_title">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_notification_access"
+        settings:controller="com.android.car.settings.applications.specialaccess.NotificationAccessPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/preferred_engine_fragment.xml b/res/xml/preferred_engine_fragment.xml
new file mode 100644
index 0000000..b730caf
--- /dev/null
+++ b/res/xml/preferred_engine_fragment.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/text_to_speech_preferred_engine_settings">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="pk_tts_preferred_engine_options"
+        settings:controller="com.android.car.settings.tts.PreferredEngineOptionsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/premium_sms_access_fragment.xml b/res/xml/premium_sms_access_fragment.xml
new file mode 100644
index 0000000..829cfd9
--- /dev/null
+++ b/res/xml/premium_sms_access_fragment.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/premium_sms_access_title">
+    <Preference
+        android:key="@string/pk_premium_sms_access_description"
+        android:selectable="false"
+        android:summary="@string/premium_sms_access_description"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_premium_sms_access"
+        settings:controller="com.android.car.settings.applications.specialaccess.PremiumSmsAccessPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/reset_app_pref_fragment.xml b/res/xml/reset_app_pref_fragment.xml
new file mode 100644
index 0000000..540d0dd
--- /dev/null
+++ b/res/xml/reset_app_pref_fragment.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/reset_app_pref_title">
+    <Preference
+        android:selectable="false"
+        android:title="@string/reset_app_pref_desc"
+        settings:singleLineTitle="false"/>
+</PreferenceScreen>
diff --git a/res/xml/reset_network_confirm_fragment.xml b/res/xml/reset_network_confirm_fragment.xml
new file mode 100644
index 0000000..e861532
--- /dev/null
+++ b/res/xml/reset_network_confirm_fragment.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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"
+                  android:title="@string/reset_network_confirm_title">
+    <Preference
+        android:selectable="false"
+        android:title="@string/reset_network_confirm_desc"/>
+</PreferenceScreen>
diff --git a/res/xml/reset_network_fragment.xml b/res/xml/reset_network_fragment.xml
new file mode 100644
index 0000000..789f581
--- /dev/null
+++ b/res/xml/reset_network_fragment.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/reset_network_title">
+    <Preference
+        android:key="@string/pk_reset_network_items"
+        android:selectable="false"
+        android:title="@string/reset_network_desc"
+        settings:controller="com.android.car.settings.system.ResetNetworkItemsPreferenceController"
+        settings:singleLineTitle="false"/>
+    <CheckBoxPreference
+        android:key="@string/pk_reset_esim"
+        android:summary="@string/reset_esim_desc"
+        android:title="@string/reset_esim_title"
+        settings:controller="com.android.car.settings.system.ResetEsimPreferenceController"/>
+    <ListPreference
+        android:key="@string/pk_reset_network_subscription"
+        android:title="@string/reset_network_select"
+        android:widgetLayout="@layout/dropdown_preference_widget"
+        settings:controller="com.android.car.settings.system.ResetNetworkSubscriptionPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/reset_options_fragment.xml b/res/xml/reset_options_fragment.xml
new file mode 100644
index 0000000..3802b46
--- /dev/null
+++ b/res/xml/reset_options_fragment.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/reset_options_title">
+    <Preference
+        android:fragment="com.android.car.settings.system.ResetNetworkFragment"
+        android:key="@string/pk_reset_network"
+        android:title="@string/reset_network_title"
+        settings:controller="com.android.car.settings.system.ResetNetworkEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.system.ResetAppPrefFragment"
+        android:key="@string/pk_reset_app_pref"
+        android:title="@string/reset_app_pref_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.system.MasterClearFragment"
+        android:key="@string/pk_master_clear"
+        android:title="@string/master_clear_title"
+        settings:controller="com.android.car.settings.system.MasterClearEntryPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/security_settings_fragment.xml b/res/xml/security_settings_fragment.xml
new file mode 100644
index 0000000..b71d532
--- /dev/null
+++ b/res/xml/security_settings_fragment.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/security_settings_title">
+    <Preference
+        android:icon="@drawable/ic_lock"
+        android:key="@string/pk_choose_lock_type"
+        android:title="@string/lock_settings_picker_title"
+        settings:controller="com.android.car.settings.security.SecurityEntryPreferenceController">
+        <intent
+            android:targetClass="com.android.car.settings.security.SettingsScreenLockActivity"
+            android:targetPackage="com.android.car.settings"/>
+    </Preference>
+    <Preference
+        android:fragment="com.android.car.settings.security.ChooseTrustedDeviceFragment"
+        android:icon="@drawable/ic_lock"
+        android:key="@string/pk_trusted_device"
+        android:title="@string/trusted_device"
+        settings:controller="com.android.car.settings.security.TrustedDeviceEntryPreferenceController"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/sound_settings_fragment.xml b/res/xml/sound_settings_fragment.xml
new file mode 100644
index 0000000..3aab43f
--- /dev/null
+++ b/res/xml/sound_settings_fragment.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/sound_settings">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_volume_settings"
+        settings:controller="com.android.car.settings.sound.VolumeSettingsPreferenceController"/>
+    <com.android.car.settings.sound.RingtonePreference
+        android:key="@string/pk_default_ringtone"
+        android:ringtoneType="ringtone"
+        android:title="@string/ringtone_title"
+        settings:controller="com.android.car.settings.sound.RingtonePreferenceController"/>
+    <com.android.car.settings.sound.RingtonePreference
+        android:key="@string/pk_default_notification"
+        android:ringtoneType="notification"
+        android:title="@string/notification_ringtone_title"
+        settings:controller="com.android.car.settings.sound.RingtonePreferenceController"/>
+    <com.android.car.settings.sound.RingtonePreference
+        android:key="@string/pk_default_alarm"
+        android:ringtoneType="alarm"
+        android:title="@string/alarm_ringtone_title"
+        settings:controller="com.android.car.settings.sound.RingtonePreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_sounds_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.sound"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/special_access_fragment.xml b/res/xml/special_access_fragment.xml
new file mode 100644
index 0000000..e6cadfb
--- /dev/null
+++ b/res/xml/special_access_fragment.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/special_access">
+    <Preference
+        android:fragment="com.android.car.settings.applications.specialaccess.ModifySystemSettingsFragment"
+        android:key="@string/pk_modify_system_settings_entry"
+        android:title="@string/modify_system_settings_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.applications.specialaccess.NotificationAccessFragment"
+        android:key="@string/pk_notification_access_entry"
+        android:title="@string/notification_access_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.applications.specialaccess.PremiumSmsAccessFragment"
+        android:key="@string/pk_premium_sms_access_entry"
+        android:title="@string/premium_sms_access_title"
+        settings:controller="com.android.car.settings.applications.specialaccess.PremiumSmsAccessEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.applications.specialaccess.UsageAccessFragment"
+        android:key="@string/pk_usage_access_entry"
+        android:title="@string/usage_access_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.applications.specialaccess.WifiControlFragment"
+        android:key="@string/pk_wifi_control_entry"
+        android:title="@string/wifi_control_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:key="@string/pk_more_special_access"
+        android:title="@string/more_special_access_title"
+        settings:controller="com.android.car.settings.applications.specialaccess.MoreSpecialAccessPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/storage_media_category_detail_fragment.xml b/res/xml/storage_media_category_detail_fragment.xml
new file mode 100644
index 0000000..14f7207
--- /dev/null
+++ b/res/xml/storage_media_category_detail_fragment.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/storage_music_audio">
+
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_storage_music_audio_details"
+        settings:controller="com.android.car.settings.storage.StorageMediaCategoryDetailPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/storage_other_category_detail_fragment.xml b/res/xml/storage_other_category_detail_fragment.xml
new file mode 100644
index 0000000..b01877c
--- /dev/null
+++ b/res/xml/storage_other_category_detail_fragment.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/storage_other_apps">
+
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_storage_other_apps_details"
+        settings:controller="com.android.car.settings.storage.StorageApplicationListPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/storage_settings_fragment.xml b/res/xml/storage_settings_fragment.xml
new file mode 100644
index 0000000..1d06a1f
--- /dev/null
+++ b/res/xml/storage_settings_fragment.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/storage_settings_title">
+    <com.android.car.settings.common.ProgressBarPreference
+        android:icon="@drawable/ic_media_stream"
+        android:key="@string/pk_storage_music_audio"
+        android:layout="@layout/progress_bar_preference"
+        android:title="@string/storage_music_audio"
+        settings:controller="com.android.car.settings.storage.StorageMediaCategoryPreferenceController"/>
+    <com.android.car.settings.common.ProgressBarPreference
+        android:fragment="com.android.car.settings.storage.StorageOtherCategoryDetailFragment"
+        android:icon="@drawable/ic_storage_apps"
+        android:key="@string/pk_storage_other_apps"
+        android:layout="@layout/progress_bar_preference"
+        android:title="@string/storage_other_apps"
+        settings:controller="com.android.car.settings.storage.StorageOtherCategoryPreferenceController"/>
+    <com.android.car.settings.common.ProgressBarPreference
+        android:icon="@drawable/ic_folder"
+        android:key="@string/pk_storage_files"
+        android:layout="@layout/progress_bar_preference"
+        android:title="@string/storage_files"
+        settings:controller="com.android.car.settings.storage.StorageFileCategoryPreferenceController"/>
+    <com.android.car.settings.common.ProgressBarPreference
+        android:icon="@drawable/ic_system_update"
+        android:key="@string/pk_storage_system"
+        android:layout="@layout/progress_bar_preference"
+        android:title="@string/storage_system"
+        settings:controller="com.android.car.settings.storage.StorageSystemCategoryPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/system_settings_fragment.xml b/res/xml/system_settings_fragment.xml
new file mode 100644
index 0000000..1ce163a
--- /dev/null
+++ b/res/xml/system_settings_fragment.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/system_setting_title">
+    <Preference
+        android:fragment="com.android.car.settings.language.LanguagesAndInputFragment"
+        android:key="@string/pk_languages_and_input_settings"
+        android:icon="@drawable/ic_language"
+        android:title="@string/languages_and_input_settings"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:icon="@drawable/ic_system_update"
+        android:key="@string/pk_system_update_settings"
+        android:title="@string/system_update_settings_title"
+        settings:controller="com.android.car.settings.system.SystemUpdatePreferenceController">
+        <intent android:action="android.settings.SYSTEM_UPDATE_SETTINGS"/>
+    </Preference>
+    <Preference
+        android:fragment="com.android.car.settings.system.AboutSettingsFragment"
+        android:icon="@drawable/ic_settings_about"
+        android:key="@string/pk_about_settings_entry"
+        android:title="@string/about_settings"
+        settings:controller="com.android.car.settings.system.AboutSettingsEntryPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.system.LegalInformationFragment"
+        android:icon="@drawable/ic_settings_about"
+        android:key="@string/pk_legal_information_entry"
+        android:title="@string/legal_information"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.system.ResetOptionsFragment"
+        android:icon="@drawable/ic_restore"
+        android:key="@string/pk_reset_options_entry"
+        android:summary="@string/reset_options_summary"
+        android:title="@string/reset_options_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:icon="@drawable/ic_settings_development"
+        android:key="@string/pk_developer_options_entry"
+        android:title="@string/developer_options_settings"
+        settings:controller="com.android.car.settings.system.DeveloperOptionsEntryPreferenceController">
+        <intent android:action="android.settings.APPLICATION_DEVELOPMENT_SETTINGS"/>
+    </Preference>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_system_extra_settings"
+        settings:controller="com.android.car.settings.common.ExtraSettingsPreferenceController">
+        <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+            <extra android:name="com.android.settings.category"
+                   android:value="com.android.settings.category.ia.system"/>
+        </intent>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/text_to_speech_output_fragment.xml b/res/xml/text_to_speech_output_fragment.xml
new file mode 100644
index 0000000..fcf8f94
--- /dev/null
+++ b/res/xml/text_to_speech_output_fragment.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/text_to_speech_settings">
+    <com.android.car.settings.common.ButtonPreference
+        android:fragment="com.android.car.settings.tts.PreferredEngineFragment"
+        android:key="@string/pk_tts_preferred_engine_entry"
+        android:title="@string/text_to_speech_preferred_engine_settings"
+        android:widgetLayout="@layout/details_preference_widget"
+        settings:controller="com.android.car.settings.tts.PreferredEngineEntryPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_tts_playback_group"
+        settings:controller="com.android.car.settings.tts.TtsPlaybackPreferenceController">
+        <ListPreference
+            android:key="@string/pk_tts_default_language"
+            android:persistent="false"
+            android:summary="@string/tts_default_lang_summary"
+            android:title="@string/tts_default_lang_title"/>
+        <com.android.car.settings.common.SeekBarPreference
+            android:key="@string/pk_tts_speech_rate"
+            android:title="@string/tts_speech_rate"/>
+        <com.android.car.settings.common.SeekBarPreference
+            android:key="@string/pk_tts_pitch"
+            android:title="@string/tts_pitch"/>
+        <Preference
+            android:key="@string/pk_tts_reset"
+            android:title="@string/tts_reset"/>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+</PreferenceScreen>
diff --git a/res/xml/timezone_picker_screen_fragment.xml b/res/xml/timezone_picker_screen_fragment.xml
new file mode 100644
index 0000000..fab12a8
--- /dev/null
+++ b/res/xml/timezone_picker_screen_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/date_time_set_timezone_title">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_timezone_picker_screen"
+        settings:controller="com.android.car.settings.datetime.TimeZonePickerScreenPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/units_fragment.xml b/res/xml/units_fragment.xml
new file mode 100644
index 0000000..ab1d687
--- /dev/null
+++ b/res/xml/units_fragment.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/units_settings" >
+    <ListPreference
+        android:key="@string/pk_units_speed"
+        android:title="@string/units_speed_title"
+        android:dialogTitle="@string/units_speed_title"
+        settings:controller="com.android.car.settings.units.UnitsSpeedPreferenceController"/>
+
+    <ListPreference
+        android:key="@string/pk_units_distance"
+        android:title="@string/units_distance_title"
+        android:dialogTitle="@string/units_distance_title"
+        settings:controller="com.android.car.settings.units.UnitsDistancePreferenceController"/>
+
+    <ListPreference
+        android:key="@string/pk_units_fuel_consumption"
+        android:title="@string/units_fuel_consumption_title"
+        android:dialogTitle="@string/units_fuel_consumption_title"
+        settings:controller="com.android.car.settings.units.UnitsFuelConsumptionPreferenceController"/>
+
+    <ListPreference
+        android:key="@string/pk_units_energy_consumption"
+        android:title="@string/units_energy_consumption_title"
+        android:dialogTitle="@string/units_energy_consumption_title"
+        settings:controller="com.android.car.settings.units.UnitsEnergyConsumptionPreferenceController"/>
+
+    <ListPreference
+        android:key="@string/pk_units_temperature"
+        android:title="@string/units_temperature_title"
+        android:dialogTitle="@string/units_temperature_title"
+        settings:controller="com.android.car.settings.units.UnitsTemperaturePreferenceController"/>
+
+    <ListPreference
+        android:key="@string/pk_units_volume"
+        android:title="@string/units_volume_title"
+        android:dialogTitle="@string/units_volume_title"
+        settings:controller="com.android.car.settings.units.UnitsVolumePreferenceController"/>
+
+    <ListPreference
+        android:key="@string/pk_units_pressure"
+        android:title="@string/units_pressure_title"
+        android:dialogTitle="@string/units_pressure_title"
+        settings:controller="com.android.car.settings.units.UnitsPressurePreferenceController"/>
+
+</PreferenceScreen>
diff --git a/res/xml/usage_access_fragment.xml b/res/xml/usage_access_fragment.xml
new file mode 100644
index 0000000..a1ac3e2
--- /dev/null
+++ b/res/xml/usage_access_fragment.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/usage_access_title">
+    <Preference
+        android:key="@string/pk_usage_access_description"
+        android:selectable="false"
+        android:summary="@string/usage_access_description"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_usage_access"
+        settings:controller="com.android.car.settings.applications.specialaccess.AppOpsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/user_details_fragment.xml b/res/xml/user_details_fragment.xml
new file mode 100644
index 0000000..1317453
--- /dev/null
+++ b/res/xml/user_details_fragment.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <com.android.car.settings.common.ButtonPreference
+        android:key="@string/pk_edit_user_name_entry"
+        android:selectable="false"
+        android:widgetLayout="@layout/edit_icon_preference_widget"
+        settings:controller="com.android.car.settings.users.EditUserNameEntryPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/user_details_permissions_fragment.xml b/res/xml/user_details_permissions_fragment.xml
new file mode 100644
index 0000000..a71a604
--- /dev/null
+++ b/res/xml/user_details_permissions_fragment.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <com.android.car.settings.common.ButtonPreference
+        android:key="@string/pk_make_user_admin"
+        android:selectable="false"
+        android:title="@string/grant_admin_permissions_title"
+        android:widgetLayout="@layout/make_admin_preference_widget"
+        settings:controller="com.android.car.settings.users.MakeAdminPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_user_permissions"
+        settings:controller="com.android.car.settings.users.PermissionsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/users_list_fragment.xml b/res/xml/users_list_fragment.xml
new file mode 100644
index 0000000..d483ffe
--- /dev/null
+++ b/res/xml/users_list_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/users_list_title">
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_users_list"
+        settings:controller="com.android.car.settings.users.UsersListPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/wifi_control_fragment.xml b/res/xml/wifi_control_fragment.xml
new file mode 100644
index 0000000..58d4b0e
--- /dev/null
+++ b/res/xml/wifi_control_fragment.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/wifi_control_title">
+    <Preference
+        android:key="@string/pk_wifi_control_description"
+        android:selectable="false"
+        android:summary="@string/wifi_control_description"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_wifi_control"
+        settings:controller="com.android.car.settings.applications.specialaccess.WifiControlPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/wifi_detail_fragment.xml b/res/xml/wifi_detail_fragment.xml
new file mode 100644
index 0000000..a681f4b
--- /dev/null
+++ b/res/xml/wifi_detail_fragment.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/wifi_settings">
+    <!-- General Details Category -->
+    <com.android.car.settings.common.LogicalPreferenceGroup>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_signal_strength"
+            android:selectable="false"
+            android:title="@string/wifi_signal_strength"
+            settings:controller="com.android.car.settings.wifi.details.WifiSignalStrengthPreferenceController"/>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_frequency"
+            android:selectable="false"
+            android:title="@string/wifi_frequency"
+            settings:controller="com.android.car.settings.wifi.details.WifiFrequencyPreferenceController"/>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_security"
+            android:selectable="false"
+            android:title="@string/wifi_security"
+            settings:controller="com.android.car.settings.wifi.details.WifiSecurityPreferenceController"/>
+    </com.android.car.settings.common.LogicalPreferenceGroup>
+
+    <!-- Ip Details Category -->
+    <PreferenceCategory
+        android:title="@string/wifi_network_detail">
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_mac_address"
+            android:selectable="false"
+            android:title="@string/wifi_mac_address"
+            settings:controller="com.android.car.settings.wifi.details.WifiMacAddressPreferenceController"/>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_ip"
+            android:selectable="false"
+            android:title="@string/wifi_ip_address"
+            settings:controller="com.android.car.settings.wifi.details.WifiIpAddressPreferenceController"/>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_gateway"
+            android:selectable="false"
+            android:title="@string/wifi_gateway"
+            settings:controller="com.android.car.settings.wifi.details.WifiGatewayPreferenceController"/>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_subnet_mask"
+            android:selectable="false"
+            android:title="@string/wifi_subnet_mask"
+            settings:controller="com.android.car.settings.wifi.details.WifiSubnetPreferenceController"/>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_dns"
+            android:selectable="false"
+            android:title="@string/wifi_dns"
+            settings:controller="com.android.car.settings.wifi.details.WifiDnsPreferenceController"/>
+        <com.android.car.settings.wifi.details.WifiDetailsPreference
+            android:key="@string/pk_wifi_link_speed"
+            android:selectable="false"
+            android:title="@string/wifi_speed"
+            settings:controller="com.android.car.settings.wifi.details.WifiLinkSpeedPreferenceController"/>
+    </PreferenceCategory>
+
+    <!-- IPv6 Details -->
+    <PreferenceCategory
+        android:selectable="false"
+        android:title="@string/wifi_details_ipv6_address_header">
+        <Preference
+            android:key="@string/pk_wifi_ipv6"
+            android:selectable="false"
+            settings:controller="com.android.car.settings.wifi.details.WifiIpv6AddressPreferenceController"/>
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/res/xml/wifi_list_fragment.xml b/res/xml/wifi_list_fragment.xml
new file mode 100644
index 0000000..bcd287f
--- /dev/null
+++ b/res/xml/wifi_list_fragment.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/wifi_settings">
+    <Preference
+        android:key="@string/pk_wifi_status"
+        settings:controller="com.android.car.settings.wifi.WifiStatusPreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="@string/pk_wifi_list"
+        settings:controller="com.android.car.settings.wifi.AccessPointListPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.wifi.AddWifiFragment"
+        android:icon="@drawable/ic_add"
+        android:key="@string/pk_add_wifi"
+        android:title="@string/wifi_setup_add_network"
+        settings:controller="com.android.car.settings.wifi.AddWifiPreferenceController"/>
+    <Preference
+        android:fragment="com.android.car.settings.wifi.preferences.WifiPreferencesFragment"
+        android:key="@string/pk_wifi_preferences"
+        android:title="@string/wifi_preferences_title"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/wifi_preferences_fragment.xml b/res/xml/wifi_preferences_fragment.xml
new file mode 100644
index 0000000..f19d174
--- /dev/null
+++ b/res/xml/wifi_preferences_fragment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="@string/wifi_preferences_title">
+    <SwitchPreference
+        android:key="@string/pk_enable_wifi_wakeup"
+        android:title="@string/wifi_wakeup"
+        android:icon="@drawable/ic_settings_auto_wifi"
+        android:summary="@string/wifi_wakeup_summary"
+        settings:controller="com.android.car.settings.wifi.preferences.WifiWakeupTogglePreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_wifi_cellular_fallback"
+        android:summary="@string/wifi_cellular_fallback_summary"
+        android:title="@string/wifi_cellular_fallback_title"
+        settings:controller="com.android.car.settings.wifi.preferences.CellularFallbackTogglePreferenceController"/>
+</PreferenceScreen>
diff --git a/res/xml/wifi_tether_fragment.xml b/res/xml/wifi_tether_fragment.xml
new file mode 100644
index 0000000..a0d1bcf
--- /dev/null
+++ b/res/xml/wifi_tether_fragment.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:title="@string/tether_settings_title_all" >
+    <com.android.car.settings.common.ValidatedEditTextPreference
+        android:key="@string/pk_wifi_tether_name"
+        android:title="@string/wifi_hotspot_name_title"
+        settings:controller="com.android.car.settings.wifi.WifiTetherNamePreferenceController"/>
+    <ListPreference
+        android:key="@string/pk_wifi_tether_security"
+        android:title="@string/wifi_hotspot_security_title"
+        android:dialogTitle="@string/wifi_hotspot_security_title"
+        android:persistent="false"
+        settings:controller="com.android.car.settings.wifi.WifiTetherSecurityPreferenceController"/>
+    <com.android.car.settings.common.ValidatedEditTextPreference
+        android:key="@string/pk_wifi_tether_password"
+        android:title="@string/wifi_hotspot_password_title"
+        android:persistent="false"
+        settings:controller="com.android.car.settings.wifi.WifiTetherPasswordPreferenceController"/>
+    <SwitchPreference
+        android:key="@string/pk_wifi_tether_auto_off"
+        android:title="@string/wifi_hotspot_auto_off_title"
+        android:summary="@string/wifi_hotspot_auto_off_summary"
+        android:persistent="false"
+        settings:controller="com.android.car.settings.wifi.WifiTetherAutoOffPreferenceController"/>
+    <ListPreference
+        android:key="@string/pk_wifi_tether_ap_band"
+        android:title="@string/wifi_hotspot_ap_band_title"
+        android:dialogTitle="@string/wifi_hotspot_ap_band_title"
+        android:persistent="false"
+        settings:controller="com.android.car.settings.wifi.WifiTetherApBandPreferenceController"/>
+</PreferenceScreen>
diff --git a/src/com/android/car/settings/FallbackHome.java b/src/com/android/car/settings/FallbackHome.java
new file mode 100644
index 0000000..41ef281
--- /dev/null
+++ b/src/com/android/car/settings/FallbackHome.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2018 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.car.settings;
+
+import android.app.Activity;
+import android.app.WallpaperColors;
+import android.app.WallpaperManager;
+import android.app.WallpaperManager.OnColorsChangedListener;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.view.View;
+import android.view.WindowManager.LayoutParams;
+import android.view.animation.AnimationUtils;
+
+import com.android.car.settings.common.Logger;
+
+import java.util.Objects;
+
+/**
+ * Copied over from phone settings. This covers the fallback case where no launcher is available.
+ */
+public class FallbackHome extends Activity {
+    private static final Logger LOG = new Logger(FallbackHome.class);
+    private static final int PROGRESS_TIMEOUT = 2000;
+
+    private boolean mProvisioned;
+    private WallpaperManager mWallManager;
+
+    private final Runnable mProgressTimeoutRunnable = () -> {
+        View v = getLayoutInflater().inflate(
+                R.layout.fallback_home_finishing_boot, null /* root */);
+        setContentView(v);
+        v.setAlpha(0f);
+        v.animate()
+                .alpha(1f)
+                .setDuration(500)
+                .setInterpolator(AnimationUtils.loadInterpolator(
+                        this, android.R.interpolator.fast_out_slow_in))
+                .start();
+        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+    };
+
+    private final OnColorsChangedListener mColorsChangedListener = new OnColorsChangedListener() {
+        @Override
+        public void onColorsChanged(WallpaperColors colors, int which) {
+            if (colors != null) {
+                View decorView = getWindow().getDecorView();
+                decorView.setSystemUiVisibility(
+                        updateVisibilityFlagsFromColors(colors, decorView.getSystemUiVisibility()));
+                mWallManager.removeOnColorsChangedListener(this);
+            }
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Set ourselves totally black before the device is provisioned so that
+        // we don't flash the wallpaper before SUW
+        mProvisioned = Settings.Global.getInt(getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+        int flags;
+        if (!mProvisioned) {
+            setTheme(R.style.FallbackHome_SetupWizard);
+            flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+        } else {
+            flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+        }
+
+        // Set the system ui flags to light status bar if the wallpaper supports dark text to match
+        // current system ui color tints. Use a listener to wait for colors if not ready yet.
+        mWallManager = getSystemService(WallpaperManager.class);
+        if (mWallManager == null) {
+            LOG.w("Wallpaper manager isn't ready, can't listen to color changes!");
+        } else {
+            WallpaperColors colors = mWallManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
+            if (colors == null) {
+                mWallManager.addOnColorsChangedListener(mColorsChangedListener, null /* handler */);
+            } else {
+                flags = updateVisibilityFlagsFromColors(colors, flags);
+            }
+        }
+        getWindow().getDecorView().setSystemUiVisibility(flags);
+
+        registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED));
+        maybeFinish();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (mProvisioned) {
+            mHandler.postDelayed(mProgressTimeoutRunnable, PROGRESS_TIMEOUT);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mHandler.removeCallbacks(mProgressTimeoutRunnable);
+    }
+
+    protected void onDestroy() {
+        super.onDestroy();
+        unregisterReceiver(mReceiver);
+        if (mWallManager != null) {
+            mWallManager.removeOnColorsChangedListener(mColorsChangedListener);
+        }
+    }
+
+    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            maybeFinish();
+        }
+    };
+
+    private void maybeFinish() {
+        if (getSystemService(UserManager.class).isUserUnlocked()) {
+            final Intent homeIntent = new Intent(Intent.ACTION_MAIN)
+                    .addCategory(Intent.CATEGORY_HOME);
+            final ResolveInfo homeInfo = getPackageManager().resolveActivity(homeIntent, 0);
+            if (Objects.equals(getPackageName(), homeInfo.activityInfo.packageName)) {
+                if (UserManager.isSplitSystemUser()
+                        && UserHandle.myUserId() == UserHandle.USER_SYSTEM) {
+                    // This avoids the situation where the system user has no home activity after
+                    // SUW and this activity continues to throw out warnings. See b/28870689.
+                    return;
+                }
+                LOG.d("User unlocked but no home; let's hope someone enables one soon?");
+                mHandler.sendEmptyMessageDelayed(0, 500);
+            } else {
+                LOG.d("User unlocked and real home found; let's go!");
+                getSystemService(PowerManager.class).userActivity(
+                        SystemClock.uptimeMillis(), false);
+                finish();
+            }
+        }
+    }
+
+    private int updateVisibilityFlagsFromColors(WallpaperColors colors, int flags) {
+        if ((colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0) {
+            return flags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
+                    | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
+        }
+        return flags & ~(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
+                & ~(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
+    }
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            maybeFinish();
+        }
+    };
+}
diff --git a/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceController.java b/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceController.java
new file mode 100644
index 0000000..80d6a83
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceController.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.os.UserHandle;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller for the preference that allows the user to toggle automatic syncing of accounts.
+ *
+ * <p>Copied from {@link com.android.settings.users.AutoSyncDataPreferenceController}
+ */
+public class AccountAutoSyncPreferenceController extends PreferenceController<TwoStatePreference> {
+
+    private final UserHandle mUserHandle;
+    /**
+     * Argument key to store a value that indicates whether the account auto sync is being enabled
+     * or disabled.
+     */
+    @VisibleForTesting
+    static final String KEY_ENABLING = "ENABLING";
+    /** Argument key to store user handle. */
+    @VisibleForTesting
+    static final String KEY_USER_HANDLE = "USER_HANDLE";
+
+    @VisibleForTesting
+    final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        boolean enabling = arguments.getBoolean(KEY_ENABLING);
+        UserHandle userHandle = arguments.getParcelable(KEY_USER_HANDLE);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(enabling, userHandle.getIdentifier());
+        getPreference().setChecked(enabling);
+    };
+
+    public AccountAutoSyncPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        CarUserManagerHelper carUserManagerHelper = new CarUserManagerHelper(context);
+        mUserHandle = carUserManagerHelper.getCurrentProcessUserInfo().getUserHandle();
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(ContentResolver.getMasterSyncAutomaticallyAsUser(
+                mUserHandle.getIdentifier()));
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        // If the dialog is still up, reattach the preference
+        ConfirmationDialogFragment dialog =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG);
+
+        ConfirmationDialogFragment.resetListeners(dialog, mConfirmListener, /* rejectListener= */
+                null);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object checked) {
+        getFragmentController().showDialog(
+                getAutoSyncChangeConfirmationDialogFragment((boolean) checked),
+                ConfirmationDialogFragment.TAG);
+        // The dialog will change the state of the preference if the user confirms, so don't handle
+        // it here
+        return false;
+    }
+
+    private ConfirmationDialogFragment getAutoSyncChangeConfirmationDialogFragment(
+            boolean enabling) {
+        int dialogTitle;
+        int dialogMessage;
+
+        if (enabling) {
+            dialogTitle = R.string.data_usage_auto_sync_on_dialog_title;
+            dialogMessage = R.string.data_usage_auto_sync_on_dialog;
+        } else {
+            dialogTitle = R.string.data_usage_auto_sync_off_dialog_title;
+            dialogMessage = R.string.data_usage_auto_sync_off_dialog;
+        }
+
+        ConfirmationDialogFragment dialogFragment =
+                new ConfirmationDialogFragment.Builder(getContext())
+                        .setTitle(dialogTitle).setMessage(dialogMessage)
+                        .setPositiveButton(android.R.string.ok, mConfirmListener)
+                        .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null)
+                        .addArgumentBoolean(KEY_ENABLING, enabling)
+                        .addArgumentParcelable(KEY_USER_HANDLE, mUserHandle)
+                        .build();
+
+        return dialogFragment;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/car/settings/accounts/AccountDetailsFragment.java b/src/com/android/car/settings/accounts/AccountDetailsFragment.java
index df9c5c6..465cde8 100644
--- a/src/com/android/car/settings/accounts/AccountDetailsFragment.java
+++ b/src/com/android/car/settings/accounts/AccountDetailsFragment.java
@@ -18,144 +18,167 @@
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AccountManagerCallback;
-import android.accounts.AccountManagerFuture;
 import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.app.Dialog;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.UserInfo;
-import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.UserHandle;
-import android.text.TextUtils;
+import android.view.View;
 import android.widget.Button;
+import android.widget.TextView;
 
-import androidx.car.app.CarAlertDialog;
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
+import com.android.car.settings.common.ErrorDialog;
 import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
 import com.android.settingslib.accounts.AuthenticatorHelper;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Arrays;
 
 /**
  * Shows account details, and delete account option.
  */
-public class AccountDetailsFragment extends ListItemSettingsFragment
-        implements AuthenticatorHelper.OnAccountsUpdateListener {
-    public static final String EXTRA_ACCOUNT_INFO = "extra_account_info";
+public class AccountDetailsFragment extends SettingsFragment implements
+        AuthenticatorHelper.OnAccountsUpdateListener {
+    public static final String EXTRA_ACCOUNT = "extra_account";
+    public static final String EXTRA_ACCOUNT_LABEL = "extra_account_label";
     public static final String EXTRA_USER_INFO = "extra_user_info";
 
     private Account mAccount;
     private UserInfo mUserInfo;
-    private ListItemProvider mItemProvider;
-    private AccountManagerHelper mAccountManagerHelper;
+    private AuthenticatorHelper mAuthenticatorHelper;
 
-    public static AccountDetailsFragment newInstance(
-            Account account, UserInfo userInfo) {
+    /**
+     * Creates a new AccountDetailsFragment.
+     *
+     * <p>Passes the provided account, label, and user info to the fragment via fragment arguments.
+     */
+    public static AccountDetailsFragment newInstance(Account account, CharSequence label,
+            UserInfo userInfo) {
         AccountDetailsFragment
                 accountDetailsFragment = new AccountDetailsFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_TITLE_ID, R.string.account_details_title);
-        bundle.putParcelable(EXTRA_ACCOUNT_INFO, account);
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(EXTRA_ACCOUNT, account);
+        bundle.putCharSequence(EXTRA_ACCOUNT_LABEL, label);
         bundle.putParcelable(EXTRA_USER_INFO, userInfo);
         accountDetailsFragment.setArguments(bundle);
         return accountDetailsFragment;
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mAccount = getArguments().getParcelable(EXTRA_ACCOUNT_INFO);
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.account_details_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mAccount = getArguments().getParcelable(EXTRA_ACCOUNT);
         mUserInfo = getArguments().getParcelable(EXTRA_USER_INFO);
+
+        use(AccountDetailsPreferenceController.class, R.string.pk_account_details)
+                .setAccount(mAccount);
+        use(AccountDetailsPreferenceController.class, R.string.pk_account_details)
+                .setUserHandle(mUserInfo.getUserHandle());
+
+        use(AccountSyncPreferenceController.class, R.string.pk_account_sync)
+                .setAccount(mAccount);
+        use(AccountDetailsSettingController.class, R.string.pk_account_settings)
+                .setAccount(mAccount);
+        use(AccountSyncPreferenceController.class, R.string.pk_account_sync)
+                .setUserHandle(mUserInfo.getUserHandle());
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
-        // Should be created before calling getListItem().
-        mAccountManagerHelper = new AccountManagerHelper(getContext(), this);
-        mAccountManagerHelper.startListeningToAccountUpdates();
-
-        mItemProvider = new ListItemProvider.ListProvider(getListItems());
-
-        // Super is called only AFTER item provider is instantiated, because
-        // super.onActivityCreated calls getItemProvider().
         super.onActivityCreated(savedInstanceState);
 
-        // Title was set in super.onActivityCreated, but override if account label is available.
-        setFragmentTitle();
+        // Set the fragment's title
+        TextView titleView = requireActivity().findViewById(R.id.title);
+        titleView.setText(getArguments().getCharSequence(EXTRA_ACCOUNT_LABEL));
 
-        showRemoveButton();
+        // Enable the remove account button if the user is allowed to modify accounts.
+        Button removeAccountButton = requireActivity().findViewById(R.id.action_button1);
+        if (new CarUserManagerHelper(getContext()).canCurrentProcessModifyAccounts()) {
+            removeAccountButton.setText(R.string.remove_button);
+            removeAccountButton.setOnClickListener(v -> onRemoveAccountClicked());
+        } else {
+            removeAccountButton.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        mAuthenticatorHelper = new AuthenticatorHelper(getContext(), mUserInfo.getUserHandle(),
+                this);
+        mAuthenticatorHelper.listenToAccountUpdates();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mAuthenticatorHelper.stopListeningToAccountUpdates();
     }
 
     @Override
     public void onAccountsUpdate(UserHandle userHandle) {
-        if (!mAccountManagerHelper.accountExists(mAccount)) {
+        if (!accountExists()) {
             // The account was deleted. Pop back.
-            getFragmentController().goBack();
+            goBack();
         }
     }
 
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-
-    private void showRemoveButton() {
-        Button removeAccountBtn = getActivity().findViewById(R.id.action_button1);
-        removeAccountBtn.setText(R.string.remove_button);
-        removeAccountBtn.setOnClickListener(v -> removeAccount());
-    }
-
-    private void setFragmentTitle() {
-        CharSequence accountLabel = mAccountManagerHelper.getLabelForType(mAccount.type);
-        if (!TextUtils.isEmpty(accountLabel)) {
-            setTitle(accountLabel);
+    /** Returns whether the account being shown by this fragment still exists. */
+    @VisibleForTesting
+    boolean accountExists() {
+        if (mAccount == null) {
+            return false;
         }
+
+        Account[] accounts = AccountManager.get(getContext()).getAccountsByTypeAsUser(mAccount.type,
+                mUserInfo.getUserHandle());
+
+        return Arrays.asList(accounts).contains(mAccount);
     }
 
-    private List<ListItem> getListItems() {
-        Drawable icon = mAccountManagerHelper.getDrawableForType(mAccount.type);
-
-        TextListItem item = new TextListItem(getContext());
-        item.setPrimaryActionIcon(icon, /* useLargeIcon= */ false);
-        item.setTitle(mAccount.name);
-
-        List<ListItem> items = new ArrayList<>();
-        items.add(item);
-        return items;
-    }
-
-    public void removeAccount() {
-        ConfirmRemoveAccountDialog.show(this, mAccount, mUserInfo.getUserHandle());
+    private void onRemoveAccountClicked() {
+        ConfirmRemoveAccountDialogFragment.show(this, mAccount, mUserInfo.getUserHandle());
     }
 
     /**
      * Dialog to confirm with user about account removal
      */
-    public static class ConfirmRemoveAccountDialog extends DialogFragment implements
+    public static class ConfirmRemoveAccountDialogFragment extends DialogFragment implements
             DialogInterface.OnClickListener {
         private static final String KEY_ACCOUNT = "account";
         private static final String DIALOG_TAG = "confirmRemoveAccount";
-        private static final Logger LOG = new Logger(ConfirmRemoveAccountDialog.class);
-        private Account mAccount;
-        private UserHandle mUserHandle;
-
+        private static final Logger LOG = new Logger(ConfirmRemoveAccountDialogFragment.class);
         private final AccountManagerCallback<Bundle> mCallback =
-            new AccountManagerCallback<Bundle>() {
-                @Override
-                public void run(AccountManagerFuture<Bundle> future) {
+                future -> {
                     // If already out of this screen, don't proceed.
                     if (!getTargetFragment().isResumed()) {
                         return;
@@ -164,22 +187,26 @@
                     boolean success = false;
                     try {
                         success =
-                                future.getResult().getBoolean(AccountManager.KEY_BOOLEAN_RESULT);
+                                future.getResult().getBoolean(
+                                        AccountManager.KEY_BOOLEAN_RESULT);
                     } catch (OperationCanceledException | IOException | AuthenticatorException e) {
                         LOG.v("removeAccount error: " + e);
                     }
                     final Activity activity = getTargetFragment().getActivity();
                     if (!success && activity != null && !activity.isFinishing()) {
-                        RemoveAccountFailureDialog.show(getTargetFragment());
+                        ErrorDialog.show(getTargetFragment(),
+                                R.string.remove_account_error_title);
                     } else {
                         getTargetFragment().getFragmentManager().popBackStack();
                     }
-                }
-            };
+                };
+        private Account mAccount;
+        private UserHandle mUserHandle;
 
         public static void show(
                 Fragment parent, Account account, UserHandle userHandle) {
-            final ConfirmRemoveAccountDialog dialog = new ConfirmRemoveAccountDialog();
+            final ConfirmRemoveAccountDialogFragment dialog =
+                    new ConfirmRemoveAccountDialogFragment();
             Bundle bundle = new Bundle();
             bundle.putParcelable(KEY_ACCOUNT, account);
             bundle.putParcelable(Intent.EXTRA_USER, userHandle);
@@ -198,9 +225,9 @@
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return new CarAlertDialog.Builder(getContext())
+            return new AlertDialog.Builder(getContext())
                     .setTitle(R.string.really_remove_account_title)
-                    .setBody(R.string.really_remove_account_message)
+                    .setMessage(R.string.really_remove_account_message)
                     .setNegativeButton(android.R.string.cancel, null)
                     .setPositiveButton(R.string.remove_account_title, this)
                     .create();
@@ -214,28 +241,4 @@
             dialog.dismiss();
         }
     }
-
-    /**
-     * Dialog to tell user about account removal failure
-     */
-    public static class RemoveAccountFailureDialog extends DialogFragment {
-
-        private static final String DIALOG_TAG = "removeAccountFailed";
-
-        public static void show(Fragment parent) {
-            final RemoveAccountFailureDialog dialog = new RemoveAccountFailureDialog();
-            dialog.setTargetFragment(parent, 0);
-            dialog.show(parent.getFragmentManager(), DIALOG_TAG);
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return new CarAlertDialog.Builder(getContext())
-                    .setTitle(R.string.really_remove_account_title)
-                    .setBody(R.string.remove_account_failed)
-                    .setPositiveButton(android.R.string.ok, null)
-                    .create();
-        }
-
-    }
 }
diff --git a/src/com/android/car/settings/accounts/AccountDetailsPreferenceController.java b/src/com/android/car/settings/accounts/AccountDetailsPreferenceController.java
new file mode 100644
index 0000000..c47efba
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountDetailsPreferenceController.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.accounts.Account;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.UserHandle;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.accounts.AuthenticatorHelper;
+
+/** Controller for the preference that shows the details of an account. */
+public class AccountDetailsPreferenceController extends PreferenceController<Preference> {
+    private static final Logger LOG = new Logger(AccountDetailsPreferenceController.class);
+
+    private Account mAccount;
+    private UserHandle mUserHandle;
+
+    public AccountDetailsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /** Sets the account that the details are shown for. */
+    public void setAccount(Account account) {
+        mAccount = account;
+    }
+
+    /** Returns the account the details are shown for. */
+    public Account getAccount() {
+        return mAccount;
+    }
+
+    /** Sets the UserHandle used by the controller. */
+    public void setUserHandle(UserHandle userHandle) {
+        mUserHandle = userHandle;
+    }
+
+    /** Returns the UserHandle used by the controller. */
+    public UserHandle getUserHandle() {
+        return mUserHandle;
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /**
+     * Verifies that the controller was properly initialized with
+     * {@link #setAccount(Account)} and {@link #setUserHandle(UserHandle)}.
+     *
+     * @throws IllegalStateException if the account or user handle are {@code null}
+     */
+    @Override
+    @CallSuper
+    protected void checkInitialized() {
+        LOG.v("checkInitialized");
+        if (mAccount == null) {
+            throw new IllegalStateException(
+                    "AccountDetailsPreferenceController must be initialized by calling "
+                            + "setAccount(Account)");
+        }
+        if (mUserHandle == null) {
+            throw new IllegalStateException(
+                    "AccountDetailsPreferenceController must be initialized by calling "
+                            + "setUserHandle(UserHandle)");
+        }
+    }
+
+    @Override
+    @CallSuper
+    protected void updateState(Preference preference) {
+        preference.setTitle(mAccount.name);
+        // Get the icon corresponding to the account's type and set it.
+        AuthenticatorHelper helper = new AuthenticatorHelper(getContext(), mUserHandle, null);
+        preference.setIcon(helper.getDrawableForType(getContext(), mAccount.type));
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountDetailsSettingController.java b/src/com/android/car/settings/accounts/AccountDetailsSettingController.java
new file mode 100644
index 0000000..056e643
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountDetailsSettingController.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accounts;
+
+import android.accounts.Account;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.ExtraSettingsPreferenceController;
+import com.android.car.settings.common.FragmentController;
+
+import java.util.Map;
+
+/**
+ * Injects preferences from other system applications at a placeholder location into the account
+ * details fragment. This class is and extension of {@link ExtraSettingsPreferenceController} which
+ * is needed to check what all preferences to show in the account details page.
+ */
+public class AccountDetailsSettingController extends ExtraSettingsPreferenceController {
+
+    private static final String METADATA_IA_ACCOUNT = "com.android.settings.ia.account";
+    private Account mAccount;
+
+    public AccountDetailsSettingController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions restrictionInfo) {
+        super(context, preferenceKey, fragmentController, restrictionInfo);
+    }
+
+    /** Sets the account that the preferences are being shown for. */
+    public void setAccount(Account account) {
+        mAccount = account;
+    }
+
+    @Override
+    @CallSuper
+    protected void checkInitialized() {
+        if (mAccount == null) {
+            throw new IllegalStateException(
+                    "AccountDetailsSettingController must be initialized by calling "
+                            + "setAccount(Account)");
+        }
+    }
+
+    @Override
+    @CallSuper
+    protected void addExtraSettings(Map<Preference, Bundle> preferenceBundleMap) {
+        for (Preference setting : preferenceBundleMap.keySet()) {
+            if (mAccount != null && !mAccount.type.equals(
+                    preferenceBundleMap.get(setting).getString(METADATA_IA_ACCOUNT))) {
+                continue;
+            }
+            getPreference().addPreference(setting);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceController.java b/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceController.java
new file mode 100644
index 0000000..0def505
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceController.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accounts;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SyncAdapterType;
+import android.content.SyncInfo;
+import android.content.SyncStatusInfo;
+import android.content.SyncStatusObserver;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Controller for the preference that shows information about an account, including info about
+ * failures.
+ */
+public class AccountDetailsWithSyncStatusPreferenceController extends
+        AccountDetailsPreferenceController {
+    private boolean mIsStarted = false;
+    private Object mStatusChangeListenerHandle;
+    private SyncStatusObserver mSyncStatusObserver =
+            which -> ThreadUtils.postOnMainThread(() -> {
+                // The observer call may occur even if the fragment hasn't been started, so
+                // only force an update if the fragment hasn't been stopped.
+                if (mIsStarted) {
+                    refreshUi();
+                }
+            });
+
+    public AccountDetailsWithSyncStatusPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+
+    /**
+     * Registers the account update and sync status change callbacks.
+     */
+    @Override
+    protected void onStartInternal() {
+        mIsStarted = true;
+        mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener(
+                ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
+                        | ContentResolver.SYNC_OBSERVER_TYPE_STATUS
+                        | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, mSyncStatusObserver);
+    }
+
+    /**
+     * Unregisters the account update and sync status change callbacks.
+     */
+    @Override
+    protected void onStopInternal() {
+        mIsStarted = false;
+        if (mStatusChangeListenerHandle != null) {
+            ContentResolver.removeStatusChangeListener(mStatusChangeListenerHandle);
+        }
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        super.updateState(preference);
+        if (isSyncFailing()) {
+            preference.setSummary(R.string.sync_is_failing);
+        } else {
+            preference.setSummary("");
+        }
+    }
+
+    private boolean isSyncFailing() {
+        int userId = getUserHandle().getIdentifier();
+        List<SyncInfo> currentSyncs = ContentResolver.getCurrentSyncsAsUser(userId);
+        boolean syncIsFailing = false;
+
+        Set<SyncAdapterType> syncAdapters = AccountSyncHelper.getVisibleSyncAdaptersForAccount(
+                getContext(), getAccount(), getUserHandle());
+        for (SyncAdapterType syncAdapter : syncAdapters) {
+            String authority = syncAdapter.authority;
+
+            SyncStatusInfo status = ContentResolver.getSyncStatusAsUser(getAccount(), authority,
+                    userId);
+            boolean syncEnabled = ContentResolver.getSyncAutomaticallyAsUser(getAccount(),
+                    authority, userId);
+            boolean activelySyncing = AccountSyncHelper.isSyncing(getAccount(), currentSyncs,
+                    authority);
+
+            AccountSyncHelper.SyncState syncState = AccountSyncHelper.getSyncState(status,
+                    syncEnabled, activelySyncing);
+
+            boolean syncIsPending = status != null && status.pending;
+            if (syncState == AccountSyncHelper.SyncState.FAILED && !activelySyncing
+                    && !syncIsPending) {
+                syncIsFailing = true;
+            }
+        }
+
+        return syncIsFailing;
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountListPreferenceController.java b/src/com/android/car/settings/accounts/AccountListPreferenceController.java
new file mode 100644
index 0000000..0f98700
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountListPreferenceController.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+
+import androidx.collection.ArrayMap;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.accounts.AuthenticatorHelper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Controller for listing accounts.
+ *
+ * <p>Largely derived from {@link com.android.settings.accounts.AccountPreferenceController}
+ */
+public class AccountListPreferenceController extends
+        PreferenceController<PreferenceCategory> implements
+        AuthenticatorHelper.OnAccountsUpdateListener,
+        CarUserManagerHelper.OnUsersUpdateListener {
+    private static final String NO_ACCOUNT_PREF_KEY = "no_accounts_added";
+
+    private final UserInfo mUserInfo;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final ArrayMap<String, Preference> mPreferences = new ArrayMap<>();
+    private AuthenticatorHelper mAuthenticatorHelper;
+    private String[] mAuthorities;
+
+    public AccountListPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserInfo = mCarUserManagerHelper.getCurrentProcessUserInfo();
+        mAuthenticatorHelper = new AuthenticatorHelper(context,
+                mUserInfo.getUserHandle(), /* listener= */ this);
+    }
+
+    /** Sets the account authorities that are available. */
+    public void setAuthorities(String[] authorities) {
+        mAuthorities = authorities;
+    }
+
+    @Override
+    protected Class<PreferenceCategory> getPreferenceType() {
+        return PreferenceCategory.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceCategory preference) {
+        forceUpdateAccountsCategory();
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return mCarUserManagerHelper.canCurrentProcessModifyAccounts() ? AVAILABLE
+                : DISABLED_FOR_USER;
+    }
+
+    /**
+     * Registers the account update and user update callbacks.
+     */
+    @Override
+    protected void onStartInternal() {
+        mAuthenticatorHelper.listenToAccountUpdates();
+        mCarUserManagerHelper.registerOnUsersUpdateListener(this);
+    }
+
+    /**
+     * Unregisters the account update and user update callbacks.
+     */
+    @Override
+    protected void onStopInternal() {
+        mAuthenticatorHelper.stopListeningToAccountUpdates();
+        mCarUserManagerHelper.unregisterOnUsersUpdateListener(this);
+    }
+
+    @Override
+    public void onAccountsUpdate(UserHandle userHandle) {
+        if (userHandle.equals(mUserInfo.getUserHandle())) {
+            forceUpdateAccountsCategory();
+        }
+    }
+
+    @Override
+    public void onUsersUpdate() {
+        forceUpdateAccountsCategory();
+    }
+
+    private boolean onAccountPreferenceClicked(AccountPreference preference) {
+        // Show the account's details when an account is clicked on.
+        getFragmentController().launchFragment(AccountDetailsFragment.newInstance(
+                preference.getAccount(), preference.getLabel(), mUserInfo));
+        return true;
+    }
+
+    /** Forces a refresh of the account preferences. */
+    private void forceUpdateAccountsCategory() {
+        // Set the category title and include the user's name
+        getPreference().setTitle(
+                getContext().getString(R.string.account_list_title, mUserInfo.name));
+
+        // Recreate the authentication helper to refresh the list of enabled accounts
+        mAuthenticatorHelper = new AuthenticatorHelper(getContext(), mUserInfo.getUserHandle(),
+                this);
+
+        Set<String> preferencesToRemove = new HashSet<>(mPreferences.keySet());
+        List<? extends Preference> preferences = getAccountPreferences(preferencesToRemove);
+        // Add all preferences that aren't already shown. Manually set the order so that existing
+        // preferences are reordered correctly.
+        for (int i = 0; i < preferences.size(); i++) {
+            Preference pref = preferences.get(i);
+            pref.setOrder(i);
+            mPreferences.put(pref.getKey(), pref);
+            getPreference().addPreference(pref);
+        }
+
+        for (String key : preferencesToRemove) {
+            getPreference().removePreference(mPreferences.get(key));
+            mPreferences.remove(key);
+        }
+    }
+
+    /**
+     * Returns a list of preferences corresponding to the accounts for the current user.
+     *
+     * <p> Derived from
+     * {@link com.android.settings.accounts.AccountPreferenceController#getAccountTypePreferences}
+     *
+     * @param preferencesToRemove the current preferences shown; only preferences to be removed will
+     *                            remain after method execution
+     */
+    private List<? extends Preference> getAccountPreferences(
+            Set<String> preferencesToRemove) {
+        String[] accountTypes = mAuthenticatorHelper.getEnabledAccountTypes();
+        ArrayList<AccountPreference> accountPreferences =
+                new ArrayList<>(accountTypes.length);
+
+        for (int i = 0; i < accountTypes.length; i++) {
+            String accountType = accountTypes[i];
+            // Skip showing any account that does not have any of the requested authorities
+            if (!accountTypeHasAnyRequestedAuthorities(accountType)) {
+                continue;
+            }
+            CharSequence label = mAuthenticatorHelper.getLabelForType(getContext(), accountType);
+            if (label == null) {
+                continue;
+            }
+
+            Account[] accounts = AccountManager.get(getContext())
+                    .getAccountsByTypeAsUser(accountType, mUserInfo.getUserHandle());
+            Drawable icon = mAuthenticatorHelper.getDrawableForType(getContext(), accountType);
+
+            // Add a preference row for each individual account
+            for (Account account : accounts) {
+                String key = AccountPreference.buildKey(account);
+                AccountPreference preference = (AccountPreference) mPreferences.getOrDefault(key,
+                        new AccountPreference(getContext(), account, label, icon));
+                preference.setOnPreferenceClickListener(
+                        (Preference pref) -> onAccountPreferenceClicked((AccountPreference) pref));
+
+                accountPreferences.add(preference);
+                preferencesToRemove.remove(key);
+            }
+            mAuthenticatorHelper.preloadDrawableForType(getContext(), accountType);
+        }
+
+        // If there are no accounts, return the "no account added" preference.
+        if (accountPreferences.isEmpty()) {
+            preferencesToRemove.remove(NO_ACCOUNT_PREF_KEY);
+            return Arrays.asList(mPreferences.getOrDefault(NO_ACCOUNT_PREF_KEY,
+                    createNoAccountsAddedPreference()));
+        }
+
+        Collections.sort(accountPreferences, Comparator.comparing(
+                (AccountPreference a) -> a.getSummary().toString())
+                .thenComparing((AccountPreference a) -> a.getTitle().toString()));
+
+        return accountPreferences;
+    }
+
+    private Preference createNoAccountsAddedPreference() {
+        Preference emptyPreference = new Preference(getContext());
+        emptyPreference.setTitle(R.string.no_accounts_added);
+        emptyPreference.setKey(NO_ACCOUNT_PREF_KEY);
+        emptyPreference.setSelectable(false);
+
+        return emptyPreference;
+    }
+
+    /**
+     * Returns whether the account type has any of the authorities requested by the caller.
+     *
+     * <p> Derived from {@link AccountPreferenceController#accountTypeHasAnyRequestedAuthorities}
+     */
+    private boolean accountTypeHasAnyRequestedAuthorities(String accountType) {
+        if (mAuthorities == null || mAuthorities.length == 0) {
+            // No authorities required
+            return true;
+        }
+        ArrayList<String> authoritiesForType =
+                mAuthenticatorHelper.getAuthoritiesForAccountType(accountType);
+        if (authoritiesForType == null) {
+            return false;
+        }
+        for (int j = 0; j < mAuthorities.length; j++) {
+            if (authoritiesForType.contains(mAuthorities[j])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static class AccountPreference extends Preference {
+        /** Account that this Preference represents. */
+        private final Account mAccount;
+        private final CharSequence mLabel;
+
+        private AccountPreference(Context context, Account account, CharSequence label,
+                Drawable icon) {
+            super(context);
+            mAccount = account;
+            mLabel = label;
+
+            setKey(buildKey(account));
+            setTitle(account.name);
+            setSummary(label);
+            setIcon(icon);
+        }
+
+        /**
+         * Build a unique preference key based on the account.
+         */
+        public static String buildKey(Account account) {
+            return String.valueOf(account.hashCode());
+        }
+
+        public Account getAccount() {
+            return mAccount;
+        }
+
+        public CharSequence getLabel() {
+            return mLabel;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountManagerHelper.java b/src/com/android/car/settings/accounts/AccountManagerHelper.java
deleted file mode 100644
index c0e56ed..0000000
--- a/src/com/android/car/settings/accounts/AccountManagerHelper.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.accounts;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-import android.os.UserManager;
-
-import com.android.settingslib.accounts.AuthenticatorHelper;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Helper class for managing accounts that belong to a single user.
- */
-class AccountManagerHelper {
-    private final Context mContext;
-    private final AuthenticatorHelper.OnAccountsUpdateListener mUpdateListener;
-    private final AuthenticatorHelper mAuthenticatorHelper;
-
-    private final UserHandle mCurrentUserHandle;
-
-    public AccountManagerHelper(Context context,
-            AuthenticatorHelper.OnAccountsUpdateListener listener) {
-        mContext = context;
-        mUpdateListener = listener;
-        UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        mCurrentUserHandle = userManager.getUserInfo(UserHandle.myUserId()).getUserHandle();
-
-        // Listen to account updates for this user.
-        mAuthenticatorHelper =
-                new AuthenticatorHelper(mContext, mCurrentUserHandle, mUpdateListener);
-    }
-
-    /**
-     * Starts listening to account updates. Every registered listener should be unregistered.
-     */
-    public void startListeningToAccountUpdates() {
-        mAuthenticatorHelper.listenToAccountUpdates();
-    }
-
-    /**
-     * Stops listening to account updates. Should be called on cleanup/destroy.
-     */
-    public void stopListeningToAccountUpdates() {
-        mAuthenticatorHelper.stopListeningToAccountUpdates();
-    }
-
-    /**
-     * Returns all the enabled accounts that exist for the current user. These include 1st and 3rd
-     * party accounts.
-     *
-     * @return List of {@code Account} for the currently logged in user.
-     */
-    public List<Account> getAccountsForCurrentUser() {
-        List<Account> accounts = new ArrayList<>();
-
-        String[] accountTypes = mAuthenticatorHelper.getEnabledAccountTypes();
-        for (int i = 0; i < accountTypes.length; i++) {
-            String accountType = accountTypes[i];
-            Account[] accountsForType = AccountManager.get(mContext)
-                    .getAccountsByTypeAsUser(accountType, mCurrentUserHandle);
-            for (Account account : accountsForType) {
-                accounts.add(account);
-            }
-        }
-        return accounts;
-    }
-
-    /**
-     * Returns whether the given account is in the list of accounts for the current user.
-     * Useful for checking whether an account has been deleted.
-     *
-     * @param account Account which existence we're checking for.
-     * @return {@code true} if it exists, {@code false} if it doesn't.
-     */
-    public boolean accountExists(Account account) {
-        if (account == null) {
-            return false;
-        }
-
-        Account[] accounts = AccountManager.get(mContext).getAccountsByTypeAsUser(
-                account.type, mCurrentUserHandle);
-        for (Account other : accounts) {
-            if (other.equals(account)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Wrapper for {@code AuthenticatorHelper.getDrawableForType}.
-     * Gets an icon associated with a particular account type.
-     *
-     * @param accountType the type of account
-     * @return a drawable for the icon
-     */
-    public Drawable getDrawableForType(final String accountType) {
-        return mAuthenticatorHelper.getDrawableForType(mContext, accountType);
-    }
-
-    /**
-     * Wrapper for {@code AuthenticatorHelper.getLabelForType}.
-     * Gets the label associated with a particular account type. If none found, return {@code null}.
-     *
-     * @param accountType the type of account
-     * @return a CharSequence for the label or null if one cannot be found.
-     */
-    public CharSequence getLabelForType(final String accountType) {
-        return mAuthenticatorHelper.getLabelForType(mContext, accountType);
-    }
-}
diff --git a/src/com/android/car/settings/accounts/AccountSettingsFragment.java b/src/com/android/car/settings/accounts/AccountSettingsFragment.java
new file mode 100644
index 0000000..4d3212e
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountSettingsFragment.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Lists the user's accounts and any related options.
+ */
+public class AccountSettingsFragment extends SettingsFragment {
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.account_settings_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        // Enable the add account button if the user is allowed to modify accounts
+        Button addAccountButton = requireActivity().findViewById(R.id.action_button1);
+        if (new CarUserManagerHelper(getContext()).canCurrentProcessModifyAccounts()) {
+            addAccountButton.setText(R.string.user_add_account_menu);
+            addAccountButton.setOnClickListener(v -> onAddAccountClicked());
+        } else {
+            addAccountButton.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        String[] authorities = getActivity().getIntent().getStringArrayExtra(
+                Settings.EXTRA_AUTHORITIES);
+        if (authorities != null) {
+            use(AccountListPreferenceController.class, R.string.pk_account_list)
+                    .setAuthorities(authorities);
+        }
+    }
+
+    private void onAddAccountClicked() {
+        launchFragment(new ChooseAccountFragment());
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountSyncDetailsFragment.java b/src/com/android/car/settings/accounts/AccountSyncDetailsFragment.java
new file mode 100644
index 0000000..65f2bbc
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountSyncDetailsFragment.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SyncAdapterType;
+import android.content.SyncStatusObserver;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.Set;
+
+/**
+ * Shows details for syncing an account.
+ */
+public class AccountSyncDetailsFragment extends SettingsFragment {
+    private static final String EXTRA_ACCOUNT = "extra_account";
+    private static final String EXTRA_USER_HANDLE = "extra_user_handle";
+    private boolean mIsStarted = false;
+    private Object mStatusChangeListenerHandle;
+    private SyncStatusObserver mSyncStatusObserver =
+            which -> ThreadUtils.postOnMainThread(() -> {
+                // The observer call may occur even if the fragment hasn't been started, so
+                // only force an update if the fragment hasn't been stopped.
+                if (mIsStarted) {
+                    updateSyncButton();
+                }
+            });
+
+    /**
+     * Creates a new AccountSyncDetailsFragment.
+     *
+     * <p>Passes the provided account and user handle to the fragment via fragment arguments.
+     */
+    public static AccountSyncDetailsFragment newInstance(Account account, UserHandle userHandle) {
+        AccountSyncDetailsFragment accountSyncDetailsFragment = new AccountSyncDetailsFragment();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(EXTRA_ACCOUNT, account);
+        bundle.putParcelable(EXTRA_USER_HANDLE, userHandle);
+        accountSyncDetailsFragment.setArguments(bundle);
+        return accountSyncDetailsFragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.account_sync_details_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        Account account = getArguments().getParcelable(EXTRA_ACCOUNT);
+        UserHandle userHandle = getArguments().getParcelable(EXTRA_USER_HANDLE);
+
+        use(AccountDetailsWithSyncStatusPreferenceController.class,
+                R.string.pk_account_details_with_sync)
+                .setAccount(account);
+        use(AccountDetailsWithSyncStatusPreferenceController.class,
+                R.string.pk_account_details_with_sync)
+                .setUserHandle(userHandle);
+
+        use(AccountSyncDetailsPreferenceController.class, R.string.pk_account_sync_details)
+                .setAccount(account);
+        use(AccountSyncDetailsPreferenceController.class, R.string.pk_account_sync_details)
+                .setUserHandle(userHandle);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        updateSyncButton();
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mIsStarted = true;
+        mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener(
+                ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
+                        | ContentResolver.SYNC_OBSERVER_TYPE_STATUS
+                        | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, mSyncStatusObserver);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mIsStarted = false;
+        if (mStatusChangeListenerHandle != null) {
+            ContentResolver.removeStatusChangeListener(mStatusChangeListenerHandle);
+        }
+    }
+
+    private void updateSyncButton() {
+        // Set the action button to either request or cancel sync, depending on the current state
+        Button syncButton = requireActivity().findViewById(R.id.action_button1);
+
+        UserHandle userHandle = getArguments().getParcelable(EXTRA_USER_HANDLE);
+        boolean hasActiveSyncs = !ContentResolver.getCurrentSyncsAsUser(
+                userHandle.getIdentifier()).isEmpty();
+
+        // If there are active syncs, clicking the button with cancel them. Otherwise, clicking the
+        // button will start them.
+        syncButton.setText(
+                hasActiveSyncs ? R.string.sync_button_sync_cancel : R.string.sync_button_sync_now);
+        syncButton.setOnClickListener(v -> {
+            if (hasActiveSyncs) {
+                cancelSyncForEnabledProviders();
+            } else {
+                requestSyncForEnabledProviders();
+            }
+        });
+    }
+
+    private void requestSyncForEnabledProviders() {
+        Account account = getArguments().getParcelable(EXTRA_ACCOUNT);
+        UserHandle userHandle = getArguments().getParcelable(EXTRA_USER_HANDLE);
+        int userId = userHandle.getIdentifier();
+
+        Set<SyncAdapterType> adapters = AccountSyncHelper.getSyncableSyncAdaptersForAccount(account,
+                userHandle);
+        for (SyncAdapterType adapter : adapters) {
+            AccountSyncHelper.requestSyncIfAllowed(account, adapter.authority, userId);
+        }
+    }
+
+    private void cancelSyncForEnabledProviders() {
+        Account account = getArguments().getParcelable(EXTRA_ACCOUNT);
+        UserHandle userHandle = getArguments().getParcelable(EXTRA_USER_HANDLE);
+        int userId = userHandle.getIdentifier();
+
+        Set<SyncAdapterType> adapters = AccountSyncHelper.getSyncableSyncAdaptersForAccount(account,
+                userHandle);
+        for (SyncAdapterType adapter : adapters) {
+            ContentResolver.cancelSyncAsUser(account, adapter.authority, userId);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceController.java b/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceController.java
new file mode 100644
index 0000000..435bbf6
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceController.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.app.Activity;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.SyncAdapterType;
+import android.content.SyncInfo;
+import android.content.SyncStatusInfo;
+import android.content.SyncStatusObserver;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.text.format.DateFormat;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.collection.ArrayMap;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.accounts.AuthenticatorHelper;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Controller that presents all visible sync adapters for an account.
+ *
+ * <p>Largely derived from {@link com.android.settings.accounts.AccountSyncSettings}.
+ */
+public class AccountSyncDetailsPreferenceController extends
+        PreferenceController<PreferenceGroup> implements
+        AuthenticatorHelper.OnAccountsUpdateListener {
+    private static final Logger LOG = new Logger(AccountSyncDetailsPreferenceController.class);
+    /**
+     * Preferences are keyed by authority so that existing SyncPreferences can be reused on account
+     * sync.
+     */
+    private final Map<String, SyncPreference> mSyncPreferences = new ArrayMap<>();
+    private boolean mIsStarted = false;
+    private Account mAccount;
+    private UserHandle mUserHandle;
+    private AuthenticatorHelper mAuthenticatorHelper;
+    private Object mStatusChangeListenerHandle;
+    private SyncStatusObserver mSyncStatusObserver =
+            which -> ThreadUtils.postOnMainThread(() -> {
+                // The observer call may occur even if the fragment hasn't been started, so
+                // only force an update if the fragment hasn't been stopped.
+                if (mIsStarted) {
+                    forceUpdateSyncCategory();
+                }
+            });
+
+    public AccountSyncDetailsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /** Sets the account that the sync preferences are being shown for. */
+    public void setAccount(Account account) {
+        mAccount = account;
+    }
+
+    /** Sets the user handle used by the controller. */
+    public void setUserHandle(UserHandle userHandle) {
+        mUserHandle = userHandle;
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /**
+     * Verifies that the controller was properly initialized with {@link #setAccount(Account)} and
+     * {@link #setUserHandle(UserHandle)}.
+     *
+     * @throws IllegalStateException if the account or user handle is {@code null}
+     */
+    @Override
+    protected void checkInitialized() {
+        LOG.v("checkInitialized");
+        if (mAccount == null) {
+            throw new IllegalStateException(
+                    "AccountSyncDetailsPreferenceController must be initialized by calling "
+                            + "setAccount(Account)");
+        }
+        if (mUserHandle == null) {
+            throw new IllegalStateException(
+                    "AccountSyncDetailsPreferenceController must be initialized by calling "
+                            + "setUserHandle(UserHandle)");
+        }
+    }
+
+    /**
+     * Initializes the authenticator helper.
+     */
+    @Override
+    protected void onCreateInternal() {
+        mAuthenticatorHelper = new AuthenticatorHelper(getContext(), mUserHandle, /* listener= */
+                this);
+    }
+
+    /**
+     * Registers the account update and sync status change callbacks.
+     */
+    @Override
+    protected void onStartInternal() {
+        mIsStarted = true;
+        mAuthenticatorHelper.listenToAccountUpdates();
+
+        mStatusChangeListenerHandle = ContentResolver.addStatusChangeListener(
+                ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE
+                        | ContentResolver.SYNC_OBSERVER_TYPE_STATUS
+                        | ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, mSyncStatusObserver);
+    }
+
+    /**
+     * Unregisters the account update and sync status change callbacks.
+     */
+    @Override
+    protected void onStopInternal() {
+        mIsStarted = false;
+        mAuthenticatorHelper.stopListeningToAccountUpdates();
+        if (mStatusChangeListenerHandle != null) {
+            ContentResolver.removeStatusChangeListener(mStatusChangeListenerHandle);
+        }
+    }
+
+    @Override
+    public void onAccountsUpdate(UserHandle userHandle) {
+        // Only force a refresh if accounts have changed for the current user.
+        if (userHandle.equals(mUserHandle)) {
+            forceUpdateSyncCategory();
+        }
+    }
+
+    @Override
+    public void updateState(PreferenceGroup preferenceGroup) {
+        // Add preferences for each account if the controller should be available
+        forceUpdateSyncCategory();
+    }
+
+    /**
+     * Handles toggling/syncing when a sync preference is clicked on.
+     *
+     * <p>Largely derived from
+     * {@link com.android.settings.accounts.AccountSyncSettings#onPreferenceTreeClick}.
+     */
+    private boolean onSyncPreferenceClicked(SyncPreference preference) {
+        String authority = preference.getKey();
+        String packageName = preference.getPackageName();
+        int uid = preference.getUid();
+        if (preference.isOneTimeSyncMode()) {
+            // If the sync adapter doesn't have access to the account we either
+            // request access by starting an activity if possible or kick off the
+            // sync which will end up posting an access request notification.
+            if (requestAccountAccessIfNeeded(packageName, uid)) {
+                return true;
+            }
+            requestSync(authority);
+        } else {
+            boolean syncOn = preference.isChecked();
+            int userId = mUserHandle.getIdentifier();
+            boolean oldSyncState = ContentResolver.getSyncAutomaticallyAsUser(mAccount,
+                    authority, userId);
+            if (syncOn != oldSyncState) {
+                // Toggling this switch triggers sync but we may need a user approval. If the
+                // sync adapter doesn't have access to the account we either request access by
+                // starting an activity if possible or kick off the sync which will end up
+                // posting an access request notification.
+                if (syncOn && requestAccountAccessIfNeeded(packageName, uid)) {
+                    return true;
+                }
+                // If we're enabling sync, this will request a sync as well.
+                ContentResolver.setSyncAutomaticallyAsUser(mAccount, authority, syncOn, userId);
+                if (syncOn) {
+                    requestSync(authority);
+                } else {
+                    cancelSync(authority);
+                }
+            }
+        }
+        return true;
+    }
+
+    private void requestSync(String authority) {
+        AccountSyncHelper.requestSyncIfAllowed(mAccount, authority, mUserHandle.getIdentifier());
+    }
+
+    private void cancelSync(String authority) {
+        ContentResolver.cancelSyncAsUser(mAccount, authority, mUserHandle.getIdentifier());
+    }
+
+    /**
+     * Requests account access if needed.
+     *
+     * <p>Copied from
+     * {@link com.android.settings.accounts.AccountSyncSettings#requestAccountAccessIfNeeded}.
+     */
+    private boolean requestAccountAccessIfNeeded(String packageName, int uid) {
+        if (packageName == null) {
+            return false;
+        }
+
+        AccountManager accountManager = getContext().getSystemService(AccountManager.class);
+        if (!accountManager.hasAccountAccess(mAccount, packageName, mUserHandle)) {
+            IntentSender intent = accountManager.createRequestAccountAccessIntentSenderAsUser(
+                    mAccount, packageName, mUserHandle);
+            if (intent != null) {
+                try {
+                    getFragmentController().startIntentSenderForResult(intent,
+                            uid, /* fillInIntent= */ null, /* flagsMask= */0,
+                            /* flagsValues= */0, /* options= */null,
+                            this::onAccountRequestApproved);
+                    return true;
+                } catch (IntentSender.SendIntentException e) {
+                    LOG.e("Error requesting account access", e);
+                }
+            }
+        }
+        return false;
+    }
+
+    /** Handles a sync adapter refresh when an account request was approved. */
+    public void onAccountRequestApproved(int uid, int resultCode, @Nullable Intent data) {
+        if (resultCode == Activity.RESULT_OK) {
+            for (SyncPreference pref : mSyncPreferences.values()) {
+                if (pref.getUid() == uid) {
+                    onSyncPreferenceClicked(pref);
+                    return;
+                }
+            }
+        }
+    }
+
+    /** Forces a refresh of the sync adapter preferences. */
+    private void forceUpdateSyncCategory() {
+        Set<String> preferencesToRemove = new HashSet<>(mSyncPreferences.keySet());
+        List<SyncPreference> preferences = getSyncPreferences(preferencesToRemove);
+
+        // Sort the preferences, add the ones that need to be added, and remove the ones that need
+        // to be removed. Manually set the order so that existing preferences are reordered
+        // correctly.
+        Collections.sort(preferences, Comparator.comparing(
+                (SyncPreference a) -> a.getTitle().toString())
+                .thenComparing((SyncPreference a) -> a.getSummary().toString()));
+
+        for (int i = 0; i < preferences.size(); i++) {
+            SyncPreference pref = preferences.get(i);
+            pref.setOrder(i);
+            mSyncPreferences.put(pref.getKey(), pref);
+            getPreference().addPreference(pref);
+        }
+
+        for (String key : preferencesToRemove) {
+            getPreference().removePreference(mSyncPreferences.get(key));
+            mSyncPreferences.remove(key);
+        }
+    }
+
+    /**
+     * Returns a list of preferences corresponding to the visible sync adapters for the current
+     * user.
+     *
+     * <p> Derived from {@link com.android.settings.accounts.AccountSyncSettings#setFeedsState}
+     * and {@link com.android.settings.accounts.AccountSyncSettings#updateAccountSwitches}.
+     *
+     * @param preferencesToRemove the keys for the preferences currently being shown; only the keys
+     *                            for preferences to be removed will remain after method execution
+     */
+    private List<SyncPreference> getSyncPreferences(Set<String> preferencesToRemove) {
+        int userId = mUserHandle.getIdentifier();
+        PackageManager packageManager = getContext().getPackageManager();
+        List<SyncInfo> currentSyncs = ContentResolver.getCurrentSyncsAsUser(userId);
+        // Whether one time sync is enabled rather than automtic sync
+        boolean oneTimeSyncMode = !ContentResolver.getMasterSyncAutomaticallyAsUser(userId);
+
+        List<SyncPreference> syncPreferences = new ArrayList<>();
+
+        Set<SyncAdapterType> syncAdapters = AccountSyncHelper.getVisibleSyncAdaptersForAccount(
+                getContext(), mAccount, mUserHandle);
+        for (SyncAdapterType syncAdapter : syncAdapters) {
+            String authority = syncAdapter.authority;
+
+            int uid;
+            try {
+                uid = packageManager.getPackageUidAsUser(syncAdapter.getPackageName(), userId);
+            } catch (PackageManager.NameNotFoundException e) {
+                LOG.e("No uid for package" + syncAdapter.getPackageName(), e);
+                // If we can't get the Uid for the package hosting the sync adapter, don't show it
+                continue;
+            }
+
+            // If we've reached this point, the sync adapter should be shown. If a preference for
+            // the sync adapter already exists, update its state. Otherwise, create a new
+            // preference.
+            SyncPreference pref = mSyncPreferences.getOrDefault(authority,
+                    new SyncPreference(getContext(), authority));
+            pref.setUid(uid);
+            pref.setPackageName(syncAdapter.getPackageName());
+            pref.setOnPreferenceClickListener(
+                    (Preference p) -> onSyncPreferenceClicked((SyncPreference) p));
+
+            CharSequence title = AccountSyncHelper.getTitle(getContext(), authority, mUserHandle);
+            pref.setTitle(title);
+
+            // Keep track of preferences that need to be added and removed
+            syncPreferences.add(pref);
+            preferencesToRemove.remove(authority);
+
+            SyncStatusInfo status = ContentResolver.getSyncStatusAsUser(mAccount, authority,
+                    userId);
+            boolean syncEnabled = ContentResolver.getSyncAutomaticallyAsUser(mAccount, authority,
+                    userId);
+            boolean activelySyncing = AccountSyncHelper.isSyncing(mAccount, currentSyncs,
+                    authority);
+
+            // The preference should be checked if one one-time sync or regular sync is enabled
+            boolean checked = oneTimeSyncMode || syncEnabled;
+            pref.setChecked(checked);
+
+            String summary = getSummary(status, syncEnabled, activelySyncing);
+            pref.setSummary(summary);
+
+            // Update the sync state so the icon is updated
+            AccountSyncHelper.SyncState syncState = AccountSyncHelper.getSyncState(status,
+                    syncEnabled, activelySyncing);
+            pref.setSyncState(syncState);
+            pref.setOneTimeSyncMode(oneTimeSyncMode);
+        }
+
+        return syncPreferences;
+    }
+
+    private String getSummary(SyncStatusInfo status, boolean syncEnabled, boolean activelySyncing) {
+        long successEndTime = (status == null) ? 0 : status.lastSuccessTime;
+        // Set the summary based on the current syncing state
+        if (!syncEnabled) {
+            return getContext().getString(R.string.sync_disabled);
+        } else if (activelySyncing) {
+            return getContext().getString(R.string.sync_in_progress);
+        } else if (successEndTime != 0) {
+            Date date = new Date();
+            date.setTime(successEndTime);
+            String timeString = formatSyncDate(date);
+            return getContext().getString(R.string.last_synced, timeString);
+        }
+        return "";
+    }
+
+    @VisibleForTesting
+    String formatSyncDate(Date date) {
+        return DateFormat.getDateFormat(getContext()).format(date) + " " + DateFormat.getTimeFormat(
+                getContext()).format(date);
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountSyncHelper.java b/src/com/android/car/settings/accounts/AccountSyncHelper.java
new file mode 100644
index 0000000..109e0d4
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountSyncHelper.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SyncAdapterType;
+import android.content.SyncInfo;
+import android.content.SyncStatusInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.text.TextUtils;
+
+import com.android.car.settings.common.Logger;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/** Helper that provides utility methods for account syncing. */
+class AccountSyncHelper {
+    private static final Logger LOG = new Logger(AccountSyncHelper.class);
+
+    private AccountSyncHelper() {
+    }
+
+    /** Returns the visible sync adapters available for an account. */
+    static Set<SyncAdapterType> getVisibleSyncAdaptersForAccount(Context context, Account account,
+            UserHandle userHandle) {
+        Set<SyncAdapterType> syncableAdapters = getSyncableSyncAdaptersForAccount(account,
+                userHandle);
+
+        syncableAdapters.removeIf(
+                (SyncAdapterType syncAdapter) -> !isVisible(context, syncAdapter, userHandle));
+
+        return syncableAdapters;
+    }
+
+    /** Returns the syncable sync adapters available for an account. */
+    static Set<SyncAdapterType> getSyncableSyncAdaptersForAccount(Account account,
+            UserHandle userHandle) {
+        Set<SyncAdapterType> adapters = new HashSet<>();
+
+        SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(
+                userHandle.getIdentifier());
+        for (int i = 0; i < syncAdapters.length; i++) {
+            SyncAdapterType syncAdapter = syncAdapters[i];
+            String authority = syncAdapter.authority;
+
+            // If the sync adapter is not for this account type, don't include it
+            if (!syncAdapter.accountType.equals(account.type)) {
+                continue;
+            }
+
+            boolean isSyncable = ContentResolver.getIsSyncableAsUser(account, authority,
+                    userHandle.getIdentifier()) > 0;
+            // If the adapter is not syncable, don't include it
+            if (!isSyncable) {
+                continue;
+            }
+
+            adapters.add(syncAdapter);
+        }
+
+        return adapters;
+    }
+
+    /**
+     * Requests a sync if it is allowed.
+     *
+     * <p>Derived from
+     * {@link com.android.settings.accounts.AccountSyncSettings#requestOrCancelSync}.
+     */
+    static void requestSyncIfAllowed(Account account, String authority, int userId) {
+        if (!syncIsAllowed(account, authority, userId)) {
+            return;
+        }
+
+        Bundle extras = new Bundle();
+        extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
+        ContentResolver.requestSyncAsUser(account, authority, userId, extras);
+    }
+
+    /**
+     * Returns the label for a given sync authority.
+     *
+     * @return the title if available, and an empty CharSequence otherwise
+     */
+    static CharSequence getTitle(Context context, String authority, UserHandle userHandle) {
+        PackageManager packageManager = context.getPackageManager();
+        ProviderInfo providerInfo = packageManager.resolveContentProviderAsUser(
+                authority, /* flags= */ 0, userHandle.getIdentifier());
+        if (providerInfo == null) {
+            return "";
+        }
+
+        return providerInfo.loadLabel(packageManager);
+    }
+
+    /** Returns whether a sync adapter is currently syncing for the account being shown. */
+    static boolean isSyncing(Account account, List<SyncInfo> currentSyncs, String authority) {
+        for (SyncInfo syncInfo : currentSyncs) {
+            if (syncInfo.account.equals(account) && syncInfo.authority.equals(authority)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Returns the current sync state based on sync status information. */
+    static SyncState getSyncState(SyncStatusInfo status, boolean syncEnabled,
+            boolean activelySyncing) {
+        boolean initialSync = status != null && status.initialize;
+        boolean syncIsPending = status != null && status.pending;
+        boolean lastSyncFailed = syncEnabled && status != null && status.lastFailureTime != 0
+                && status.getLastFailureMesgAsInt(0)
+                != ContentResolver.SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS;
+        if (activelySyncing && !initialSync) {
+            return SyncState.ACTIVE;
+        } else if (syncIsPending && !initialSync) {
+            return SyncState.PENDING;
+        } else if (lastSyncFailed) {
+            return SyncState.FAILED;
+        }
+        return SyncState.NONE;
+    }
+
+    private static boolean syncIsAllowed(Account account, String authority, int userId) {
+        boolean oneTimeSyncMode = !ContentResolver.getMasterSyncAutomaticallyAsUser(userId);
+        boolean syncEnabled = ContentResolver.getSyncAutomaticallyAsUser(account, authority,
+                userId);
+        return oneTimeSyncMode || syncEnabled;
+    }
+
+    private static boolean isVisible(Context context, SyncAdapterType syncAdapter,
+            UserHandle userHandle) {
+        String authority = syncAdapter.authority;
+
+        if (!syncAdapter.isUserVisible()) {
+            // If the sync adapter is not visible, don't show it
+            return false;
+        }
+
+        try {
+            context.getPackageManager().getPackageUidAsUser(syncAdapter.getPackageName(),
+                    userHandle.getIdentifier());
+        } catch (PackageManager.NameNotFoundException e) {
+            LOG.e("No uid for package" + syncAdapter.getPackageName(), e);
+            // If we can't get the Uid for the package hosting the sync adapter, don't show it
+            return false;
+        }
+
+        CharSequence title = getTitle(context, authority, userHandle);
+        if (TextUtils.isEmpty(title)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /** Denotes a sync adapter state. */
+    public enum SyncState {
+        /** The sync adapter is actively syncing. */
+        ACTIVE,
+        /** The sync adapter is waiting to start syncing. */
+        PENDING,
+        /** The sync adapter's last attempt to sync failed. */
+        FAILED,
+        /** Nothing to note about the sync adapter's sync state. */
+        NONE;
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountSyncPreferenceController.java b/src/com/android/car/settings/accounts/AccountSyncPreferenceController.java
new file mode 100644
index 0000000..54e6fd0
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountSyncPreferenceController.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.accounts.Account;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SyncAdapterType;
+import android.os.UserHandle;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller for the account syncing preference.
+ *
+ * <p>Largely derived from {@link com.android.settings.accounts.AccountSyncPreferenceController}.
+ */
+public class AccountSyncPreferenceController extends PreferenceController<Preference> {
+    private static final Logger LOG = new Logger(AccountSyncPreferenceController.class);
+    private Account mAccount;
+    private UserHandle mUserHandle;
+
+    public AccountSyncPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /** Sets the account that the sync preferences are being shown for. */
+    public void setAccount(Account account) {
+        mAccount = account;
+    }
+
+    /** Sets the user handle used by the controller. */
+    public void setUserHandle(UserHandle userHandle) {
+        mUserHandle = userHandle;
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /**
+     * Verifies that the controller was properly initialized with
+     * {@link #setAccount(Account)} and {@link #setUserHandle(UserHandle)}.
+     *
+     * @throws IllegalStateException if the account is {@code null}
+     */
+    @Override
+    protected void checkInitialized() {
+        LOG.v("checkInitialized");
+        if (mAccount == null) {
+            throw new IllegalStateException(
+                    "AccountSyncPreferenceController must be initialized by calling "
+                            + "setAccount(Account)");
+        }
+        if (mUserHandle == null) {
+            throw new IllegalStateException(
+                    "AccountSyncPreferenceController must be initialized by calling "
+                            + "setUserHandle(UserHandle)");
+        }
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(getSummary());
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        getFragmentController().launchFragment(
+                AccountSyncDetailsFragment.newInstance(mAccount, mUserHandle));
+        return true;
+    }
+
+    private CharSequence getSummary() {
+        int userId = mUserHandle.getIdentifier();
+        SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(userId);
+        int total = 0;
+        int enabled = 0;
+        if (syncAdapters != null) {
+            for (int i = 0, n = syncAdapters.length; i < n; i++) {
+                SyncAdapterType sa = syncAdapters[i];
+                // If the sync adapter isn't for this account type or if the user is not visible,
+                // don't show it.
+                if (!sa.accountType.equals(mAccount.type) || !sa.isUserVisible()) {
+                    continue;
+                }
+                int syncState =
+                        ContentResolver.getIsSyncableAsUser(mAccount, sa.authority, userId);
+                if (syncState > 0) {
+                    // If the sync adapter is syncable, add it to the count of items that can be
+                    // synced.
+                    total++;
+
+                    // If sync is enabled for the sync adapter at the master level or at the account
+                    // level, add it to the count of items that are enabled.
+                    boolean syncEnabled = ContentResolver.getSyncAutomaticallyAsUser(
+                            mAccount, sa.authority, userId);
+                    boolean oneTimeSyncMode =
+                            !ContentResolver.getMasterSyncAutomaticallyAsUser(userId);
+                    if (oneTimeSyncMode || syncEnabled) {
+                        enabled++;
+                    }
+                }
+            }
+        }
+        if (enabled == 0) {
+            return getContext().getText(R.string.account_sync_summary_all_off);
+        } else if (enabled == total) {
+            return getContext().getText(R.string.account_sync_summary_all_on);
+        } else {
+            return getContext().getString(R.string.account_sync_summary_some_on, enabled, total);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountsEntryPreferenceController.java b/src/com/android/car/settings/accounts/AccountsEntryPreferenceController.java
new file mode 100644
index 0000000..1133a9f
--- /dev/null
+++ b/src/com/android/car/settings/accounts/AccountsEntryPreferenceController.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller which determines if the top level entry into Account settings should be displayed
+ * based on the user status.
+ */
+public class AccountsEntryPreferenceController extends PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public AccountsEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return mCarUserManagerHelper.canCurrentProcessModifyAccounts() ? AVAILABLE
+                : DISABLED_FOR_USER;
+    }
+}
diff --git a/src/com/android/car/settings/accounts/AccountsItemProvider.java b/src/com/android/car/settings/accounts/AccountsItemProvider.java
deleted file mode 100644
index 398bd2c..0000000
--- a/src/com/android/car/settings/accounts/AccountsItemProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.accounts;
-
-import android.accounts.Account;
-import android.car.user.CarUserManagerHelper;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.text.TextUtils;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Implementation of {@link ListItemProvider} for {@link AccountsListFragment}.
- * Creates items that represent current user's accounts.
- */
-class AccountsItemProvider extends ListItemProvider {
-    private final List<ListItem> mItems = new ArrayList<>();
-    private final Context mContext;
-    private final AccountClickListener mItemClickListener;
-    private final CarUserManagerHelper mCarUserManagerHelper;
-    private final AccountManagerHelper mAccountManagerHelper;
-
-    AccountsItemProvider(Context context, AccountClickListener itemClickListener,
-            CarUserManagerHelper carUserManagerHelper, AccountManagerHelper accountManagerHelper) {
-        mContext = context;
-        mItemClickListener = itemClickListener;
-        mCarUserManagerHelper = carUserManagerHelper;
-        mAccountManagerHelper = accountManagerHelper;
-        refreshItems();
-    }
-
-    @Override
-    public ListItem get(int position) {
-        return mItems.get(position);
-    }
-
-    @Override
-    public int size() {
-        return mItems.size();
-    }
-
-    /**
-     * Clears and recreates the list of items.
-     */
-    public void refreshItems() {
-        mItems.clear();
-
-        UserInfo currUserInfo = mCarUserManagerHelper.getCurrentProcessUserInfo();
-
-        List<Account> accounts = getSortedUserAccounts();
-
-        // Only add account-related items if the User can Modify Accounts
-        if (mCarUserManagerHelper.canCurrentProcessModifyAccounts()) {
-            // Add "Account for $User" title for a list of accounts.
-            mItems.add(createSubtitleItem(
-                    mContext.getString(R.string.account_list_title, currUserInfo.name),
-                    accounts.isEmpty() ? mContext.getString(R.string.no_accounts_added) : ""));
-
-            // Add an item for each account owned by the current user (1st and 3rd party accounts)
-            for (Account account : accounts) {
-                mItems.add(createAccountItem(account, account.type, currUserInfo));
-            }
-        }
-    }
-
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    List<Account> getSortedUserAccounts() {
-        List<Account> accounts = mAccountManagerHelper.getAccountsForCurrentUser();
-
-        // Sort accounts
-        Collections.sort(accounts, Comparator.comparing(
-                (Account a) -> mAccountManagerHelper.getLabelForType(a.type).toString())
-                .thenComparing(a -> a.name));
-
-        return accounts;
-    }
-
-    // Creates a subtitle line for visual separation in the list
-    private ListItem createSubtitleItem(String title, String body) {
-        TextListItem item = new TextListItem(mContext);
-        item.setTitle(title);
-        item.setBody(body);
-        item.addViewBinder(viewHolder ->
-                viewHolder.getTitle().setTextAppearance(R.style.SettingsListHeader));
-        // Hiding the divider after subtitle, since subtitle is a header for a group of items.
-        item.setHideDivider(true);
-        return item;
-    }
-
-    // Creates a line for an account that belongs to a given user
-    private ListItem createAccountItem(Account account, String accountType,
-            UserInfo userInfo) {
-        TextListItem item = new TextListItem(mContext);
-        item.setPrimaryActionIcon(mAccountManagerHelper.getDrawableForType(accountType),
-                /* useLargeIcon= */ false);
-        item.setTitle(account.name);
-
-        // Set item body = account label.
-        CharSequence itemBody = mAccountManagerHelper.getLabelForType(accountType);
-        if (!TextUtils.isEmpty(itemBody)) {
-            item.setBody(itemBody.toString());
-        }
-
-        item.setOnClickListener(view -> mItemClickListener.onAccountClicked(account, userInfo));
-
-        // setHideDivider = true will hide the divider to group the items together visually.
-        // All of those without a divider between them will be part of the same "group".
-        item.setHideDivider(true);
-        return item;
-    }
-
-    /**
-     * Interface for registering clicks on account items.
-     */
-    interface AccountClickListener {
-        /**
-         * Invoked when a specific account is clicked on.
-         *
-         * @param account  Account for which to display details.
-         * @param userInfo User who's the owner of the account.
-         */
-        void onAccountClicked(Account account, UserInfo userInfo);
-    }
-}
diff --git a/src/com/android/car/settings/accounts/AccountsListFragment.java b/src/com/android/car/settings/accounts/AccountsListFragment.java
deleted file mode 100644
index c1e3766..0000000
--- a/src/com/android/car/settings/accounts/AccountsListFragment.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.accounts;
-
-import android.accounts.Account;
-import android.car.user.CarUserManagerHelper;
-import android.content.pm.UserInfo;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.car.widget.ListItemProvider;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.settingslib.accounts.AuthenticatorHelper;
-
-/**
- * Shows current user and the accounts that belong to the user.
- */
-public class AccountsListFragment extends ListItemSettingsFragment
-        implements AuthenticatorHelper.OnAccountsUpdateListener,
-        CarUserManagerHelper.OnUsersUpdateListener,
-        AccountsItemProvider.AccountClickListener {
-    private AccountsItemProvider mItemProvider;
-    private AccountManagerHelper mAccountManagerHelper;
-    private CarUserManagerHelper mCarUserManagerHelper;
-
-    private Button mAddAccountButton;
-
-    /**
-     * Creates new instance of CurrentUserDetailsFragment.
-     */
-    public static AccountsListFragment newInstance() {
-        AccountsListFragment accountsFragment = new AccountsListFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.accounts_settings_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        accountsFragment.setArguments(bundle);
-        return accountsFragment;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mAccountManagerHelper = new AccountManagerHelper(getContext(), this);
-        mAccountManagerHelper.startListeningToAccountUpdates();
-
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
-        mItemProvider = new AccountsItemProvider(getContext(), this,
-                mCarUserManagerHelper, mAccountManagerHelper);
-
-        // Register to receive changes to the users.
-        mCarUserManagerHelper.registerOnUsersUpdateListener(this);
-
-        // Super class's onActivityCreated need to be called after mContext is initialized.
-        // Because getLineItems is called in there.
-        super.onActivityCreated(savedInstanceState);
-
-        mAddAccountButton = (Button) getActivity().findViewById(R.id.action_button1);
-        if (mCarUserManagerHelper.canCurrentProcessModifyAccounts()) {
-            mAddAccountButton.setText(R.string.user_add_account_menu);
-            mAddAccountButton.setOnClickListener(v -> onAddAccountClicked());
-        } else {
-            mAddAccountButton.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mCarUserManagerHelper.unregisterOnUsersUpdateListener(this);
-        mAccountManagerHelper.stopListeningToAccountUpdates();
-
-        // The action button may be hidden at some point, so make it visible again
-        mAddAccountButton.setVisibility(View.VISIBLE);
-    }
-
-    @Override
-    public void onAccountsUpdate(UserHandle userHandle) {
-        refreshListItems();
-    }
-
-    @Override
-    public void onUsersUpdate() {
-        refreshListItems();
-    }
-
-    @Override
-    public void onAccountClicked(Account account, UserInfo userInfo) {
-        getFragmentController().launchFragment(
-                AccountDetailsFragment.newInstance(account, userInfo));
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-
-    private void refreshListItems() {
-        mItemProvider.refreshItems();
-        refreshList();
-    }
-
-    private void onAddAccountClicked() {
-        getFragmentController().launchFragment(ChooseAccountFragment.newInstance());
-    }
-}
diff --git a/src/com/android/car/settings/accounts/AddAccountActivity.java b/src/com/android/car/settings/accounts/AddAccountActivity.java
index 15910ab..d5ce571 100644
--- a/src/com/android/car/settings/accounts/AddAccountActivity.java
+++ b/src/com/android/car/settings/accounts/AddAccountActivity.java
@@ -24,7 +24,7 @@
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.app.PendingIntent;
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -37,16 +37,15 @@
 import com.android.car.settings.common.Logger;
 
 import java.io.IOException;
+
 /**
- *
  * Entry point Activity for account setup. Works as follows
  *
  * <ol>
- *   <li> After receiving an account type from ChooseAccountFragment, this Activity launches the
- *        account setup specified by AccountManager.
- *   <li> After the account setup, this Activity finishes without showing anything.
+ * <li> After receiving an account type from ChooseAccountFragment, this Activity launches the
+ * account setup specified by AccountManager.
+ * <li> After the account setup, this Activity finishes without showing anything.
  * </ol>
- *
  */
 public class AddAccountActivity extends Activity {
     /**
@@ -54,11 +53,9 @@
      */
     private static final String KEY_ADD_CALLED = "AddAccountCalled";
     /**
-     *
      * Extra parameter to identify the caller. Applications may display a
      * different UI if the call is made from Settings or from a specific
      * application.
-     *
      */
     private static final String KEY_CALLER_IDENTITY = "pendingIntent";
     private static final String SHOULD_NOT_RESOLVE = "SHOULDN'T RESOLVE!";
@@ -79,11 +76,6 @@
     private PendingIntent mPendingIntent;
     private boolean mAddAccountCalled;
 
-    public boolean hasMultipleUsers(Context context) {
-        return ((UserManager) context.getSystemService(Context.USER_SERVICE))
-                .getUsers().size() > 1;
-    }
-
     private final AccountManagerCallback<Bundle> mCallback = new AccountManagerCallback<Bundle>() {
         @Override
         public void run(AccountManagerFuture<Bundle> future) {
@@ -128,14 +120,8 @@
         }
 
         mCarUserManagerHelper = new CarUserManagerHelper(this);
-
-        if (mAddAccountCalled) {
-            // We already called add account - maybe the callback was lost.
-            finish();
-            return;
-        }
-
         mUserHandle = mCarUserManagerHelper.getCurrentProcessUserInfo().getUserHandle();
+
         if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
                 UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
             // We aren't allowed to add an account.
@@ -145,6 +131,12 @@
             finish();
             return;
         }
+
+        if (mAddAccountCalled) {
+            // We already called add account - maybe the callback was lost.
+            finish();
+            return;
+        }
         addAccount(getIntent().getStringExtra(EXTRA_SELECTED_ACCOUNT));
     }
 
@@ -187,4 +179,9 @@
                 mUserHandle);
         mAddAccountCalled = true;
     }
+
+    private boolean hasMultipleUsers(Context context) {
+        return ((UserManager) context.getSystemService(Context.USER_SERVICE))
+                .getUsers().size() > 1;
+    }
 }
diff --git a/src/com/android/car/settings/accounts/ChooseAccountFragment.java b/src/com/android/car/settings/accounts/ChooseAccountFragment.java
index a65a29b..2f864ec 100644
--- a/src/com/android/car/settings/accounts/ChooseAccountFragment.java
+++ b/src/com/android/car/settings/accounts/ChooseAccountFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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,54 +16,43 @@
 
 package com.android.car.settings.accounts;
 
-import android.os.Bundle;
-import android.os.UserHandle;
+import android.content.Context;
+import android.provider.Settings;
 
-import androidx.car.widget.ListItemProvider;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.accounts.AuthenticatorHelper;
+import com.android.car.settings.common.SettingsFragment;
+
+import java.util.Arrays;
+import java.util.HashSet;
 
 /**
- * Activity asking a user to select an account to be set up.
- *
- * <p>An extra {@link UserHandle} can be specified in the intent as {@link EXTRA_USER},
- * if the user for which the action needs to be performed is different to the one the
- * Settings App will run in.
+ * Lists accounts the user can add.
  */
-public class ChooseAccountFragment extends ListItemSettingsFragment
-        implements AuthenticatorHelper.OnAccountsUpdateListener {
-    private static final Logger LOG = new Logger(ChooseAccountFragment.class);
-
-    private ChooseAccountItemProvider mItemProvider;
-
-    public static ChooseAccountFragment newInstance() {
-        ChooseAccountFragment
-                chooseAccountFragment = new ChooseAccountFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.add_an_account);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        chooseAccountFragment.setArguments(bundle);
-        return chooseAccountFragment;
+public class ChooseAccountFragment extends SettingsFragment {
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.choose_account_fragment;
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mItemProvider = new ChooseAccountItemProvider(getContext(), this);
-        super.onActivityCreated(savedInstanceState);
-    }
+    public void onAttach(Context context) {
+        super.onAttach(context);
 
-    @Override
-    public void onAccountsUpdate(UserHandle userHandle) {
-        LOG.v("Accounts changed, refreshing the account list.");
-        mItemProvider.refreshItems();
-        refreshList();
-    }
+        String[] authorities = requireActivity().getIntent().getStringArrayExtra(
+                Settings.EXTRA_AUTHORITIES);
+        if (authorities != null) {
+            use(ChooseAccountPreferenceController.class, R.string.pk_add_account)
+                    .setAuthorities(Arrays.asList(authorities));
+        }
 
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
+        String[] accountTypesForFilter = requireActivity().getIntent().getStringArrayExtra(
+                Settings.EXTRA_ACCOUNT_TYPES);
+        if (accountTypesForFilter != null) {
+            use(ChooseAccountPreferenceController.class, R.string.pk_add_account)
+                    .setAccountTypesFilter(new HashSet<>(Arrays.asList(accountTypesForFilter)));
+        }
     }
 }
diff --git a/src/com/android/car/settings/accounts/ChooseAccountItemProvider.java b/src/com/android/car/settings/accounts/ChooseAccountItemProvider.java
deleted file mode 100644
index 210bb9b..0000000
--- a/src/com/android/car/settings/accounts/ChooseAccountItemProvider.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.accounts;
-
-import android.accounts.AccountManager;
-import android.accounts.AuthenticatorDescription;
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SyncAdapterType;
-import android.content.pm.PackageManager;
-import android.content.pm.UserInfo;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.os.UserHandle;
-import android.os.UserManager;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.common.Logger;
-import com.android.internal.util.CharSequences;
-import com.android.settingslib.accounts.AuthenticatorHelper;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Implementation of ListItemProvider for the ChooseAccountFragment.
- */
-class ChooseAccountItemProvider extends ListItemProvider {
-    private static final Logger LOG = new Logger(ChooseAccountItemProvider.class);
-    private static final String AUTHORITIES_FILTER_KEY = "authorities";
-
-    private final List<ListItem> mItems = new ArrayList<>();
-    private final Context mContext;
-    private final ChooseAccountFragment mFragment;
-    private final UserManager mUserManager;
-    private final ArrayList<ProviderEntry> mProviderList = new ArrayList<>();
-    @Nullable private AuthenticatorDescription[] mAuthDescs;
-    @Nullable private HashMap<String, ArrayList<String>> mAccountTypeToAuthorities;
-    private Map<String, AuthenticatorDescription> mTypeToAuthDescription = new HashMap<>();
-    private final AuthenticatorHelper mAuthenticatorHelper;
-
-    // The UserHandle of the user we are choosing an account for
-    private final UserHandle mUserHandle;
-    private final String[] mAuthorities;
-
-    ChooseAccountItemProvider(Context context, ChooseAccountFragment fragment) {
-        mContext = context;
-        mFragment = fragment;
-        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        mUserHandle =
-                mUserManager.getUserInfo(ActivityManager.getCurrentUser()).getUserHandle();
-
-        mAuthorities = fragment.getActivity().getIntent().getStringArrayExtra(
-                AUTHORITIES_FILTER_KEY);
-
-        // create auth helper
-        UserInfo currUserInfo = mUserManager.getUserInfo(ActivityManager.getCurrentUser());
-        mAuthenticatorHelper =
-                new AuthenticatorHelper(mContext, currUserInfo.getUserHandle(), mFragment);
-
-        updateAuthDescriptions();
-        refreshItems();
-    }
-
-    @Override
-    public ListItem get(int position) {
-        return mItems.get(position);
-    }
-
-    @Override
-    public int size() {
-        return mItems.size();
-    }
-
-    /**
-     * Clears the existing item list and rebuilds it with new data.
-     */
-    public void refreshItems() {
-        mItems.clear();
-
-        for (int i = 0; i < mProviderList.size(); i++) {
-            String accountType = mProviderList.get(i).type;
-            Drawable icon = mAuthenticatorHelper.getDrawableForType(mContext, accountType);
-
-            TextListItem item = new TextListItem(mContext);
-            item.setPrimaryActionIcon(icon, /* useLargeIcon= */ false);
-            item.setTitle(mProviderList.get(i).name.toString());
-            item.setOnClickListener(v -> onItemSelected(accountType));
-            mItems.add(item);
-        }
-    }
-
-    // Starts a AddAccountActivity for the accountType that was clicked on.
-    private void onItemSelected(String accountType) {
-        Intent intent = new Intent(mContext, AddAccountActivity.class);
-        intent.putExtra(AddAccountActivity.EXTRA_SELECTED_ACCOUNT, accountType);
-        mContext.startActivity(intent);
-    }
-
-    /**
-     * Updates provider icons.
-     */
-    private void updateAuthDescriptions() {
-        mAuthDescs = AccountManager.get(mContext).getAuthenticatorTypesAsUser(
-                mUserHandle.getIdentifier());
-        for (int i = 0; i < mAuthDescs.length; i++) {
-            mTypeToAuthDescription.put(mAuthDescs[i].type, mAuthDescs[i]);
-        }
-        onAuthDescriptionsUpdated();
-    }
-
-    private void onAuthDescriptionsUpdated() {
-        // Create list of providers to show on page.
-        for (int i = 0; i < mAuthDescs.length; i++) {
-            String accountType = mAuthDescs[i].type;
-            CharSequence providerName = getLabelForType(accountType);
-
-            // Get the account authorities implemented by the account type.
-            ArrayList<String> accountAuths = getAuthoritiesForAccountType(accountType);
-
-            // If there are specific authorities required, we need to check whether it's
-            // included in the account type.
-            if (mAuthorities != null && mAuthorities.length > 0 && accountAuths != null) {
-                for (int k = 0; k < mAuthorities.length; k++) {
-                    if (accountAuths.contains(mAuthorities[k])) {
-                        mProviderList.add(
-                                new ProviderEntry(providerName, accountType));
-                        break;
-                    }
-                }
-            } else {
-                mProviderList.add(
-                        new ProviderEntry(providerName, accountType));
-            }
-        }
-        Collections.sort(mProviderList);
-    }
-
-    private ArrayList<String> getAuthoritiesForAccountType(String type) {
-        if (mAccountTypeToAuthorities == null) {
-            mAccountTypeToAuthorities = new HashMap<>();
-            SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(
-                    mUserHandle.getIdentifier());
-            for (int i = 0, n = syncAdapters.length; i < n; i++) {
-                final SyncAdapterType adapterType = syncAdapters[i];
-                ArrayList<String> authorities =
-                        mAccountTypeToAuthorities.get(adapterType.accountType);
-                if (authorities == null) {
-                    authorities = new ArrayList<String>();
-                    mAccountTypeToAuthorities.put(adapterType.accountType, authorities);
-                }
-                LOG.v("added authority " + adapterType.authority + " to accountType "
-                        + adapterType.accountType);
-                authorities.add(adapterType.authority);
-            }
-        }
-        return mAccountTypeToAuthorities.get(type);
-    }
-
-    /**
-     * Gets the label associated with a particular account type. If none found, return null.
-     *
-     * @param accountType the type of account
-     * @return a CharSequence for the label or null if one cannot be found.
-     */
-    private CharSequence getLabelForType(final String accountType) {
-        CharSequence label = null;
-        if (mTypeToAuthDescription.containsKey(accountType)) {
-            try {
-                AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
-                Context authContext = mFragment.getActivity().createPackageContextAsUser(
-                        desc.packageName, 0 /* flags */, mUserHandle);
-                label = authContext.getResources().getText(desc.labelId);
-            } catch (PackageManager.NameNotFoundException e) {
-                LOG.w("No label name for account type " + accountType);
-            } catch (Resources.NotFoundException e) {
-                LOG.w("No label resource for account type " + accountType);
-            }
-        }
-        return label;
-    }
-
-    private static class ProviderEntry implements Comparable<ProviderEntry> {
-        private final CharSequence name;
-        private final String type;
-        ProviderEntry(CharSequence providerName, String accountType) {
-            name = providerName;
-            type = accountType;
-        }
-
-        @Override
-        public int compareTo(ProviderEntry another) {
-            if (name == null) {
-                return -1;
-            }
-            if (another.name == null) {
-                return 1;
-            }
-            return CharSequences.compareToIgnoreCase(name, another.name);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/accounts/ChooseAccountPreferenceController.java b/src/com/android/car/settings/accounts/ChooseAccountPreferenceController.java
new file mode 100644
index 0000000..f28b335
--- /dev/null
+++ b/src/com/android/car/settings/accounts/ChooseAccountPreferenceController.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.collection.ArrayMap;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.accounts.AuthenticatorHelper;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Controller for showing the user the list of accounts they can add.
+ *
+ * <p>Largely derived from {@link com.android.settings.accounts.ChooseAccountActivity}
+ */
+public class ChooseAccountPreferenceController extends
+        PreferenceController<PreferenceGroup> implements
+        AuthenticatorHelper.OnAccountsUpdateListener {
+    private static final int ADD_ACCOUNT_REQUEST_CODE = 1;
+
+    private final UserHandle mUserHandle;
+    private AuthenticatorHelper mAuthenticatorHelper;
+    private List<String> mAuthorities;
+    private Set<String> mAccountTypesFilter;
+    private Set<String> mAccountTypesExclusionFilter;
+    private ArrayMap<String, AuthenticatorDescriptionPreference> mPreferences = new ArrayMap<>();
+
+    public ChooseAccountPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mUserHandle = new CarUserManagerHelper(context).getCurrentProcessUserInfo().getUserHandle();
+
+        HashSet<String> accountTypeExclusionFilter = new HashSet<>();
+
+        // Hardcoding bluetooth account type
+        accountTypeExclusionFilter.add("com.android.bluetooth.pbapsink");
+        setAccountTypesExclusionFilter(accountTypeExclusionFilter);
+    }
+
+    /** Sets the authorities that the user has. */
+    public void setAuthorities(List<String> authorities) {
+        mAuthorities = authorities;
+    }
+
+    /** Sets the filter for accounts that should be shown. */
+    public void setAccountTypesFilter(Set<String> accountTypesFilter) {
+        mAccountTypesFilter = accountTypesFilter;
+    }
+
+    /** Sets the filter for accounts that should NOT be shown. */
+    protected void setAccountTypesExclusionFilter(Set<String> accountTypesExclusionFilterFilter) {
+        mAccountTypesExclusionFilter = accountTypesExclusionFilterFilter;
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        forceUpdateAccountsCategory();
+    }
+
+    /** Initializes the authenticator helper. */
+    @Override
+    protected void onCreateInternal() {
+        mAuthenticatorHelper = new AuthenticatorHelper(getContext(), mUserHandle, this);
+    }
+
+    /**
+     * Registers the account update callback.
+     */
+    @Override
+    protected void onStartInternal() {
+        mAuthenticatorHelper.listenToAccountUpdates();
+    }
+
+    /**
+     * Unregisters the account update callback.
+     */
+    @Override
+    protected void onStopInternal() {
+        mAuthenticatorHelper.stopListeningToAccountUpdates();
+    }
+
+    @Override
+    public void onAccountsUpdate(UserHandle userHandle) {
+        // Only force a refresh if accounts have changed for the current user.
+        if (userHandle.equals(mUserHandle)) {
+            forceUpdateAccountsCategory();
+        }
+    }
+
+    /** Forces a refresh of the authenticator description preferences. */
+    private void forceUpdateAccountsCategory() {
+        Set<String> preferencesToRemove = new HashSet<>(mPreferences.keySet());
+        List<AuthenticatorDescriptionPreference> preferences =
+                getAuthenticatorDescriptionPreferences(preferencesToRemove);
+        // Add all preferences that aren't already shown
+        for (int i = 0; i < preferences.size(); i++) {
+            AuthenticatorDescriptionPreference preference = preferences.get(i);
+            preference.setOrder(i);
+            String key = preference.getKey();
+            getPreference().addPreference(preference);
+            mPreferences.put(key, preference);
+        }
+
+        // Remove all preferences that should no longer be shown
+        for (String key : preferencesToRemove) {
+            getPreference().removePreference(mPreferences.get(key));
+            mPreferences.remove(key);
+        }
+    }
+
+    /**
+     * Returns a list of preferences corresponding to the account types the user can add.
+     *
+     * <p> Derived from
+     * {@link com.android.settings.accounts.ChooseAccountActivity#onAuthDescriptionsUpdated}
+     *
+     * @param preferencesToRemove the current preferences shown; will contain the preferences that
+     *                            need to be removed from the screen after method execution
+     */
+    private List<AuthenticatorDescriptionPreference> getAuthenticatorDescriptionPreferences(
+            Set<String> preferencesToRemove) {
+        AuthenticatorDescription[] authenticatorDescriptions = AccountManager.get(
+                getContext()).getAuthenticatorTypesAsUser(
+                mUserHandle.getIdentifier());
+
+        ArrayList<AuthenticatorDescriptionPreference> authenticatorDescriptionPreferences =
+                new ArrayList<>();
+        // Create list of account providers to show on page.
+        for (AuthenticatorDescription authenticatorDescription : authenticatorDescriptions) {
+            String accountType = authenticatorDescription.type;
+            CharSequence label = mAuthenticatorHelper.getLabelForType(getContext(), accountType);
+            Drawable icon = mAuthenticatorHelper.getDrawableForType(getContext(), accountType);
+
+            List<String> accountAuthorities =
+                    mAuthenticatorHelper.getAuthoritiesForAccountType(accountType);
+
+            // If there are specific authorities required, we need to check whether they are
+            // included in the account type.
+            boolean authorized =
+                    (mAuthorities == null || mAuthorities.isEmpty() || accountAuthorities == null
+                            || !Collections.disjoint(accountAuthorities, mAuthorities));
+
+            // If there is an account type filter, make sure this account type is included.
+            authorized = authorized && (mAccountTypesFilter == null
+                    || mAccountTypesFilter.contains(accountType));
+
+            // Check if the account type is in the exclusion list.
+            authorized = authorized && (mAccountTypesExclusionFilter == null
+                    || !mAccountTypesExclusionFilter.contains(accountType));
+
+            // If authorized, add a preference for the provider to the list and remove it from
+            // preferencesToRemove.
+            if (authorized) {
+                AuthenticatorDescriptionPreference preference = mPreferences.getOrDefault(
+                        accountType,
+                        new AuthenticatorDescriptionPreference(getContext(), accountType, label,
+                                icon));
+                preference.setOnPreferenceClickListener(
+                        pref -> onAddAccount(preference.getAccountType()));
+                authenticatorDescriptionPreferences.add(preference);
+                preferencesToRemove.remove(accountType);
+            }
+        }
+
+        Collections.sort(authenticatorDescriptionPreferences, Comparator.comparing(
+                (AuthenticatorDescriptionPreference a) -> a.getTitle().toString()));
+
+        return authenticatorDescriptionPreferences;
+    }
+
+    /** Starts the {@link AddAccountActivity} to add an account for the given account type. */
+    private boolean onAddAccount(String accountType) {
+        Intent intent = new Intent(getContext(), AddAccountActivity.class);
+        intent.putExtra(AddAccountActivity.EXTRA_SELECTED_ACCOUNT, accountType);
+        getFragmentController().startActivityForResult(intent, ADD_ACCOUNT_REQUEST_CODE,
+                this::onAccountAdded);
+        return true;
+    }
+
+    private void onAccountAdded(int requestCode, int resultCode, @Nullable Intent data) {
+        if (requestCode == ADD_ACCOUNT_REQUEST_CODE) {
+            getFragmentController().goBack();
+        }
+    }
+
+    /** Used for testing to trigger an account update. */
+    @VisibleForTesting
+    AuthenticatorHelper getAuthenticatorHelper() {
+        return mAuthenticatorHelper;
+    }
+
+    /** Handles adding accounts. */
+    interface AddAccountListener {
+        /** Handles adding an account. */
+        void addAccount(String accountType);
+    }
+
+    private static class AuthenticatorDescriptionPreference extends Preference {
+        private final String mType;
+
+        AuthenticatorDescriptionPreference(Context context, String accountType, CharSequence label,
+                Drawable icon) {
+            super(context);
+            mType = accountType;
+
+            setKey(accountType);
+            setTitle(label);
+            setIcon(icon);
+        }
+
+        private String getAccountType() {
+            return mType;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/accounts/SyncPreference.java b/src/com/android/car/settings/accounts/SyncPreference.java
new file mode 100644
index 0000000..612a739
--- /dev/null
+++ b/src/com/android/car/settings/accounts/SyncPreference.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.preference.PreferenceViewHolder;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.apps.common.util.Themes;
+import com.android.car.settings.R;
+
+/**
+ * A preference that represents the state of a sync adapter.
+ *
+ * <p>Largely derived from {@link com.android.settings.accounts.SyncStateSwitchPreference}.
+ */
+public class SyncPreference extends SwitchPreference {
+    private int mUid;
+    private String mPackageName;
+    private AccountSyncHelper.SyncState mSyncState = AccountSyncHelper.SyncState.NONE;
+    private boolean mOneTimeSyncMode = false;
+
+    public SyncPreference(Context context, String authority) {
+        super(context);
+        setKey(authority);
+        setPersistent(false);
+        updateIcon();
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+
+        View switchView = view.findViewById(com.android.internal.R.id.switch_widget);
+        if (mOneTimeSyncMode) {
+            switchView.setVisibility(View.GONE);
+
+            /*
+             * Override the summary. Fill in the %1$s with the existing summary
+             * (what ends up happening is the old summary is shown on the next
+             * line).
+             */
+            TextView summary = (TextView) view.findViewById(android.R.id.summary);
+            summary.setText(getContext().getString(R.string.sync_one_time_sync, getSummary()));
+        } else {
+            switchView.setVisibility(View.VISIBLE);
+        }
+    }
+
+    /** Updates the preference icon based on the current syncing state. */
+    private void updateIcon() {
+        switch (mSyncState) {
+            case ACTIVE:
+                setIcon(R.drawable.ic_sync_anim);
+                getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+                break;
+            case PENDING:
+                setIcon(R.drawable.ic_sync);
+                getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+                break;
+            case FAILED:
+                setIcon(R.drawable.ic_sync_problem);
+                getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+                break;
+            default:
+                setIcon(null);
+                setIconSpaceReserved(true);
+                break;
+        }
+    }
+
+    /** Sets the sync state for this preference. */
+    public void setSyncState(AccountSyncHelper.SyncState state) {
+        mSyncState = state;
+        // Force a manual update of the icon since the sync state affects what is shown.
+        updateIcon();
+    }
+
+    /**
+     * Returns whether or not the sync adapter is in one-time sync mode.
+     *
+     * <p>One-time sync mode means that the sync adapter is not being automatically synced but
+     * can be manually synced (i.e. a one time sync).
+     */
+    public boolean isOneTimeSyncMode() {
+        return mOneTimeSyncMode;
+    }
+
+    /** Sets whether one-time sync mode is on for this preference. */
+    public void setOneTimeSyncMode(boolean oneTimeSyncMode) {
+        mOneTimeSyncMode = oneTimeSyncMode;
+        // Force a refresh so that onBindViewHolder is called
+        notifyChanged();
+    }
+
+    /**
+     * Returns the uid corresponding to the sync adapter's package.
+     *
+     * <p>This can be used to create an intent to request account access via
+     * {@link android.accounts.AccountManager#createRequestAccountAccessIntentSenderAsUser}.
+     */
+    public int getUid() {
+        return mUid;
+    }
+
+    /** Sets the uid for this preference. */
+    public void setUid(int uid) {
+        mUid = uid;
+    }
+
+    public String getPackageName() {
+        return mPackageName;
+    }
+
+    public void setPackageName(String packageName) {
+        mPackageName = packageName;
+    }
+}
diff --git a/src/com/android/car/settings/applications/AppListFragment.java b/src/com/android/car/settings/applications/AppListFragment.java
new file mode 100644
index 0000000..c56ab7b
--- /dev/null
+++ b/src/com/android/car/settings/applications/AppListFragment.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import android.os.Bundle;
+import android.widget.Button;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Fragment base class for use in cases where a list of applications is displayed with the option to
+ * show/hide system apps in the list.
+ */
+public abstract class AppListFragment extends SettingsFragment {
+
+    private static final String KEY_SHOW_SYSTEM = "showSystem";
+
+    private boolean mShowSystem;
+
+    @Override
+    @XmlRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState != null) {
+            mShowSystem = savedInstanceState.getBoolean(KEY_SHOW_SYSTEM, false);
+        }
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        Button toggleShowSystem = requireActivity().findViewById(R.id.action_button1);
+        setButtonText(toggleShowSystem);
+        toggleShowSystem.setOnClickListener(v -> {
+            mShowSystem = !mShowSystem;
+            onToggleShowSystemApps(mShowSystem);
+            setButtonText(toggleShowSystem);
+        });
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        onToggleShowSystemApps(mShowSystem);
+    }
+
+    /** Called when a user toggles the option to show system applications in the list. */
+    protected abstract void onToggleShowSystemApps(boolean showSystem);
+
+    /** Returns {@code true} if system applications should be shown in the list. */
+    protected final boolean shouldShowSystemApps() {
+        return mShowSystem;
+    }
+
+    private void setButtonText(Button button) {
+        // Show text to reverse the current state.
+        button.setText(mShowSystem ? R.string.hide_system : R.string.show_system);
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBoolean(KEY_SHOW_SYSTEM, mShowSystem);
+    }
+}
diff --git a/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceController.java b/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceController.java
new file mode 100644
index 0000000..9743875
--- /dev/null
+++ b/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceController.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.icu.text.ListFormatter;
+import android.util.ArraySet;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Updates the summary of the entry preference for app permissions to show up to a fixed number of
+ * permission groups currently permitted.
+ */
+public class AppPermissionsEntryPreferenceController extends PreferenceController<Preference> {
+
+    private static final Logger LOG = new Logger(AppPermissionsEntryPreferenceController.class);
+
+    private static final String[] PERMISSION_GROUPS = new String[]{
+            "android.permission-group.LOCATION",
+            "android.permission-group.MICROPHONE",
+            "android.permission-group.CAMERA",
+            "android.permission-group.SMS",
+            "android.permission-group.CONTACTS",
+            "android.permission-group.PHONE"};
+
+    private static final int NUM_PERMISSION_TO_USE = 3;
+
+    private PackageManager mPackageManager;
+
+    public AppPermissionsEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPackageManager = context.getPackageManager();
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        Set<String> permissions = getAllPermissionsInGroups();
+        Set<String> grantedPermissionGroups = getGrantedPermissionGroups(permissions);
+        int count = 0;
+        final List<String> summaries = new ArrayList<>();
+
+        // Iterate over array instead of set to show sensitive permissions first.
+        for (String group : PERMISSION_GROUPS) {
+            if (!grantedPermissionGroups.contains(group)) {
+                continue;
+            }
+            summaries.add(getPermissionGroupLabel(group).toString().toLowerCase());
+            if (++count >= NUM_PERMISSION_TO_USE) {
+                break;
+            }
+        }
+        String summary = (count > 0) ? getContext().getString(R.string.app_permissions_summary,
+                ListFormatter.getInstance().format(summaries)) : null;
+
+        preference.setSummary(summary);
+    }
+
+    private Set<String> getAllPermissionsInGroups() {
+        Set<String> result = new ArraySet<>();
+        for (String group : PERMISSION_GROUPS) {
+            try {
+                List<PermissionInfo> permissions = mPackageManager.queryPermissionsByGroup(
+                        group, /* flags= */ 0);
+                for (PermissionInfo permissionInfo : permissions) {
+                    result.add(permissionInfo.name);
+                }
+            } catch (PackageManager.NameNotFoundException e) {
+                LOG.e("Error getting permissions in group " + group, e);
+            }
+        }
+        return result;
+    }
+
+    private Set<String> getGrantedPermissionGroups(Set<String> permissions) {
+        Set<String> grantedPermissionGroups = new ArraySet<>();
+        List<PackageInfo> installedPackages =
+                mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
+        for (PackageInfo installedPackage : installedPackages) {
+            if (installedPackage.permissions == null) {
+                continue;
+            }
+            for (PermissionInfo permissionInfo : installedPackage.permissions) {
+                if (permissions.contains(permissionInfo.name)) {
+                    grantedPermissionGroups.add(permissionInfo.group);
+                }
+            }
+        }
+        return grantedPermissionGroups;
+    }
+
+    private CharSequence getPermissionGroupLabel(String group) {
+        try {
+            PermissionGroupInfo groupInfo = mPackageManager.getPermissionGroupInfo(
+                    group, /* flags= */ 0);
+            return groupInfo.loadLabel(mPackageManager);
+        } catch (PackageManager.NameNotFoundException e) {
+            LOG.e("Error getting permissions label.", e);
+        }
+        return group;
+    }
+}
diff --git a/src/com/android/car/settings/applications/ApplicationDetailFragment.java b/src/com/android/car/settings/applications/ApplicationDetailFragment.java
deleted file mode 100644
index efcd64d..0000000
--- a/src/com/android/car/settings/applications/ApplicationDetailFragment.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.applications;
-
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.admin.DevicePolicyManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.Utils;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Shows details about an application and action associated with that application,
- * like uninstall, forceStop.
- */
-public class ApplicationDetailFragment extends ListItemSettingsFragment {
-    private static final Logger LOG = new Logger(ApplicationDetailFragment.class);
-    public static final String EXTRA_RESOLVE_INFO = "extra_resolve_info";
-
-    private ResolveInfo mResolveInfo;
-    private PackageInfo mPackageInfo;
-
-    private Button mDisableToggle;
-    private Button mForceStopButton;
-    private DevicePolicyManager mDpm;
-
-    public static ApplicationDetailFragment getInstance(ResolveInfo resolveInfo) {
-        ApplicationDetailFragment applicationDetailFragment = new ApplicationDetailFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putParcelable(EXTRA_RESOLVE_INFO, resolveInfo);
-        bundle.putInt(EXTRA_TITLE_ID, R.string.applications_settings);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        applicationDetailFragment.setArguments(bundle);
-        return applicationDetailFragment;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mResolveInfo = getArguments().getParcelable(EXTRA_RESOLVE_INFO);
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mPackageInfo = getPackageInfo();
-        super.onActivityCreated(savedInstanceState);
-        if (mResolveInfo == null) {
-            LOG.w("No application info set.");
-            return;
-        }
-
-        mDisableToggle = (Button) getActivity().findViewById(R.id.action_button1);
-        mForceStopButton = (Button) getActivity().findViewById(R.id.action_button2);
-        mForceStopButton.setText(R.string.force_stop);
-        mForceStopButton.setVisibility(View.VISIBLE);
-
-        mDpm = (DevicePolicyManager) getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
-        updateForceStopButton();
-        mForceStopButton.setOnClickListener(
-                v -> forceStopPackage(mResolveInfo.activityInfo.packageName));
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        updateForceStopButton();
-        updateDisableable();
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return new ListItemProvider.ListProvider(getListItems());
-    }
-
-    private List<ListItem> getListItems() {
-        ArrayList<ListItem> items = new ArrayList<>();
-        items.add(new ApplicationLineItem(
-                getContext(),
-                getContext().getPackageManager(),
-                mResolveInfo,
-                /* fragmentController= */ null,
-                false));
-        items.add(new ApplicationPermissionLineItem(getContext(), mResolveInfo, this));
-        TextListItem versionItem = new TextListItem(getContext());
-        versionItem.setTitle(getContext().getString(
-                R.string.application_version_label, mPackageInfo.versionName));
-        items.add(versionItem);
-        return items;
-    }
-
-    // fetch the latest ApplicationInfo instead of caching it so it reflects the current state.
-    private ApplicationInfo getAppInfo() {
-        try {
-            return getContext().getPackageManager().getApplicationInfo(
-                    mResolveInfo.activityInfo.packageName, 0 /* flag */);
-        } catch (PackageManager.NameNotFoundException e) {
-            LOG.e("incorrect packagename: " + mResolveInfo.activityInfo.packageName, e);
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    private PackageInfo getPackageInfo() {
-        try {
-            return getContext().getPackageManager().getPackageInfo(
-                    mResolveInfo.activityInfo.packageName, 0 /* flag */);
-        } catch (PackageManager.NameNotFoundException e) {
-            LOG.e("incorrect packagename: " + mResolveInfo.activityInfo.packageName, e);
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    private void updateDisableable() {
-        boolean disableable = false;
-        boolean disabled = false;
-        // Try to prevent the user from bricking their phone
-        // by not allowing disabling of apps in the system.
-        if (Utils.isSystemPackage(
-                getResources(), getContext().getPackageManager(), mPackageInfo)) {
-            // Disable button for core system applications.
-            mDisableToggle.setText(R.string.disable_text);
-            disabled = false;
-        } else if (getAppInfo().enabled && !isDisabledUntilUsed()) {
-            mDisableToggle.setText(R.string.disable_text);
-            disableable = true;
-            disabled = false;
-        } else {
-            mDisableToggle.setText(R.string.enable_text);
-            disableable = true;
-            disabled = true;
-        }
-        mDisableToggle.setEnabled(disableable);
-        final int enableState = disabled
-                ? PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
-                : PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
-        mDisableToggle.setOnClickListener(v -> {
-            getContext().getPackageManager().setApplicationEnabledSetting(
-                    mResolveInfo.activityInfo.packageName,
-                    enableState,
-                    0);
-            updateDisableable();
-        });
-    }
-
-    private boolean isDisabledUntilUsed() {
-        return getAppInfo().enabledSetting
-                == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
-    }
-
-    private void forceStopPackage(String pkgName) {
-        ActivityManager am = (ActivityManager) getContext().getSystemService(
-                Context.ACTIVITY_SERVICE);
-        LOG.d("Stopping package " + pkgName);
-        am.forceStopPackage(pkgName);
-        updateForceStopButton();
-    }
-
-    // enable or disable the force stop button:
-    // - disabled if it's a device admin
-    // - if the application is stopped unexplicitly, enabled the button
-    // - if there's a reason for the system to restart the application, that indicates the app
-    //   can be force stopped.
-    private void updateForceStopButton() {
-        if (mDpm.packageHasActiveAdmins(mResolveInfo.activityInfo.packageName)) {
-            // User can't force stop device admin.
-            LOG.d("Disabling button, user can't force stop device admin");
-            mForceStopButton.setEnabled(false);
-        } else if ((getAppInfo().flags & ApplicationInfo.FLAG_STOPPED) == 0) {
-            // If the app isn't explicitly stopped, then always show the
-            // force stop button.
-            LOG.w("App is not explicitly stopped");
-            mForceStopButton.setEnabled(true);
-        } else {
-            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
-                    Uri.fromParts("package", mResolveInfo.activityInfo.packageName, null));
-            intent.putExtra(Intent.EXTRA_PACKAGES, new String[]{
-                    mResolveInfo.activityInfo.packageName
-            });
-            LOG.d("Sending broadcast to query restart for "
-                    + mResolveInfo.activityInfo.packageName);
-            getActivity().sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null,
-                    mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null);
-        }
-    }
-
-    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            final boolean enabled = getResultCode() != Activity.RESULT_CANCELED;
-            LOG.d(MessageFormat.format("Got broadcast response: Restart status for {0} {1}",
-                    mResolveInfo.activityInfo.packageName, enabled));
-            mForceStopButton.setEnabled(enabled);
-        }
-    };
-}
diff --git a/src/com/android/car/settings/applications/ApplicationDetailsFragment.java b/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
new file mode 100644
index 0000000..5042208
--- /dev/null
+++ b/src/com/android/car/settings/applications/ApplicationDetailsFragment.java
@@ -0,0 +1,515 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import static android.app.Activity.RESULT_OK;
+
+import static com.android.car.settings.applications.ApplicationsUtils.isKeepEnabledPackage;
+import static com.android.car.settings.applications.ApplicationsUtils.isProfileOrDeviceOwner;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.admin.DevicePolicyManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.ArraySet;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.Utils;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Shows details about an application and action associated with that application, like uninstall,
+ * forceStop.
+ *
+ * <p>To uninstall an app, it must <i>not</i> be:
+ * <ul>
+ * <li>a system bundled app
+ * <li>system signed
+ * <li>managed by an active admin from a device policy
+ * <li>a device or profile owner
+ * <li>the only home app
+ * <li>the default home app
+ * <li>for a user with the {@link UserManager#DISALLOW_APPS_CONTROL} restriction
+ * <li>for a user with the {@link UserManager#DISALLOW_UNINSTALL_APPS} restriction
+ * </ul>
+ *
+ * <p>For apps that cannot be uninstalled, a disable option is shown instead (or enable if the app
+ * is already disabled).
+ */
+public class ApplicationDetailsFragment extends SettingsFragment implements ActivityResultCallback {
+    private static final Logger LOG = new Logger(ApplicationDetailsFragment.class);
+    public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
+
+    @VisibleForTesting
+    static final String DISABLE_CONFIRM_DIALOG_TAG =
+            "com.android.car.settings.applications.DisableConfirmDialog";
+    @VisibleForTesting
+    static final String FORCE_STOP_CONFIRM_DIALOG_TAG =
+            "com.android.car.settings.applications.ForceStopConfirmDialog";
+    @VisibleForTesting
+    static final int UNINSTALL_REQUEST_CODE = 10;
+
+    private DevicePolicyManager mDpm;
+    private PackageManager mPm;
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    private String mPackageName;
+    private PackageInfo mPackageInfo;
+    private ApplicationsState mAppState;
+    private ApplicationsState.Session mSession;
+    private ApplicationsState.AppEntry mAppEntry;
+
+    // The function of this button depends on which app is shown and the app's current state.
+    // It is an application enable/disable toggle for apps bundled with the system image.
+    private Button mUninstallButton;
+    private Button mForceStopButton;
+
+    /** Creates an instance of this fragment, passing packageName as an argument. */
+    public static ApplicationDetailsFragment getInstance(String packageName) {
+        ApplicationDetailsFragment applicationDetailFragment = new ApplicationDetailsFragment();
+        Bundle bundle = new Bundle();
+        bundle.putString(EXTRA_PACKAGE_NAME, packageName);
+        applicationDetailFragment.setArguments(bundle);
+        return applicationDetailFragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.application_details_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mDpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mPm = context.getPackageManager();
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+
+        // These should be loaded before onCreate() so that the controller operates as expected.
+        mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
+
+        mAppState = ApplicationsState.getInstance(requireActivity().getApplication());
+        mSession = mAppState.newSession(mApplicationStateCallbacks, getLifecycle());
+
+        retrieveAppEntry();
+
+        use(ApplicationPreferenceController.class,
+                R.string.pk_application_details_app)
+                .setAppEntry(mAppEntry).setAppState(mAppState);
+        use(NotificationsPreferenceController.class,
+                R.string.pk_application_details_notifications).setPackageInfo(mPackageInfo);
+        use(PermissionsPreferenceController.class,
+                R.string.pk_application_details_permissions).setPackageName(mPackageName);
+        use(VersionPreferenceController.class,
+                R.string.pk_application_details_version).setPackageInfo(mPackageInfo);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) findDialogByTag(DISABLE_CONFIRM_DIALOG_TAG),
+                mDisableConfirmListener, /* rejectListener= */ null);
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) findDialogByTag(FORCE_STOP_CONFIRM_DIALOG_TAG),
+                mForceStopConfirmListener, /* rejectListener= */ null);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        mUninstallButton = requireActivity().findViewById(R.id.action_button1);
+        mForceStopButton = requireActivity().findViewById(R.id.action_button2);
+        mForceStopButton.setVisibility(View.VISIBLE);
+        mForceStopButton.setEnabled(false);
+        mForceStopButton.setText(R.string.force_stop);
+        mForceStopButton.setOnClickListener(mForceStopClickListener);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        // Resume the session earlier than the lifecycle so that cached information is updated
+        // even if settings is not resumed (for example in multi-display).
+        mSession.onResume();
+        refresh();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        // Since we resume early in onStart, make sure we clean up even if we don't receive onPause.
+        mSession.onPause();
+    }
+
+    private void refresh() {
+        retrieveAppEntry();
+        if (mAppEntry == null) {
+            goBack();
+        }
+        updateForceStopButton();
+        updateUninstallButton();
+    }
+
+    private void retrieveAppEntry() {
+        mAppEntry = mAppState.getEntry(mPackageName,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+        if (mAppEntry != null) {
+            try {
+                mPackageInfo = mPm.getPackageInfo(mPackageName,
+                        PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER
+                                | PackageManager.GET_SIGNATURES | PackageManager.GET_PERMISSIONS);
+            } catch (PackageManager.NameNotFoundException e) {
+                LOG.e("Exception when retrieving package:" + mPackageName, e);
+                mPackageInfo = null;
+            }
+        } else {
+            mPackageInfo = null;
+        }
+    }
+
+    private void updateForceStopButton() {
+        if (mDpm.packageHasActiveAdmins(mPackageName)) {
+            updateForceStopButtonInner(/* enabled= */ false);
+        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_STOPPED) == 0) {
+            // If the app isn't explicitly stopped, then always show the force stop button.
+            updateForceStopButtonInner(/* enabled= */ true);
+        } else {
+            Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
+                    Uri.fromParts("package", mPackageName, /* fragment= */ null));
+            intent.putExtra(Intent.EXTRA_PACKAGES, new String[]{mPackageName});
+            intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
+            intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
+            LOG.d("Sending broadcast to query restart status for " + mPackageName);
+            requireContext().sendOrderedBroadcastAsUser(intent,
+                    UserHandle.CURRENT,
+                    /* receiverPermission= */ null,
+                    mCheckKillProcessesReceiver,
+                    /* scheduler= */ null,
+                    Activity.RESULT_CANCELED,
+                    /* initialData= */ null,
+                    /* initialExtras= */ null);
+        }
+    }
+
+    private void updateForceStopButtonInner(boolean enabled) {
+        mForceStopButton.setEnabled(
+                enabled && !mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                        UserManager.DISALLOW_APPS_CONTROL));
+    }
+
+    private void updateUninstallButton() {
+        if (isBundledApp()) {
+            if (isAppEnabled()) {
+                mUninstallButton.setText(R.string.disable_text);
+                mUninstallButton.setOnClickListener(mDisableClickListener);
+            } else {
+                mUninstallButton.setText(R.string.enable_text);
+                mUninstallButton.setOnClickListener(mEnableClickListener);
+            }
+        } else {
+            mUninstallButton.setText(R.string.uninstall_text);
+            mUninstallButton.setOnClickListener(mUninstallClickListener);
+        }
+
+        mUninstallButton.setEnabled(!shouldDisableUninstallButton());
+    }
+
+    private boolean shouldDisableUninstallButton() {
+        if (shouldDisableUninstallForHomeApp()) {
+            LOG.d("Uninstall disabled for home app");
+            return true;
+        }
+
+        if (isAppEnabled() && isKeepEnabledPackage(requireContext(), mPackageName)) {
+            LOG.d("Disable button disabled for keep enabled package");
+            return true;
+        }
+
+        if (Utils.isSystemPackage(getResources(), mPm, mPackageInfo)) {
+            LOG.d("Uninstall disabled for system package");
+            return true;
+        }
+
+        if (mDpm.packageHasActiveAdmins(mPackageName)) {
+            LOG.d("Uninstall disabled because package has active admins");
+            return true;
+        }
+
+        // We don't allow uninstalling profile/device owner on any user because if it's a system
+        // app, "uninstall" is actually "downgrade to the system version + disable", and
+        // "downgrade" will clear data on all users.
+        if (isProfileOrDeviceOwner(mPackageName, mDpm, mCarUserManagerHelper)) {
+            LOG.d("Uninstall disabled because package is profile or device owner");
+            return true;
+        }
+
+        if (mDpm.isUninstallInQueue(mPackageName)) {
+            LOG.d("Uninstall disabled because intent is already queued");
+            return true;
+        }
+
+        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_APPS_CONTROL)) {
+            LOG.d("Uninstall disabled because user has DISALLOW_APPS_CONTROL restriction");
+            return true;
+        }
+
+        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_UNINSTALL_APPS)) {
+            LOG.d("Uninstall disabled because user has DISALLOW_UNINSTALL_APPS restriction");
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns {@code true} if the package is a Home app that should not be uninstalled. We don't
+     * risk downgrading bundled home apps because that can interfere with home-key resolution. We
+     * can't allow removal of the only home app, and we don't want to allow removal of an
+     * explicitly preferred home app. The user can go to Home settings and pick a different app,
+     * after which we'll permit removal of the now-not-default app.
+     */
+    private boolean shouldDisableUninstallForHomeApp() {
+        Set<String> homePackages = new ArraySet<>();
+        // Get list of "home" apps and trace through any meta-data references.
+        List<ResolveInfo> homeActivities = new ArrayList<>();
+        ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities);
+        for (int i = 0; i < homeActivities.size(); i++) {
+            ResolveInfo ri = homeActivities.get(i);
+            String activityPkg = ri.activityInfo.packageName;
+            homePackages.add(activityPkg);
+
+            // Also make sure to include anything proxying for the home app.
+            Bundle metadata = ri.activityInfo.metaData;
+            if (metadata != null) {
+                String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE);
+                if (signaturesMatch(metaPkg, activityPkg)) {
+                    homePackages.add(metaPkg);
+                }
+            }
+        }
+
+        if (homePackages.contains(mPackageName)) {
+            boolean isBundledApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+            if (isBundledApp) {
+                // Don't risk a downgrade.
+                return true;
+            } else if (currentDefaultHome == null) {
+                // No preferred default. Permit uninstall only when there is more than one
+                // candidate.
+                return (homePackages.size() == 1);
+            } else {
+                // Explicit default home app. Forbid uninstall of that one, but permit it for
+                // installed-but-inactive ones.
+                return mPackageName.equals(currentDefaultHome.getPackageName());
+            }
+        } else {
+            // Not a home app.
+            return false;
+        }
+    }
+
+    private boolean signaturesMatch(String pkg1, String pkg2) {
+        if (pkg1 != null && pkg2 != null) {
+            try {
+                int match = mPm.checkSignatures(pkg1, pkg2);
+                if (match >= PackageManager.SIGNATURE_MATCH) {
+                    return true;
+                }
+            } catch (Exception e) {
+                // e.g. package not found during lookup. Possibly bad input.
+                // Just return false as this isn't a reason to crash given the use case.
+            }
+        }
+        return false;
+    }
+
+    private boolean isBundledApp() {
+        return (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+    }
+
+    private boolean isAppEnabled() {
+        return mAppEntry.info.enabled && !(mAppEntry.info.enabledSetting
+                == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
+    }
+
+    @Override
+    public void processActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        if (requestCode == UNINSTALL_REQUEST_CODE) {
+            if (resultCode == RESULT_OK) {
+                goBack();
+            } else {
+                LOG.e("Uninstall failed with result " + resultCode);
+            }
+        }
+    }
+
+    private final View.OnClickListener mForceStopClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            ConfirmationDialogFragment dialogFragment =
+                    new ConfirmationDialogFragment.Builder(getContext())
+                            .setTitle(R.string.force_stop_dialog_title)
+                            .setMessage(R.string.force_stop_dialog_text)
+                            .setPositiveButton(android.R.string.ok,
+                                    mForceStopConfirmListener)
+                            .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null)
+                            .build();
+            showDialog(dialogFragment, FORCE_STOP_CONFIRM_DIALOG_TAG);
+        }
+    };
+
+    private final ConfirmationDialogFragment.ConfirmListener mForceStopConfirmListener =
+            new ConfirmationDialogFragment.ConfirmListener() {
+                @Override
+                public void onConfirm(@Nullable Bundle arguments) {
+                    ActivityManager am = (ActivityManager) requireContext().getSystemService(
+                            Context.ACTIVITY_SERVICE);
+                    LOG.d("Stopping package " + mPackageName);
+                    am.forceStopPackage(mPackageName);
+                    int userId = UserHandle.getUserId(mAppEntry.info.uid);
+                    mAppState.invalidatePackage(mPackageName, userId);
+                }
+            };
+
+    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            boolean enabled = getResultCode() != Activity.RESULT_CANCELED;
+            LOG.d("Got broadcast response: Restart status for " + mPackageName + " " + enabled);
+            updateForceStopButtonInner(enabled);
+        }
+    };
+
+    private final View.OnClickListener mDisableClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            ConfirmationDialogFragment dialogFragment =
+                    new ConfirmationDialogFragment.Builder(getContext())
+                            .setMessage(getString(R.string.app_disable_dialog_text))
+                            .setPositiveButton(R.string.app_disable_dialog_positive,
+                                    mDisableConfirmListener)
+                            .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null)
+                            .build();
+            showDialog(dialogFragment, DISABLE_CONFIRM_DIALOG_TAG);
+        }
+    };
+
+    private final ConfirmationDialogFragment.ConfirmListener mDisableConfirmListener =
+            new ConfirmationDialogFragment.ConfirmListener() {
+                @Override
+                public void onConfirm(@Nullable Bundle arguments) {
+                    mPm.setApplicationEnabledSetting(mPackageName,
+                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER, /* flags= */ 0);
+                }
+            };
+
+    private final View.OnClickListener mEnableClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            mPm.setApplicationEnabledSetting(mPackageName,
+                    PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, /* flags= */ 0);
+        }
+    };
+
+    private final View.OnClickListener mUninstallClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            Uri packageUri = Uri.parse("package:" + mPackageName);
+
+            Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri);
+            uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, true);
+            uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
+
+            startActivityForResult(uninstallIntent, UNINSTALL_REQUEST_CODE, /* callback= */
+                    ApplicationDetailsFragment.this);
+        }
+    };
+
+    private final ApplicationsState.Callbacks mApplicationStateCallbacks =
+            new ApplicationsState.Callbacks() {
+                @Override
+                public void onRunningStateChanged(boolean running) {
+                }
+
+                @Override
+                public void onPackageListChanged() {
+                    refresh();
+                }
+
+                @Override
+                public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+                }
+
+                @Override
+                public void onPackageIconChanged() {
+                }
+
+                @Override
+                public void onPackageSizeChanged(String packageName) {
+                }
+
+                @Override
+                public void onAllSizesComputed() {
+                }
+
+                @Override
+                public void onLauncherInfoChanged() {
+                }
+
+                @Override
+                public void onLoadEntriesCompleted() {
+                }
+            };
+}
diff --git a/src/com/android/car/settings/applications/ApplicationLineItem.java b/src/com/android/car/settings/applications/ApplicationLineItem.java
deleted file mode 100644
index cafeefc..0000000
--- a/src/com/android/car/settings/applications/ApplicationLineItem.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.applications;
-
-import android.annotation.NonNull;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-
-/**
- * Represents an application in application settings page.
- */
-public class ApplicationLineItem extends TextListItem {
-
-    public ApplicationLineItem(
-            @NonNull Context context,
-            PackageManager pm,
-            ResolveInfo resolveInfo,
-            BaseFragment.FragmentController fragmentController) {
-        this(context, pm, resolveInfo, fragmentController, true);
-    }
-
-    public ApplicationLineItem(
-            @NonNull Context context,
-            PackageManager pm,
-            ResolveInfo resolveInfo,
-            BaseFragment.FragmentController fragmentController,
-            boolean clickable) {
-        super(context);
-        setTitle(resolveInfo.loadLabel(pm).toString());
-        setPrimaryActionIcon(resolveInfo.loadIcon(pm), /* useLargeIcon= */ false);
-        if (clickable) {
-            setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-            setOnClickListener(v ->
-                    fragmentController.launchFragment(
-                            ApplicationDetailFragment.getInstance(resolveInfo)));
-        }
-    }
-}
diff --git a/src/com/android/car/settings/applications/ApplicationListItemManager.java b/src/com/android/car/settings/applications/ApplicationListItemManager.java
new file mode 100644
index 0000000..8f7f95b
--- /dev/null
+++ b/src/com/android/car/settings/applications/ApplicationListItemManager.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.applications;
+
+import android.graphics.drawable.Drawable;
+import android.os.storage.VolumeInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Class used to load the applications installed on the system with their metadata.
+ */
+// TODO: consolidate with AppEntryListManager.
+public class ApplicationListItemManager implements ApplicationsState.Callbacks {
+    /**
+     * Callback that is called once the list of applications are loaded.
+     */
+    public interface AppListItemListener {
+        /**
+         * Called when the data is successfully loaded from {@link ApplicationsState.Callbacks} and
+         * icon, title and summary are set for all the applications.
+         */
+        void onDataLoaded(ArrayList<ApplicationsState.AppEntry> apps);
+    }
+
+    private static final Logger LOG = new Logger(ApplicationListItemManager.class);
+
+    private final VolumeInfo mVolumeInfo;
+    private final Lifecycle mLifecycle;
+    private final ApplicationsState mAppState;
+    private final List<AppListItemListener> mAppListItemListeners = new ArrayList<>();
+
+    private ApplicationsState.Session mSession;
+    private ApplicationsState.AppFilter mAppFilter;
+    private Comparator<ApplicationsState.AppEntry> mAppEntryComparator;
+
+    public ApplicationListItemManager(VolumeInfo volumeInfo, Lifecycle lifecycle,
+            ApplicationsState appState) {
+        mVolumeInfo = volumeInfo;
+        mLifecycle = lifecycle;
+        mAppState = appState;
+    }
+
+    /**
+     * Registers a listener that will be notified once the data is loaded.
+     */
+    public void registerListener(AppListItemListener appListItemListener) {
+        if (!mAppListItemListeners.contains(appListItemListener) && appListItemListener != null) {
+            mAppListItemListeners.add(appListItemListener);
+        }
+    }
+
+    /**
+     * Unregisters the listener.
+     */
+    public void unregisterlistener(AppListItemListener appListItemListener) {
+        mAppListItemListeners.remove(appListItemListener);
+    }
+
+    /**
+     * Resumes the session on fragment start.
+     */
+    public void onFragmentStart() {
+        mSession.onResume();
+    }
+
+    /**
+     * Pause the session on fragment stop.
+     */
+    public void onFragmentStop() {
+        mSession.onPause();
+    }
+
+    /**
+     * Starts the new session and start loading the list of installed applications on the device.
+     * This list will be filtered out based on the {@link ApplicationsState.AppFilter} provided.
+     * Once the list is ready, {@link AppListItemListener#onDataLoaded} will be called.
+     *
+     * @param appFilter          based on which the list of applications will be filtered before
+     *                           returning.
+     * @param appEntryComparator comparator based on which the application list will be sorted.
+     */
+    public void startLoading(ApplicationsState.AppFilter appFilter,
+            Comparator<ApplicationsState.AppEntry> appEntryComparator) {
+        if (mSession != null) {
+            LOG.w("Loading already started but restart attempted.");
+            return; // Prevent leaking sessions.
+        }
+        mAppFilter = appFilter;
+        mAppEntryComparator = appEntryComparator;
+        mSession = mAppState.newSession(this, mLifecycle);
+    }
+
+    /**
+     * Rebuilds the list of applications using the provided {@link ApplicationsState.AppFilter}.
+     * The filter will be used for all subsequent loading. Once the list is ready, {@link
+     * AppListItemListener#onDataLoaded} will be called.
+     */
+    public void rebuildWithFilter(ApplicationsState.AppFilter appFilter) {
+        mAppFilter = appFilter;
+        rebuild();
+    }
+
+    @Override
+    public void onPackageIconChanged() {
+        rebuild();
+    }
+
+    @Override
+    public void onPackageSizeChanged(String packageName) {
+        rebuild();
+    }
+
+    @Override
+    public void onAllSizesComputed() {
+        rebuild();
+    }
+
+    @Override
+    public void onLauncherInfoChanged() {
+        rebuild();
+    }
+
+    @Override
+    public void onLoadEntriesCompleted() {
+        rebuild();
+    }
+
+    @Override
+    public void onRunningStateChanged(boolean running) {
+    }
+
+    @Override
+    public void onPackageListChanged() {
+        rebuild();
+    }
+
+    @Override
+    public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+        List<String> successfullyLoadedApplications = new ArrayList<>();
+        for (ApplicationsState.AppEntry appEntry : apps) {
+            String key = appEntry.label + appEntry.sizeStr;
+            if (isLoaded(appEntry.label,
+                    appEntry.sizeStr, appEntry.icon)) {
+                successfullyLoadedApplications.add(key);
+            }
+        }
+
+        if (successfullyLoadedApplications.size() == apps.size()) {
+            for (AppListItemListener appListItemListener : mAppListItemListeners) {
+                appListItemListener.onDataLoaded(apps);
+            }
+        }
+    }
+
+    private boolean isLoaded(String title, String summary, Drawable icon) {
+        return title != null && summary != null && icon != null;
+    }
+
+    ApplicationsState.AppFilter getCompositeFilter(String volumeUuid) {
+        if (mAppFilter == null) {
+            return null;
+        }
+        ApplicationsState.AppFilter filter = new ApplicationsState.VolumeFilter(volumeUuid);
+        filter = new ApplicationsState.CompoundFilter(mAppFilter, filter);
+        return filter;
+    }
+
+    private void rebuild() {
+        ApplicationsState.AppFilter filterObj = ApplicationsState.FILTER_EVERYTHING;
+
+        filterObj = new ApplicationsState.CompoundFilter(filterObj,
+                ApplicationsState.FILTER_NOT_HIDE);
+        ApplicationsState.AppFilter compositeFilter = getCompositeFilter(mVolumeInfo.getFsUuid());
+        if (compositeFilter != null) {
+            filterObj = new ApplicationsState.CompoundFilter(filterObj, compositeFilter);
+        }
+        ApplicationsState.AppFilter finalFilterObj = filterObj;
+        mSession.rebuild(finalFilterObj, mAppEntryComparator, /* foreground= */ false);
+    }
+}
diff --git a/src/com/android/car/settings/applications/ApplicationPermissionLineItem.java b/src/com/android/car/settings/applications/ApplicationPermissionLineItem.java
deleted file mode 100644
index 157aaec..0000000
--- a/src/com/android/car/settings/applications/ApplicationPermissionLineItem.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.applications;
-
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.icu.text.ListFormatter;
-import android.text.TextUtils;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.AnimationUtil;
-import com.android.car.settings.common.ListController;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.applications.PermissionsSummaryHelper;
-import com.android.settingslib.applications.PermissionsSummaryHelper.PermissionsResultCallback;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Shows details about an application and action associated with that application,
- * like uninstall, forceStop.
- */
-public class ApplicationPermissionLineItem extends TextListItem {
-    private static final Logger LOG = new Logger(ApplicationPermissionLineItem.class);
-
-    private final ResolveInfo mResolveInfo;
-    private final Context mContext;
-    private final ListController mListController;
-    private String mSummary;
-
-    public ApplicationPermissionLineItem(Context context, ResolveInfo resolveInfo,
-            ListController listController) {
-        super(context);
-        mResolveInfo = resolveInfo;
-        mContext = context;
-        mListController = listController;
-
-        PermissionsSummaryHelper.getPermissionSummary(mContext,
-                mResolveInfo.activityInfo.packageName, mPermissionCallback);
-        setTitle(context.getString(R.string.permissions_label));
-        setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-        updateBody();
-    }
-
-    private void updateBody() {
-        if (TextUtils.isEmpty(mSummary)) {
-            setBody(mContext.getString(R.string.computing_size));
-            setOnClickListener(null);
-        } else {
-            setBody(mSummary);
-            setOnClickListener(view -> {
-                // start new activity to manage app permissions
-                Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
-                intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mResolveInfo.activityInfo.packageName);
-                try {
-                    mContext.startActivity(
-                            intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
-                } catch (ActivityNotFoundException e) {
-                    LOG.w("No app can handle android.intent.action.MANAGE_APP_PERMISSIONS");
-                }
-            });
-        }
-    }
-
-    private final PermissionsResultCallback mPermissionCallback = new PermissionsResultCallback() {
-        @Override
-        public void onPermissionSummaryResult(int standardGrantedPermissionCount,
-                int requestedPermissionCount, int additionalGrantedPermissionCount,
-                List<CharSequence> grantedGroupLabels) {
-            Resources res = mContext.getResources();
-
-            if (requestedPermissionCount == 0) {
-                mSummary = res.getString(
-                        R.string.runtime_permissions_summary_no_permissions_requested);
-            } else {
-                ArrayList<CharSequence> list = new ArrayList<>(grantedGroupLabels);
-                if (additionalGrantedPermissionCount > 0) {
-                    // N additional permissions.
-                    list.add(res.getQuantityString(
-                            R.plurals.runtime_permissions_additional_count,
-                            additionalGrantedPermissionCount, additionalGrantedPermissionCount));
-                }
-                if (list.isEmpty()) {
-                    mSummary = res.getString(
-                            R.string.runtime_permissions_summary_no_permissions_granted);
-                } else {
-                    mSummary = ListFormatter.getInstance().format(list);
-                }
-            }
-            updateBody();
-            mListController.refreshList();
-        }
-    };
-}
diff --git a/src/com/android/car/settings/applications/ApplicationPreferenceController.java b/src/com/android/car/settings/applications/ApplicationPreferenceController.java
new file mode 100644
index 0000000..63e0227
--- /dev/null
+++ b/src/com/android/car/settings/applications/ApplicationPreferenceController.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+/** Business logic for the Application field in the application details page. */
+public class ApplicationPreferenceController extends PreferenceController<Preference> {
+
+    private AppEntry mAppEntry;
+    private ApplicationsState mApplicationsState;
+
+    public ApplicationPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /** Sets the {@link AppEntry} which is used to load the app name and icon. */
+    public ApplicationPreferenceController setAppEntry(AppEntry appEntry) {
+        mAppEntry = appEntry;
+        return this;
+    }
+
+    /** Sets the {@link ApplicationsState} which is used to load the app name and icon. */
+    public ApplicationPreferenceController setAppState(ApplicationsState applicationsState) {
+        mApplicationsState = applicationsState;
+        return this;
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mAppEntry == null || mApplicationsState == null) {
+            throw new IllegalStateException(
+                    "AppEntry and AppState should be set before calling this function");
+        }
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setTitle(getAppName());
+        preference.setIcon(getAppIcon());
+    }
+
+    protected String getAppName() {
+        mAppEntry.ensureLabel(getContext());
+        return mAppEntry.label;
+    }
+
+    protected Drawable getAppIcon() {
+        mApplicationsState.ensureIcon(mAppEntry);
+        return mAppEntry.icon;
+    }
+
+    protected String getAppVersion() {
+        return mAppEntry.getVersion(getContext());
+    }
+}
diff --git a/src/com/android/car/settings/applications/ApplicationSettingsFragment.java b/src/com/android/car/settings/applications/ApplicationSettingsFragment.java
deleted file mode 100644
index eb1aa94..0000000
--- a/src/com/android/car/settings/applications/ApplicationSettingsFragment.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.applications;
-
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Lists all installed applications and their summary.
- */
-public class ApplicationSettingsFragment extends ListItemSettingsFragment {
-
-    /**
-     * Gets an instance of this object.
-     */
-    public static ApplicationSettingsFragment newInstance() {
-        ApplicationSettingsFragment applicationSettingsFragment = new ApplicationSettingsFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.applications_settings);
-        applicationSettingsFragment.setArguments(bundle);
-        return applicationSettingsFragment;
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return new ListItemProvider.ListProvider(getListItems());
-    }
-
-    private List<ListItem> getListItems() {
-        PackageManager pm = getContext().getPackageManager();
-        Intent intent= new Intent(Intent.ACTION_MAIN);
-        intent.addCategory(Intent.CATEGORY_LAUNCHER);
-        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent,
-                PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
-                        | PackageManager.MATCH_DISABLED_COMPONENTS);
-        ArrayList<ListItem> items = new ArrayList<>();
-        for (ResolveInfo resolveInfo : resolveInfos) {
-            items.add(new ApplicationLineItem(
-                    getContext(), pm, resolveInfo, getFragmentController()));
-        }
-        return items;
-    }
-}
diff --git a/src/com/android/car/settings/applications/ApplicationsSettingsFragment.java b/src/com/android/car/settings/applications/ApplicationsSettingsFragment.java
new file mode 100644
index 0000000..0dce6be
--- /dev/null
+++ b/src/com/android/car/settings/applications/ApplicationsSettingsFragment.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import static com.android.car.settings.storage.StorageUtils.maybeInitializeVolume;
+
+import android.app.Application;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+
+import com.android.car.settings.R;
+import com.android.settingslib.applications.ApplicationsState;
+
+/**
+ * Lists all installed applications and their summary.
+ */
+public class ApplicationsSettingsFragment extends AppListFragment {
+
+    private ApplicationListItemManager mAppListItemManager;
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.applications_settings_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        Application application = requireActivity().getApplication();
+        StorageManager sm = context.getSystemService(StorageManager.class);
+        VolumeInfo volume = maybeInitializeVolume(sm, getArguments());
+        mAppListItemManager = new ApplicationListItemManager(volume, getLifecycle(),
+                ApplicationsState.getInstance(application));
+        mAppListItemManager.registerListener(
+                use(ApplicationsSettingsPreferenceController.class,
+                        R.string.pk_all_applications_settings_list));
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mAppListItemManager.startLoading(getAppFilter(), ApplicationsState.ALPHA_COMPARATOR);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mAppListItemManager.onFragmentStart();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mAppListItemManager.onFragmentStop();
+    }
+
+    @Override
+    protected void onToggleShowSystemApps(boolean showSystem) {
+        mAppListItemManager.rebuildWithFilter(getAppFilter());
+    }
+
+    private ApplicationsState.AppFilter getAppFilter() {
+        return shouldShowSystemApps() ? null
+                : ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER_AND_INSTANT;
+    }
+}
diff --git a/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceController.java b/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceController.java
new file mode 100644
index 0000000..f94e9af
--- /dev/null
+++ b/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceController.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.ArrayList;
+
+/** Business logic which populates the applications in this setting. */
+public class ApplicationsSettingsPreferenceController extends
+        PreferenceController<PreferenceGroup> implements
+        ApplicationListItemManager.AppListItemListener {
+
+    public ApplicationsSettingsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    public void onDataLoaded(ArrayList<ApplicationsState.AppEntry> apps) {
+        getPreference().removeAll();
+        for (ApplicationsState.AppEntry appEntry : apps) {
+            getPreference().addPreference(
+                    createPreference(appEntry.label, appEntry.sizeStr, appEntry.icon,
+                            appEntry.info.packageName));
+        }
+    }
+
+    private Preference createPreference(String title, String summary, Drawable icon,
+            String packageName) {
+        Preference preference = new Preference(getContext());
+        preference.setTitle(title);
+        preference.setSummary(summary);
+        preference.setIcon(icon);
+        preference.setKey(packageName);
+        preference.setOnPreferenceClickListener(p -> {
+            getFragmentController().launchFragment(
+                    ApplicationDetailsFragment.getInstance(packageName));
+            return true;
+        });
+        return preference;
+    }
+}
diff --git a/src/com/android/car/settings/applications/ApplicationsUtils.java b/src/com/android/car/settings/applications/ApplicationsUtils.java
new file mode 100644
index 0000000..00aa190
--- /dev/null
+++ b/src/com/android/car/settings/applications/ApplicationsUtils.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.telecom.DefaultDialerManager;
+import android.text.TextUtils;
+import android.util.ArraySet;
+
+import com.android.internal.telephony.SmsApplication;
+
+import java.util.List;
+import java.util.Set;
+
+/** Utility functions for use in applications settings. */
+public class ApplicationsUtils {
+
+    private ApplicationsUtils() {
+    }
+
+    /**
+     * Returns {@code true} if the package should always remain enabled.
+     */
+    // TODO: investigate making this behavior configurable via a feature factory with the current
+    //  contents as the default.
+    public static boolean isKeepEnabledPackage(Context context, String packageName) {
+        // Find current default phone/sms app. We should keep them enabled.
+        Set<String> keepEnabledPackages = new ArraySet<>();
+        String defaultDialer = DefaultDialerManager.getDefaultDialerApplication(context);
+        if (!TextUtils.isEmpty(defaultDialer)) {
+            keepEnabledPackages.add(defaultDialer);
+        }
+        ComponentName defaultSms = SmsApplication.getDefaultSmsApplication(
+                context, /* updateIfNeeded= */ true);
+        if (defaultSms != null) {
+            keepEnabledPackages.add(defaultSms.getPackageName());
+        }
+        return keepEnabledPackages.contains(packageName);
+    }
+
+    /**
+     * Returns {@code true} if the given {@code packageName} is device owner or profile owner of at
+     * least one user.
+     */
+    public static boolean isProfileOrDeviceOwner(String packageName, DevicePolicyManager dpm,
+            CarUserManagerHelper um) {
+        if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) {
+            return true;
+        }
+        List<UserInfo> userInfos = um.getAllUsers();
+        for (int i = 0; i < userInfos.size(); i++) {
+            ComponentName cn = dpm.getProfileOwnerAsUser(userInfos.get(i).id);
+            if (cn != null && cn.getPackageName().equals(packageName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/car/settings/applications/AppsAndNotificationsFragment.java b/src/com/android/car/settings/applications/AppsAndNotificationsFragment.java
new file mode 100644
index 0000000..a935aee
--- /dev/null
+++ b/src/com/android/car/settings/applications/AppsAndNotificationsFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Shows subsettings related to apps and notifications. */
+public class AppsAndNotificationsFragment extends SettingsFragment {
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.apps_and_notifications_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/applications/NotificationsPreferenceController.java b/src/com/android/car/settings/applications/NotificationsPreferenceController.java
new file mode 100644
index 0000000..db7da71
--- /dev/null
+++ b/src/com/android/car/settings/applications/NotificationsPreferenceController.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import static android.app.NotificationManager.IMPORTANCE_NONE;
+import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
+
+import android.app.INotificationManager;
+import android.app.NotificationChannel;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.os.ServiceManager;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * Controller for preference which enables / disables showing notifications for an application.
+ */
+public class NotificationsPreferenceController extends PreferenceController<TwoStatePreference> {
+
+    private static final Logger LOG = new Logger(NotificationsPreferenceController.class);
+
+    private String mPackageName;
+    private int mUid;
+
+    @VisibleForTesting
+    INotificationManager mNotificationManager =
+            INotificationManager.Stub.asInterface(
+                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+
+    public NotificationsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /**
+     * Set the package info of the application.
+     */
+    public void setPackageInfo(PackageInfo packageInfo) {
+        mPackageName = packageInfo.packageName;
+        mUid = packageInfo.applicationInfo.uid;
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(isNotificationsEnabled());
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean enabled = (boolean) newValue;
+
+        try {
+            if (mNotificationManager.onlyHasDefaultChannel(mPackageName, mUid)) {
+                NotificationChannel defaultChannel =
+                        mNotificationManager.getNotificationChannelForPackage(
+                                mPackageName,
+                                mUid,
+                                NotificationChannel.DEFAULT_CHANNEL_ID,
+                                /* includeDeleted= */ true);
+                defaultChannel.setImportance(enabled ? IMPORTANCE_UNSPECIFIED : IMPORTANCE_NONE);
+                mNotificationManager
+                        .updateNotificationChannelForPackage(mPackageName, mUid, defaultChannel);
+            }
+            mNotificationManager.setNotificationsEnabledForPackage(mPackageName, mUid, enabled);
+        } catch (Exception e) {
+            LOG.w("Error querying notification setting for package");
+            return false;
+        }
+        return true;
+    }
+
+    private boolean isNotificationsEnabled() {
+        try {
+            return mNotificationManager.areNotificationsEnabledForPackage(mPackageName, mUid);
+        } catch (Exception e) {
+            LOG.w("Error querying notification setting for package");
+            return false;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/PermissionsPreferenceController.java b/src/com/android/car/settings/applications/PermissionsPreferenceController.java
new file mode 100644
index 0000000..98d4634
--- /dev/null
+++ b/src/com/android/car/settings/applications/PermissionsPreferenceController.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.icu.text.ListFormatter;
+import android.text.TextUtils;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.PermissionsSummaryHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Business logic for the permissions entry in the application details settings. */
+public class PermissionsPreferenceController extends PreferenceController<Preference> {
+
+    private static final Logger LOG = new Logger(PermissionsPreferenceController.class);
+
+    private String mPackageName;
+    private String mSummary;
+
+    public PermissionsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /**
+     * Set the packageName, which is used on the intent to open the permissions
+     * selection screen.
+     */
+    public void setPackageName(String packageName) {
+        mPackageName = packageName;
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mPackageName == null) {
+            throw new IllegalStateException(
+                    "PackageName should be set before calling this function");
+        }
+    }
+
+    @Override
+    protected void onStartInternal() {
+        PermissionsSummaryHelper.getPermissionSummary(getContext(), mPackageName,
+                mPermissionCallback);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(getSummary());
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
+        intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mPackageName);
+        try {
+            getContext().startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            LOG.w("No app can handle android.intent.action.MANAGE_APP_PERMISSIONS");
+        }
+        return true;
+    }
+
+    private CharSequence getSummary() {
+        if (TextUtils.isEmpty(mSummary)) {
+            return getContext().getString(R.string.computing_size);
+        }
+        return mSummary;
+    }
+
+    private final PermissionsSummaryHelper.PermissionsResultCallback mPermissionCallback =
+            new PermissionsSummaryHelper.PermissionsResultCallback() {
+                @Override
+                public void onPermissionSummaryResult(int standardGrantedPermissionCount,
+                        int requestedPermissionCount, int additionalGrantedPermissionCount,
+                        List<CharSequence> grantedGroupLabels) {
+                    Resources res = getContext().getResources();
+
+                    if (requestedPermissionCount == 0) {
+                        mSummary = res.getString(
+                                R.string.runtime_permissions_summary_no_permissions_requested);
+                    } else {
+                        ArrayList<CharSequence> list = new ArrayList<>(grantedGroupLabels);
+                        if (additionalGrantedPermissionCount > 0) {
+                            // N additional permissions.
+                            list.add(res.getQuantityString(
+                                    R.plurals.runtime_permissions_additional_count,
+                                    additionalGrantedPermissionCount,
+                                    additionalGrantedPermissionCount));
+                        }
+                        if (list.isEmpty()) {
+                            mSummary = res.getString(
+                                    R.string.runtime_permissions_summary_no_permissions_granted);
+                        } else {
+                            mSummary = ListFormatter.getInstance().format(list);
+                        }
+                    }
+                    refreshUi();
+                }
+            };
+}
diff --git a/src/com/android/car/settings/applications/VersionPreferenceController.java b/src/com/android/car/settings/applications/VersionPreferenceController.java
new file mode 100644
index 0000000..8df5ce0
--- /dev/null
+++ b/src/com/android/car/settings/applications/VersionPreferenceController.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic for the Version field in the application details page. */
+public class VersionPreferenceController extends PreferenceController<Preference> {
+
+    private PackageInfo mPackageInfo;
+
+    public VersionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /** Set the package info which is used to get the version name. */
+    public void setPackageInfo(PackageInfo packageInfo) {
+        mPackageInfo = packageInfo;
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mPackageInfo == null) {
+            throw new IllegalStateException(
+                    "PackageInfo should be set before calling this function");
+        }
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setTitle(getContext().getString(
+                R.string.application_version_label, mPackageInfo.versionName));
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java b/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
new file mode 100644
index 0000000..1a7ea28
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceController.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.app.AssistUtils;
+
+import java.util.List;
+
+/** Common logic for preference controllers that configure the assistant's behavior. */
+public abstract class AssistConfigBasePreferenceController extends
+        PreferenceController<TwoStatePreference> {
+
+    private final SettingObserver mSettingObserver;
+    private final AssistUtils mAssistUtils;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public AssistConfigBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAssistUtils = new AssistUtils(context);
+        mSettingObserver = new SettingObserver(getSettingUris(), this::refreshUi);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        int userId = mCarUserManagerHelper.getCurrentProcessUserId();
+        return mAssistUtils.getAssistComponentForUser(userId) != null ? AVAILABLE
+                : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mSettingObserver.register(getContext().getContentResolver(), true);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mSettingObserver.register(getContext().getContentResolver(), false);
+    }
+
+    /** Gets the Setting Uris that should be observed */
+    protected abstract List<Uri> getSettingUris();
+
+    /**
+     * Creates an observer that listens for changes to {@link Settings.Secure#ASSISTANT} as well as
+     * any other URI defined by {@link #getSettingUris()}.
+     */
+    private static class SettingObserver extends ContentObserver {
+
+        private static final Uri ASSIST_URI = Settings.Secure.getUriFor(Settings.Secure.ASSISTANT);
+        private final List<Uri> mUriList;
+        private final Runnable mSettingChangeListener;
+
+        SettingObserver(List<Uri> uriList, Runnable settingChangeListener) {
+            super(new Handler(Looper.getMainLooper()));
+            mUriList = uriList;
+            mSettingChangeListener = settingChangeListener;
+        }
+
+        /** Registers or unregisters this observer to the given content resolver. */
+        void register(ContentResolver cr, boolean register) {
+            if (register) {
+                cr.registerContentObserver(ASSIST_URI, /* notifyForDescendants= */ false,
+                        /* observer= */ this);
+                if (mUriList != null) {
+                    for (Uri uri : mUriList) {
+                        cr.registerContentObserver(uri, /* notifyForDescendants= */ false,
+                                /* observer=*/ this);
+                    }
+                }
+            } else {
+                cr.unregisterContentObserver(this);
+            }
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+
+            if (shouldUpdatePreference(uri)) {
+                mSettingChangeListener.run();
+            }
+        }
+
+        private boolean shouldUpdatePreference(Uri uri) {
+            return ASSIST_URI.equals(uri) || (mUriList != null && mUriList.contains(uri));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceController.java b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceController.java
new file mode 100644
index 0000000..e0ed7a9
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceController.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.applications.defaultapps.DefaultAppsPickerEntryBasePreferenceController;
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.app.AssistUtils;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import java.util.Objects;
+
+/**
+ * Business logic to show the currently selected default voice input service and also link to the
+ * service settings, if it exists.
+ */
+public class DefaultVoiceInputPickerEntryPreferenceController extends
+        DefaultAppsPickerEntryBasePreferenceController {
+
+    private static final Uri ASSIST_URI = Settings.Secure.getUriFor(Settings.Secure.ASSISTANT);
+
+    private final ContentObserver mSettingObserver = new ContentObserver(
+            new Handler(Looper.getMainLooper())) {
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+
+            if (ASSIST_URI.equals(uri)) {
+                refreshUi();
+            }
+        }
+    };
+
+    private final VoiceInputInfoProvider mVoiceInputInfoProvider;
+    private final AssistUtils mAssistUtils;
+
+    public DefaultVoiceInputPickerEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mVoiceInputInfoProvider = new VoiceInputInfoProvider(context);
+        mAssistUtils = new AssistUtils(context);
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        ComponentName currentVoiceService = VoiceInputUtils.getCurrentService(getContext());
+        ComponentName currentAssist = mAssistUtils.getAssistComponentForUser(
+                getCurrentProcessUserId());
+
+        return Objects.equals(currentAssist, currentVoiceService) ? CONDITIONALLY_UNAVAILABLE
+                : AVAILABLE;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        getContext().getContentResolver().registerContentObserver(ASSIST_URI,
+                /* notifyForDescendants= */ false, mSettingObserver);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        getContext().getContentResolver().unregisterContentObserver(mSettingObserver);
+    }
+
+    @Nullable
+    @Override
+    protected DefaultAppInfo getCurrentDefaultAppInfo() {
+        VoiceInputInfoProvider.VoiceInputInfo info = mVoiceInputInfoProvider.getInfoForComponent(
+                VoiceInputUtils.getCurrentService(getContext()));
+        return (info == null) ? null : new DefaultVoiceInputServiceInfo(getContext(),
+                getContext().getPackageManager(), getCurrentProcessUserId(), info,
+                /* enabled= */ true);
+    }
+
+    @Nullable
+    @Override
+    protected Intent getSettingIntent(@Nullable DefaultAppInfo info) {
+        if (info instanceof DefaultVoiceInputServiceInfo) {
+            return ((DefaultVoiceInputServiceInfo) info).getSettingIntent();
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerFragment.java b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerFragment.java
new file mode 100644
index 0000000..1460ade
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Shows the screen to pick the default voice input service. */
+public class DefaultVoiceInputPickerFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_voice_input_picker_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceController.java b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceController.java
new file mode 100644
index 0000000..0cc1eaf
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceController.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import com.android.car.settings.applications.defaultapps.DefaultAppsPickerBasePreferenceController;
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.app.AssistUtils;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/** Business logic for displaying and choosing the default voice input service. */
+public class DefaultVoiceInputPickerPreferenceController extends
+        DefaultAppsPickerBasePreferenceController {
+
+    private final AssistUtils mAssistUtils;
+    private final VoiceInputInfoProvider mVoiceInputInfoProvider;
+
+    // Current assistant component name, used to restrict available voice inputs.
+    private String mAssistComponentName = null;
+
+    public DefaultVoiceInputPickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAssistUtils = new AssistUtils(context);
+        mVoiceInputInfoProvider = new VoiceInputInfoProvider(context);
+        if (Objects.equals(mAssistUtils.getAssistComponentForUser(getCurrentProcessUserId()),
+                VoiceInputUtils.getCurrentService(getContext()))) {
+            ComponentName cn = mAssistUtils.getAssistComponentForUser(getCurrentProcessUserId());
+            if (cn != null) {
+                mAssistComponentName = cn.flattenToString();
+            }
+        }
+    }
+
+    @NonNull
+    @Override
+    protected List<DefaultAppInfo> getCandidates() {
+        List<DefaultAppInfo> candidates = new ArrayList<>();
+        for (VoiceInputInfoProvider.VoiceInteractionInfo info :
+                mVoiceInputInfoProvider.getVoiceInteractionInfoList()) {
+            boolean enabled = TextUtils.equals(info.getComponentName().flattenToString(),
+                    mAssistComponentName);
+            candidates.add(
+                    new DefaultVoiceInputServiceInfo(getContext(), getContext().getPackageManager(),
+                            getCurrentProcessUserId(), info, enabled));
+        }
+
+        for (VoiceInputInfoProvider.VoiceRecognitionInfo info :
+                mVoiceInputInfoProvider.getVoiceRecognitionInfoList()) {
+            candidates.add(
+                    new DefaultVoiceInputServiceInfo(getContext(), getContext().getPackageManager(),
+                            getCurrentProcessUserId(), info, /* enabled= */ true));
+        }
+        return candidates;
+    }
+
+    @Override
+    protected String getCurrentDefaultKey() {
+        ComponentName cn = VoiceInputUtils.getCurrentService(getContext());
+        if (cn == null) {
+            return null;
+        }
+        return cn.flattenToString();
+    }
+
+    @Override
+    protected void setCurrentDefault(String key) {
+        ComponentName cn = ComponentName.unflattenFromString(key);
+        VoiceInputInfoProvider.VoiceInputInfo info = mVoiceInputInfoProvider.getInfoForComponent(
+                cn);
+
+        if (info instanceof VoiceInputInfoProvider.VoiceInteractionInfo) {
+            VoiceInputInfoProvider.VoiceInteractionInfo interactionInfo =
+                    (VoiceInputInfoProvider.VoiceInteractionInfo) info;
+            Settings.Secure.putString(getContext().getContentResolver(),
+                    Settings.Secure.VOICE_INTERACTION_SERVICE, key);
+            Settings.Secure.putString(getContext().getContentResolver(),
+                    Settings.Secure.VOICE_RECOGNITION_SERVICE,
+                    new ComponentName(interactionInfo.getPackageName(),
+                            interactionInfo.getRecognitionService())
+                            .flattenToString());
+        } else if (info instanceof VoiceInputInfoProvider.VoiceRecognitionInfo) {
+            Settings.Secure.putString(getContext().getContentResolver(),
+                    Settings.Secure.VOICE_INTERACTION_SERVICE, "");
+            Settings.Secure.putString(getContext().getContentResolver(),
+                    Settings.Secure.VOICE_RECOGNITION_SERVICE, key);
+        }
+    }
+
+    @Override
+    protected boolean includeNonePreference() {
+        return false;
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/DefaultVoiceInputServiceInfo.java b/src/com/android/car/settings/applications/assist/DefaultVoiceInputServiceInfo.java
new file mode 100644
index 0000000..369281e
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/DefaultVoiceInputServiceInfo.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.applications.assist.VoiceInputInfoProvider.VoiceInteractionInfo;
+import com.android.car.settings.applications.assist.VoiceInputInfoProvider.VoiceRecognitionInfo;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+/** An extension of {@link DefaultAppInfo} to help represent voice input services. */
+public class DefaultVoiceInputServiceInfo extends DefaultAppInfo {
+
+    private VoiceInputInfoProvider.VoiceInputInfo mInfo;
+
+    /**
+     * Constructs a {@link DefaultVoiceInputServiceInfo}
+     *
+     * @param info    a {@link VoiceInteractionInfo} or {@link VoiceRecognitionInfo} that describes
+     *                the Voice Input Service.
+     * @param enabled determines whether the service should be selectable or not.
+     */
+    public DefaultVoiceInputServiceInfo(Context context, PackageManager pm, int userId,
+            VoiceInputInfoProvider.VoiceInputInfo info, boolean enabled) {
+        super(context, pm, userId, info.getComponentName(), /* summary= */ null, enabled);
+        mInfo = info;
+    }
+
+    @Override
+    public CharSequence loadLabel() {
+        return mInfo.getLabel();
+    }
+
+    /** Gets the intent to open the related settings component if it exists. */
+    @Nullable
+    public Intent getSettingIntent() {
+        if (mInfo.getSettingsActivityComponentName() == null) {
+            return null;
+        }
+        return new Intent(Intent.ACTION_MAIN).setComponent(
+                mInfo.getSettingsActivityComponentName());
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/ManageAssistActivity.java b/src/com/android/car/settings/applications/assist/ManageAssistActivity.java
new file mode 100644
index 0000000..3ac4fa5
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/ManageAssistActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/**
+ * Starts {@link ManageAssistFragment} in a separate activity to help with the back navigation
+ * flow. This setting differs from the other settings in that the user arrives here from the
+ * PermissionController rather than from within the Settings app itself.
+ */
+public class ManageAssistActivity extends BaseCarSettingsActivity {
+
+    @Nullable
+    @Override
+    protected Fragment getInitialFragment() {
+        return new ManageAssistFragment();
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/ManageAssistEntryPreferenceController.java b/src/com/android/car/settings/applications/assist/ManageAssistEntryPreferenceController.java
new file mode 100644
index 0000000..b817e81
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/ManageAssistEntryPreferenceController.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+
+import com.android.car.settings.applications.defaultapps.DefaultAppEntryBasePreferenceController;
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.app.AssistUtils;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+/**
+ * Business logic to show the currently selected default assist.
+ */
+public class ManageAssistEntryPreferenceController extends
+        DefaultAppEntryBasePreferenceController<Preference> {
+
+    private final AssistUtils mAssistUtils;
+
+    public ManageAssistEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAssistUtils = new AssistUtils(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Nullable
+    protected DefaultAppInfo getCurrentDefaultAppInfo() {
+        ComponentName cn = mAssistUtils.getAssistComponentForUser(getCurrentProcessUserId());
+        if (cn == null) {
+            return null;
+        }
+        return new DefaultAppInfo(getContext(), getContext().getPackageManager(),
+                getCurrentProcessUserId(), cn);
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/ManageAssistFragment.java b/src/com/android/car/settings/applications/assist/ManageAssistFragment.java
new file mode 100644
index 0000000..d4fd2f5
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/ManageAssistFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Assistant management settings screen. */
+public class ManageAssistFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.manage_assist_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceController.java b/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceController.java
new file mode 100644
index 0000000..eadad84
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceController.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.Uri;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.util.Arrays;
+import java.util.List;
+
+/** Toggles the assistant's ability to use a screenshot of the screen for context. */
+public class ScreenshotContextPreferenceController extends AssistConfigBasePreferenceController {
+
+    public ScreenshotContextPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        boolean checked = Settings.Secure.getInt(getContext().getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1) != 0;
+        preference.setChecked(checked);
+
+        boolean contextChecked = Settings.Secure.getInt(getContext().getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1) != 0;
+        preference.setEnabled(contextChecked);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        Settings.Secure.putInt(getContext().getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, (boolean) newValue ? 1 : 0);
+        return true;
+    }
+
+    @Override
+    protected List<Uri> getSettingUris() {
+        return Arrays.asList(
+                Settings.Secure.getUriFor(Settings.Secure.ASSIST_SCREENSHOT_ENABLED),
+                Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED));
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/TextContextPreferenceController.java b/src/com/android/car/settings/applications/assist/TextContextPreferenceController.java
new file mode 100644
index 0000000..336d5f7
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/TextContextPreferenceController.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.Uri;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.util.Collections;
+import java.util.List;
+
+/** Toggles the assistant's ability to use the text on the screen for context. */
+public class TextContextPreferenceController extends AssistConfigBasePreferenceController {
+
+    public TextContextPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(isAssistContextEnabled());
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        Settings.Secure.putInt(getContext().getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, (boolean) newValue ? 1 : 0);
+        return true;
+    }
+
+    @Override
+    protected List<Uri> getSettingUris() {
+        return Collections.singletonList(
+                Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED));
+    }
+
+    private boolean isAssistContextEnabled() {
+        return Settings.Secure.getInt(getContext().getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1) != 0;
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/VoiceInputInfoProvider.java b/src/com/android/car/settings/applications/assist/VoiceInputInfoProvider.java
new file mode 100644
index 0000000..ef01f4d
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/VoiceInputInfoProvider.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.service.voice.VoiceInteractionService;
+import android.service.voice.VoiceInteractionServiceInfo;
+import android.speech.RecognitionService;
+import android.util.AttributeSet;
+import android.util.Xml;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.collection.ArrayMap;
+import androidx.collection.ArraySet;
+
+import com.android.car.settings.common.Logger;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Extracts the voice interaction services and voice recognition services and converts them into
+ * {@link VoiceInteractionInfo} instances and {@link VoiceRecognitionInfo} instances.
+ */
+public class VoiceInputInfoProvider {
+
+    private static final Logger LOG = new Logger(VoiceInputInfoProvider.class);
+    @VisibleForTesting
+    static final Intent VOICE_INTERACTION_SERVICE_TAG = new Intent(
+            VoiceInteractionService.SERVICE_INTERFACE);
+    @VisibleForTesting
+    static final Intent VOICE_RECOGNITION_SERVICE_TAG = new Intent(
+            RecognitionService.SERVICE_INTERFACE);
+
+    private final Context mContext;
+    private final Map<ComponentName, VoiceInputInfo> mComponentToInfoMap = new ArrayMap<>();
+    private final List<VoiceInteractionInfo> mVoiceInteractionInfoList = new ArrayList<>();
+    private final List<VoiceRecognitionInfo> mVoiceRecognitionInfoList = new ArrayList<>();
+    private final Set<ComponentName> mRecognitionServiceNames = new ArraySet<>();
+
+    public VoiceInputInfoProvider(Context context) {
+        mContext = context;
+
+        loadVoiceInteractionServices();
+        loadVoiceRecognitionServices();
+    }
+
+    /**
+     * Gets the list of voice interaction services represented as {@link VoiceInteractionInfo}
+     * instances.
+     */
+    public List<VoiceInteractionInfo> getVoiceInteractionInfoList() {
+        return mVoiceInteractionInfoList;
+    }
+
+    /**
+     * Gets the list of voice recognition services represented as {@link VoiceRecognitionInfo}
+     * instances.
+     */
+    public List<VoiceRecognitionInfo> getVoiceRecognitionInfoList() {
+        return mVoiceRecognitionInfoList;
+    }
+
+    /**
+     * Returns the appropriate {@link VoiceInteractionInfo} or {@link VoiceRecognitionInfo} based on
+     * the provided {@link ComponentName}.
+     *
+     * @return {@link VoiceInputInfo} if it exists for the component name, null otherwise.
+     */
+    @Nullable
+    public VoiceInputInfo getInfoForComponent(ComponentName key) {
+        return mComponentToInfoMap.getOrDefault(key, null);
+    }
+
+    private void loadVoiceInteractionServices() {
+        List<ResolveInfo> mAvailableVoiceInteractionServices =
+                mContext.getPackageManager().queryIntentServices(VOICE_INTERACTION_SERVICE_TAG,
+                        PackageManager.GET_META_DATA);
+
+        for (ResolveInfo resolveInfo : mAvailableVoiceInteractionServices) {
+            VoiceInteractionServiceInfo interactionServiceInfo = new VoiceInteractionServiceInfo(
+                    mContext.getPackageManager(), resolveInfo.serviceInfo);
+            if (interactionServiceInfo.getParseError() != null) {
+                LOG.w("Error in VoiceInteractionService " + resolveInfo.serviceInfo.packageName
+                        + "/" + resolveInfo.serviceInfo.name + ": "
+                        + interactionServiceInfo.getParseError());
+                continue;
+            }
+            VoiceInteractionInfo voiceInteractionInfo = new VoiceInteractionInfo(mContext,
+                    interactionServiceInfo);
+            mVoiceInteractionInfoList.add(voiceInteractionInfo);
+            if (interactionServiceInfo.getRecognitionService() != null) {
+                mRecognitionServiceNames.add(new ComponentName(resolveInfo.serviceInfo.packageName,
+                        interactionServiceInfo.getRecognitionService()));
+            }
+            mComponentToInfoMap.put(new ComponentName(resolveInfo.serviceInfo.packageName,
+                    resolveInfo.serviceInfo.name), voiceInteractionInfo);
+        }
+        Collections.sort(mVoiceInteractionInfoList);
+    }
+
+    private void loadVoiceRecognitionServices() {
+        List<ResolveInfo> mAvailableRecognitionServices =
+                mContext.getPackageManager().queryIntentServices(VOICE_RECOGNITION_SERVICE_TAG,
+                        PackageManager.GET_META_DATA);
+        for (ResolveInfo resolveInfo : mAvailableRecognitionServices) {
+            ComponentName componentName = new ComponentName(resolveInfo.serviceInfo.packageName,
+                    resolveInfo.serviceInfo.name);
+
+            VoiceRecognitionInfo voiceRecognitionInfo = new VoiceRecognitionInfo(mContext,
+                    resolveInfo.serviceInfo);
+            mVoiceRecognitionInfoList.add(voiceRecognitionInfo);
+            mRecognitionServiceNames.add(componentName);
+            mComponentToInfoMap.put(componentName, voiceRecognitionInfo);
+        }
+        Collections.sort(mVoiceRecognitionInfoList);
+    }
+
+    /**
+     * Base object used to represent {@link VoiceInteractionInfo} and {@link VoiceRecognitionInfo}.
+     */
+    abstract static class VoiceInputInfo implements Comparable {
+        private final Context mContext;
+        private final ServiceInfo mServiceInfo;
+
+        VoiceInputInfo(Context context, ServiceInfo serviceInfo) {
+            mContext = context;
+            mServiceInfo = serviceInfo;
+        }
+
+        protected Context getContext() {
+            return mContext;
+        }
+
+        protected ServiceInfo getServiceInfo() {
+            return mServiceInfo;
+        }
+
+        @Override
+        public int compareTo(Object o) {
+            return getTag().toString().compareTo(((VoiceInputInfo) o).getTag().toString());
+        }
+
+        /**
+         * Returns the {@link ComponentName} which represents the settings activity, if it exists.
+         */
+        @Nullable
+        ComponentName getSettingsActivityComponentName() {
+            String activity = getSettingsActivity();
+            return (activity != null) ? new ComponentName(mServiceInfo.packageName, activity)
+                    : null;
+        }
+
+        /** Returns the package name for the service represented by this {@link VoiceInputInfo}. */
+        String getPackageName() {
+            return mServiceInfo.packageName;
+        }
+
+        /**
+         * Returns the component name for the service represented by this {@link VoiceInputInfo}.
+         */
+        ComponentName getComponentName() {
+            return new ComponentName(mServiceInfo.packageName, mServiceInfo.name);
+        }
+
+        /**
+         * Returns the label to describe the service represented by this {@link VoiceInputInfo}.
+         */
+        abstract CharSequence getLabel();
+
+        /**
+         * The string representation of the settings activity for the service represented by this
+         * {@link VoiceInputInfo}.
+         */
+        protected abstract String getSettingsActivity();
+
+        /**
+         * Returns a tag used to determine the sort order of the {@link VoiceInputInfo} instances.
+         */
+        protected CharSequence getTag() {
+            return mServiceInfo.loadLabel(mContext.getPackageManager());
+        }
+    }
+
+    /** An object to represent {@link VoiceInteractionService} instances. */
+    static class VoiceInteractionInfo extends VoiceInputInfo {
+        private final VoiceInteractionServiceInfo mInteractionServiceInfo;
+
+        VoiceInteractionInfo(Context context, VoiceInteractionServiceInfo info) {
+            super(context, info.getServiceInfo());
+
+            mInteractionServiceInfo = info;
+        }
+
+        /** Returns the recognition service associated with this {@link VoiceInteractionService}. */
+        String getRecognitionService() {
+            return mInteractionServiceInfo.getRecognitionService();
+        }
+
+        @Override
+        protected String getSettingsActivity() {
+            return mInteractionServiceInfo.getSettingsActivity();
+        }
+
+        @Override
+        CharSequence getLabel() {
+            return getServiceInfo().applicationInfo.loadLabel(getContext().getPackageManager());
+        }
+    }
+
+    /** An object to represent {@link RecognitionService} instances. */
+    static class VoiceRecognitionInfo extends VoiceInputInfo {
+
+        VoiceRecognitionInfo(Context context, ServiceInfo serviceInfo) {
+            super(context, serviceInfo);
+        }
+
+        @Override
+        protected String getSettingsActivity() {
+            return getServiceSettingsActivity(getServiceInfo());
+        }
+
+        @Override
+        CharSequence getLabel() {
+            return getTag();
+        }
+
+        private String getServiceSettingsActivity(ServiceInfo serviceInfo) {
+            XmlResourceParser parser = null;
+            String settingActivity = null;
+            try {
+                parser = serviceInfo.loadXmlMetaData(getContext().getPackageManager(),
+                        RecognitionService.SERVICE_META_DATA);
+                if (parser == null) {
+                    throw new XmlPullParserException(
+                            "No " + RecognitionService.SERVICE_META_DATA + " meta-data for "
+                                    + serviceInfo.packageName);
+                }
+
+                Resources res = getContext().getPackageManager().getResourcesForApplication(
+                        serviceInfo.applicationInfo);
+
+                AttributeSet attrs = Xml.asAttributeSet(parser);
+
+                int type;
+                while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                        && type != XmlPullParser.START_TAG) {
+                    continue;
+                }
+
+                String nodeName = parser.getName();
+                if (!"recognition-service".equals(nodeName)) {
+                    throw new XmlPullParserException(
+                            "Meta-data does not start with recognition-service tag");
+                }
+
+                TypedArray array = res.obtainAttributes(attrs,
+                        com.android.internal.R.styleable.RecognitionService);
+                settingActivity = array.getString(
+                        com.android.internal.R.styleable.RecognitionService_settingsActivity);
+                array.recycle();
+            } catch (XmlPullParserException e) {
+                LOG.e("error parsing recognition service meta-data", e);
+            } catch (IOException e) {
+                LOG.e("error parsing recognition service meta-data", e);
+            } catch (PackageManager.NameNotFoundException e) {
+                LOG.e("error parsing recognition service meta-data", e);
+            } finally {
+                if (parser != null) parser.close();
+            }
+
+            return settingActivity;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/assist/VoiceInputUtils.java b/src/com/android/car/settings/applications/assist/VoiceInputUtils.java
new file mode 100644
index 0000000..0098fd8
--- /dev/null
+++ b/src/com/android/car/settings/applications/assist/VoiceInputUtils.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+/** Utilities to help interact with voice input services. */
+final class VoiceInputUtils {
+
+    private VoiceInputUtils() {
+    }
+
+    /**
+     * Chooses the current service based on the current voice interaction service and current
+     * recognizer service.
+     */
+    static ComponentName getCurrentService(Context context) {
+        ComponentName currentVoiceInteraction = getComponentNameOrNull(context,
+                Settings.Secure.VOICE_INTERACTION_SERVICE);
+        ComponentName currentVoiceRecognizer = getComponentNameOrNull(context,
+                Settings.Secure.VOICE_RECOGNITION_SERVICE);
+
+        if (currentVoiceInteraction != null) {
+            return currentVoiceInteraction;
+        } else if (currentVoiceRecognizer != null) {
+            return currentVoiceRecognizer;
+        } else {
+            return null;
+        }
+    }
+
+    private static ComponentName getComponentNameOrNull(Context context, String secureSettingKey) {
+        String currentSetting = Settings.Secure.getString(context.getContentResolver(),
+                secureSettingKey);
+        if (!TextUtils.isEmpty(currentSetting)) {
+            return ComponentName.unflattenFromString(currentSetting);
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceController.java
new file mode 100644
index 0000000..a686785
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceController.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+/**
+ * Base preference which handles the logic to display the currently selected default app.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller expects to
+ *            operate.
+ */
+public abstract class DefaultAppEntryBasePreferenceController<V extends Preference> extends
+        PreferenceController<V> {
+
+    private static final Logger LOG = new Logger(
+            DefaultAppEntryBasePreferenceController.class);
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public DefaultAppEntryBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected void updateState(V preference) {
+        CharSequence defaultAppLabel = getDefaultAppLabel();
+        if (!TextUtils.isEmpty(defaultAppLabel)) {
+            preference.setSummary(defaultAppLabel);
+            DefaultAppUtils.setSafeIcon(preference, getDefaultAppIcon(),
+                    getContext().getResources().getInteger(R.integer.default_app_safe_icon_size));
+        } else {
+            LOG.d("No default app");
+            preference.setSummary(R.string.app_list_preference_none);
+            preference.setIcon(null);
+        }
+    }
+
+    /** Specifies the currently selected default app. */
+    @Nullable
+    protected abstract DefaultAppInfo getCurrentDefaultAppInfo();
+
+    /** Gets the current process user id. */
+    protected int getCurrentProcessUserId() {
+        return mCarUserManagerHelper.getCurrentProcessUserId();
+    }
+
+    private Drawable getDefaultAppIcon() {
+        DefaultAppInfo app = getCurrentDefaultAppInfo();
+        if (app != null) {
+            return app.loadIcon();
+        }
+        return null;
+    }
+
+    private CharSequence getDefaultAppLabel() {
+        DefaultAppInfo app = getCurrentDefaultAppInfo();
+        if (app != null) {
+            return app.loadLabel();
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAppUtils.java b/src/com/android/car/settings/applications/defaultapps/DefaultAppUtils.java
new file mode 100644
index 0000000..2910860
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAppUtils.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.VectorDrawable;
+
+import androidx.preference.Preference;
+
+/** Utilities related to default apps. */
+public class DefaultAppUtils {
+
+    private DefaultAppUtils() {}
+
+    /**
+     * Sets the preference icon with a drawable that is scaled down to to avoid crashing Settings if
+     * it's too big.
+     */
+    public static void setSafeIcon(Preference pref, Drawable icon, int maxDimension) {
+        Drawable safeIcon = icon;
+        if ((icon != null) && !(icon instanceof VectorDrawable)) {
+            safeIcon = getSafeDrawable(icon, maxDimension);
+        }
+        pref.setIcon(safeIcon);
+    }
+
+    /**
+     * Gets a drawable with a limited size to avoid crashing Settings if it's too big.
+     *
+     * @param original     original drawable, typically an app icon.
+     * @param maxDimension maximum width/height, in pixels.
+     */
+    private static Drawable getSafeDrawable(Drawable original, int maxDimension) {
+        int actualWidth = original.getMinimumWidth();
+        int actualHeight = original.getMinimumHeight();
+
+        if (actualWidth <= maxDimension && actualHeight <= maxDimension) {
+            return original;
+        }
+
+        float scaleWidth = ((float) maxDimension) / actualWidth;
+        float scaleHeight = ((float) maxDimension) / actualHeight;
+        float scale = Math.min(scaleWidth, scaleHeight);
+        int width = (int) (actualWidth * scale);
+        int height = (int) (actualHeight * scale);
+
+        Bitmap bitmap;
+        if (original instanceof BitmapDrawable) {
+            bitmap = Bitmap.createScaledBitmap(((BitmapDrawable) original).getBitmap(), width,
+                    height, false);
+        } else {
+            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+            Canvas canvas = new Canvas(bitmap);
+            original.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+            original.draw(canvas);
+        }
+        return new BitmapDrawable(null, bitmap);
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceController.java
new file mode 100644
index 0000000..5e38a6e
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceController.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** Defines the shared logic in picking a default application. */
+public abstract class DefaultAppsPickerBasePreferenceController extends
+        PreferenceController<PreferenceGroup> implements Preference.OnPreferenceClickListener {
+
+    private static final Logger LOG = new Logger(DefaultAppsPickerBasePreferenceController.class);
+    private static final String DIALOG_KEY_ARG = "key_arg";
+    protected static final String NONE_PREFERENCE_KEY = "";
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final Map<String, DefaultAppInfo> mDefaultAppInfoMap = new HashMap<>();
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        setCurrentDefault(arguments.getString(DIALOG_KEY_ARG));
+        refreshUi();
+    };
+    private List<DefaultAppInfo> mCurrentCandidates;
+
+    public DefaultAppsPickerBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG),
+                mConfirmListener,
+                /* rejectListener= */ null);
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        List<DefaultAppInfo> defaultAppInfos = getCandidates();
+        if (!equalToCurrentCandidates(defaultAppInfos)) {
+            mCurrentCandidates = defaultAppInfos;
+            preferenceGroup.removeAll();
+            if (includeNonePreference()) {
+                preferenceGroup.addPreference(createNonePreference());
+            }
+            if (mCurrentCandidates != null) {
+                for (DefaultAppInfo info : mCurrentCandidates) {
+                    mDefaultAppInfoMap.put(info.getKey(), info);
+
+                    Preference preference = new Preference(getContext());
+                    bindPreference(preference, info);
+                    getPreference().addPreference(preference);
+                }
+            } else {
+                LOG.i("no candidate provided");
+            }
+        }
+
+        // This is done separately from above, since the summary can change without changing the
+        // list of candidates.
+        for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
+            Preference preference = preferenceGroup.getPreference(i);
+            String newPreferenceSummary = TextUtils.equals(preference.getKey(),
+                    getCurrentDefaultKey()) ? getContext().getString(
+                    R.string.default_app_selected_app) : "";
+            preference.setSummary(newPreferenceSummary);
+        }
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        String selectedKey = preference.getKey();
+        if (TextUtils.equals(selectedKey, getCurrentDefaultKey())) {
+            return false;
+        }
+
+        CharSequence message = getConfirmationMessage(mDefaultAppInfoMap.get(selectedKey));
+        if (!TextUtils.isEmpty(message)) {
+            ConfirmationDialogFragment dialogFragment =
+                    new ConfirmationDialogFragment.Builder(getContext())
+                            .setMessage(message.toString())
+                            .setPositiveButton(android.R.string.ok, mConfirmListener)
+                            .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null)
+                            .addArgumentString(DIALOG_KEY_ARG, selectedKey)
+                            .build();
+            getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
+        } else {
+            setCurrentDefault(selectedKey);
+            refreshUi();
+        }
+        return true;
+    }
+
+    /** Modifies the preference based on the information provided. */
+    protected void bindPreference(Preference preference, DefaultAppInfo info) {
+        preference.setTitle(info.loadLabel());
+        preference.setKey(info.getKey());
+        preference.setEnabled(info.enabled);
+        preference.setOnPreferenceClickListener(this);
+        DefaultAppUtils.setSafeIcon(preference, info.loadIcon(),
+                getContext().getResources().getInteger(R.integer.default_app_safe_icon_size));
+    }
+
+    /** Gets all of the candidates that should be considered when choosing a default application. */
+    @NonNull
+    protected abstract List<DefaultAppInfo> getCandidates();
+
+    /** Gets the key of the currently selected candidate. */
+    protected abstract String getCurrentDefaultKey();
+
+    /**
+     * Sets the key of the currently selected candidate.
+     *
+     * @param key represents the key from {@link DefaultAppInfo} which should mark the default
+     *            application.
+     */
+    protected abstract void setCurrentDefault(String key);
+
+    /**
+     * Defines the warning dialog message to be shown when a default app is selected.
+     */
+    protected CharSequence getConfirmationMessage(DefaultAppInfo info) {
+        return null;
+    }
+
+    /** Gets the current process user id. */
+    protected int getCurrentProcessUserId() {
+        return mCarUserManagerHelper.getCurrentProcessUserId();
+    }
+
+    /**
+     * Determines whether the list of default apps should include "none". Implementation classes can
+     * override this value to {@code false} in order to remove the "none" preference.
+     */
+    protected boolean includeNonePreference() {
+        return true;
+    }
+
+    private Preference createNonePreference() {
+        Preference nonePreference = new Preference(getContext());
+        nonePreference.setKey(NONE_PREFERENCE_KEY);
+        nonePreference.setTitle(R.string.app_list_preference_none);
+        nonePreference.setOnPreferenceClickListener(this);
+        nonePreference.setIcon(R.drawable.ic_remove_circle);
+        return nonePreference;
+    }
+
+    /**
+     * Check that the provided {@link DefaultAppInfo} list is equivalent to the current list of
+     * candidates.
+     */
+    private boolean equalToCurrentCandidates(@NonNull List<DefaultAppInfo> defaultAppInfos) {
+        if (mCurrentCandidates == null) {
+            return false;
+        }
+
+        Set<String> keys = new HashSet<>();
+        for (DefaultAppInfo info : mCurrentCandidates) {
+            keys.add(info.getKey());
+        }
+        for (DefaultAppInfo info : defaultAppInfos) {
+            if (!keys.remove(info.getKey())) {
+                return false;
+            }
+        }
+        return keys.isEmpty();
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceController.java
new file mode 100644
index 0000000..e64df67
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+/**
+ * Base preference which handles the logic to display the currently selected default app as well as
+ * an option to navigate to the settings of the selected default app.
+ */
+public abstract class DefaultAppsPickerEntryBasePreferenceController extends
+        DefaultAppEntryBasePreferenceController<ButtonPreference> {
+
+    public DefaultAppsPickerEntryBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ButtonPreference> getPreferenceType() {
+        return ButtonPreference.class;
+    }
+
+    @Override
+    protected void updateState(ButtonPreference preference) {
+        super.updateState(preference);
+
+        Intent intent = getSettingIntent(getCurrentDefaultAppInfo());
+        preference.showAction(intent != null);
+        if (intent != null) {
+            preference.setOnButtonClickListener(p -> getContext().startActivity(intent));
+        }
+    }
+
+    /**
+     * Returns an optional intent that will be launched when clicking the secondary action icon.
+     */
+    @Nullable
+    protected Intent getSettingIntent(@Nullable DefaultAppInfo info) {
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceController.java
new file mode 100644
index 0000000..a754297
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceController.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import android.app.role.RoleManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.service.voice.VoiceInteractionService;
+import android.service.voice.VoiceInteractionServiceInfo;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.app.AssistUtils;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import java.util.List;
+
+/**
+ * Business logic to show the currently selected default assistant and also show the assistant
+ * settings, if it exists.
+ */
+public class DefaultAssistantPickerEntryPreferenceController extends
+        DefaultAppsPickerEntryBasePreferenceController {
+
+    @VisibleForTesting
+    static final Intent ASSISTANT_SERVICE = new Intent(
+            VoiceInteractionService.SERVICE_INTERFACE);
+
+    private final AssistUtils mAssistUtils;
+
+    public DefaultAssistantPickerEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAssistUtils = new AssistUtils(context);
+    }
+
+    @Nullable
+    @Override
+    protected DefaultAppInfo getCurrentDefaultAppInfo() {
+        ComponentName cn = mAssistUtils.getAssistComponentForUser(getCurrentProcessUserId());
+        if (cn == null) {
+            return null;
+        }
+        return new DefaultAppInfo(getContext(), getContext().getPackageManager(),
+                getCurrentProcessUserId(), cn);
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(ButtonPreference preference) {
+        String packageName = getContext().getPackageManager().getPermissionControllerPackageName();
+        if (packageName != null) {
+            Intent intent = new Intent(Intent.ACTION_MANAGE_DEFAULT_APP)
+                    .setPackage(packageName)
+                    .putExtra(Intent.EXTRA_ROLE_NAME, RoleManager.ROLE_ASSISTANT);
+            getContext().startActivity(intent);
+        }
+        return true;
+    }
+
+    @Nullable
+    @Override
+    protected Intent getSettingIntent(@Nullable DefaultAppInfo info) {
+        ComponentName cn = mAssistUtils.getAssistComponentForUser(getCurrentProcessUserId());
+        if (cn == null) {
+            return null;
+        }
+
+        Intent probe = ASSISTANT_SERVICE.setPackage(cn.getPackageName());
+        PackageManager pm = getContext().getPackageManager();
+        List<ResolveInfo> services = pm.queryIntentServices(probe, PackageManager.GET_META_DATA);
+        if (services == null || services.isEmpty()) {
+            return null;
+        }
+
+        String activity = getAssistSettingsActivity(pm, services.get(0));
+        if (activity == null) {
+            return null;
+        }
+
+        return new Intent(Intent.ACTION_MAIN).setComponent(
+                new ComponentName(cn.getPackageName(), activity));
+    }
+
+    private String getAssistSettingsActivity(PackageManager pm, ResolveInfo resolveInfo) {
+        VoiceInteractionServiceInfo voiceInfo = new VoiceInteractionServiceInfo(pm,
+                resolveInfo.serviceInfo);
+        if (!voiceInfo.getSupportsAssist()) {
+            return null;
+        }
+        return voiceInfo.getSettingsActivity();
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceController.java
new file mode 100644
index 0000000..91652a1
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceController.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.provider.Settings;
+import android.service.autofill.AutofillService;
+import android.service.autofill.AutofillServiceInfo;
+import android.text.TextUtils;
+import android.view.autofill.AutofillManager;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import java.util.List;
+
+/** Business logic for displaying the currently selected autofill app. */
+public class DefaultAutofillPickerEntryPreferenceController extends
+        DefaultAppsPickerEntryBasePreferenceController {
+
+    private static final Logger LOG = new Logger(
+            DefaultAutofillPickerEntryPreferenceController.class);
+    private final AutofillManager mAutofillManager;
+
+    public DefaultAutofillPickerEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAutofillManager = context.getSystemService(AutofillManager.class);
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (mAutofillManager != null && mAutofillManager.isAutofillSupported()) {
+            return AVAILABLE;
+        }
+        return UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Nullable
+    @Override
+    protected DefaultAppInfo getCurrentDefaultAppInfo() {
+        String flattenComponent = Settings.Secure.getString(getContext().getContentResolver(),
+                Settings.Secure.AUTOFILL_SERVICE);
+        if (!TextUtils.isEmpty(flattenComponent)) {
+            DefaultAppInfo appInfo = new DefaultAppInfo(getContext(),
+                    getContext().getPackageManager(), getCurrentProcessUserId(),
+                    ComponentName.unflattenFromString(flattenComponent));
+            return appInfo;
+        }
+        return null;
+    }
+
+    @Nullable
+    @Override
+    protected Intent getSettingIntent(@Nullable DefaultAppInfo info) {
+        if (info == null) {
+            return null;
+        }
+
+        Intent intent = new Intent(AutofillService.SERVICE_INTERFACE);
+        List<ResolveInfo> resolveInfos = getContext().getPackageManager().queryIntentServices(
+                intent, PackageManager.GET_META_DATA);
+
+        for (ResolveInfo resolveInfo : resolveInfos) {
+            ServiceInfo serviceInfo = resolveInfo.serviceInfo;
+            String flattenKey = new ComponentName(serviceInfo.packageName,
+                    serviceInfo.name).flattenToString();
+            if (TextUtils.equals(info.getKey(), flattenKey)) {
+                String settingsActivity;
+                try {
+                    settingsActivity = new AutofillServiceInfo(getContext(), serviceInfo)
+                            .getSettingsActivity();
+                } catch (SecurityException e) {
+                    // Service does not declare the proper permission, ignore it.
+                    LOG.w("Error getting info for " + serviceInfo + ": " + e);
+                    continue;
+                }
+                if (TextUtils.isEmpty(settingsActivity)) {
+                    continue;
+                }
+                return new Intent(Intent.ACTION_MAIN).setComponent(
+                        new ComponentName(serviceInfo.packageName, settingsActivity));
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerFragment.java b/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerFragment.java
new file mode 100644
index 0000000..5a97fea
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Shows the option to choose the default autofill service. */
+public class DefaultAutofillPickerFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_autofill_picker_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceController.java b/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceController.java
new file mode 100644
index 0000000..8dcc5d9
--- /dev/null
+++ b/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceController.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import android.Manifest;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.provider.Settings;
+import android.service.autofill.AutofillService;
+import android.text.Html;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Business logic for displaying and choosing the default autofill service. */
+public class DefaultAutofillPickerPreferenceController extends
+        DefaultAppsPickerBasePreferenceController {
+
+    public DefaultAutofillPickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @NonNull
+    @Override
+    protected List<DefaultAppInfo> getCandidates() {
+        List<DefaultAppInfo> candidates = new ArrayList<>();
+        List<ResolveInfo> resolveInfos = getContext().getPackageManager().queryIntentServices(
+                new Intent(AutofillService.SERVICE_INTERFACE), PackageManager.GET_META_DATA);
+        for (ResolveInfo info : resolveInfos) {
+            String permission = info.serviceInfo.permission;
+            if (Manifest.permission.BIND_AUTOFILL_SERVICE.equals(permission)) {
+                candidates.add(new DefaultAppInfo(getContext(), getContext().getPackageManager(),
+                        getCurrentProcessUserId(),
+                        new ComponentName(info.serviceInfo.packageName, info.serviceInfo.name)));
+            }
+        }
+        return candidates;
+    }
+
+    @Override
+    protected String getCurrentDefaultKey() {
+        String setting = Settings.Secure.getString(getContext().getContentResolver(),
+                Settings.Secure.AUTOFILL_SERVICE);
+        if (setting != null) {
+            ComponentName componentName = ComponentName.unflattenFromString(setting);
+            if (componentName != null) {
+                return componentName.flattenToString();
+            }
+        }
+        return DefaultAppsPickerBasePreferenceController.NONE_PREFERENCE_KEY;
+    }
+
+    @Override
+    protected void setCurrentDefault(String key) {
+        Settings.Secure.putString(getContext().getContentResolver(),
+                Settings.Secure.AUTOFILL_SERVICE, key);
+    }
+
+    @Override
+    @Nullable
+    protected CharSequence getConfirmationMessage(DefaultAppInfo info) {
+        if (info == null) {
+            return null;
+        }
+
+        CharSequence appName = info.loadLabel();
+        String message = getContext().getString(R.string.autofill_confirmation_message, appName);
+        return Html.fromHtml(message, Html.FROM_HTML_MODE_LEGACY);
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
new file mode 100644
index 0000000..40adda3
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/AppLaunchSettingsBasePreferenceController.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.List;
+
+/**
+ * Shared logic for preference controllers related to app launch settings.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ *            expects to operate.
+ */
+public abstract class AppLaunchSettingsBasePreferenceController<V extends Preference> extends
+        PreferenceController<V> {
+
+    @VisibleForTesting
+    static final Intent sBrowserIntent = new Intent()
+            .setAction(Intent.ACTION_VIEW)
+            .addCategory(Intent.CATEGORY_BROWSABLE)
+            .setData(Uri.parse("http:"));
+
+    private final PackageManager mPm;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    private String mPackageName;
+    private ApplicationsState.AppEntry mAppEntry;
+
+    public AppLaunchSettingsBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPm = context.getPackageManager();
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    /** Sets the app entry associated with this settings screen. */
+    public void setAppEntry(ApplicationsState.AppEntry entry) {
+        mAppEntry = entry;
+    }
+
+    /** Returns the app entry. */
+    public ApplicationsState.AppEntry getAppEntry() {
+        return mAppEntry;
+    }
+
+    /** Returns the package name. */
+    public String getPackageName() {
+        return mAppEntry.info.packageName;
+    }
+
+    /** Returns the current user id. */
+    protected int getCurrentUserId() {
+        return mCarUserManagerHelper.getCurrentProcessUserId();
+    }
+
+    /** Returns {@code true} if the current package is a browser app. */
+    protected boolean isBrowserApp() {
+        sBrowserIntent.setPackage(getPackageName());
+        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(sBrowserIntent,
+                PackageManager.MATCH_ALL, getCurrentUserId());
+        for (ResolveInfo info : list) {
+            if (info.activityInfo != null && info.handleAllWebDataURI) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceController.java
new file mode 100644
index 0000000..310d14b
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceController.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+
+/**
+ * Business logic to define how the app should handle related domain links (whether related domain
+ * links should be opened always, never, or after asking).
+ */
+public class AppLinkStatePreferenceController extends
+        AppLaunchSettingsBasePreferenceController<ListPreference> {
+
+    private static final Logger LOG = new Logger(AppLinkStatePreferenceController.class);
+
+    private final PackageManager mPm;
+    private boolean mHasDomainUrls;
+
+    public AppLinkStatePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPm = context.getPackageManager();
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mHasDomainUrls =
+                (getAppEntry().info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS)
+                        != 0;
+    }
+
+    @Override
+    protected void updateState(ListPreference preference) {
+        if (isBrowserApp()) {
+            preference.setEnabled(false);
+        } else {
+            preference.setEnabled(mHasDomainUrls);
+
+            preference.setEntries(new CharSequence[]{
+                    getContext().getString(R.string.app_link_open_always),
+                    getContext().getString(R.string.app_link_open_ask),
+                    getContext().getString(R.string.app_link_open_never),
+            });
+            preference.setEntryValues(new CharSequence[]{
+                    Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS),
+                    Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK),
+                    Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER),
+            });
+
+            if (mHasDomainUrls) {
+                int state = mPm.getIntentVerificationStatusAsUser(getPackageName(),
+                        getCurrentUserId());
+                preference.setValueIndex(linkStateToIndex(state));
+            }
+        }
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+        if (isBrowserApp()) {
+            // We shouldn't get into this state, but if we do make sure
+            // not to cause any permanent mayhem.
+            return false;
+        }
+
+        int newState = Integer.parseInt((String) newValue);
+        int priorState = mPm.getIntentVerificationStatusAsUser(getPackageName(),
+                getCurrentUserId());
+        if (priorState == newState) {
+            return false;
+        }
+
+        boolean success = mPm.updateIntentVerificationStatusAsUser(getPackageName(), newState,
+                getCurrentUserId());
+        if (success) {
+            // Read back the state to see if the change worked.
+            int updatedState = mPm.getIntentVerificationStatusAsUser(getPackageName(),
+                    getCurrentUserId());
+            success = (newState == updatedState);
+        } else {
+            LOG.e("Couldn't update intent verification status!");
+        }
+        return success;
+    }
+
+    private int linkStateToIndex(int state) {
+        switch (state) {
+            case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS:
+                return getPreference().findIndexOfValue(
+                        Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS));
+            case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER:
+                return getPreference().findIndexOfValue(
+                        Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER));
+            case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK:
+            default:
+                return getPreference().findIndexOfValue(
+                        Integer.toString(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/ApplicationLaunchSettingsFragment.java b/src/com/android/car/settings/applications/managedomainurls/ApplicationLaunchSettingsFragment.java
new file mode 100644
index 0000000..198d67a
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/ApplicationLaunchSettingsFragment.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.Arrays;
+import java.util.List;
+
+/** Settings screen to show details about launching a specific app. */
+public class ApplicationLaunchSettingsFragment extends SettingsFragment {
+
+    @VisibleForTesting
+    static final String ARG_PACKAGE_NAME = "arg_package_name";
+
+    private ApplicationsState mState;
+    private ApplicationsState.AppEntry mAppEntry;
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    /** Creates a new instance of this fragment for the package specified in the arguments. */
+    public static ApplicationLaunchSettingsFragment newInstance(String pkg) {
+        ApplicationLaunchSettingsFragment fragment = new ApplicationLaunchSettingsFragment();
+        Bundle args = new Bundle();
+        args.putString(ARG_PACKAGE_NAME, pkg);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.application_launch_settings_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mState = ApplicationsState.getInstance(requireActivity().getApplication());
+
+        String pkgName = getArguments().getString(ARG_PACKAGE_NAME);
+        mAppEntry = mState.getEntry(pkgName, mCarUserManagerHelper.getCurrentProcessUserId());
+
+        ApplicationWithVersionPreferenceController appController = use(
+                ApplicationWithVersionPreferenceController.class,
+                R.string.pk_opening_links_app_details);
+        appController.setAppState(mState);
+        appController.setAppEntry(mAppEntry);
+
+        List<AppLaunchSettingsBasePreferenceController> preferenceControllers = Arrays.asList(
+                use(AppLinkStatePreferenceController.class,
+                        R.string.pk_opening_links_app_details_state),
+                use(DomainUrlsPreferenceController.class,
+                        R.string.pk_opening_links_app_details_urls),
+                use(ClearDefaultsPreferenceController.class,
+                        R.string.pk_opening_links_app_details_reset));
+
+        for (AppLaunchSettingsBasePreferenceController controller : preferenceControllers) {
+            controller.setAppEntry(mAppEntry);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/ApplicationWithVersionPreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/ApplicationWithVersionPreferenceController.java
new file mode 100644
index 0000000..5915c07
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/ApplicationWithVersionPreferenceController.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.applications.ApplicationPreferenceController;
+import com.android.car.settings.common.FragmentController;
+
+/** In addition to showing the app name and icon, shows the app version in the summary. */
+public class ApplicationWithVersionPreferenceController extends ApplicationPreferenceController {
+
+    public ApplicationWithVersionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        super.updateState(preference);
+        preference.setSummary(getAppVersion());
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceController.java
new file mode 100644
index 0000000..e608196
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceController.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.usb.IUsbManager;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.applications.AppUtils;
+
+/**
+ * Business logic to reset a user preference for auto launching an app.
+ *
+ * <p>i.e. if a user has both NavigationAppA and NavigationAppB installed and NavigationAppA is set
+ * as the default navigation app, the user can reset that preference to pick a different default
+ * navigation app.
+ */
+public class ClearDefaultsPreferenceController extends
+        AppLaunchSettingsBasePreferenceController<Preference> {
+
+    private static final Logger LOG = new Logger(ClearDefaultsPreferenceController.class);
+
+    private final IUsbManager mUsbManager;
+    private final PackageManager mPm;
+
+    public ClearDefaultsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
+        mUsbManager = IUsbManager.Stub.asInterface(b);
+        mPm = context.getPackageManager();
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        boolean autoLaunchEnabled = AppUtils.hasPreferredActivities(mPm, getPackageName())
+                || isDefaultBrowser(getPackageName())
+                || hasUsbDefaults(mUsbManager, getPackageName());
+
+        preference.setEnabled(autoLaunchEnabled);
+        if (autoLaunchEnabled) {
+            preference.setTitle(R.string.auto_launch_reset_text);
+            preference.setSummary(R.string.auto_launch_enable_text);
+        } else {
+            preference.setTitle(R.string.auto_launch_disable_text);
+            preference.setSummary(null);
+        }
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        if (mUsbManager != null) {
+            int userId = getCurrentUserId();
+            mPm.clearPackagePreferredActivities(getPackageName());
+            if (isDefaultBrowser(getPackageName())) {
+                mPm.setDefaultBrowserPackageNameAsUser(/* packageName= */ null, userId);
+            }
+            try {
+                mUsbManager.clearDefaults(getPackageName(), userId);
+            } catch (RemoteException e) {
+                LOG.e("mUsbManager.clearDefaults", e);
+            }
+            refreshUi();
+        }
+        return true;
+    }
+
+    private boolean isDefaultBrowser(String packageName) {
+        String defaultBrowser = mPm.getDefaultBrowserPackageNameAsUser(getCurrentUserId());
+        return packageName.equals(defaultBrowser);
+    }
+
+    private boolean hasUsbDefaults(IUsbManager usbManager, String packageName) {
+        try {
+            if (usbManager != null) {
+                return usbManager.hasDefaults(packageName, getCurrentUserId());
+            }
+        } catch (RemoteException e) {
+            LOG.e("mUsbManager.hasDefaults", e);
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
new file mode 100644
index 0000000..a45796c
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceController.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.app.Application;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.util.ArrayMap;
+import android.util.IconDrawableFactory;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.ArrayList;
+
+/** Business logic to populate the list of apps that deal with domain urls. */
+public class DomainAppPreferenceController extends PreferenceController<PreferenceGroup> {
+
+    private final ApplicationsState mApplicationsState;
+    private final PackageManager mPm;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    @VisibleForTesting
+    final ApplicationsState.Callbacks mApplicationStateCallbacks =
+            new ApplicationsState.Callbacks() {
+                @Override
+                public void onRunningStateChanged(boolean running) {
+                }
+
+                @Override
+                public void onPackageListChanged() {
+                }
+
+                @Override
+                public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+                    rebuildAppList(apps);
+                }
+
+                @Override
+                public void onPackageIconChanged() {
+                }
+
+                @Override
+                public void onPackageSizeChanged(String packageName) {
+                }
+
+                @Override
+                public void onAllSizesComputed() {
+                }
+
+                @Override
+                public void onLauncherInfoChanged() {
+                }
+
+                @Override
+                public void onLoadEntriesCompleted() {
+                    mSession.rebuild(ApplicationsState.FILTER_WITH_DOMAIN_URLS,
+                            ApplicationsState.ALPHA_COMPARATOR);
+                }
+            };
+
+    private ApplicationsState.Session mSession;
+    private ArrayMap<String, Preference> mPreferenceCache;
+
+    public DomainAppPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mApplicationsState = ApplicationsState.getInstance(
+                (Application) context.getApplicationContext());
+        mPm = context.getPackageManager();
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mSession == null) {
+            throw new IllegalStateException("session should be non null by this point");
+        }
+    }
+
+    /** Sets the lifecycle to create a new session. */
+    public void setLifecycle(Lifecycle lifecycle) {
+        mSession = mApplicationsState.newSession(mApplicationStateCallbacks, lifecycle);
+    }
+
+    @Override
+    protected void onStartInternal() {
+        // Resume the session earlier than the lifecycle so that cached information is updated
+        // even if settings is not resumed (for example in multi-display).
+        mSession.onResume();
+    }
+
+    @Override
+    protected void onStopInternal() {
+        // Since we resume early in onStart, make sure we clean up even if we don't receive onPause.
+        mSession.onPause();
+    }
+
+    private void rebuildAppList(ArrayList<ApplicationsState.AppEntry> apps) {
+        PreferenceGroup preferenceGroup = getPreference();
+        preferenceGroup.removeAll();
+        for (int i = 0; i < apps.size(); i++) {
+            ApplicationsState.AppEntry entry = apps.get(i);
+            preferenceGroup.addPreference(createPreference(entry));
+        }
+    }
+
+    private Preference createPreference(ApplicationsState.AppEntry entry) {
+        String key = entry.info.packageName + "|" + entry.info.uid;
+        IconDrawableFactory iconDrawableFactory = IconDrawableFactory.newInstance(getContext());
+        Preference preference = new Preference(getContext());
+        preference.setKey(key);
+        preference.setTitle(entry.label);
+        preference.setSummary(
+                DomainUrlsUtils.getDomainsSummary(getContext(), entry.info.packageName,
+                        mCarUserManagerHelper.getCurrentProcessUserId(),
+                        DomainUrlsUtils.getHandledDomains(mPm, entry.info.packageName)));
+        preference.setIcon(iconDrawableFactory.getBadgedIcon(entry.info));
+        preference.setOnPreferenceClickListener(pref -> {
+            getFragmentController().launchFragment(
+                    ApplicationLaunchSettingsFragment.newInstance(entry.info.packageName));
+            return true;
+        });
+        return preference;
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceController.java b/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceController.java
new file mode 100644
index 0000000..80b8f4e
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceController.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.util.ArraySet;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+
+/** Business logic to generate and see the list of supported domain urls. */
+public class DomainUrlsPreferenceController extends
+        AppLaunchSettingsBasePreferenceController<Preference> {
+
+    private ArraySet<String> mDomains;
+
+    public DomainUrlsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mDomains = DomainUrlsUtils.getHandledDomains(getContext().getPackageManager(),
+                getPackageName());
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setEnabled(!isBrowserApp());
+        preference.setSummary(
+                DomainUrlsUtils.getDomainsSummary(getContext(), getPackageName(),
+                        getCurrentUserId(), mDomains));
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        String newLines = System.lineSeparator() + System.lineSeparator();
+        String message = String.join(newLines, mDomains);
+
+        // Not exactly a "confirmation" dialog, but reusing to remove the need for a custom
+        // dialog fragment.
+        ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment.Builder(
+                getContext())
+                .setTitle(R.string.app_launch_supported_domain_urls_title)
+                .setMessage(message)
+                .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null)
+                .build();
+        getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtils.java b/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtils.java
new file mode 100644
index 0000000..9769196
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtils.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.IntentFilterVerificationInfo;
+import android.content.pm.PackageManager;
+import android.util.ArraySet;
+
+import com.android.car.settings.R;
+
+import java.util.List;
+
+/** Utility functions related to handling application domain urls. */
+public final class DomainUrlsUtils {
+    private DomainUrlsUtils() {
+    }
+
+    /** Get a summary text based on the number of handled domains. */
+    public static CharSequence getDomainsSummary(Context context, String packageName, int userId,
+            ArraySet<String> domains) {
+        PackageManager pm = context.getPackageManager();
+
+        // If the user has explicitly said "no" for this package, that's the string we should show.
+        int domainStatus = pm.getIntentVerificationStatusAsUser(packageName, userId);
+        if (domainStatus == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER) {
+            return context.getText(R.string.domain_urls_summary_none);
+        }
+        // Otherwise, ask package manager for the domains for this package, and show the first
+        // one (or none if there aren't any).
+        if (domains.isEmpty()) {
+            return context.getText(R.string.domain_urls_summary_none);
+        } else if (domains.size() == 1) {
+            return context.getString(R.string.domain_urls_summary_one, domains.valueAt(0));
+        } else {
+            return context.getString(R.string.domain_urls_summary_some, domains.valueAt(0));
+        }
+    }
+
+    /** Get the list of domains handled by the given package. */
+    public static ArraySet<String> getHandledDomains(PackageManager pm, String packageName) {
+        List<IntentFilterVerificationInfo> iviList = pm.getIntentFilterVerifications(packageName);
+        List<IntentFilter> filters = pm.getAllIntentFilters(packageName);
+
+        ArraySet<String> result = new ArraySet<>();
+        if (iviList != null && iviList.size() > 0) {
+            for (IntentFilterVerificationInfo ivi : iviList) {
+                for (String host : ivi.getDomains()) {
+                    result.add(host);
+                }
+            }
+        }
+        if (filters != null && filters.size() > 0) {
+            for (IntentFilter filter : filters) {
+                if (filter.hasCategory(Intent.CATEGORY_BROWSABLE)
+                        && (filter.hasDataScheme(IntentFilter.SCHEME_HTTP)
+                        || filter.hasDataScheme(IntentFilter.SCHEME_HTTPS))) {
+                    result.addAll(filter.getHostsList());
+                }
+            }
+        }
+        return result;
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/ManageDomainUrlsActivity.java b/src/com/android/car/settings/applications/managedomainurls/ManageDomainUrlsActivity.java
new file mode 100644
index 0000000..6920892
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/ManageDomainUrlsActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/**
+ * Starts {@link ManageDomainUrlsFragment} in a separate activity to help with the back navigation
+ * flow. This setting differs from the other settings in that the user arrives here from the
+ * PermissionController rather than from within the Settings app itself.
+ */
+public class ManageDomainUrlsActivity extends BaseCarSettingsActivity {
+
+    @Nullable
+    @Override
+    protected Fragment getInitialFragment() {
+        return new ManageDomainUrlsFragment();
+    }
+}
diff --git a/src/com/android/car/settings/applications/managedomainurls/ManageDomainUrlsFragment.java b/src/com/android/car/settings/applications/managedomainurls/ManageDomainUrlsFragment.java
new file mode 100644
index 0000000..7aacc16
--- /dev/null
+++ b/src/com/android/car/settings/applications/managedomainurls/ManageDomainUrlsFragment.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import android.content.Context;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Fragment which shows a list of applications to manage handled domain urls. */
+public class ManageDomainUrlsFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.manage_domain_urls_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        use(DomainAppPreferenceController.class, R.string.pk_opening_links_options).setLifecycle(
+                getLifecycle());
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/AppEntryListManager.java b/src/com/android/car/settings/applications/specialaccess/AppEntryListManager.java
new file mode 100644
index 0000000..7359f80
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/AppEntryListManager.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.app.Application;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import androidx.annotation.Nullable;
+
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Manages a list of {@link ApplicationsState.AppEntry} instances by syncing in the background and
+ * providing updates via a {@link Callback}. Clients may provide an {@link ExtraInfoBridge} to
+ * populate the {@link ApplicationsState.AppEntry#extraInfo} field with use case sepecific data.
+ * Clients may also provide an {@link ApplicationsState.AppFilter} via an {@link AppFilterProvider}
+ * to determine which entries will appear in the list updates.
+ *
+ * <p>Clients should call {@link #init(ExtraInfoBridge, AppFilterProvider, Callback)} to specify
+ * behavior and then {@link #start()} to begin loading. {@link #stop()} will cancel loading, and
+ * {@link #destroy()} will clean up resources when this class will no longer be used.
+ */
+public class AppEntryListManager {
+
+    /** Callback for receiving events from {@link AppEntryListManager}. */
+    public interface Callback {
+        /**
+         * Called when the list of {@link ApplicationsState.AppEntry} instances or the {@link
+         * ApplicationsState.AppEntry#extraInfo} fields have changed.
+         */
+        void onAppEntryListChanged(List<ApplicationsState.AppEntry> entries);
+    }
+
+    /**
+     * Provides an {@link ApplicationsState.AppFilter} to tailor the entries in the list updates.
+     */
+    public interface AppFilterProvider {
+        /**
+         * Returns the filter that should be used to trim the entries list before callback delivery.
+         */
+        ApplicationsState.AppFilter getAppFilter();
+    }
+
+    /** Bridges extra information to {@link ApplicationsState.AppEntry#extraInfo}. */
+    public interface ExtraInfoBridge {
+        /**
+         * Populates the {@link ApplicationsState.AppEntry#extraInfo} field on the {@code enrties}
+         * with the relevant data for the implementation.
+         */
+        void loadExtraInfo(List<ApplicationsState.AppEntry> entries);
+    }
+
+    private final ApplicationsState.Callbacks mSessionCallbacks =
+            new ApplicationsState.Callbacks() {
+                @Override
+                public void onRunningStateChanged(boolean running) {
+                    // No op.
+                }
+
+                @Override
+                public void onPackageListChanged() {
+                    forceUpdate();
+                }
+
+                @Override
+                public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+                    if (mCallback != null) {
+                        mCallback.onAppEntryListChanged(apps);
+                    }
+                }
+
+                @Override
+                public void onPackageIconChanged() {
+                    // No op.
+                }
+
+                @Override
+                public void onPackageSizeChanged(String packageName) {
+                    // No op.
+                }
+
+                @Override
+                public void onAllSizesComputed() {
+                    // No op.
+                }
+
+                @Override
+                public void onLauncherInfoChanged() {
+                    // No op.
+                }
+
+                @Override
+                public void onLoadEntriesCompleted() {
+                    mHasReceivedLoadEntries = true;
+                    forceUpdate();
+                }
+            };
+
+    private final ApplicationsState mApplicationsState;
+    private final BackgroundHandler mBackgroundHandler;
+    private final MainHandler mMainHandler;
+
+    private ExtraInfoBridge mExtraInfoBridge;
+    private AppFilterProvider mFilterProvider;
+    private Callback mCallback;
+    private ApplicationsState.Session mSession;
+
+    private boolean mHasReceivedLoadEntries;
+    private boolean mHasReceivedExtraInfo;
+
+    public AppEntryListManager(Context context) {
+        mApplicationsState = ApplicationsState.getInstance(
+                (Application) context.getApplicationContext());
+        // Run on the same background thread as the ApplicationsState to make sure updates don't
+        // conflict.
+        mBackgroundHandler = new BackgroundHandler(new WeakReference<>(this),
+                mApplicationsState.getBackgroundLooper());
+        mMainHandler = new MainHandler(new WeakReference<>(this));
+    }
+
+    /**
+     * Specifies the behavior of this manager.
+     *
+     * @param extraInfoBridge an optional bridge to load information into the entries.
+     * @param filterProvider  provides a filter to tailor the contents of the list updates.
+     * @param callback        callback to which updated lists are delivered.
+     */
+    public void init(@Nullable ExtraInfoBridge extraInfoBridge,
+            @Nullable AppFilterProvider filterProvider,
+            Callback callback) {
+        if (mSession != null) {
+            destroy();
+        }
+        mExtraInfoBridge = extraInfoBridge;
+        mFilterProvider = filterProvider;
+        mCallback = callback;
+        mSession = mApplicationsState.newSession(mSessionCallbacks);
+    }
+
+    /**
+     * Starts loading the information in the background. When loading is finished, the {@link
+     * Callback} will be notified on the main thread.
+     */
+    public void start() {
+        mSession.onResume();
+    }
+
+    /**
+     * Stops any pending loading.
+     */
+    public void stop() {
+        mSession.onPause();
+        clearHandlers();
+    }
+
+    /**
+     * Cleans up internal state when this will no longer be used.
+     */
+    public void destroy() {
+        mSession.onDestroy();
+        clearHandlers();
+        mExtraInfoBridge = null;
+        mFilterProvider = null;
+        mCallback = null;
+    }
+
+    /**
+     * Schedules updates for all {@link ApplicationsState.AppEntry} instances. When loading is
+     * finished, the {@link Callback} will be notified on the main thread.
+     */
+    public void forceUpdate() {
+        mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL);
+    }
+
+    /**
+     * Schedules an update for the given {@code entry}. When loading is finished, the {@link
+     * Callback} will be notified on the main thread.
+     */
+    public void forceUpdate(ApplicationsState.AppEntry entry) {
+        mBackgroundHandler.obtainMessage(BackgroundHandler.MSG_LOAD_PKG,
+                entry).sendToTarget();
+    }
+
+    private void rebuild() {
+        if (!mHasReceivedLoadEntries || !mHasReceivedExtraInfo) {
+            // Don't rebuild the list until all the app entries are loaded.
+            return;
+        }
+        mSession.rebuild((mFilterProvider != null) ? mFilterProvider.getAppFilter()
+                        : ApplicationsState.FILTER_EVERYTHING,
+                ApplicationsState.ALPHA_COMPARATOR, /* foreground= */ false);
+    }
+
+    private void clearHandlers() {
+        mBackgroundHandler.removeMessages(BackgroundHandler.MSG_LOAD_ALL);
+        mBackgroundHandler.removeMessages(BackgroundHandler.MSG_LOAD_PKG);
+        mMainHandler.removeMessages(MainHandler.MSG_INFO_UPDATED);
+    }
+
+    private void loadInfo(List<ApplicationsState.AppEntry> entries) {
+        if (mExtraInfoBridge != null) {
+            mExtraInfoBridge.loadExtraInfo(entries);
+        }
+        for (ApplicationsState.AppEntry entry : entries) {
+            mApplicationsState.ensureIcon(entry);
+        }
+    }
+
+    private static class BackgroundHandler extends Handler {
+        private static final int MSG_LOAD_ALL = 1;
+        private static final int MSG_LOAD_PKG = 2;
+
+        private final WeakReference<AppEntryListManager> mOuter;
+
+        BackgroundHandler(WeakReference<AppEntryListManager> outer, Looper looper) {
+            super(looper);
+            mOuter = outer;
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            AppEntryListManager outer = mOuter.get();
+            if (outer == null) {
+                return;
+            }
+            switch (msg.what) {
+                case MSG_LOAD_ALL:
+                    outer.loadInfo(outer.mSession.getAllApps());
+                    outer.mMainHandler.sendEmptyMessage(MainHandler.MSG_INFO_UPDATED);
+                    break;
+                case MSG_LOAD_PKG:
+                    ApplicationsState.AppEntry entry = (ApplicationsState.AppEntry) msg.obj;
+                    outer.loadInfo(Collections.singletonList(entry));
+                    outer.mMainHandler.sendEmptyMessage(MainHandler.MSG_INFO_UPDATED);
+                    break;
+            }
+        }
+    }
+
+    private static class MainHandler extends Handler {
+        private static final int MSG_INFO_UPDATED = 1;
+
+        private final WeakReference<AppEntryListManager> mOuter;
+
+        MainHandler(WeakReference<AppEntryListManager> outer) {
+            mOuter = outer;
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            AppEntryListManager outer = mOuter.get();
+            if (outer == null) {
+                return;
+            }
+            switch (msg.what) {
+                case MSG_INFO_UPDATED:
+                    outer.mHasReceivedExtraInfo = true;
+                    outer.rebuild();
+                    break;
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceController.java
new file mode 100644
index 0000000..043aec9
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceController.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.app.AppOpsManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.specialaccess.AppStateAppOpsBridge.PermissionState;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import com.android.settingslib.applications.ApplicationsState.AppFilter;
+import com.android.settingslib.applications.ApplicationsState.CompoundFilter;
+
+import java.util.List;
+
+/**
+ * Displays a list of toggles for applications requesting permission to perform the operation with
+ * which this controller was initialized. {@link #init(int, String, int)} should be called when
+ * this controller is instantiated to specify the {@link AppOpsManager} operation code to control
+ * access for.
+ */
+public class AppOpsPreferenceController extends PreferenceController<PreferenceGroup> {
+
+    private static final AppFilter FILTER_HAS_INFO = new AppFilter() {
+        @Override
+        public void init() {
+            // No op.
+        }
+
+        @Override
+        public boolean filterApp(AppEntry info) {
+            return info.extraInfo != null;
+        }
+    };
+
+    private final AppOpsManager mAppOpsManager;
+
+    private final Preference.OnPreferenceChangeListener mOnPreferenceChangeListener =
+            new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    AppOpPreference appOpPreference = (AppOpPreference) preference;
+                    AppEntry entry = appOpPreference.mEntry;
+                    PermissionState extraInfo = (PermissionState) entry.extraInfo;
+                    boolean allowOp = (Boolean) newValue;
+                    if (allowOp != extraInfo.isPermissible()) {
+                        mAppOpsManager.setMode(mAppOpsOpCode, entry.info.uid,
+                                entry.info.packageName,
+                                allowOp ? AppOpsManager.MODE_ALLOWED : mNegativeOpMode);
+                        // Update the extra info of this entry so that it reflects the new mode.
+                        mAppEntryListManager.forceUpdate(entry);
+                        return true;
+                    }
+                    return false;
+                }
+            };
+
+    private final AppEntryListManager.Callback mCallback = new AppEntryListManager.Callback() {
+        @Override
+        public void onAppEntryListChanged(List<AppEntry> entries) {
+            mEntries = entries;
+            refreshUi();
+        }
+    };
+
+    private int mAppOpsOpCode = AppOpsManager.OP_NONE;
+    private String mPermission;
+    private int mNegativeOpMode = -1;
+
+    @VisibleForTesting
+    AppEntryListManager mAppEntryListManager;
+    private List<AppEntry> mEntries;
+
+    private boolean mShowSystem;
+
+    public AppOpsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+        mAppEntryListManager = new AppEntryListManager(context);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /**
+     * Initializes this controller with the {@code appOpsOpCode} (selected from the operations in
+     * {@link AppOpsManager}) to control access for.
+     *
+     * @param permission     the {@link android.Manifest.permission} apps must hold to perform the
+     *                       operation.
+     * @param negativeOpMode the operation mode that will be passed to {@link
+     *                       AppOpsManager#setMode(int, int, String, int)} when access for a app is
+     *                       revoked.
+     */
+    public void init(int appOpsOpCode, String permission, int negativeOpMode) {
+        mAppOpsOpCode = appOpsOpCode;
+        mPermission = permission;
+        mNegativeOpMode = negativeOpMode;
+    }
+
+    /**
+     * Rebuilds the preference list to show system applications if {@code showSystem} is true.
+     * System applications will be hidden otherwise.
+     */
+    public void setShowSystem(boolean showSystem) {
+        if (mShowSystem != showSystem) {
+            mShowSystem = showSystem;
+            mAppEntryListManager.forceUpdate();
+        }
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mAppOpsOpCode == AppOpsManager.OP_NONE) {
+            throw new IllegalStateException("App operation code must be initialized");
+        }
+        if (mPermission == null) {
+            throw new IllegalStateException("Manifest permission must be initialized");
+        }
+        if (mNegativeOpMode == -1) {
+            throw new IllegalStateException("Negative case app operation mode must be initialized");
+        }
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        AppStateAppOpsBridge extraInfoBridge = new AppStateAppOpsBridge(getContext(), mAppOpsOpCode,
+                mPermission);
+        mAppEntryListManager.init(extraInfoBridge, this::getAppFilter, mCallback);
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mAppEntryListManager.start();
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mAppEntryListManager.stop();
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        mAppEntryListManager.destroy();
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        if (mEntries == null) {
+            // Still loading.
+            return;
+        }
+        preference.removeAll();
+        for (AppEntry entry : mEntries) {
+            Preference appOpPreference = new AppOpPreference(getContext(), entry);
+            appOpPreference.setOnPreferenceChangeListener(mOnPreferenceChangeListener);
+            preference.addPreference(appOpPreference);
+        }
+    }
+
+    @CallSuper
+    protected AppFilter getAppFilter() {
+        AppFilter filterObj = new CompoundFilter(FILTER_HAS_INFO,
+                ApplicationsState.FILTER_NOT_HIDE);
+        if (!mShowSystem) {
+            filterObj = new CompoundFilter(filterObj,
+                    ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER);
+        }
+        return filterObj;
+    }
+
+    private static class AppOpPreference extends SwitchPreference {
+
+        private final AppEntry mEntry;
+
+        AppOpPreference(Context context, AppEntry entry) {
+            super(context);
+            String key = entry.info.packageName + "|" + entry.info.uid;
+            setKey(key);
+            setTitle(entry.label);
+            setIcon(entry.icon);
+            setSummary(getAppStateText(entry.info));
+            setPersistent(false);
+            PermissionState extraInfo = (PermissionState) entry.extraInfo;
+            setChecked(extraInfo.isPermissible());
+            mEntry = entry;
+        }
+
+        private String getAppStateText(ApplicationInfo info) {
+            if ((info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) {
+                return getContext().getString(R.string.not_installed);
+            } else if (!info.enabled || info.enabledSetting
+                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
+                return getContext().getString(R.string.disabled);
+            }
+            return null;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridge.java b/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridge.java
new file mode 100644
index 0000000..4a3d0a1
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridge.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.app.AppGlobals;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.ArrayMap;
+import android.util.SparseArray;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.common.Logger;
+import com.android.internal.util.ArrayUtils;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Bridges {@link AppOpsManager} app operation permission information into {@link
+ * AppEntry#extraInfo} as {@link PermissionState} objects.
+ */
+public class AppStateAppOpsBridge implements AppEntryListManager.ExtraInfoBridge {
+
+    private static final Logger LOG = new Logger(AppStateAppOpsBridge.class);
+
+    private final Context mContext;
+    private final IPackageManager mIPackageManager;
+    private final List<UserHandle> mProfiles;
+    private final AppOpsManager mAppOpsManager;
+    private final int mAppOpsOpCode;
+    private final String mPermission;
+
+    /**
+     * Constructor.
+     *
+     * @param appOpsOpCode the {@link AppOpsManager} op code constant to fetch information for.
+     * @param permission   the {@link android.Manifest.permission} required to perform the
+     *                     operation.
+     */
+    public AppStateAppOpsBridge(Context context, int appOpsOpCode, String permission) {
+        this(context, appOpsOpCode, permission, AppGlobals.getPackageManager());
+    }
+
+    @VisibleForTesting
+    AppStateAppOpsBridge(Context context, int appOpsOpCode, String permission,
+            IPackageManager packageManager) {
+        mContext = context;
+        mIPackageManager = packageManager;
+        mProfiles = UserManager.get(context).getUserProfiles();
+        mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+        mAppOpsOpCode = appOpsOpCode;
+        mPermission = permission;
+    }
+
+    @Override
+    public void loadExtraInfo(List<AppEntry> entries) {
+        SparseArray<Map<String, PermissionState>> packageToStatesMapByProfileId =
+                getPackageToStateMapsByProfileId();
+        loadAppOpModes(packageToStatesMapByProfileId);
+
+        for (AppEntry entry : entries) {
+            Map<String, PermissionState> packageStatesMap = packageToStatesMapByProfileId.get(
+                    UserHandle.getUserId(entry.info.uid));
+            entry.extraInfo = (packageStatesMap != null) ? packageStatesMap.get(
+                    entry.info.packageName) : null;
+        }
+    }
+
+    private SparseArray<Map<String, PermissionState>> getPackageToStateMapsByProfileId() {
+        SparseArray<Map<String, PermissionState>> entries = new SparseArray<>();
+        try {
+            for (UserHandle profile : mProfiles) {
+                int profileId = profile.getIdentifier();
+                List<PackageInfo> packageInfos = getPackageInfos(profileId);
+                Map<String, PermissionState> entriesForProfile = new ArrayMap<>();
+                entries.put(profileId, entriesForProfile);
+                for (PackageInfo packageInfo : packageInfos) {
+                    boolean isAvailable = mIPackageManager.isPackageAvailable(
+                            packageInfo.packageName,
+                            profileId);
+                    if (shouldIgnorePackage(packageInfo) || !isAvailable) {
+                        LOG.d("Ignoring " + packageInfo.packageName + " isAvailable="
+                                + isAvailable);
+                        continue;
+                    }
+                    PermissionState newEntry = new PermissionState();
+                    newEntry.mRequestedPermissions = packageInfo.requestedPermissions;
+                    entriesForProfile.put(packageInfo.packageName, newEntry);
+                }
+            }
+        } catch (RemoteException e) {
+            LOG.w("PackageManager is dead. Can't get list of packages requesting "
+                    + mPermission, e);
+        }
+        return entries;
+    }
+
+    @SuppressWarnings("unchecked") // safe by specification.
+    private List<PackageInfo> getPackageInfos(int profileId) throws RemoteException {
+        return mIPackageManager.getPackagesHoldingPermissions(new String[]{mPermission},
+                PackageManager.GET_PERMISSIONS, profileId).getList();
+    }
+
+    private boolean shouldIgnorePackage(PackageInfo packageInfo) {
+        return packageInfo.packageName.equals("android")
+                || packageInfo.packageName.equals(mContext.getPackageName())
+                || !ArrayUtils.contains(packageInfo.requestedPermissions, mPermission);
+    }
+
+    /** Sets the {@link PermissionState#mAppOpMode} field. */
+    private void loadAppOpModes(
+            SparseArray<Map<String, PermissionState>> packageToStateMapsByProfileId) {
+        // Find out which packages have been granted permission from AppOps.
+        List<AppOpsManager.PackageOps> packageOps = mAppOpsManager.getPackagesForOps(
+                new int[]{mAppOpsOpCode});
+        if (packageOps == null) {
+            return;
+        }
+        for (AppOpsManager.PackageOps packageOp : packageOps) {
+            int userId = UserHandle.getUserId(packageOp.getUid());
+            Map<String, PermissionState> packageStateMap = packageToStateMapsByProfileId.get(
+                    userId);
+            if (packageStateMap == null) {
+                // Profile is not for the current user.
+                continue;
+            }
+            PermissionState permissionState = packageStateMap.get(packageOp.getPackageName());
+            if (permissionState == null) {
+                LOG.w("AppOp permission exists for package " + packageOp.getPackageName()
+                        + " of user " + userId + " but package doesn't exist or did not request "
+                        + mPermission + " access");
+                continue;
+            }
+            if (packageOp.getOps().size() < 1) {
+                LOG.w("No AppOps permission exists for package " + packageOp.getPackageName());
+                continue;
+            }
+            permissionState.mAppOpMode = packageOp.getOps().get(0).getMode();
+        }
+    }
+
+    /**
+     * Data class for use in {@link AppEntry#extraInfo} which indicates whether
+     * the app operation used to construct the data bridge is permitted for the associated
+     * application.
+     */
+    public static class PermissionState {
+        private String[] mRequestedPermissions;
+        private int mAppOpMode = AppOpsManager.MODE_DEFAULT;
+
+        /** Returns {@code true} if the entry's application is allowed to perform the operation. */
+        public boolean isPermissible() {
+            // Default behavior is permissible as long as the package requested this permission.
+            if (mAppOpMode == AppOpsManager.MODE_DEFAULT) {
+                return true;
+            }
+            return mAppOpMode == AppOpsManager.MODE_ALLOWED;
+        }
+
+        /** Returns the permissions requested by the entry's application. */
+        public String[] getRequestedPermissions() {
+            return mRequestedPermissions;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridge.java b/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridge.java
new file mode 100644
index 0000000..b13fedb
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridge.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.os.RemoteException;
+
+import com.android.internal.telephony.ISms;
+import com.android.internal.telephony.SmsUsageMonitor;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.List;
+
+/**
+ * Bridges the value of {@link ISms#getPremiumSmsPermission(String)} into the {@link
+ * ApplicationsState.AppEntry#extraInfo} for each entry's package name.
+ */
+public class AppStatePremiumSmsBridge implements AppEntryListManager.ExtraInfoBridge {
+
+    private final ISms mSmsManager;
+
+    public AppStatePremiumSmsBridge(ISms smsManager) {
+        mSmsManager = smsManager;
+    }
+
+    @Override
+    public void loadExtraInfo(List<ApplicationsState.AppEntry> entries) {
+        for (ApplicationsState.AppEntry entry : entries) {
+            entry.extraInfo = getSmsState(entry.info.packageName);
+        }
+    }
+
+    private int getSmsState(String packageName) {
+        try {
+            return mSmsManager.getPremiumSmsPermission(packageName);
+        } catch (RemoteException e) {
+            return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/ModifySystemSettingsFragment.java b/src/com/android/car/settings/applications/specialaccess/ModifySystemSettingsFragment.java
new file mode 100644
index 0000000..fae0522
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/ModifySystemSettingsFragment.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.content.Context;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.AppListFragment;
+
+/**
+ * Displays apps which have requested to modify system settings and their current allowed status.
+ */
+public class ModifySystemSettingsFragment extends AppListFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.modify_system_settings_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(AppOpsPreferenceController.class, R.string.pk_modify_system_settings).init(
+                AppOpsManager.OP_WRITE_SETTINGS,
+                Manifest.permission.WRITE_SETTINGS,
+                AppOpsManager.MODE_ERRORED);
+    }
+
+    @Override
+    protected void onToggleShowSystemApps(boolean showSystem) {
+        use(AppOpsPreferenceController.class, R.string.pk_modify_system_settings).setShowSystem(
+                showSystem);
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceController.java
new file mode 100644
index 0000000..05f2a80
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceController.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Launches into additional special access settings if they are supported by the permission
+ * controller package.
+ */
+public class MoreSpecialAccessPreferenceController extends PreferenceController<Preference> {
+
+    @Nullable
+    private final Intent mIntent;
+
+    public MoreSpecialAccessPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        PackageManager packageManager = getContext().getPackageManager();
+        String packageName = packageManager.getPermissionControllerPackageName();
+        if (packageName != null) {
+            Intent intent = new Intent(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES).setPackage(
+                    packageName);
+            ResolveInfo resolveInfo = packageManager.resolveActivity(intent,
+                    PackageManager.MATCH_DEFAULT_ONLY);
+            mIntent = (resolveInfo != null) ? intent : null;
+        } else {
+            mIntent = null;
+        }
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return (mIntent != null) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        if (mIntent != null) {
+            getContext().startActivity(mIntent);
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/NotificationAccessFragment.java b/src/com/android/car/settings/applications/specialaccess/NotificationAccessFragment.java
new file mode 100644
index 0000000..8583b3d
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/NotificationAccessFragment.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Displays controls for managing notification listener permissions. */
+public class NotificationAccessFragment extends SettingsFragment {
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.notification_access_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
new file mode 100644
index 0000000..0f30329
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.Manifest;
+import android.app.NotificationManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.os.AsyncTask;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.service.notification.NotificationListenerService;
+import android.util.IconDrawableFactory;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.ServiceListing;
+
+import java.util.List;
+
+/**
+ * Displays a list of notification listener services and provides toggles to allow the user to
+ * grant/revoke permission for listening to notifications. Before changing the value of a
+ * permission, the user is shown a confirmation dialog with information about the risks and
+ * potential effects.
+ */
+public class NotificationAccessPreferenceController extends PreferenceController<PreferenceGroup> {
+
+    private static final Logger LOG = new Logger(NotificationAccessPreferenceController.class);
+
+    @VisibleForTesting
+    static final String GRANT_CONFIRM_DIALOG_TAG =
+            "com.android.car.settings.applications.specialaccess.GrantNotificationAccessDialog";
+    @VisibleForTesting
+    static final String REVOKE_CONFIRM_DIALOG_TAG =
+            "com.android.car.settings.applications.specialaccess.RevokeNotificationAccessDialog";
+    private static final String KEY_SERVICE = "service";
+
+    private final NotificationManager mNm;
+    private final ServiceListing mServiceListing;
+    private final IconDrawableFactory mIconDrawableFactory;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    private final ServiceListing.Callback mCallback = this::onServicesReloaded;
+
+    private final ConfirmationDialogFragment.ConfirmListener mGrantConfirmListener = arguments -> {
+        ComponentName service = arguments.getParcelable(KEY_SERVICE);
+        grantNotificationAccess(service);
+    };
+    private final ConfirmationDialogFragment.ConfirmListener mRevokeConfirmListener =
+            arguments -> {
+                ComponentName service = arguments.getParcelable(KEY_SERVICE);
+                revokeNotificationAccess(service);
+            };
+
+    public NotificationAccessPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mNm = context.getSystemService(NotificationManager.class);
+        mServiceListing = new ServiceListing.Builder(context)
+                .setPermission(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE)
+                .setIntentAction(NotificationListenerService.SERVICE_INTERFACE)
+                .setSetting(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS)
+                .setTag(NotificationAccessPreferenceController.class.getSimpleName())
+                .setNoun("notification listener") // For logging.
+                .build();
+        mIconDrawableFactory = IconDrawableFactory.newInstance(context);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        ConfirmationDialogFragment grantConfirmDialogFragment =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        GRANT_CONFIRM_DIALOG_TAG);
+        ConfirmationDialogFragment.resetListeners(grantConfirmDialogFragment,
+                mGrantConfirmListener, /* rejectListener= */ null);
+
+        ConfirmationDialogFragment revokeConfirmDialogFragment =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        REVOKE_CONFIRM_DIALOG_TAG);
+        ConfirmationDialogFragment.resetListeners(revokeConfirmDialogFragment,
+                mRevokeConfirmListener, /* rejectListener= */ null);
+
+        mServiceListing.addCallback(mCallback);
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mServiceListing.reload();
+        mServiceListing.setListening(true);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mServiceListing.setListening(false);
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        mServiceListing.removeCallback(mCallback);
+    }
+
+    private void onServicesReloaded(List<ServiceInfo> services) {
+        PackageManager packageManager = getContext().getPackageManager();
+        services.sort(new PackageItemInfo.DisplayNameComparator(packageManager));
+        getPreference().removeAll();
+        for (ServiceInfo service : services) {
+            ComponentName cn = new ComponentName(service.packageName, service.name);
+            CharSequence title = null;
+            try {
+                title = packageManager.getApplicationInfoAsUser(service.packageName, /* flags= */ 0,
+                        mCarUserManagerHelper.getCurrentProcessUserId()).loadLabel(packageManager);
+            } catch (PackageManager.NameNotFoundException e) {
+                LOG.e("can't find package name", e);
+            }
+            String summary = service.loadLabel(packageManager).toString();
+            SwitchPreference pref = new SwitchPreference(getContext());
+            pref.setPersistent(false);
+            pref.setIcon(mIconDrawableFactory.getBadgedIcon(service, service.applicationInfo,
+                    UserHandle.getUserId(service.applicationInfo.uid)));
+            if (title != null && !title.equals(summary)) {
+                pref.setTitle(title);
+                pref.setSummary(summary);
+            } else {
+                pref.setTitle(summary);
+            }
+            pref.setKey(cn.flattenToString());
+            pref.setChecked(isAccessGranted(cn));
+            pref.setOnPreferenceChangeListener((preference, newValue) -> {
+                boolean enable = (boolean) newValue;
+                return promptUserToConfirmChange(cn, summary, enable);
+            });
+            getPreference().addPreference(pref);
+        }
+    }
+
+    private boolean isAccessGranted(ComponentName service) {
+        return mNm.isNotificationListenerAccessGranted(service);
+    }
+
+    private void grantNotificationAccess(ComponentName service) {
+        mNm.setNotificationListenerAccessGranted(service, /* granted= */ true);
+    }
+
+    private void revokeNotificationAccess(ComponentName service) {
+        mNm.setNotificationListenerAccessGranted(service, /* granted= */ false);
+        AsyncTask.execute(() -> {
+            if (!mNm.isNotificationPolicyAccessGrantedForPackage(service.getPackageName())) {
+                mNm.removeAutomaticZenRules(service.getPackageName());
+            }
+        });
+    }
+
+    private boolean promptUserToConfirmChange(ComponentName service, String label,
+            boolean grantAccess) {
+        if (isAccessGranted(service) == grantAccess) {
+            return true;
+        }
+        ConfirmationDialogFragment.Builder dialogFragment =
+                grantAccess ? createConfirmGrantDialogFragment(label)
+                        : createConfirmRevokeDialogFragment(label);
+        dialogFragment.addArgumentParcelable(KEY_SERVICE, service);
+        getFragmentController().showDialog(dialogFragment.build(),
+                grantAccess ? GRANT_CONFIRM_DIALOG_TAG : REVOKE_CONFIRM_DIALOG_TAG);
+        return false;
+    }
+
+    private ConfirmationDialogFragment.Builder createConfirmGrantDialogFragment(String label) {
+        String title = getContext().getResources().getString(
+                R.string.notification_listener_security_warning_title, label);
+        String summary = getContext().getResources().getString(
+                R.string.notification_listener_security_warning_summary, label);
+        return new ConfirmationDialogFragment.Builder(getContext())
+                .setTitle(title)
+                .setMessage(summary)
+                .setPositiveButton(R.string.allow, mGrantConfirmListener)
+                .setNegativeButton(R.string.deny, /* rejectionListener= */ null);
+    }
+
+    private ConfirmationDialogFragment.Builder createConfirmRevokeDialogFragment(String label) {
+        String summary = getContext().getResources().getString(
+                R.string.notification_listener_revoke_warning_summary, label);
+        return new ConfirmationDialogFragment.Builder(getContext())
+                .setMessage(summary)
+                .setPositiveButton(R.string.notification_listener_revoke_warning_confirm,
+                        mRevokeConfirmListener)
+                .setNegativeButton(R.string.notification_listener_revoke_warning_cancel,
+                        /* rejectionListener= */ null);
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessEntryPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessEntryPreferenceController.java
new file mode 100644
index 0000000..3270b0e
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessEntryPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller for the entry point to premium SMS access settings. It reads an overlayable config
+ * value to determine if premium SMS is supported and returns an appropriate availability status.
+ */
+public class PremiumSmsAccessEntryPreferenceController extends PreferenceController<Preference> {
+
+    public PremiumSmsAccessEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return getContext().getResources().getBoolean(R.bool.config_show_premium_sms) ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessFragment.java b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessFragment.java
new file mode 100644
index 0000000..d485581
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Displays controls for managing premium SMS access. */
+public class PremiumSmsAccessFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.premium_sms_access_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
new file mode 100644
index 0000000..1673dcb
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceController.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.telephony.ISms;
+import com.android.internal.telephony.SmsUsageMonitor;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import com.android.settingslib.applications.ApplicationsState.AppFilter;
+
+import java.util.List;
+
+/**
+ * Displays the list of apps which have a known premium SMS access state. When a user selects an
+ * app, they are shown a dialog which allows them to configure the state to one of:
+ *
+ * <ul>
+ * <li>Ask - the user will be prompted before app sends premium SMS.
+ * <li>Never allow - app can never send premium SMS.
+ * <li>Always allow - app can automatically send premium SMS.
+ * </ul>
+ */
+public class PremiumSmsAccessPreferenceController extends PreferenceController<PreferenceGroup> {
+
+    private static final Logger LOG = new Logger(PremiumSmsAccessPreferenceController.class);
+
+    private static final AppFilter FILTER_SMS_STATE_KNOWN = new AppFilter() {
+        @Override
+        public void init() {
+            // No op.
+        }
+
+        @Override
+        public boolean filterApp(AppEntry info) {
+            return info.extraInfo != null
+                    && (Integer) info.extraInfo != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN;
+        }
+    };
+
+    private final ISms mSmsManager;
+
+    private final Preference.OnPreferenceChangeListener mOnPreferenceChangeListener =
+            new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    PremiumSmsPreference appPreference = (PremiumSmsPreference) preference;
+                    AppEntry entry = appPreference.mEntry;
+                    int smsState = Integer.parseInt((String) newValue);
+                    if (smsState != (Integer) entry.extraInfo) {
+                        try {
+                            mSmsManager.setPremiumSmsPermission(entry.info.packageName, smsState);
+                        } catch (RemoteException e) {
+                            LOG.w("Unable to set premium sms permission for "
+                                    + entry.info.packageName + " " + entry.info.uid, e);
+                            return false;
+                        }
+                        // Update the extra info of this entry so that it reflects the new state.
+                        mAppEntryListManager.forceUpdate(entry);
+                        return true;
+                    }
+                    return false;
+                }
+            };
+
+    private final AppEntryListManager.Callback mCallback = new AppEntryListManager.Callback() {
+        @Override
+        public void onAppEntryListChanged(List<AppEntry> entries) {
+            mEntries = entries;
+            refreshUi();
+        }
+    };
+
+    @VisibleForTesting
+    AppEntryListManager mAppEntryListManager;
+    private List<AppEntry> mEntries;
+
+    public PremiumSmsAccessPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms"));
+        mAppEntryListManager = new AppEntryListManager(context);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mAppEntryListManager.init(new AppStatePremiumSmsBridge(mSmsManager),
+                () -> FILTER_SMS_STATE_KNOWN, mCallback);
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mAppEntryListManager.start();
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mAppEntryListManager.stop();
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        mAppEntryListManager.destroy();
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        if (mEntries == null) {
+            // Still loading.
+            return;
+        }
+        preference.removeAll();
+        for (AppEntry entry : mEntries) {
+            Preference appPreference = new PremiumSmsPreference(getContext(), entry);
+            appPreference.setOnPreferenceChangeListener(mOnPreferenceChangeListener);
+            preference.addPreference(appPreference);
+        }
+    }
+
+    private static class PremiumSmsPreference extends ListPreference {
+
+        private final AppEntry mEntry;
+
+        PremiumSmsPreference(Context context, AppEntry entry) {
+            super(context);
+            String key = entry.info.packageName + "|" + entry.info.uid;
+            setKey(key);
+            setTitle(entry.label);
+            setIcon(entry.icon);
+            setPersistent(false);
+            setEntries(R.array.premium_sms_access_values);
+            setEntryValues(new CharSequence[]{
+                    String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER),
+                    String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW),
+                    String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW)
+            });
+            setValue(String.valueOf(entry.extraInfo));
+            setSummary("%s");
+            mEntry = entry;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/SpecialAccessSettingsFragment.java b/src/com/android/car/settings/applications/specialaccess/SpecialAccessSettingsFragment.java
new file mode 100644
index 0000000..3c89a71
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/SpecialAccessSettingsFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Top-level page which lists the types of special access the user can grant to applications.
+ * Selecting an option will open a detailed page for granting access to individual apps.
+ */
+public class SpecialAccessSettingsFragment extends SettingsFragment {
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.special_access_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/UsageAccessFragment.java b/src/com/android/car/settings/applications/specialaccess/UsageAccessFragment.java
new file mode 100644
index 0000000..266afd8
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/UsageAccessFragment.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.content.Context;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.AppListFragment;
+
+/**
+ * Displays apps which have requested to access usage data and their current allowed status.
+ */
+public class UsageAccessFragment extends AppListFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.usage_access_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(AppOpsPreferenceController.class, R.string.pk_usage_access).init(
+                AppOpsManager.OP_GET_USAGE_STATS,
+                Manifest.permission.PACKAGE_USAGE_STATS,
+                AppOpsManager.MODE_IGNORED);
+    }
+
+    @Override
+    protected void onToggleShowSystemApps(boolean showSystem) {
+        use(AppOpsPreferenceController.class, R.string.pk_usage_access).setShowSystem(showSystem);
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/WifiControlFragment.java b/src/com/android/car/settings/applications/specialaccess/WifiControlFragment.java
new file mode 100644
index 0000000..87b7728
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/WifiControlFragment.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.AppListFragment;
+
+/**
+ * Displays apps which have requested to control Wi-Fi settings and their current allowed status.
+ */
+public class WifiControlFragment extends AppListFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_control_fragment;
+    }
+
+    @Override
+    protected void onToggleShowSystemApps(boolean showSystem) {
+        use(WifiControlPreferenceController.class, R.string.pk_wifi_control).setShowSystem(
+                showSystem);
+    }
+}
diff --git a/src/com/android/car/settings/applications/specialaccess/WifiControlPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/WifiControlPreferenceController.java
new file mode 100644
index 0000000..8780f1f
--- /dev/null
+++ b/src/com/android/car/settings/applications/specialaccess/WifiControlPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.applications.specialaccess.AppStateAppOpsBridge.PermissionState;
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.util.ArrayUtils;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppFilter;
+import com.android.settingslib.applications.ApplicationsState.CompoundFilter;
+
+/**
+ * Manages the list of apps requesting to control Wi-Fi settings. Apps that also request {@link
+ * Manifest.permission#NETWORK_SETTINGS} are excluded from the list as this permission overrules
+ * {@link Manifest.permission#CHANGE_WIFI_STATE}.
+ */
+public class WifiControlPreferenceController extends AppOpsPreferenceController {
+
+    private static final AppFilter FILTER_CHANGE_WIFI_STATE = new AppFilter() {
+        @Override
+        public void init() {
+            // No op.
+        }
+
+        @Override
+        public boolean filterApp(ApplicationsState.AppEntry info) {
+            return !ArrayUtils.contains(
+                    ((PermissionState) info.extraInfo).getRequestedPermissions(),
+                    Manifest.permission.NETWORK_SETTINGS);
+        }
+    };
+
+    public WifiControlPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        init(AppOpsManager.OP_CHANGE_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE,
+                AppOpsManager.MODE_IGNORED);
+    }
+
+    @Override
+    protected AppFilter getAppFilter() {
+        AppFilter filter = super.getAppFilter();
+        return new CompoundFilter(filter, FILTER_CHANGE_WIFI_STATE);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceController.java
new file mode 100644
index 0000000..e5e599b
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceController.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Displays the Bluetooth MAC address of the vehicle.
+ */
+public class BluetoothAddressPreferenceController extends
+        BluetoothPreferenceController<Preference> {
+
+    public BluetoothAddressPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        String address = BluetoothAdapter.getDefaultAdapter().getAddress();
+        String formattedAddress = getContext().getString(R.string.bluetooth_vehicle_mac_address,
+                address);
+        preference.setTitle(formattedAddress);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
new file mode 100644
index 0000000..8402974
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceController.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+/**
+ * Displays a list of bonded (paired) Bluetooth devices. Clicking on a device will attempt a
+ * connection with that device. If a device is already connected, a click will prompt the user to
+ * disconnect. Devices are shown with an addition affordance which launches the device details page.
+ */
+public class BluetoothBondedDevicesPreferenceController extends
+        BluetoothDevicesGroupPreferenceController {
+
+    public BluetoothBondedDevicesPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected BluetoothDeviceFilter.Filter getDeviceFilter() {
+        return BluetoothDeviceFilter.BONDED_DEVICE_FILTER;
+    }
+
+    @Override
+    protected BluetoothDevicePreference createDevicePreference(CachedBluetoothDevice cachedDevice) {
+        BluetoothDevicePreference pref = super.createDevicePreference(cachedDevice);
+        if (!getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)) {
+            pref.setWidgetLayoutResource(R.layout.details_preference_widget);
+            pref.setOnButtonClickListener(preference -> getFragmentController().launchFragment(
+                    BluetoothDeviceDetailsFragment.newInstance(cachedDevice)));
+            pref.showAction(true);
+        }
+        return pref;
+    }
+
+    @Override
+    protected void onDeviceClicked(CachedBluetoothDevice cachedDevice) {
+        if (cachedDevice.isConnected()) {
+            getFragmentController().showDialog(
+                    BluetoothDisconnectConfirmDialogFragment.newInstance(cachedDevice),
+                    /* tag= */ null);
+        } else {
+            cachedDevice.connect(/* connectAllProfiles= */ true);
+        }
+    }
+
+    @Override
+    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+        refreshUi();
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDetailFragment.java b/src/com/android/car/settings/bluetooth/BluetoothDetailFragment.java
deleted file mode 100644
index 2a27f58..0000000
--- a/src/com/android/car/settings/bluetooth/BluetoothDetailFragment.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.bluetooth;
-
-import android.bluetooth.BluetoothDevice;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-
-import com.android.car.list.EditTextLineItem;
-import com.android.car.list.SingleTextLineItem;
-import com.android.car.list.TypedPagedListAdapter;
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListSettingsFragment;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.bluetooth.LocalBluetoothProfile;
-
-import java.util.ArrayList;
-
-/**
- * Shows details about a bluetooth device, including actions related to the device,
- * e.g. forget etc. The intent should include information about the device, use that to
- * render UI, e.g. show name etc.
- */
-public class BluetoothDetailFragment extends ListSettingsFragment implements
-        BluetoothProfileLineItem.DataChangedListener {
-    private static final Logger LOG = new Logger(BluetoothDetailFragment.class);
-
-    public static final String EXTRA_BT_DEVICE = "extra_bt_device";
-
-    private BluetoothDevice mDevice;
-    private CachedBluetoothDevice mCachedDevice;
-
-    private CachedBluetoothDeviceManager mDeviceManager;
-    private LocalBluetoothManager mLocalManager;
-    private EditTextLineItem mInputLineItem;
-    private Button mOkButton;
-
-    public static BluetoothDetailFragment getInstance(BluetoothDevice btDevice) {
-        BluetoothDetailFragment bluetoothDetailFragment = new BluetoothDetailFragment();
-        Bundle bundle = ListSettingsFragment.getBundle();
-        bundle.putParcelable(EXTRA_BT_DEVICE, btDevice);
-        bundle.putInt(EXTRA_TITLE_ID, R.string.bluetooth_settings);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        bluetoothDetailFragment.setArguments(bundle);
-        return bluetoothDetailFragment;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mDevice = getArguments().getParcelable(EXTRA_BT_DEVICE);
-        mLocalManager =
-                LocalBluetoothManager.getInstance(getContext(), /* onInitCallback= */ null);
-        if (mLocalManager == null) {
-            LOG.e("Bluetooth is not supported on this device");
-            return;
-        }
-        mDeviceManager = mLocalManager.getCachedDeviceManager();
-        mCachedDevice = mDeviceManager.findDevice(mDevice);
-        if (mCachedDevice == null) {
-            mCachedDevice = mDeviceManager.addDevice(
-                    mLocalManager.getBluetoothAdapter(),
-                    mLocalManager.getProfileManager(),
-                    mDevice);
-        }
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        if (mDevice == null) {
-            LOG.w("No bluetooth device set.");
-            return;
-        }
-        super.onActivityCreated(savedInstanceState);
-
-        setupForgetButton();
-        setupOkButton();
-    }
-
-    @Override
-    public void onDataChanged() {
-        mPagedListAdapter.notifyDataSetChanged();
-    }
-
-    @Override
-    public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
-        ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
-        mInputLineItem = new EditTextLineItem(
-                getContext().getText(R.string.bluetooth_preference_paired_dialog_name_label),
-                mCachedDevice.getName());
-        mInputLineItem.setTextType(EditTextLineItem.TextType.TEXT);
-        lineItems.add(mInputLineItem);
-        lineItems.add(new SingleTextLineItem(getContext().getText(
-                R.string.bluetooth_device_advanced_profile_header_title)));
-        addProfileLineItems(lineItems);
-        return lineItems;
-    }
-
-    private void addProfileLineItems(ArrayList<TypedPagedListAdapter.LineItem> lineItems) {
-        for (LocalBluetoothProfile profile : mCachedDevice.getConnectableProfiles()) {
-            lineItems.add(new BluetoothProfileLineItem(
-                    getContext(), profile, mCachedDevice, this));
-        }
-    }
-
-    private void setupForgetButton() {
-        Button fortgetButton = getActivity().findViewById(R.id.action_button2);
-        fortgetButton.setVisibility(View.VISIBLE);
-        fortgetButton.setText(R.string.forget);
-        fortgetButton.setOnClickListener(v -> {
-            mCachedDevice.unpair();
-            getFragmentController().goBack();
-        });
-    }
-
-    private void setupOkButton() {
-        mOkButton = getActivity().findViewById(R.id.action_button1);
-        mOkButton.setText(android.R.string.ok);
-        mOkButton.setOnClickListener(v -> {
-            if (!mInputLineItem.getInput().equals(mCachedDevice.getName())) {
-                mCachedDevice.setName(mInputLineItem.getInput());
-            }
-            getFragmentController().goBack();
-        });
-    }
-}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceController.java
new file mode 100644
index 0000000..e2e74bf
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Displays the Bluetooth MAC address of a remote device.
+ */
+public class BluetoothDeviceAddressPreferenceController extends
+        BluetoothDevicePreferenceController<Preference> {
+
+    public BluetoothDeviceAddressPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        String address = getContext().getString(R.string.bluetooth_device_mac_address,
+                getCachedDevice().getAddress());
+        preference.setTitle(address);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragment.java
new file mode 100644
index 0000000..0c15570
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * Page which displays information for a remote Bluetooth device including the name, icon,
+ * connection status, supported profiles, and MAC. Buttons are shown to enable
+ * connecting/disconnecting and forgetting the device.
+ */
+public class BluetoothDeviceDetailsFragment extends SettingsFragment {
+
+    private static final String KEY_DEVICE_ADDRESS = "device_address";
+
+    private final CachedBluetoothDevice.Callback mDeviceCallback =
+            this::updateConnectionButtonState;
+
+    private CachedBluetoothDevice mCachedDevice;
+    private Button mConnectionButton;
+
+    /**
+     * Returns a new {@link BluetoothDeviceDetailsFragment} for the given {@code device}.
+     */
+    public static BluetoothDeviceDetailsFragment newInstance(CachedBluetoothDevice device) {
+        Bundle args = new Bundle();
+        args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, device.getAddress());
+        BluetoothDeviceDetailsFragment fragment = new BluetoothDeviceDetailsFragment();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.bluetooth_device_details_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        LocalBluetoothManager manager = BluetoothUtils.getLocalBtManager(context);
+        if (manager == null) {
+            goBack();
+            return;
+        }
+        String deviceAddress = getArguments().getString(KEY_DEVICE_ADDRESS);
+        BluetoothDevice remoteDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
+                deviceAddress);
+        mCachedDevice = manager.getCachedDeviceManager().findDevice(remoteDevice);
+        if (mCachedDevice == null) {
+            goBack();
+            return;
+        }
+
+        use(BluetoothDeviceNamePreferenceController.class,
+                R.string.pk_bluetooth_device_name).setCachedDevice(mCachedDevice);
+        use(BluetoothDeviceProfilesPreferenceController.class,
+                R.string.pk_bluetooth_device_profiles).setCachedDevice(mCachedDevice);
+        use(BluetoothDeviceAddressPreferenceController.class,
+                R.string.pk_bluetooth_device_address).setCachedDevice(mCachedDevice);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        setupForgetButton();
+        setupConnectionButton();
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mCachedDevice.registerCallback(mDeviceCallback);
+        updateConnectionButtonState();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mCachedDevice.unregisterCallback(mDeviceCallback);
+    }
+
+    private void setupForgetButton() {
+        Button forgetButton = requireActivity().findViewById(R.id.action_button2);
+        forgetButton.setVisibility(View.VISIBLE);
+        forgetButton.setText(R.string.forget);
+        forgetButton.setOnClickListener(v -> {
+            mCachedDevice.unpair();
+            goBack();
+        });
+    }
+
+    private void setupConnectionButton() {
+        mConnectionButton = requireActivity().findViewById(R.id.action_button1);
+        updateConnectionButtonState();
+    }
+
+    private void updateConnectionButtonState() {
+        mConnectionButton.setEnabled(!mCachedDevice.isBusy());
+        if (mCachedDevice.isConnected()) {
+            mConnectionButton.setText(R.string.disconnect);
+            mConnectionButton.setOnClickListener(view -> mCachedDevice.disconnect());
+        } else {
+            mConnectionButton.setText(R.string.connect);
+            mConnectionButton.setOnClickListener(
+                    view -> mCachedDevice.connect(/* connectAllProfiles= */ true));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceListAdapter.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceListAdapter.java
deleted file mode 100644
index 3566641..0000000
--- a/src/com/android/car/settings/bluetooth/BluetoothDeviceListAdapter.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.bluetooth;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothClass;
-import android.bluetooth.BluetoothDevice;
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemProperties;
-import android.util.Pair;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.car.widget.PagedListView;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.bluetooth.BluetoothCallback;
-import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
-import com.android.settingslib.bluetooth.HidProfile;
-import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.bluetooth.LocalBluetoothProfile;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Renders {@link android.bluetooth.BluetoothDevice} to a view to be displayed as a row in a list.
- */
-public class BluetoothDeviceListAdapter
-        extends RecyclerView.Adapter<BluetoothDeviceListAdapter.ViewHolder>
-        implements PagedListView.ItemCap, BluetoothCallback {
-    private static final Logger LOG = new Logger(BluetoothDeviceListAdapter.class);
-    // Copied from BluetoothDeviceNoNamePreferenceController.java
-    private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
-            "persist.bluetooth.showdeviceswithoutnames";
-    private static final int DEVICE_ROW_TYPE = 1;
-    private static final int BONDED_DEVICE_HEADER_TYPE = 2;
-    private static final int AVAILABLE_DEVICE_HEADER_TYPE = 3;
-    private static final int NUM_OF_HEADERS = 2;
-    public static final int DELAY_MILLIS = 1000;
-
-    private final Handler mHandler = new Handler(Looper.getMainLooper());
-    private final HashSet<CachedBluetoothDevice> mBondedDevices = new HashSet<>();
-    private final HashSet<CachedBluetoothDevice> mAvailableDevices = new HashSet<>();
-    private final LocalBluetoothAdapter mLocalAdapter;
-    private final LocalBluetoothManager mLocalManager;
-    private final CachedBluetoothDeviceManager mDeviceManager;
-    private final Context mContext;
-    private final BaseFragment.FragmentController mFragmentController;
-    private final boolean mShowDevicesWithoutNames;
-
-    /* Talk-back descriptions for various BT icons */
-    public final String mComputerDescription;
-    public final String mInputPeripheralDescription;
-    public final String mHeadsetDescription;
-    public final String mPhoneDescription;
-    public final String mImagingDescription;
-    public final String mHeadphoneDescription;
-    public final String mBluetoothDescription;
-
-    private SortTask mSortTask;
-
-    private ArrayList<CachedBluetoothDevice> mBondedDevicesSorted = new ArrayList<>();
-    private ArrayList<CachedBluetoothDevice> mAvailableDevicesSorted = new ArrayList<>();
-
-    class ViewHolder extends RecyclerView.ViewHolder {
-        private final ImageView mIcon;
-        private final TextView mTitle;
-        private final TextView mDesc;
-        private final ImageButton mActionButton;
-        private final DeviceAttributeChangeCallback mCallback =
-                new DeviceAttributeChangeCallback(this);
-
-        public ViewHolder(View view) {
-            super(view);
-            mTitle = (TextView) view.findViewById(R.id.title);
-            mDesc = (TextView) view.findViewById(R.id.desc);
-            mIcon = (ImageView) view.findViewById(R.id.icon);
-            mActionButton = (ImageButton) view.findViewById(R.id.action);
-            view.setOnClickListener(new BluetoothClickListener(this));
-        }
-    }
-
-    public BluetoothDeviceListAdapter(
-            Context context,
-            LocalBluetoothManager localBluetoothManager,
-            BaseFragment.FragmentController fragmentController) {
-        mContext = context;
-        mLocalManager = localBluetoothManager;
-        mFragmentController = fragmentController;
-        mLocalAdapter = mLocalManager.getBluetoothAdapter();
-        mDeviceManager = mLocalManager.getCachedDeviceManager();
-
-        Resources r = context.getResources();
-        mComputerDescription = r.getString(R.string.bluetooth_talkback_computer);
-        mInputPeripheralDescription = r.getString(
-                R.string.bluetooth_talkback_input_peripheral);
-        mHeadsetDescription = r.getString(R.string.bluetooth_talkback_headset);
-        mPhoneDescription = r.getString(R.string.bluetooth_talkback_phone);
-        mImagingDescription = r.getString(R.string.bluetooth_talkback_imaging);
-        mHeadphoneDescription = r.getString(R.string.bluetooth_talkback_headphone);
-        mBluetoothDescription = r.getString(R.string.bluetooth_talkback_bluetooth);
-        mShowDevicesWithoutNames =
-                SystemProperties.getBoolean(BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
-    }
-
-    public void start() {
-        mLocalManager.getEventManager().registerCallback(this);
-        if (mLocalAdapter.isEnabled()) {
-            mLocalAdapter.startScanning(true);
-            addBondDevices();
-            addCachedDevices();
-        }
-        // create task here to avoid re-executing existing tasks.
-        mSortTask = new SortTask();
-        mSortTask.execute();
-    }
-
-    public void stop() {
-        mLocalAdapter.stopScanning();
-        mDeviceManager.clearNonBondedDevices();
-        mLocalManager.getEventManager().unregisterCallback(this);
-        mBondedDevices.clear();
-        mBondedDevicesSorted.clear();
-        mAvailableDevices.clear();
-        mAvailableDevicesSorted.clear();
-        mSortTask.cancel(true);
-    }
-
-    @Override
-    public BluetoothDeviceListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
-            int viewType) {
-        View v;
-        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
-        switch (viewType) {
-            case BONDED_DEVICE_HEADER_TYPE:
-                v = layoutInflater.inflate(R.layout.single_text_line_item, parent, false);
-                v.setEnabled(false);
-                ((TextView) v.findViewById(R.id.title)).setText(
-                        R.string.bluetooth_preference_paired_devices);
-                break;
-            case AVAILABLE_DEVICE_HEADER_TYPE:
-                v = layoutInflater.inflate(R.layout.single_text_line_item, parent, false);
-                v.setEnabled(false);
-                ((TextView) v.findViewById(R.id.title)).setText(
-                        R.string.bluetooth_preference_found_devices);
-                break;
-            default:
-                v = layoutInflater.inflate(R.layout.icon_widget_line_item, parent, false);
-        }
-        return new ViewHolder(v);
-    }
-
-    @Override
-    public int getItemCount() {
-        return mAvailableDevicesSorted.size() + NUM_OF_HEADERS + mBondedDevicesSorted.size();
-    }
-
-    @Override
-    public void setMaxItems(int maxItems) {
-        // no limit in this list.
-    }
-
-    @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
-        final CachedBluetoothDevice bluetoothDevice = getItem(position);
-        if (bluetoothDevice == null) {
-            // this row is for in-list headers
-            return;
-        }
-        if (holder.getOldPosition() != RecyclerView.NO_POSITION) {
-            getItem(holder.getOldPosition()).unregisterCallback(holder.mCallback);
-        }
-        bluetoothDevice.registerCallback(holder.mCallback);
-        holder.mTitle.setText(bluetoothDevice.getName());
-        Pair<Integer, String> pair = getBtClassDrawableWithDescription(bluetoothDevice);
-        holder.mIcon.setImageResource(pair.first);
-        String summaryText = bluetoothDevice.getCarConnectionSummary();
-        if (summaryText != null) {
-            holder.mDesc.setText(summaryText);
-            holder.mDesc.setVisibility(View.VISIBLE);
-        } else {
-            holder.mDesc.setVisibility(View.GONE);
-        }
-        if (BluetoothDeviceFilter.BONDED_DEVICE_FILTER.matches(bluetoothDevice.getDevice())) {
-            holder.mActionButton.setVisibility(View.VISIBLE);
-            holder.mActionButton.setOnClickListener(v -> {
-                mFragmentController.launchFragment(
-                        BluetoothDetailFragment.getInstance(bluetoothDevice.getDevice()));
-                });
-        } else {
-            holder.mActionButton.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public int getItemViewType(int position) {
-        // the first row is the header for the bonded device list;
-        if (position == 0) {
-            return BONDED_DEVICE_HEADER_TYPE;
-        }
-        // after the end of the bonded device list is the header of the available device list.
-        if (position == mBondedDevicesSorted.size() + 1) {
-            return AVAILABLE_DEVICE_HEADER_TYPE;
-        }
-        return DEVICE_ROW_TYPE;
-    }
-
-    private CachedBluetoothDevice getItem(int position) {
-        if (position > 0 && position <= mBondedDevicesSorted.size()) {
-            // off set the header row
-            return mBondedDevicesSorted.get(position - 1);
-        }
-        if (position > mBondedDevicesSorted.size() + 1
-                && position <= mBondedDevicesSorted.size() + 1 + mAvailableDevicesSorted.size()) {
-            // off set two header row and the size of bonded device list.
-            return mAvailableDevicesSorted.get(
-                    position - NUM_OF_HEADERS - mBondedDevicesSorted.size());
-        }
-        // otherwise it's a in list header
-        return null;
-    }
-
-    // callback functions
-    @Override
-    public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
-        if (addDevice(cachedDevice)) {
-            ArrayList<CachedBluetoothDevice> devices = new ArrayList<>(mBondedDevices);
-            Collections.sort(devices);
-            mBondedDevicesSorted = devices;
-            notifyDataSetChanged();
-        }
-    }
-
-    @Override
-    public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {
-        // the device might changed bonding state, so need to remove from both sets.
-        if (mBondedDevices.remove(cachedDevice)) {
-            mBondedDevicesSorted.remove(cachedDevice);
-        }
-        mAvailableDevices.remove(cachedDevice);
-        notifyDataSetChanged();
-    }
-
-    @Override
-    public void onBluetoothStateChanged(int bluetoothState) {
-        switch (bluetoothState) {
-            case BluetoothAdapter.STATE_OFF:
-                mBondedDevices.clear();
-                mBondedDevicesSorted.clear();
-                mAvailableDevices.clear();
-                mAvailableDevicesSorted.clear();
-                notifyDataSetChanged();
-                break;
-            case BluetoothAdapter.STATE_ON:
-                mLocalAdapter.startScanning(true);
-                addBondDevices();
-                addCachedDevices();
-                break;
-            default:
-        }
-    }
-
-    public void reset() {
-        mBondedDevices.clear();
-        mBondedDevicesSorted.clear();
-        mAvailableDevices.clear();
-        mAvailableDevicesSorted.clear();
-        mLocalAdapter.startScanning(true);
-        addBondDevices();
-        addCachedDevices();
-        notifyDataSetChanged();
-    }
-
-    @Override
-    public void onScanningStateChanged(boolean started) {
-        // don't care
-    }
-
-    @Override
-    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
-        onDeviceDeleted(cachedDevice);
-        onDeviceAdded(cachedDevice);
-    }
-
-    /**
-     * Call back for the first connection or the last connection to ANY device/profile. Not
-     * suitable for monitor per device level connection.
-     */
-    @Override
-    public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {
-        onDeviceDeleted(cachedDevice);
-        onDeviceAdded(cachedDevice);
-    }
-
-    @Override
-    public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
-        // Not used (for now)
-    }
-
-    @Override
-    public void onAudioModeChanged() {
-        // Not used (for now)
-    }
-
-    private void addDevices(Collection<CachedBluetoothDevice> cachedDevices) {
-        boolean needSort = false;
-        for (CachedBluetoothDevice device : cachedDevices) {
-            if (addDevice(device)) {
-                needSort = true;
-            }
-        }
-        if (needSort) {
-            ArrayList<CachedBluetoothDevice> devices =
-                    new ArrayList<CachedBluetoothDevice>(mBondedDevices);
-            Collections.sort(devices);
-            mBondedDevicesSorted = devices;
-            notifyDataSetChanged();
-        }
-    }
-
-    /**
-     * @return {@code true} if list changed and needed sort again.
-     */
-    private boolean addDevice(CachedBluetoothDevice cachedDevice) {
-        boolean needSort = false;
-        if (BluetoothDeviceFilter.BONDED_DEVICE_FILTER.matches(cachedDevice.getDevice())) {
-            if (mBondedDevices.add(cachedDevice)) {
-                needSort = true;
-            }
-        }
-        if (BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER.matches(cachedDevice.getDevice())
-                && (mShowDevicesWithoutNames || cachedDevice.hasHumanReadableName())) {
-            // reset is done at SortTask.
-            mAvailableDevices.add(cachedDevice);
-        }
-        return needSort;
-    }
-
-    private void addBondDevices() {
-        Set<BluetoothDevice> bondedDevices = mLocalAdapter.getBondedDevices();
-        if (bondedDevices == null) {
-            return;
-        }
-        ArrayList<CachedBluetoothDevice> cachedBluetoothDevices = new ArrayList<>();
-        for (BluetoothDevice device : bondedDevices) {
-            CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice(device);
-            if (cachedDevice == null) {
-                cachedDevice = mDeviceManager.addDevice(
-                        mLocalAdapter, mLocalManager.getProfileManager(), device);
-            }
-            cachedBluetoothDevices.add(cachedDevice);
-        }
-        addDevices(cachedBluetoothDevices);
-    }
-
-    private void addCachedDevices() {
-        addDevices(mDeviceManager.getCachedDevicesCopy());
-    }
-
-    private Pair<Integer, String> getBtClassDrawableWithDescription(
-            CachedBluetoothDevice bluetoothDevice) {
-        BluetoothClass btClass = bluetoothDevice.getBtClass();
-        if (btClass != null) {
-            switch (btClass.getMajorDeviceClass()) {
-                case BluetoothClass.Device.Major.COMPUTER:
-                    return new Pair<>(R.drawable.ic_bt_laptop, mComputerDescription);
-
-                case BluetoothClass.Device.Major.PHONE:
-                    return new Pair<>(R.drawable.ic_bt_cellphone, mPhoneDescription);
-
-                case BluetoothClass.Device.Major.PERIPHERAL:
-                    return new Pair<>(HidProfile.getHidClassDrawable(btClass),
-                            mInputPeripheralDescription);
-
-                case BluetoothClass.Device.Major.IMAGING:
-                    return new Pair<>(R.drawable.ic_bt_imaging, mImagingDescription);
-
-                default:
-                    // unrecognized device class; continue
-            }
-        } else {
-            LOG.w("btClass is null");
-        }
-
-        List<LocalBluetoothProfile> profiles = bluetoothDevice.getProfiles();
-        for (LocalBluetoothProfile profile : profiles) {
-            int resId = profile.getDrawableResource(btClass);
-            if (resId != 0) {
-                return new Pair<Integer, String>(resId, null);
-            }
-        }
-        if (btClass != null) {
-            if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
-                return new Pair<Integer, String>(R.drawable.ic_bt_headset_hfp, mHeadsetDescription);
-            }
-            if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
-                return new Pair<Integer, String>(R.drawable.ic_bt_headphones_a2dp,
-                        mHeadphoneDescription);
-            }
-        }
-        return new Pair<Integer, String>(R.drawable.ic_settings_bluetooth, mBluetoothDescription);
-    }
-
-    /**
-     * Updates device render upon device attribute change.
-     */
-    // TODO: This is a walk around for handling attribute callback. Since the callback doesn't
-    // contain the information about which device needs to be updated, we have to maintain a
-    // local reference to the device. Fix the code in CachedBluetoothDevice.Callback to return
-    // a reference of the device been updated.
-    private class DeviceAttributeChangeCallback implements CachedBluetoothDevice.Callback {
-
-        private final ViewHolder mViewHolder;
-
-        DeviceAttributeChangeCallback(ViewHolder viewHolder) {
-            mViewHolder = viewHolder;
-        }
-
-        @Override
-        public void onDeviceAttributesChanged() {
-            notifyItemChanged(mViewHolder.getAdapterPosition());
-        }
-    }
-
-    private class BluetoothClickListener implements OnClickListener {
-        private final ViewHolder mViewHolder;
-
-        BluetoothClickListener(ViewHolder viewHolder) {
-            mViewHolder = viewHolder;
-        }
-
-        @Override
-        public void onClick(View v) {
-            CachedBluetoothDevice device = getItem(mViewHolder.getAdapterPosition());
-            int bondState = device.getBondState();
-
-            if (device.isConnected()) {
-                // TODO: ask user for confirmation
-                device.disconnect();
-            } else if (bondState == BluetoothDevice.BOND_BONDED) {
-                device.connect(true);
-            } else if (bondState == BluetoothDevice.BOND_NONE) {
-                if (!device.startPairing()) {
-                    showError(device.getName(),
-                            R.string.bluetooth_pairing_error_message);
-                    return;
-                }
-                // allow MAP and PBAP since this is client side, permission should be handled on
-                // server side. i.e. the phone side.
-                device.setPhonebookPermissionChoice(CachedBluetoothDevice.ACCESS_ALLOWED);
-                device.setMessagePermissionChoice(CachedBluetoothDevice.ACCESS_ALLOWED);
-            }
-        }
-    }
-
-    private void showError(String name, int messageResId) {
-        String message = mContext.getString(messageResId, name);
-        Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
-    }
-
-    /**
-     * Provides an ordered bt device list periodically.
-     */
-    // TODO: improve the way we sort BT devices. Ideally we should keep all devices in a TreeSet
-    // and as devices are added the correct order is maintained, that requires a consistent
-    // logic between equals and compareTo function, unfortunately it's not the case in
-    // CachedBluetoothDevice class. Fix that and improve the way we order devices.
-    private class SortTask extends AsyncTask<Void, Void, ArrayList<CachedBluetoothDevice>> {
-
-        /**
-         * Returns {code null} if no changed are made.
-         */
-        @Override
-        protected ArrayList<CachedBluetoothDevice> doInBackground(Void... v) {
-            if (mAvailableDevicesSorted != null
-                    && mAvailableDevicesSorted.size() == mAvailableDevices.size()) {
-                return null;
-            }
-            ArrayList<CachedBluetoothDevice> devices =
-                    new ArrayList<CachedBluetoothDevice>(mAvailableDevices);
-            Collections.sort(devices);
-            return devices;
-        }
-
-        @Override
-        protected void onPostExecute(ArrayList<CachedBluetoothDevice> devices) {
-            // skip if no changes are made.
-            if (devices != null) {
-                mAvailableDevicesSorted = devices;
-                notifyDataSetChanged();
-            }
-            mHandler.postDelayed(new Runnable() {
-                public void run() {
-                    mSortTask = new SortTask();
-                    mSortTask.execute();
-                }
-            }, DELAY_MILLIS);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
new file mode 100644
index 0000000..3d09b37
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.Pair;
+
+import androidx.preference.Preference;
+
+import com.android.car.apps.common.util.Themes;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+import java.util.StringJoiner;
+
+/**
+ * Displays the name, icon, and status (connected/disconnected, etc.) of a remote Bluetooth device.
+ * When the associated preference is clicked, a dialog is shown to allow the user to update the
+ * display name of the remote device.
+ */
+public class BluetoothDeviceNamePreferenceController extends
+        BluetoothDevicePreferenceController<Preference> {
+
+    public BluetoothDeviceNamePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        CachedBluetoothDevice cachedDevice = getCachedDevice();
+        Pair<Drawable, String> pair =
+                com.android.settingslib.bluetooth.BluetoothUtils.getBtClassDrawableWithDescription(
+                        getContext(),
+                        cachedDevice);
+        StringJoiner summaryJoiner = new StringJoiner(System.lineSeparator());
+        summaryJoiner.setEmptyValue("");
+
+        String summaryText = cachedDevice.getCarConnectionSummary();
+        if (!TextUtils.isEmpty(summaryText)) {
+            summaryJoiner.add(summaryText);
+        }
+        // If hearing aids are connected, two battery statuses should be shown.
+        String pairDeviceSummary =
+                getBluetoothManager().getCachedDeviceManager().getSubDeviceSummary(cachedDevice);
+        if (!TextUtils.isEmpty(pairDeviceSummary)) {
+            summaryJoiner.add(pairDeviceSummary);
+        }
+        preference.setTitle(cachedDevice.getName());
+        preference.setIcon(pair.first);
+        preference.getIcon().setTintList(
+                Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+        preference.setSummary(summaryJoiner.toString());
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        getFragmentController().showDialog(
+                RemoteRenameDialogFragment.newInstance(getCachedDevice()),
+                RemoteRenameDialogFragment.TAG);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePickerActivity.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerActivity.java
new file mode 100644
index 0000000..db89075
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/**
+ * Displays a list of Bluetooth devices at the request of another application. When a user selects a
+ * device from the list, its details are returned to the requester. See {@link
+ * android.bluetooth.BluetoothDevicePicker}.
+ */
+public class BluetoothDevicePickerActivity extends BaseCarSettingsActivity {
+
+    @Nullable
+    @Override
+    protected Fragment getInitialFragment() {
+        return new BluetoothDevicePickerFragment();
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragment.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragment.java
new file mode 100644
index 0000000..658690d
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragment.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ProgressBar;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * Hosts {@link BluetoothDevicePickerPreferenceController} to display the list of Bluetooth
+ * devices. The progress bar is shown while this fragment is visible to indicate discovery or
+ * pairing progress.
+ */
+public class BluetoothDevicePickerFragment extends SettingsFragment {
+
+    private LocalBluetoothManager mManager;
+    private ProgressBar mProgressBar;
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.bluetooth_device_picker_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mManager = BluetoothUtils.getLocalBtManager(context);
+        if (mManager == null) {
+            goBack();
+            return;
+        }
+
+        use(BluetoothDevicePickerPreferenceController.class,
+                R.string.pk_bluetooth_device_picker).setLaunchIntent(requireActivity().getIntent());
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mProgressBar = requireActivity().findViewById(R.id.progress_bar);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mManager.setForegroundActivity(requireActivity());
+        mProgressBar.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mManager.setForegroundActivity(null);
+        mProgressBar.setVisibility(View.GONE);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceController.java
new file mode 100644
index 0000000..0c68eb5
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceController.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothDevicePicker;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+/**
+ * Displays a list of Bluetooth devices for the user to select. When a device is selected, a
+ * {@link BluetoothDevicePicker#ACTION_DEVICE_SELECTED} broadcast is sent containing {@link
+ * BluetoothDevice#EXTRA_DEVICE}.
+ *
+ * <p>This is useful to other application to obtain a device without needing to implement the UI.
+ * The activity hosting this controller should be launched with an intent as detailed in {@link
+ * BluetoothDevicePicker#ACTION_LAUNCH}. This controller will filter devices as specified by {@link
+ * BluetoothDevicePicker#EXTRA_FILTER_TYPE} and deliver the broadcast to the specified {@link
+ * BluetoothDevicePicker#EXTRA_LAUNCH_PACKAGE} {@link BluetoothDevicePicker#EXTRA_LAUNCH_CLASS}
+ * component.  If authentication is required ({@link BluetoothDevicePicker#EXTRA_NEED_AUTH}), this
+ * controller will initiate pairing with the device and send the selected broadcast once the device
+ * successfully pairs. If no device is selected and this controller is destroyed, a broadcast with
+ * a {@code null} {@link BluetoothDevice#EXTRA_DEVICE} is sent.
+ */
+public class BluetoothDevicePickerPreferenceController extends
+        BluetoothScanningDevicesGroupPreferenceController {
+
+    private static final Logger LOG = new Logger(BluetoothDevicePickerPreferenceController.class);
+
+    private BluetoothDeviceFilter.Filter mFilter;
+
+    private boolean mNeedAuth;
+    private String mLaunchPackage;
+    private String mLaunchClass;
+
+    private CachedBluetoothDevice mSelectedDevice;
+
+    public BluetoothDevicePickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /**
+     * Sets the intent with which {@link BluetoothDevicePickerActivity} was launched. The intent
+     * may contain {@link BluetoothDevicePicker} extras to customize the selection list and specify
+     * the destination of the selected device. See {@link BluetoothDevicePicker#ACTION_LAUNCH}.
+     */
+    public void setLaunchIntent(Intent intent) {
+        mNeedAuth = intent.getBooleanExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);
+        mFilter = BluetoothDeviceFilter.getFilter(
+                intent.getIntExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE,
+                        BluetoothDevicePicker.FILTER_TYPE_ALL));
+        mLaunchPackage = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE);
+        mLaunchClass = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS);
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mFilter == null) {
+            throw new IllegalStateException("launch intent must be set");
+        }
+    }
+
+    @Override
+    protected BluetoothDeviceFilter.Filter getDeviceFilter() {
+        return mFilter;
+    }
+
+    @Override
+    protected void onDeviceClickedInternal(CachedBluetoothDevice cachedDevice) {
+        mSelectedDevice = cachedDevice;
+        BluetoothUtils.persistSelectedDeviceInPicker(getContext(), cachedDevice.getAddress());
+
+        if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED || !mNeedAuth) {
+            sendDevicePickedIntent(cachedDevice.getDevice());
+            getFragmentController().goBack();
+            return;
+        }
+
+        if (cachedDevice.startPairing()) {
+            LOG.d("startPairing");
+        } else {
+            BluetoothUtils.showError(getContext(), cachedDevice.getName(),
+                    R.string.bluetooth_pairing_error_message);
+            refreshUi();
+        }
+    }
+
+    @Override
+    protected void onStartInternal() {
+        super.onStartInternal();
+        mSelectedDevice = null;
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        super.onDestroyInternal();
+        if (mSelectedDevice == null) {
+            // Notify that no device was selected.
+            sendDevicePickedIntent(null);
+        }
+    }
+
+    @Override
+    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+        super.onDeviceBondStateChanged(cachedDevice, bondState);
+        if (bondState == BluetoothDevice.BOND_BONDED && cachedDevice.equals(mSelectedDevice)) {
+            sendDevicePickedIntent(mSelectedDevice.getDevice());
+            getFragmentController().goBack();
+        }
+    }
+
+    private void sendDevicePickedIntent(BluetoothDevice device) {
+        LOG.d("sendDevicePickedIntent device: " + device + " package: " + mLaunchPackage
+                + " class: " + mLaunchClass);
+        Intent intent = new Intent(BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+        if (mLaunchPackage != null && mLaunchClass != null) {
+            intent.setClassName(mLaunchPackage, mLaunchClass);
+        }
+        getContext().sendBroadcast(intent);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePreference.java
new file mode 100644
index 0000000..dfba4c6
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePreference.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.SystemProperties;
+import android.util.Pair;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+
+import com.android.car.apps.common.util.Themes;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+/**
+ * Preference which represents a specific {@link CachedBluetoothDevice}. The title, icon, and
+ * summary are kept in sync with the device when the preference is shown. When the device is busy,
+ * the preference is disabled. The equality and sort order of this preference is determined by the
+ * underlying cached device {@link CachedBluetoothDevice#equals(Object)} and {@link
+ * CachedBluetoothDevice#compareTo(CachedBluetoothDevice)}. If two devices are considered equal, the
+ * default preference sort ordering is used (see {@link #compareTo(Preference)}.
+ */
+public class BluetoothDevicePreference extends ButtonPreference {
+    private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
+            "persist.bluetooth.showdeviceswithoutnames";
+
+    private final CachedBluetoothDevice mCachedDevice;
+    private final boolean mShowDevicesWithoutNames;
+    private final CachedBluetoothDevice.Callback mDeviceCallback = this::refreshUi;
+
+    public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice) {
+        super(context);
+        mCachedDevice = cachedDevice;
+        mShowDevicesWithoutNames = SystemProperties.getBoolean(
+                BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
+        // Hide action by default.
+        showAction(false);
+    }
+
+    /**
+     * Returns the {@link CachedBluetoothDevice} represented by this preference.
+     */
+    public CachedBluetoothDevice getCachedDevice() {
+        return mCachedDevice;
+    }
+
+    @Override
+    public void onAttached() {
+        super.onAttached();
+        mCachedDevice.registerCallback(mDeviceCallback);
+        refreshUi();
+    }
+
+    @Override
+    public void onDetached() {
+        super.onDetached();
+        mCachedDevice.unregisterCallback(mDeviceCallback);
+    }
+
+    private void refreshUi() {
+        setTitle(mCachedDevice.getName());
+        setSummary(mCachedDevice.getCarConnectionSummary());
+
+        final Pair<Drawable, String> pair = com.android.settingslib.bluetooth.BluetoothUtils
+                .getBtClassDrawableWithDescription(getContext(), mCachedDevice);
+        if (pair.first != null) {
+            setIcon(pair.first);
+            getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+        }
+
+        setEnabled(!mCachedDevice.isBusy());
+        setVisible(mShowDevicesWithoutNames || mCachedDevice.hasHumanReadableName());
+
+        // Notify since the ordering may have changed.
+        notifyHierarchyChanged();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof BluetoothDevicePreference)) {
+            return false;
+        }
+        return mCachedDevice.equals(((BluetoothDevicePreference) o).mCachedDevice);
+    }
+
+    @Override
+    public int hashCode() {
+        return mCachedDevice.hashCode();
+    }
+
+    @Override
+    public int compareTo(@NonNull Preference another) {
+        if (!(another instanceof BluetoothDevicePreference)) {
+            // Rely on default sort.
+            return super.compareTo(another);
+        }
+
+        return mCachedDevice
+                .compareTo(((BluetoothDevicePreference) another).mCachedDevice);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceController.java
new file mode 100644
index 0000000..4fc12c3
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceController.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.UserManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+/**
+ * Encapsulates common functionality for all {@link BluetoothPreferenceController} instances
+ * which display state of a specific {@link CachedBluetoothDevice}. The controller will refresh
+ * the UI whenever the device properties change. The controller is not available to users with
+ * the {@link UserManager#DISALLOW_CONFIG_BLUETOOTH} restriction.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller expects
+ *         to operate.
+ */
+public abstract class BluetoothDevicePreferenceController<V extends Preference> extends
+        BluetoothPreferenceController<V> {
+
+    private final CachedBluetoothDevice.Callback mDeviceCallback = this::refreshUi;
+    private CachedBluetoothDevice mCachedDevice;
+
+    public BluetoothDevicePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /**
+     * Sets the {@link CachedBluetoothDevice} which the controller represents. The device must be
+     * set or an {@link IllegalStateException} will be thrown when this controller begins its
+     * lifecycle.
+     */
+    public void setCachedDevice(CachedBluetoothDevice device) {
+        mCachedDevice = device;
+    }
+
+    /**
+     * Returns the {@link CachedBluetoothDevice} represented by this controller.
+     */
+    public CachedBluetoothDevice getCachedDevice() {
+        return mCachedDevice;
+    }
+
+
+    @Override
+    protected void checkInitialized() {
+        if (mCachedDevice == null) {
+            throw new IllegalStateException("Must be initialized with a CachedBluetoothDevice");
+        }
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        int availabilityStatus = super.getAvailabilityStatus();
+        if (availabilityStatus == AVAILABLE) {
+            return getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
+                    DISALLOW_CONFIG_BLUETOOTH) ? DISABLED_FOR_USER : AVAILABLE;
+        }
+        return availabilityStatus;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        super.onStartInternal();
+        mCachedDevice.registerCallback(mDeviceCallback);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        super.onStopInternal();
+        mCachedDevice.unregisterCallback(mDeviceCallback);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreference.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreference.java
new file mode 100644
index 0000000..a6ac320
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreference.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.bluetooth.BluetoothProfile.STATE_CONNECTED;
+
+import android.content.Context;
+
+import androidx.preference.SwitchPreference;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import com.android.settingslib.bluetooth.PanProfile;
+
+/**
+ * Preference that represents a {@link LocalBluetoothProfile} for a {@link CachedBluetoothDevice}.
+ */
+public class BluetoothDeviceProfilePreference extends SwitchPreference {
+
+    private final LocalBluetoothProfile mProfile;
+    private final CachedBluetoothDevice mCachedDevice;
+    private final CachedBluetoothDevice.Callback mDeviceCallback = this::refreshUi;
+
+    public BluetoothDeviceProfilePreference(Context context, LocalBluetoothProfile profile,
+            CachedBluetoothDevice cachedDevice) {
+        super(context);
+        mProfile = profile;
+        mCachedDevice = cachedDevice;
+        setKey(profile.toString());
+        setTitle(profile.getNameResource(cachedDevice.getDevice()));
+    }
+
+    /**
+     * Returns the {@link LocalBluetoothProfile} represented by this preference.
+     */
+    public LocalBluetoothProfile getProfile() {
+        return mProfile;
+    }
+
+    /**
+     * Returns the {@link CachedBluetoothDevice} used to construct this preference.
+     */
+    public CachedBluetoothDevice getCachedDevice() {
+        return mCachedDevice;
+    }
+
+    @Override
+    public void onAttached() {
+        super.onAttached();
+        mCachedDevice.registerCallback(mDeviceCallback);
+        refreshUi();
+    }
+
+    @Override
+    public void onDetached() {
+        super.onDetached();
+        mCachedDevice.unregisterCallback(mDeviceCallback);
+    }
+
+    private void refreshUi() {
+        setEnabled(!mCachedDevice.isBusy());
+        if (mProfile instanceof PanProfile) {
+            setChecked(
+                    mProfile.getConnectionStatus(mCachedDevice.getDevice()) == STATE_CONNECTED);
+        } else {
+            setChecked(mProfile.isPreferred(mCachedDevice.getDevice()));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceController.java
new file mode 100644
index 0000000..9df8054
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceController.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+
+/**
+ * Displays toggles for Bluetooth profiles supported by a device. Toggling a profile on will set it
+ * as preferred and attempt a connection. Toggling a profile off will disconnect the profile. If no
+ * profiles are supported, the preference is hidden.
+ */
+public class BluetoothDeviceProfilesPreferenceController extends
+        BluetoothDevicePreferenceController<PreferenceGroup> {
+
+    private final Preference.OnPreferenceChangeListener mProfileChangeListener =
+            (preference, newValue) -> {
+                boolean isChecked = (boolean) newValue;
+                BluetoothDeviceProfilePreference profilePref =
+                        (BluetoothDeviceProfilePreference) preference;
+                LocalBluetoothProfile profile = profilePref.getProfile();
+                profile.setPreferred(profilePref.getCachedDevice().getDevice(), isChecked);
+                if (isChecked) {
+                    getCachedDevice().connectProfile(profile);
+                } else {
+                    getCachedDevice().disconnect(profile);
+                }
+                return true;
+            };
+
+    public BluetoothDeviceProfilesPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        for (LocalBluetoothProfile profile : getCachedDevice().getProfiles()) {
+            Preference profilePref = preferenceGroup.findPreference(profile.toString());
+            if (profilePref == null) {
+                profilePref = new BluetoothDeviceProfilePreference(getContext(), profile,
+                        getCachedDevice());
+                profilePref.setOnPreferenceChangeListener(mProfileChangeListener);
+                preferenceGroup.addPreference(profilePref);
+            }
+        }
+        for (LocalBluetoothProfile removedProfile : getCachedDevice().getRemovedProfiles()) {
+            Preference prefToRemove = preferenceGroup.findPreference(removedProfile.toString());
+            if (prefToRemove != null) {
+                preferenceGroup.removePreference(prefToRemove);
+            }
+        }
+        preferenceGroup.setVisible(preferenceGroup.getPreferenceCount() > 0);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceController.java
new file mode 100644
index 0000000..8548821
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceController.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.annotation.CallSuper;
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Manages a group of Bluetooth devices by adding preferences for devices that pass a subclass
+ * defined filter and removing preferences for devices that no longer pass. Subclasses are
+ * dispatched click events on individual preferences to customize the behavior.
+ *
+ * <p>Note: {@link #refreshUi()} is called whenever a device is added or removed with {@link
+ * #onDeviceAdded(CachedBluetoothDevice)} or {@link #onDeviceDeleted(CachedBluetoothDevice)}.
+ * Subclasses should listen to state changes (and possibly override additional {@link
+ * BluetoothCallback} methods) and call {@link #refreshUi()} for changes which affect their
+ * implementation of {@link #getDeviceFilter()}.
+ */
+public abstract class BluetoothDevicesGroupPreferenceController extends
+        BluetoothPreferenceController<PreferenceGroup> {
+
+    private final Map<CachedBluetoothDevice, BluetoothDevicePreference> mPreferenceMap =
+            new HashMap<>();
+    private final Preference.OnPreferenceClickListener mDevicePreferenceClickListener =
+            preference -> {
+                onDeviceClicked(((BluetoothDevicePreference) preference).getCachedDevice());
+                return true;
+            };
+
+    public BluetoothDevicesGroupPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /**
+     * Returns a filter for which devices should be included in the group. Devices that do not
+     * pass the filter will not be added. Added devices that no longer pass the filter will be
+     * removed.
+     */
+    protected abstract BluetoothDeviceFilter.Filter getDeviceFilter();
+
+    /**
+     * Returns a newly created {@link BluetoothDevicePreference} for the given {@link
+     * CachedBluetoothDevice}. Subclasses may override this method to customize how devices are
+     * represented in the group.
+     */
+    protected BluetoothDevicePreference createDevicePreference(CachedBluetoothDevice cachedDevice) {
+        return new BluetoothDevicePreference(getContext(), cachedDevice);
+    }
+
+    /**
+     * Called when a preference in the group is clicked.
+     *
+     * @param cachedDevice the device represented by the clicked preference.
+     */
+    protected abstract void onDeviceClicked(CachedBluetoothDevice cachedDevice);
+
+    /**
+     * Returns a mapping of all {@link CachedBluetoothDevice} instances represented by this group
+     * and their associated preferences.
+     */
+    protected Map<CachedBluetoothDevice, BluetoothDevicePreference> getPreferenceMap() {
+        return mPreferenceMap;
+    }
+
+    @Override
+    @CallSuper
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        Collection<CachedBluetoothDevice> cachedDevices =
+                getBluetoothManager().getCachedDeviceManager().getCachedDevicesCopy();
+
+        Set<CachedBluetoothDevice> devicesToRemove = new HashSet<>(mPreferenceMap.keySet());
+        devicesToRemove.removeAll(cachedDevices);
+        for (CachedBluetoothDevice deviceToRemove : devicesToRemove) {
+            removePreference(deviceToRemove);
+        }
+
+        for (CachedBluetoothDevice cachedDevice : cachedDevices) {
+            if (getDeviceFilter().matches(cachedDevice.getDevice())) {
+                addPreference(cachedDevice);
+            } else {
+                removePreference(cachedDevice);
+            }
+        }
+
+        preferenceGroup.setVisible(preferenceGroup.getPreferenceCount() > 0);
+    }
+
+    @Override
+    public final void onBluetoothStateChanged(int bluetoothState) {
+        super.onBluetoothStateChanged(bluetoothState);
+        if (bluetoothState == BluetoothAdapter.STATE_TURNING_OFF) {
+            // Cleanup the UI so that we don't have stale representations when the adapter turns
+            // on again. This can happen if Bluetooth crashes and restarts.
+            getPreference().removeAll();
+            mPreferenceMap.clear();
+        }
+    }
+
+    @Override
+    public final void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
+        refreshUi();
+    }
+
+    @Override
+    public final void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {
+        refreshUi();
+    }
+
+    private void addPreference(CachedBluetoothDevice cachedDevice) {
+        if (!mPreferenceMap.containsKey(cachedDevice)) {
+            BluetoothDevicePreference devicePreference = createDevicePreference(cachedDevice);
+            devicePreference.setOnPreferenceClickListener(mDevicePreferenceClickListener);
+            mPreferenceMap.put(cachedDevice, devicePreference);
+            getPreference().addPreference(devicePreference);
+        }
+    }
+
+    private void removePreference(CachedBluetoothDevice cachedDevice) {
+        if (mPreferenceMap.containsKey(cachedDevice)) {
+            getPreference().removePreference(mPreferenceMap.get(cachedDevice));
+            mPreferenceMap.remove(cachedDevice);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragment.java b/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragment.java
new file mode 100644
index 0000000..c1caf61
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragment.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+
+import com.android.car.settings.R;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * Displays a dialog which prompts the user to confirm disconnecting from a remote Bluetooth device.
+ */
+public class BluetoothDisconnectConfirmDialogFragment extends DialogFragment {
+
+    private static final String KEY_DEVICE_ADDRESS = "device_address";
+
+    private final CachedBluetoothDevice.Callback mDeviceCallback = this::dismissIfNotConnected;
+    private CachedBluetoothDevice mCachedDevice;
+
+    /**
+     * Returns a new {@link BluetoothDisconnectConfirmDialogFragment} for the given {@code device}.
+     */
+    public static BluetoothDisconnectConfirmDialogFragment newInstance(
+            CachedBluetoothDevice device) {
+        Bundle args = new Bundle();
+        args.putString(KEY_DEVICE_ADDRESS, device.getAddress());
+        BluetoothDisconnectConfirmDialogFragment fragment =
+                new BluetoothDisconnectConfirmDialogFragment();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        String deviceAddress = getArguments().getString(KEY_DEVICE_ADDRESS);
+        LocalBluetoothManager manager = BluetoothUtils.getLocalBtManager(context);
+        BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
+                deviceAddress);
+        mCachedDevice = manager.getCachedDeviceManager().findDevice(device);
+    }
+
+    @NonNull
+    @Override
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        Context context = requireContext();
+        String name = mCachedDevice.getName();
+        if (TextUtils.isEmpty(name)) {
+            name = context.getString(R.string.bluetooth_device);
+        }
+        String title = context.getString(R.string.bluetooth_disconnect_title);
+        String message = context.getString(R.string.bluetooth_disconnect_all_profiles, name);
+
+        return new AlertDialog.Builder(context)
+                .setTitle(title)
+                .setMessage(message)
+                .setPositiveButton(android.R.string.ok,
+                        (dialog, which) -> mCachedDevice.disconnect())
+                .setNegativeButton(android.R.string.cancel, /* listener= */ null)
+                .create();
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mCachedDevice.registerCallback(mDeviceCallback);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mCachedDevice.unregisterCallback(mDeviceCallback);
+    }
+
+    private void dismissIfNotConnected() {
+        // This handles the case where the dialog is showing and the connection is broken via UI
+        // on the remote device. It does not cover the case of the device disconnecting while the
+        // fragment is starting because we cannot begin another transaction for dismiss while in
+        // a transaction to show. That case, however, should be extremely rare, and the action
+        // taken on the dialog will have no effect.
+        if (!mCachedDevice.isConnected() && getDialog().isShowing()) {
+            dismiss();
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceController.java
new file mode 100644
index 0000000..4136f95
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceController.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller which determines if the top level entry into Bluetooth settings should be displayed
+ * based on device capabilities and user restrictions.
+ */
+public class BluetoothEntryPreferenceController extends PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public BluetoothEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        if (!getContext().getPackageManager().hasSystemFeature(FEATURE_BLUETOOTH)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)
+                ? DISABLED_FOR_USER : AVAILABLE;
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceController.java
new file mode 100644
index 0000000..efc6387
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceController.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Displays the name of the local Bluetooth adapter. When the associated preference is clicked, a
+ * dialog is shown to allow the user to update the adapter name. If the user has the {@link
+ * DISALLOW_CONFIG_BLUETOOTH} restriction, interaction with the preference is disabled.
+ */
+public class BluetoothNamePreferenceController extends BluetoothPreferenceController<Preference> {
+
+    private final IntentFilter mIntentFilter = new IntentFilter(
+            BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUi();
+        }
+    };
+
+    public BluetoothNamePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        super.onStartInternal();
+        getContext().registerReceiver(mReceiver, mIntentFilter);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        super.onStopInternal();
+        getContext().unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSelectable(!getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH));
+        preference.setSummary(BluetoothAdapter.getDefaultAdapter().getName());
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        getFragmentController().showDialog(new LocalRenameDialogFragment(),
+                LocalRenameDialogFragment.TAG);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/car/settings/bluetooth/BluetoothPairingRequest.java
index 7062191..2115998 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPairingRequest.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPairingRequest.java
@@ -31,31 +31,31 @@
  */
 public final class BluetoothPairingRequest extends BroadcastReceiver {
 
-  @Override
-  public void onReceive(Context context, Intent intent) {
-    String action = intent.getAction();
-    if (!action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
-      return;
-    }
-    // convert broadcast intent into activity intent (same action string)
-    Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context, intent);
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String action = intent.getAction();
+        if (!action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
+            return;
+        }
+        // convert broadcast intent into activity intent (same action string)
+        Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context, intent);
 
-    PowerManager powerManager =
-        (PowerManager)context.getSystemService(Context.POWER_SERVICE);
-    BluetoothDevice device =
-        intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-    String deviceAddress = device != null ? device.getAddress() : null;
-    String deviceName = device != null ? device.getName() : null;
-    boolean shouldShowDialog = BluetoothUtils.shouldShowDialogInForeground(
-        context, deviceAddress, deviceName);
-    if (powerManager.isInteractive() && shouldShowDialog) {
-      // Since the screen is on and the BT-related activity is in the foreground,
-      // just open the dialog
-      context.startActivityAsUser(pairingIntent, UserHandle.CURRENT);
-    } else {
-      // Put up a notification that leads to the dialog
-      intent.setClass(context, BluetoothPairingService.class);
-      context.startServiceAsUser(intent, UserHandle.CURRENT);
+        PowerManager powerManager =
+                (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        BluetoothDevice device =
+                intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+        String deviceAddress = device != null ? device.getAddress() : null;
+        String deviceName = device != null ? device.getName() : null;
+        boolean shouldShowDialog = BluetoothUtils.shouldShowDialogInForeground(
+                context, deviceAddress, deviceName);
+        if (powerManager.isInteractive() && shouldShowDialog) {
+            // Since the screen is on and the BT-related activity is in the foreground,
+            // just open the dialog
+            context.startActivityAsUser(pairingIntent, UserHandle.CURRENT);
+        } else {
+            // Put up a notification that leads to the dialog
+            intent.setClass(context, BluetoothPairingService.class);
+            context.startServiceAsUser(intent, UserHandle.CURRENT);
+        }
     }
-  }
 }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java b/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
new file mode 100644
index 0000000..5e19d01
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragment.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ProgressBar;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * Page which scans for Bluetooth devices so that a user can select a new device to pair. When a
+ * device pairs, this page will finish.
+ */
+public class BluetoothPairingSelectionFragment extends SettingsFragment {
+
+    private final BluetoothCallback mCallback = new BluetoothCallback() {
+        @Override
+        public void onScanningStateChanged(boolean started) {
+        }
+
+        @Override
+        public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+            if (bondState == BluetoothDevice.BOND_BONDED) {
+                // We are in a dispatch loop from event manager to all listeners. goBack will pop
+                // immediately, stopping this fragment causing an unregister from the event manager
+                // and a ConcurrentModificationException. Wait until the dispatch is done to go
+                // back.
+                requireActivity().getMainThreadHandler().post(
+                        BluetoothPairingSelectionFragment.this::goBack);
+            }
+        }
+    };
+
+    private LocalBluetoothManager mManager;
+    private ProgressBar mProgressBar;
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.bluetooth_pairing_selection_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mManager = BluetoothUtils.getLocalBtManager(context);
+        if (mManager == null) {
+            goBack();
+        }
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mProgressBar = requireActivity().findViewById(R.id.progress_bar);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mManager.setForegroundActivity(requireActivity());
+        mManager.getEventManager().registerCallback(mCallback);
+        mProgressBar.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mManager.setForegroundActivity(null);
+        mManager.getEventManager().unregisterCallback(mCallback);
+        mProgressBar.setVisibility(View.GONE);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPairingService.java b/src/com/android/car/settings/bluetooth/BluetoothPairingService.java
index 848cbba..156a483 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothPairingService.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothPairingService.java
@@ -78,7 +78,8 @@
             if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
                 int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                         BluetoothDevice.ERROR);
-                if ((bondState != BluetoothDevice.BOND_NONE) && (bondState != BluetoothDevice.BOND_BONDED)) {
+                if ((bondState != BluetoothDevice.BOND_NONE) && (bondState
+                        != BluetoothDevice.BOND_BONDED)) {
                     return;
                 }
             } else if (action.equals(ACTION_DISMISS_PAIRING)) {
@@ -98,13 +99,13 @@
 
     @Override
     public void onCreate() {
-      NotificationManager mgr = (NotificationManager)this
-         .getSystemService(Context.NOTIFICATION_SERVICE);
-      NotificationChannel notificationChannel = new NotificationChannel(
-         BLUETOOTH_NOTIFICATION_CHANNEL,
-         this.getString(R.string.bluetooth),
-         NotificationManager.IMPORTANCE_HIGH);
-      mgr.createNotificationChannel(notificationChannel);
+        NotificationManager mgr = (NotificationManager) this
+                .getSystemService(Context.NOTIFICATION_SERVICE);
+        NotificationChannel notificationChannel = new NotificationChannel(
+                BLUETOOTH_NOTIFICATION_CHANNEL,
+                this.getString(R.string.bluetooth_settings_title),
+                NotificationManager.IMPORTANCE_HIGH);
+        mgr.createNotificationChannel(notificationChannel);
     }
 
     @Override
@@ -117,7 +118,7 @@
 
         Resources res = getResources();
         Notification.Builder builder = new Notification.Builder(this,
-            BLUETOOTH_NOTIFICATION_CHANNEL)
+                BLUETOOTH_NOTIFICATION_CHANNEL)
                 .setSmallIcon(android.R.drawable.stat_sys_data_bluetooth)
                 .setTicker(res.getString(R.string.bluetooth_notif_ticker))
                 .setLocalOnly(true);
@@ -139,7 +140,8 @@
         String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
         if (TextUtils.isEmpty(name)) {
             BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-            name = device != null ? device.getAliasName() : res.getString(android.R.string.unknownName);
+            name = device != null ? device.getAliasName() : res.getString(
+                    android.R.string.unknownName);
         }
 
         LOG.d("Show pairing notification for " + mDevice.getAddress() + " (" + name + ")");
diff --git a/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
new file mode 100644
index 0000000..6c9ce00
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothPreferenceController.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * Abstract {@link PreferenceController} that listens to {@link BluetoothCallback} events and
+ * exposes the interface methods for override. It implements a default
+ * {@link #getAvailabilityStatus()} which is {@link #AVAILABLE} when the  system supports
+ * Bluetooth, the current user is not restricted by {@link DISALLOW_BLUETOOTH}, and the default
+ * Bluetooth adapter is enabled.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller expects
+ *         to operate.
+ */
+public abstract class BluetoothPreferenceController<V extends Preference> extends
+        PreferenceController<V> implements BluetoothCallback {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final LocalBluetoothManager mBluetoothManager;
+
+    public BluetoothPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mBluetoothManager = BluetoothUtils.getLocalBtManager(context);
+    }
+
+    /** Returns a {@link CarUserManagerHelper} constructed from the controller context. */
+    protected final CarUserManagerHelper getCarUserManagerHelper() {
+        return mCarUserManagerHelper;
+    }
+
+    /**
+     * Returns a {@link LocalBluetoothManager} retrieved with the controller context. This is
+     * not {@code null} unless {@link #getAvailabilityStatus()} returns
+     * {@link #UNSUPPORTED_ON_DEVICE}.
+     */
+    protected final LocalBluetoothManager getBluetoothManager() {
+        return mBluetoothManager;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        if (mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)) {
+            return DISABLED_FOR_USER;
+        }
+        return BluetoothAdapter.getDefaultAdapter().isEnabled() ? AVAILABLE
+                : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    @CallSuper
+    protected void onStartInternal() {
+        mBluetoothManager.getEventManager().registerCallback(this);
+    }
+
+    @Override
+    @CallSuper
+    protected void onStopInternal() {
+        mBluetoothManager.getEventManager().unregisterCallback(this);
+    }
+
+    @Override
+    @CallSuper
+    public void onBluetoothStateChanged(int bluetoothState) {
+        refreshUi();
+    }
+
+    @Override
+    public void onScanningStateChanged(boolean started) {
+    }
+
+    @Override
+    public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
+    }
+
+    @Override
+    public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {
+    }
+
+    @Override
+    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+    }
+
+    @Override
+    public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {
+    }
+
+    @Override
+    public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
+    }
+
+    @Override
+    public void onAudioModeChanged() {
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothProfileLineItem.java b/src/com/android/car/settings/bluetooth/BluetoothProfileLineItem.java
deleted file mode 100644
index 51a1119..0000000
--- a/src/com/android/car/settings/bluetooth/BluetoothProfileLineItem.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.bluetooth;
-
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.content.Context;
-import android.view.View;
-import android.widget.CheckBox;
-
-import com.android.car.list.CheckBoxLineItem;
-import com.android.car.settings.R;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.LocalBluetoothProfile;
-import com.android.settingslib.bluetooth.PanProfile;
-
-/**
- * Represents a line item for a Bluetooth mProfile.
- */
-public class BluetoothProfileLineItem extends CheckBoxLineItem {
-    private final LocalBluetoothProfile mProfile;
-    private final CachedBluetoothDevice mCachedDevice;
-    private CheckboxLineItemViewHolder mViewHolder;
-    private DataChangedListener mDataChangedListener;
-    private final Context mContext;
-
-    public interface DataChangedListener {
-        void onDataChanged();
-    }
-
-    public BluetoothProfileLineItem(Context context, LocalBluetoothProfile profile,
-            CachedBluetoothDevice cachedBluetoothDevice, DataChangedListener listener) {
-        super(context.getText(profile.getNameResource(cachedBluetoothDevice.getDevice())));
-        mContext = context;
-        mCachedDevice = cachedBluetoothDevice;
-        mProfile = profile;
-        mDataChangedListener = listener;
-    }
-
-    @Override
-    public void onClick(View view) {
-        if (((CheckBox) view.findViewById(R.id.checkbox)).isChecked()) {
-            mCachedDevice.disconnect(mProfile);
-            mProfile.setPreferred(mCachedDevice.getDevice(), false);
-        } else if (mProfile.isPreferred(mCachedDevice.getDevice())) {
-            if (mProfile instanceof PanProfile) {
-                mCachedDevice.connectProfile(mProfile);
-            } else {
-                mProfile.setPreferred(mCachedDevice.getDevice(), false);
-            }
-        } else {
-            mProfile.setPreferred(mCachedDevice.getDevice(), true);
-            mCachedDevice.connectProfile(mProfile);
-        }
-        mDataChangedListener.onDataChanged();
-    }
-
-    @Override
-    public boolean isExpandable() {
-        return false;
-    }
-
-    @Override
-    public boolean isEnabled() {
-        return true;
-    }
-
-    @Override
-    public void bindViewHolder(CheckboxLineItemViewHolder holder) {
-        super.bindViewHolder(holder);
-        mViewHolder = holder;
-    }
-
-    @Override
-    public boolean isChecked() {
-        BluetoothDevice device = mCachedDevice.getDevice();
-        if (mProfile instanceof PanProfile) {
-            return mProfile.getConnectionStatus(device) == BluetoothProfile.STATE_CONNECTED;
-        } else {
-            return mProfile.isPreferred(device);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragment.java b/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragment.java
new file mode 100644
index 0000000..cf5da80
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragment.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.InputType;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.fragment.app.DialogFragment;
+
+import com.android.car.settings.R;
+
+import java.util.Objects;
+
+/** Dialog fragment for renaming a Bluetooth device. */
+public abstract class BluetoothRenameDialogFragment extends DialogFragment implements TextWatcher,
+        TextView.OnEditorActionListener {
+
+    // Keys to save the edited name and edit status for restoring after configuration change.
+    private static final String KEY_NAME = "device_name";
+
+    private static final int BLUETOOTH_NAME_MAX_LENGTH_BYTES = 248;
+
+    private AlertDialog mAlertDialog;
+    private EditText mDeviceNameView;
+    private Button mRenameButton;
+
+    /** Returns the title to use for the dialog. */
+    @StringRes
+    protected abstract int getDialogTitle();
+
+    /** Returns the current name used for this device or {@code null} if a name is not available. */
+    @Nullable
+    protected abstract String getDeviceName();
+
+    /**
+     * Set the device to the given name.
+     *
+     * @param deviceName the name to use.
+     */
+    protected abstract void setDeviceName(String deviceName);
+
+    @Override
+    @NonNull
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        String deviceName = getDeviceName();
+        if (savedInstanceState != null) {
+            deviceName = savedInstanceState.getString(KEY_NAME, deviceName);
+        }
+        AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity())
+                .setTitle(getDialogTitle())
+                .setView(createDialogView(deviceName))
+                .setPositiveButton(R.string.bluetooth_rename_button,
+                        (dialog, which) -> setDeviceName(
+                                mDeviceNameView.getText().toString().trim()))
+                .setNegativeButton(android.R.string.cancel, /* listener= */ null);
+        mAlertDialog = builder.create();
+        mAlertDialog.setOnShowListener(d -> {
+            if (mDeviceNameView.requestFocus()) {
+                InputMethodManager imm = (InputMethodManager) requireContext().getSystemService(
+                        Context.INPUT_METHOD_SERVICE);
+                if (imm != null) {
+                    imm.showSoftInput(mDeviceNameView, InputMethodManager.SHOW_IMPLICIT);
+                }
+            }
+        });
+
+        return mAlertDialog;
+    }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        outState.putString(KEY_NAME, mDeviceNameView.getText().toString());
+    }
+
+    private View createDialogView(String deviceName) {
+        final LayoutInflater layoutInflater = (LayoutInflater) requireActivity().getSystemService(
+                Context.LAYOUT_INFLATER_SERVICE);
+        // TODO: use dialog layout defined in preference theme.
+        View view = layoutInflater.inflate(R.layout.preference_dialog_edittext, /* root= */ null);
+        mDeviceNameView = view.findViewById(android.R.id.edit);
+        mDeviceNameView.setFilters(new InputFilter[]{
+                new Utf8ByteLengthFilter(BLUETOOTH_NAME_MAX_LENGTH_BYTES)
+        });
+        mDeviceNameView.setText(deviceName); // Set initial value before adding listener.
+        if (!TextUtils.isEmpty(deviceName)) {
+            mDeviceNameView.setSelection(deviceName.length());
+        }
+        mDeviceNameView.addTextChangedListener(this);
+        mDeviceNameView.setOnEditorActionListener(this);
+        mDeviceNameView.setRawInputType(InputType.TYPE_CLASS_TEXT);
+        mDeviceNameView.setImeOptions(EditorInfo.IME_ACTION_DONE);
+
+        return view;
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mRenameButton = mAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
+        refreshRenameButton();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mAlertDialog = null;
+        mDeviceNameView = null;
+        mRenameButton = null;
+    }
+
+    /** Refreshes the displayed device name with the latest value from {@link #getDeviceName()}. */
+    protected void updateDeviceName() {
+        String name = getDeviceName();
+        if (name != null) {
+            mDeviceNameView.setText(name);
+        }
+    }
+
+    @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) {
+        refreshRenameButton();
+    }
+
+    @Override
+    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+        if (actionId == EditorInfo.IME_ACTION_DONE) {
+            String editedName = getEditedName();
+            if (TextUtils.isEmpty(editedName)) {
+                return false;
+            }
+            setDeviceName(editedName);
+            if (mAlertDialog != null && mAlertDialog.isShowing()) {
+                mAlertDialog.dismiss();
+            }
+            return true;
+        }
+        return false;
+    }
+
+    private void refreshRenameButton() {
+        String editedName = getEditedName();
+        mRenameButton.setEnabled(
+                !TextUtils.isEmpty(editedName) && !Objects.equals(editedName, getDeviceName()));
+    }
+
+    private String getEditedName() {
+        return mDeviceNameView.getText().toString().trim();
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivity.java b/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivity.java
new file mode 100644
index 0000000..d87c4c5
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivity.java
@@ -0,0 +1,421 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import android.annotation.NonNull;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.admin.DevicePolicyManager;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.UserManager;
+import android.text.TextUtils;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.bluetooth.BluetoothDiscoverableTimeoutReceiver;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * This {@link Activity} handles requests to toggle Bluetooth by collecting user
+ * consent and waiting until the state change is completed. It can also be used to make the device
+ * explicitly discoverable for a given amount of time.
+ */
+public class BluetoothRequestPermissionActivity extends Activity {
+    private static final Logger LOG = new Logger(BluetoothRequestPermissionActivity.class);
+
+    @VisibleForTesting
+    static final int REQUEST_UNKNOWN = 0;
+    @VisibleForTesting
+    static final int REQUEST_ENABLE = 1;
+    @VisibleForTesting
+    static final int REQUEST_DISABLE = 2;
+    @VisibleForTesting
+    static final int REQUEST_ENABLE_DISCOVERABLE = 3;
+
+    private static final int DISCOVERABLE_TIMEOUT_TWO_MINUTES = 120;
+    private static final int DISCOVERABLE_TIMEOUT_ONE_HOUR = 3600;
+
+    @VisibleForTesting
+    static final int DEFAULT_DISCOVERABLE_TIMEOUT = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
+    @VisibleForTesting
+    static final int MAX_DISCOVERABLE_TIMEOUT = DISCOVERABLE_TIMEOUT_ONE_HOUR;
+
+    private AlertDialog mDialog;
+    private int mRequest;
+    private int mTimeout = DEFAULT_DISCOVERABLE_TIMEOUT;
+
+    @NonNull
+    private CharSequence mAppLabel;
+    private LocalBluetoothAdapter mLocalBluetoothAdapter;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private StateChangeReceiver mReceiver;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mRequest = parseIntent();
+        if (mRequest == REQUEST_UNKNOWN) {
+            finishWithResult(RESULT_CANCELED);
+            return;
+        }
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(
+                getApplicationContext(), /* onInitCallback= */ null);
+        if (mLocalBluetoothManager == null) {
+            LOG.e("Bluetooth is not supported on this device");
+            finishWithResult(RESULT_CANCELED);
+        }
+
+        mLocalBluetoothAdapter = mLocalBluetoothManager.getBluetoothAdapter();
+
+        int btState = mLocalBluetoothAdapter.getState();
+        switch (mRequest) {
+            case REQUEST_DISABLE:
+                switch (btState) {
+                    case BluetoothAdapter.STATE_OFF:
+                    case BluetoothAdapter.STATE_TURNING_OFF:
+                        proceedAndFinish();
+                        break;
+
+                    case BluetoothAdapter.STATE_ON:
+                    case BluetoothAdapter.STATE_TURNING_ON:
+                        mDialog = createRequestDisableBluetoothDialog();
+                        mDialog.show();
+                        break;
+
+                    default:
+                        LOG.e("Unknown adapter state: " + btState);
+                        finishWithResult(RESULT_CANCELED);
+                        break;
+                }
+                break;
+            case REQUEST_ENABLE:
+                switch (btState) {
+                    case BluetoothAdapter.STATE_OFF:
+                    case BluetoothAdapter.STATE_TURNING_OFF:
+                        mDialog = createRequestEnableBluetoothDialog();
+                        mDialog.show();
+                        break;
+                    case BluetoothAdapter.STATE_ON:
+                    case BluetoothAdapter.STATE_TURNING_ON:
+                        proceedAndFinish();
+                        break;
+                    default:
+                        LOG.e("Unknown adapter state: " + btState);
+                        finishWithResult(RESULT_CANCELED);
+                        break;
+                }
+                break;
+            case REQUEST_ENABLE_DISCOVERABLE:
+                switch (btState) {
+                    case BluetoothAdapter.STATE_OFF:
+                    case BluetoothAdapter.STATE_TURNING_OFF:
+                    case BluetoothAdapter.STATE_TURNING_ON:
+                        /*
+                         * Strictly speaking STATE_TURNING_ON belong with STATE_ON; however, BT
+                         * may not be ready when the user clicks yes and we would fail to turn on
+                         * discovery mode. We still show the dialog and handle this case via the
+                         * broadcast receiver.
+                         */
+                        mDialog = createRequestEnableBluetoothDialogWithTimeout(mTimeout);
+                        mDialog.show();
+                        break;
+                    case BluetoothAdapter.STATE_ON:
+                        mDialog = createDiscoverableConfirmDialog(mTimeout);
+                        mDialog.show();
+                        break;
+                    default:
+                        LOG.e("Unknown adapter state: " + btState);
+                        finishWithResult(RESULT_CANCELED);
+                        break;
+                }
+                break;
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mReceiver != null) {
+            unregisterReceiver(mReceiver);
+        }
+    }
+
+    private void proceedAndFinish() {
+        if (mRequest == REQUEST_ENABLE_DISCOVERABLE) {
+            finishWithResult(setDiscoverable(mTimeout));
+        } else {
+            finishWithResult(RESULT_OK);
+        }
+    }
+
+    // Returns the code that should be used to finish the activity.
+    private int setDiscoverable(int timeoutSeconds) {
+        if (!mLocalBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE,
+                timeoutSeconds)) {
+            return RESULT_CANCELED;
+        }
+
+        // If already in discoverable mode, this will extend the timeout.
+        long endTime = System.currentTimeMillis() + (long) timeoutSeconds * 1000;
+        BluetoothUtils.persistDiscoverableEndTimestamp(/* context= */ this, endTime);
+        if (timeoutSeconds > 0) {
+            BluetoothDiscoverableTimeoutReceiver.setDiscoverableAlarm(/* context= */ this, endTime);
+        }
+
+        int returnCode = timeoutSeconds;
+        return returnCode < RESULT_FIRST_USER ? RESULT_FIRST_USER : returnCode;
+    }
+
+    private void finishWithResult(int result) {
+        if (mDialog != null) {
+            mDialog.dismiss();
+        }
+        setResult(result);
+        finish();
+    }
+
+    private int parseIntent() {
+        int request;
+        Intent intent = getIntent();
+        if (intent == null) {
+            return REQUEST_UNKNOWN;
+        }
+
+        switch (intent.getAction()) {
+            case BluetoothAdapter.ACTION_REQUEST_ENABLE:
+                request = REQUEST_ENABLE;
+                break;
+            case BluetoothAdapter.ACTION_REQUEST_DISABLE:
+                request = REQUEST_DISABLE;
+                break;
+            case BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE:
+                request = REQUEST_ENABLE_DISCOVERABLE;
+                mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
+                        DEFAULT_DISCOVERABLE_TIMEOUT);
+
+                if (mTimeout < 1 || mTimeout > MAX_DISCOVERABLE_TIMEOUT) {
+                    mTimeout = DEFAULT_DISCOVERABLE_TIMEOUT;
+                }
+                break;
+            default:
+                LOG.e("Error: this activity may be started only with intent "
+                        + BluetoothAdapter.ACTION_REQUEST_ENABLE);
+                return REQUEST_UNKNOWN;
+        }
+
+        String packageName = getCallingPackage();
+        if (TextUtils.isEmpty(packageName)) {
+            packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+        }
+        if (!TextUtils.isEmpty(packageName)) {
+            try {
+                ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
+                        packageName, 0);
+                mAppLabel = applicationInfo.loadLabel(getPackageManager());
+            } catch (PackageManager.NameNotFoundException e) {
+                LOG.e("Couldn't find app with package name " + packageName);
+                return REQUEST_UNKNOWN;
+            }
+        }
+
+        return request;
+    }
+
+    private AlertDialog createWaitingDialog() {
+        int message = mRequest == REQUEST_DISABLE ? R.string.bluetooth_turning_off
+                : R.string.bluetooth_turning_on;
+
+        return new AlertDialog.Builder(/* context= */ this)
+                .setMessage(message)
+                .setCancelable(false).setOnCancelListener(
+                        dialog -> finishWithResult(RESULT_CANCELED))
+                .create();
+    }
+
+    // Assumes {@code timeoutSeconds} > 0.
+    private AlertDialog createDiscoverableConfirmDialog(int timeoutSeconds) {
+        String message = mAppLabel != null
+                ? getString(R.string.bluetooth_ask_discovery, mAppLabel, timeoutSeconds)
+                : getString(R.string.bluetooth_ask_discovery_no_name, timeoutSeconds);
+
+        return new AlertDialog.Builder(/* context= */ this)
+                .setMessage(message)
+                .setPositiveButton(R.string.allow, (dialog, which) -> proceedAndFinish())
+                .setNegativeButton(R.string.deny,
+                        (dialog, which) -> finishWithResult(RESULT_CANCELED))
+                .setOnCancelListener(dialog -> finishWithResult(RESULT_CANCELED))
+                .create();
+    }
+
+    private AlertDialog createRequestEnableBluetoothDialog() {
+        String message = mAppLabel != null
+                ? getString(R.string.bluetooth_ask_enablement, mAppLabel)
+                : getString(R.string.bluetooth_ask_enablement_no_name);
+
+        return new AlertDialog.Builder(/* context= */ this)
+                .setMessage(message)
+                .setPositiveButton(R.string.allow, this::onConfirmEnableBluetooth)
+                .setNegativeButton(R.string.deny,
+                        (dialog, which) -> finishWithResult(RESULT_CANCELED))
+                .setOnCancelListener(dialog -> finishWithResult(RESULT_CANCELED))
+                .create();
+    }
+
+    // Assumes {@code timeoutSeconds} > 0.
+    private AlertDialog createRequestEnableBluetoothDialogWithTimeout(int timeoutSeconds) {
+        String message = mAppLabel != null
+                ? getString(R.string.bluetooth_ask_enablement_and_discovery, mAppLabel,
+                        timeoutSeconds)
+                : getString(R.string.bluetooth_ask_enablement_and_discovery_no_name,
+                        timeoutSeconds);
+
+        return new AlertDialog.Builder(/* context= */ this)
+                .setMessage(message)
+                .setPositiveButton(R.string.allow, this::onConfirmEnableBluetooth)
+                .setNegativeButton(R.string.deny,
+                        (dialog, which) -> finishWithResult(RESULT_CANCELED))
+                .setOnCancelListener(dialog -> finishWithResult(RESULT_CANCELED))
+                .create();
+    }
+
+    private void onConfirmEnableBluetooth(DialogInterface dialog, int which) {
+        UserManager userManager = getSystemService(UserManager.class);
+        if (userManager.hasUserRestriction(UserManager.DISALLOW_BLUETOOTH)) {
+            // If Bluetooth is disallowed, don't try to enable it, show policy
+            // transparency message instead.
+            DevicePolicyManager dpm = getSystemService(DevicePolicyManager.class);
+            Intent intent = dpm.createAdminSupportIntent(
+                    UserManager.DISALLOW_BLUETOOTH);
+            if (intent != null) {
+                startActivity(intent);
+            }
+            return;
+        }
+
+        mLocalBluetoothAdapter.enable();
+
+        int desiredState = BluetoothAdapter.STATE_ON;
+        if (mLocalBluetoothAdapter.getState() == desiredState) {
+            proceedAndFinish();
+        } else {
+            // Register this receiver to listen for state change after the enabling has started.
+            mReceiver = new StateChangeReceiver(desiredState);
+            registerReceiver(mReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
+
+            if (mRequest == REQUEST_ENABLE) {
+                // Show dialog while waiting for enabling to complete.
+                mDialog = createWaitingDialog();
+            } else {
+                mDialog = createDiscoverableConfirmDialog(mTimeout);
+            }
+            mDialog.show();
+        }
+    }
+
+    private AlertDialog createRequestDisableBluetoothDialog() {
+        String message = mAppLabel != null
+                ? getString(R.string.bluetooth_ask_disablement, mAppLabel)
+                : getString(R.string.bluetooth_ask_disablement_no_name);
+
+        return new AlertDialog.Builder(/* context= */ this)
+                .setMessage(message)
+                .setPositiveButton(R.string.allow, this::onConfirmDisableBluetooth)
+                .setNegativeButton(R.string.deny,
+                        (dialog, which) -> finishWithResult(RESULT_CANCELED))
+                .setOnCancelListener(dialog -> finishWithResult(RESULT_CANCELED))
+                .create();
+    }
+
+    private void onConfirmDisableBluetooth(DialogInterface dialog, int which) {
+        mLocalBluetoothAdapter.disable();
+
+        int desiredState = BluetoothAdapter.STATE_OFF;
+        if (mLocalBluetoothAdapter.getState() == desiredState) {
+            proceedAndFinish();
+        } else {
+            // Register this receiver to listen for state change after the disabling has started.
+            mReceiver = new StateChangeReceiver(desiredState);
+            registerReceiver(mReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
+
+            // Show dialog while waiting for disabling to complete.
+            mDialog = createWaitingDialog();
+            mDialog.show();
+        }
+    }
+
+    @VisibleForTesting
+    int getRequestType() {
+        return mRequest;
+    }
+
+    @VisibleForTesting
+    int getTimeout() {
+        return mTimeout;
+    }
+
+    @VisibleForTesting
+    AlertDialog getCurrentDialog() {
+        return mDialog;
+    }
+
+    /**
+     * Listens for bluetooth state changes and finishes the activity if changed to the desired
+     * state. If the desired bluetooth state is not received in time, the activity is finished with
+     * {@link Activity#RESULT_CANCELED}.
+     */
+    private final class StateChangeReceiver extends BroadcastReceiver {
+        private static final long TOGGLE_TIMEOUT_MILLIS = 10000; // 10 sec
+        private final int mDesiredState;
+
+        StateChangeReceiver(int desiredState) {
+            mDesiredState = desiredState;
+
+            getWindow().getDecorView().postDelayed(() -> {
+                if (!isFinishing() && !isDestroyed()) {
+                    finishWithResult(RESULT_CANCELED);
+                }
+            }, TOGGLE_TIMEOUT_MILLIS);
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent == null) {
+                return;
+            }
+
+            int currentState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
+                    BluetoothDevice.ERROR);
+            if (mDesiredState == currentState) {
+                proceedAndFinish();
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
new file mode 100644
index 0000000..f39598a
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceController.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+/**
+ * Controller which sets the Bluetooth adapter to discovery mode and begins scanning for
+ * discoverable devices for as long as the preference group is shown. Discovery
+ * and scanning are halted while any device is pairing. Users with the {@link
+ * DISALLOW_CONFIG_BLUETOOTH} restriction cannot scan for devices, so only cached devices will be
+ * shown.
+ */
+public abstract class BluetoothScanningDevicesGroupPreferenceController extends
+        BluetoothDevicesGroupPreferenceController {
+
+    private static final Logger LOG = new Logger(
+            BluetoothScanningDevicesGroupPreferenceController.class);
+
+    private final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    private final AlwaysDiscoverable mAlwaysDiscoverable;
+    private boolean mIsScanningEnabled;
+
+    public BluetoothScanningDevicesGroupPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAlwaysDiscoverable = new AlwaysDiscoverable(context, mBluetoothAdapter);
+    }
+
+    @Override
+    protected final void onDeviceClicked(CachedBluetoothDevice cachedDevice) {
+        LOG.d("onDeviceClicked: " + cachedDevice);
+        disableScanning();
+        onDeviceClickedInternal(cachedDevice);
+    }
+
+    /**
+     * Called when the user selects a device in the group.
+     *
+     * @param cachedDevice the device represented by the selected preference.
+     */
+    protected abstract void onDeviceClickedInternal(CachedBluetoothDevice cachedDevice);
+
+    @Override
+    protected void onStopInternal() {
+        super.onStopInternal();
+        disableScanning();
+        getBluetoothManager().getCachedDeviceManager().clearNonBondedDevices();
+        getPreferenceMap().clear();
+        getPreference().removeAll();
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        super.updateState(preferenceGroup);
+        if (shouldEnableScanning()) {
+            enableScanning();
+        } else {
+            disableScanning();
+        }
+    }
+
+    private boolean shouldEnableScanning() {
+        for (CachedBluetoothDevice device : getPreferenceMap().keySet()) {
+            if (device.getBondState() == BluetoothDevice.BOND_BONDING) {
+                return false;
+            }
+        }
+        // Users who cannot configure Bluetooth cannot scan.
+        return !getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH);
+    }
+
+    /**
+     * Starts scanning for devices which will be displayed in the group for a user to select.
+     * Calls are idempotent.
+     */
+    private void enableScanning() {
+        mIsScanningEnabled = true;
+        if (!mBluetoothAdapter.isDiscovering()) {
+            mBluetoothAdapter.startDiscovery();
+        }
+        mAlwaysDiscoverable.start();
+        getPreference().setEnabled(true);
+    }
+
+    /** Stops scanning for devices and disables interaction. Calls are idempotent. */
+    private void disableScanning() {
+        mIsScanningEnabled = false;
+        getPreference().setEnabled(false);
+        mAlwaysDiscoverable.stop();
+        if (mBluetoothAdapter.isDiscovering()) {
+            mBluetoothAdapter.cancelDiscovery();
+        }
+    }
+
+    @Override
+    public void onScanningStateChanged(boolean started) {
+        LOG.d("onScanningStateChanged started: " + started + " mIsScanningEnabled: "
+                + mIsScanningEnabled);
+        if (!started && mIsScanningEnabled) {
+            enableScanning();
+        }
+    }
+
+    @Override
+    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+        LOG.d("onDeviceBondStateChanged device: " + cachedDevice + " state: " + bondState);
+        refreshUi();
+    }
+
+    /**
+     * Helper class to keep the {@link BluetoothAdapter} in discoverable mode indefinitely. By
+     * default, setting the scan mode to BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE will
+     * timeout, but for pairing, we want to keep the device discoverable as long as the page is
+     * scanning.
+     */
+    private static final class AlwaysDiscoverable extends BroadcastReceiver {
+
+        private final Context mContext;
+        private final BluetoothAdapter mAdapter;
+        private final IntentFilter mIntentFilter = new IntentFilter(
+                BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
+
+        private boolean mStarted;
+
+        AlwaysDiscoverable(Context context, BluetoothAdapter adapter) {
+            mContext = context;
+            mAdapter = adapter;
+        }
+
+        /**
+         * Sets the adapter scan mode to
+         * {@link BluetoothAdapter#SCAN_MODE_CONNECTABLE_DISCOVERABLE}. {@link #start()} calls
+         * should have a matching calls to {@link #stop()} when discover mode is no longer needed.
+         */
+        void start() {
+            if (mStarted) {
+                return;
+            }
+            mContext.registerReceiver(this, mIntentFilter);
+            mStarted = true;
+            setDiscoverable();
+        }
+
+        void stop() {
+            if (!mStarted) {
+                return;
+            }
+            mContext.unregisterReceiver(this);
+            mStarted = false;
+            mAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            setDiscoverable();
+        }
+
+        private void setDiscoverable() {
+            if (mAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
+                mAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java b/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java
index d0ef25a..c963bd8 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothSettingsFragment.java
@@ -13,226 +13,131 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.android.car.settings.bluetooth;
 
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
 import android.bluetooth.BluetoothAdapter;
+import android.car.userlib.CarUserManagerHelper;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
-import android.view.View;
-import android.widget.ProgressBar;
+import android.widget.CompoundButton;
 import android.widget.Switch;
-import android.widget.TextView;
-import android.widget.ViewSwitcher;
 
-import androidx.car.widget.PagedListView;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.bluetooth.BluetoothCallback;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.car.settings.common.SettingsFragment;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 /**
- * Hosts Bluetooth related preferences.
+ * Main page for Bluetooth settings. It manages the power switch for the Bluetooth adapter. It also
+ * displays paired devices and the entry point for device pairing.
  */
-public class BluetoothSettingsFragment extends BaseFragment implements BluetoothCallback {
-    private static final Logger LOG = new Logger(BluetoothSettingsFragment.class);
+public class BluetoothSettingsFragment extends SettingsFragment {
 
-    private SwipeRefreshLayout mSwipeRefreshLayout;
-    private Switch mBluetoothSwitch;
-    private ProgressBar mProgressBar;
-    private PagedListView mDeviceListView;
-    private ViewSwitcher mViewSwitcher;
-    private TextView mMessageView;
-    private BluetoothDeviceListAdapter mDeviceAdapter;
-    private LocalBluetoothAdapter mLocalAdapter;
-    private LocalBluetoothManager mLocalManager;
-
-    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+    private final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    private final IntentFilter mIntentFilter = new IntentFilter(
+            BluetoothAdapter.ACTION_STATE_CHANGED);
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(intent.getAction())) {
-                setProgressBarVisible(true);
-                mBluetoothSwitch.setChecked(true);
-                if (mViewSwitcher.getCurrentView() != mSwipeRefreshLayout) {
-                    mViewSwitcher.showPrevious();
-                }
-            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(intent.getAction())) {
-                setProgressBarVisible(false);
-            }
+            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
+            handleStateChanged(state);
         }
     };
+    private final CompoundButton.OnCheckedChangeListener mBluetoothSwitchListener =
+            new CompoundButton.OnCheckedChangeListener() {
+                @Override
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    mBluetoothSwitch.setEnabled(false);
+                    if (isChecked) {
+                        mBluetoothAdapter.enable();
+                    } else {
+                        mBluetoothAdapter.disable();
+                    }
+                }
+            };
 
-    public static BluetoothSettingsFragment getInstance() {
-        BluetoothSettingsFragment bluetoothSettingsFragment = new BluetoothSettingsFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.bluetooth_settings);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.bluetooth_list);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_toggle);
-        bluetoothSettingsFragment.setArguments(bundle);
-        return bluetoothSettingsFragment;
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private Switch mBluetoothSwitch;
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.bluetooth_settings_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_toggle;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mLocalBluetoothManager = BluetoothUtils.getLocalBtManager(context);
+        if (mLocalBluetoothManager == null) {
+            goBack();
+        }
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        mBluetoothSwitch = getActivity().findViewById(R.id.toggle_switch);
-        mSwipeRefreshLayout = getActivity().findViewById(R.id.swiperefresh);
-        mSwipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE);
-        mSwipeRefreshLayout.setOnRefreshListener(
-                new SwipeRefreshLayout.OnRefreshListener() {
-                    @Override
-                    public void onRefresh() {
-                        mSwipeRefreshLayout.setRefreshing(false);
-                        if (mLocalAdapter.isDiscovering()) {
-                            mLocalAdapter.cancelDiscovery();
-                        }
-                        mDeviceAdapter.reset();
-                    }
-                }
-        );
-
-        mBluetoothSwitch.setOnCheckedChangeListener((v, isChecked) -> {
-                if (mBluetoothSwitch.isChecked()) {
-                    // bt scan was turned on at state listener, when state is on.
-                    mLocalAdapter.setBluetoothEnabled(true);
-                } else {
-                    mLocalAdapter.stopScanning();
-                    mLocalAdapter.setBluetoothEnabled(false);
-                }
-            });
-
-        mProgressBar = getView().findViewById(R.id.bt_search_progress);
-        mDeviceListView = getView().findViewById(R.id.list);
-        mViewSwitcher = getView().findViewById(R.id.view_switcher);
-        mMessageView = getView().findViewById(R.id.bt_message);
-
-        mLocalManager =
-                LocalBluetoothManager.getInstance(getContext(), /* onInitCallback= */ null);
-        if (mLocalManager == null) {
-            LOG.e("Bluetooth is not supported on this device");
-            return;
-        }
-        mLocalAdapter = mLocalManager.getBluetoothAdapter();
+        mBluetoothSwitch = requireActivity().findViewById(R.id.toggle_switch);
+        mBluetoothSwitch.setOnCheckedChangeListener(mBluetoothSwitchListener);
     }
 
     @Override
     public void onStart() {
         super.onStart();
-        if (mLocalManager == null) {
-            return;
-        }
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
-        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
-        getActivity().registerReceiver(mBroadcastReceiver, filter);
-
-        mLocalManager.setForegroundActivity(getActivity());
-        mLocalManager.getEventManager().registerCallback(this);
-        mBluetoothSwitch.setChecked(mLocalAdapter.isEnabled());
-        if (mLocalAdapter.isEnabled()) {
-            setProgressBarVisible(true);
-            mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
-            mLocalAdapter.startScanning(true);
-            if (mViewSwitcher.getCurrentView() != mSwipeRefreshLayout) {
-                mViewSwitcher.showPrevious();
-            }
-        } else {
-            setProgressBarVisible(false);
-            if (mViewSwitcher.getCurrentView() != mMessageView) {
-                mViewSwitcher.showNext();
-            }
-        }
-        mDeviceAdapter = new BluetoothDeviceListAdapter(
-                getContext() , mLocalManager, getFragmentController());
-        mDeviceListView.setAdapter(mDeviceAdapter);
-        mDeviceAdapter.start();
+        requireContext().registerReceiver(mReceiver, mIntentFilter);
+        mLocalBluetoothManager.setForegroundActivity(requireActivity());
+        handleStateChanged(mBluetoothAdapter.getState());
     }
 
     @Override
     public void onStop() {
         super.onStop();
-        if (mLocalManager == null) {
-            return;
-        }
-        getActivity().unregisterReceiver(mBroadcastReceiver);
-        mDeviceAdapter.stop();
-        mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
-        mLocalManager.setForegroundActivity(null);
-        mLocalAdapter.stopScanning();
-        mLocalManager.getEventManager().unregisterCallback(this);
+        requireContext().unregisterReceiver(mReceiver);
+        mLocalBluetoothManager.setForegroundActivity(null);
     }
 
-    @Override
-    public void onBluetoothStateChanged(int bluetoothState) {
-        switch (bluetoothState) {
-            case BluetoothAdapter.STATE_OFF:
-                setProgressBarVisible(false);
-                mBluetoothSwitch.setChecked(false);
-                if (mViewSwitcher.getCurrentView() != mMessageView) {
-                    mViewSwitcher.showNext();
-                }
+    private boolean isUserRestricted() {
+        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH);
+    }
+
+    private void handleStateChanged(int state) {
+        // Momentarily clear the listener so that we don't update the adapter while trying to
+        // reflect the adapter state.
+        mBluetoothSwitch.setOnCheckedChangeListener(null);
+        switch (state) {
+            case BluetoothAdapter.STATE_TURNING_ON:
+                mBluetoothSwitch.setEnabled(false);
+                mBluetoothSwitch.setChecked(true);
                 break;
             case BluetoothAdapter.STATE_ON:
-            case BluetoothAdapter.STATE_TURNING_ON:
-                setProgressBarVisible(true);
+                mBluetoothSwitch.setEnabled(!isUserRestricted());
                 mBluetoothSwitch.setChecked(true);
-                if (mViewSwitcher.getCurrentView() != mSwipeRefreshLayout) {
-                        mViewSwitcher.showPrevious();
-                }
                 break;
             case BluetoothAdapter.STATE_TURNING_OFF:
-                setProgressBarVisible(true);
+                mBluetoothSwitch.setEnabled(false);
+                mBluetoothSwitch.setChecked(false);
                 break;
+            case BluetoothAdapter.STATE_OFF:
+            default:
+                mBluetoothSwitch.setEnabled(!isUserRestricted());
+                mBluetoothSwitch.setChecked(false);
         }
-    }
-
-    @Override
-    public void onScanningStateChanged(boolean started) {
-        if (!started) {
-            setProgressBarVisible(false);
-        }
-    }
-
-    @Override
-    public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
-        // no-op
-    }
-
-    @Override
-    public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
-        // no-op
-    }
-
-    @Override
-    public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {
-        // no-op
-    }
-
-    @Override
-    public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {
-        // no-op
-    }
-
-    @Override
-    public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
-        // no-op
-    }
-
-    @Override
-    public void onAudioModeChanged() {
-        // no-op
-    }
-
-    private  void setProgressBarVisible(boolean visible) {
-        if (mProgressBar != null) {
-            mProgressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
-        }
+        mBluetoothSwitch.setOnCheckedChangeListener(mBluetoothSwitchListener);
     }
 }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java b/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
new file mode 100644
index 0000000..7f94728
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceController.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import android.bluetooth.BluetoothDevice;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+/**
+ * Displays a list of unbonded (unpaired) Bluetooth devices. This controller also sets the
+ * Bluetooth adapter to discovery mode and begins scanning for discoverable devices for as long as
+ * the preference group is shown. Clicking on a device will start the pairing process. Discovery
+ * and scanning are halted while a device is pairing. Users with the {@link
+ * DISALLOW_CONFIG_BLUETOOTH} restriction cannot pair devices.
+ */
+public class BluetoothUnbondedDevicesPreferenceController extends
+        BluetoothScanningDevicesGroupPreferenceController {
+
+    private static final Logger LOG = new Logger(
+            BluetoothUnbondedDevicesPreferenceController.class);
+
+    public BluetoothUnbondedDevicesPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected BluetoothDeviceFilter.Filter getDeviceFilter() {
+        return BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER;
+    }
+
+    @Override
+    protected void onDeviceClickedInternal(CachedBluetoothDevice cachedDevice) {
+        if (cachedDevice.startPairing()) {
+            LOG.d("startPairing");
+            // Indicate that this client (vehicle) would like access to contacts (PBAP) and messages
+            // (MAP) if there is a server which permits it (usually a phone).
+            cachedDevice.getDevice().setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
+            cachedDevice.getDevice().setMessageAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
+        } else {
+            BluetoothUtils.showError(getContext(), cachedDevice.getName(),
+                    R.string.bluetooth_pairing_error_message);
+            refreshUi();
+        }
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        int availabilityStatus = super.getAvailabilityStatus();
+        if (availabilityStatus == AVAILABLE
+                && getCarUserManagerHelper().isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)) {
+            return DISABLED_FOR_USER;
+        }
+        return availabilityStatus;
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/BluetoothUtils.java b/src/com/android/car/settings/bluetooth/BluetoothUtils.java
index e5531fd..d20e849 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothUtils.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothUtils.java
@@ -16,14 +16,13 @@
 
 package com.android.car.settings.bluetooth;
 
+import android.app.AlertDialog;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
 import android.text.TextUtils;
 import android.widget.Toast;
 
-import androidx.car.app.CarAlertDialog;
-
 import com.android.car.settings.R;
 import com.android.car.settings.common.Logger;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
@@ -42,7 +41,8 @@
         @Override
         public void onBluetoothManagerInitialized(Context appContext,
                 LocalBluetoothManager bluetoothManager) {
-            com.android.settingslib.bluetooth.Utils.setErrorListener(BluetoothUtils::showError);
+            com.android.settingslib.bluetooth.BluetoothUtils.setErrorListener(
+                    com.android.car.settings.bluetooth.BluetoothUtils::showError);
         }
     };
 
@@ -69,9 +69,9 @@
         String message = context.getString(messageResId, name);
         Context activity = manager.getForegroundActivity();
         if (manager.isForegroundActivity()) {
-            new CarAlertDialog.Builder(activity)
+            new AlertDialog.Builder(activity)
                     .setTitle(R.string.bluetooth_error_title)
-                    .setBody(message)
+                    .setMessage(message)
                     .setPositiveButton(android.R.string.ok, null)
                     .create()
                     .show();
@@ -127,7 +127,7 @@
                 return true;
             }
             if ((adapter.getDiscoveryEndMillis() +
-                GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND) > currentTimeMillis) {
+                    GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND) > currentTimeMillis) {
                 return true;
             }
         }
@@ -162,6 +162,19 @@
         return false;
     }
 
+    static void persistSelectedDeviceInPicker(Context context, String deviceAddress) {
+        SharedPreferences.Editor editor = getSharedPreferences(context).edit();
+        editor.putString(KEY_LAST_SELECTED_DEVICE, deviceAddress);
+        editor.putLong(KEY_LAST_SELECTED_DEVICE_TIME, System.currentTimeMillis());
+        editor.apply();
+    }
+
+    static void persistDiscoverableEndTimestamp(Context context, long endTimestamp) {
+        SharedPreferences.Editor editor = getSharedPreferences(context).edit();
+        editor.putLong(KEY_DISCOVERABLE_END_TIMESTAMP, endTimestamp);
+        editor.apply();
+    }
+
     public static LocalBluetoothManager getLocalBtManager(Context context) {
         return LocalBluetoothManager.getInstance(context, mOnInitCallback);
     }
diff --git a/src/com/android/car/settings/bluetooth/LocalRenameDialogFragment.java b/src/com/android/car/settings/bluetooth/LocalRenameDialogFragment.java
new file mode 100644
index 0000000..b4288f7
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/LocalRenameDialogFragment.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.annotation.StringRes;
+
+import com.android.car.settings.R;
+
+/** Dialog for changing the advertised name of the local bluetooth adapter. */
+public class LocalRenameDialogFragment extends BluetoothRenameDialogFragment {
+
+    /** Tag identifying the dialog for changing the name of the local Bluetooth adapter. */
+    public static final String TAG = "LocalBluetoothRename";
+
+    private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+
+    private final IntentFilter mFilter = new IntentFilter(
+            BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            updateDeviceName();
+        }
+    };
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        requireContext().registerReceiver(mReceiver, mFilter);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        requireContext().unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    @StringRes
+    protected int getDialogTitle() {
+        return R.string.bluetooth_rename_vehicle;
+    }
+
+    @Override
+    protected String getDeviceName() {
+        if (mBluetoothAdapter.isEnabled()) {
+            return mBluetoothAdapter.getName();
+        }
+        return null;
+    }
+
+    @Override
+    protected void setDeviceName(String deviceName) {
+        mBluetoothAdapter.setName(deviceName);
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java b/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
new file mode 100644
index 0000000..4b62afb
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceController.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+
+import androidx.lifecycle.LifecycleObserver;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controls a preference that, when clicked, launches the page for pairing new Bluetooth devices.
+ * The associated preference for this controller should define the fragment attribute or an intent
+ * to launch for the Bluetooth device pairing page. If the adapter is not enabled, a click will
+ * enable Bluetooth. The summary message is updated to indicate this effect to the user.
+ */
+public class PairNewDevicePreferenceController extends PreferenceController<Preference> implements
+        LifecycleObserver {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final IntentFilter mIntentFilter = new IntentFilter(
+            BluetoothAdapter.ACTION_STATE_CHANGED);
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUi();
+        }
+    };
+
+    public PairNewDevicePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (getPreference().getIntent() == null && getPreference().getFragment() == null) {
+            throw new IllegalStateException(
+                    "Preference should declare fragment or intent for page to pair new devices");
+        }
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        return isUserRestricted() ? DISABLED_FOR_USER : AVAILABLE;
+    }
+
+    private boolean isUserRestricted() {
+        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)
+                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH);
+    }
+
+    @Override
+    protected void onStartInternal() {
+        getContext().registerReceiver(mReceiver, mIntentFilter);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        getContext().unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(
+                BluetoothAdapter.getDefaultAdapter().isEnabled() ? "" : getContext().getString(
+                        R.string.bluetooth_pair_new_device_summary));
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        // Enable the adapter if it is not on (user is notified via summary message).
+        BluetoothAdapter.getDefaultAdapter().enable();
+        return false; // Don't handle so that preference framework will launch pairing fragment.
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragment.java b/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragment.java
new file mode 100644
index 0000000..c220a25
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragment.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.StringRes;
+
+import com.android.car.settings.R;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/** Dialog for changing the display name of a remote bluetooth device. */
+public class RemoteRenameDialogFragment extends BluetoothRenameDialogFragment {
+
+    /** Tag identifying the dialog for changing the name of a remote Bluetooth device. */
+    public static final String TAG = "RemoteDeviceBluetoothRename";
+
+    private static final String KEY_CACHED_DEVICE_ADDRESS = "cached_device";
+
+    private CachedBluetoothDevice mCachedDevice;
+
+    /** Returns a new {@link RemoteRenameDialogFragment} instance for the given {@code device}. */
+    public static RemoteRenameDialogFragment newInstance(CachedBluetoothDevice device) {
+        Bundle args = new Bundle(1);
+        args.putString(KEY_CACHED_DEVICE_ADDRESS, device.getAddress());
+        RemoteRenameDialogFragment fragment = new RemoteRenameDialogFragment();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        String deviceAddress = getArguments().getString(KEY_CACHED_DEVICE_ADDRESS);
+        LocalBluetoothManager manager = BluetoothUtils.getLocalBtManager(context);
+        BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
+                deviceAddress);
+        mCachedDevice = manager.getCachedDeviceManager().findDevice(device);
+    }
+
+    @Override
+    @StringRes
+    protected int getDialogTitle() {
+        return R.string.bluetooth_rename_device;
+    }
+
+    @Override
+    protected String getDeviceName() {
+        if (mCachedDevice != null) {
+            return mCachedDevice.getName();
+        }
+        return null;
+    }
+
+    @Override
+    protected void setDeviceName(String deviceName) {
+        if (mCachedDevice != null) {
+            mCachedDevice.setName(deviceName);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilter.java b/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilter.java
new file mode 100644
index 0000000..2b7c3cc
--- /dev/null
+++ b/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilter.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import android.text.InputFilter;
+import android.text.Spanned;
+
+/**
+ * Filter which constrains edits so that the text length is not greater than the specified number
+ * of bytes using UTF-8 encoding.
+ *
+ * <p>The JNI method used by {@link android.server.BluetoothService} to convert UTF-16 to UTF-8
+ * doesn't support surrogate pairs, therefore code points outside of the basic multilingual plane
+ * (0000-FFFF) will be encoded as a pair of 3-byte UTF-8 characters rather than a single 4-byte
+ * UTF-8 encoding. Dalvik implements this conversion in {@code convertUtf16ToUtf8()} in
+ * {@code dalvik/vm/UtfString.c}.
+ *
+ * <p>This JNI method is unlikely to change in the future due to backwards compatibility
+ * requirements. It's also unclear whether the installed base of Bluetooth devices would
+ * correctly handle the encoding of surrogate pairs in UTF-8 as 4 bytes rather than 6.
+ * However, this filter will still work in scenarios where surrogate pairs are encoded as 4
+ * bytes, with the caveat that the maximum length will be constrained more conservatively than
+ * necessary.
+ *
+ * <p>Note: borrowed from com.android.settings.bluetooth.Utf8ByteLengthFilter.
+ */
+class Utf8ByteLengthFilter implements InputFilter {
+    private final int mMaxBytes;
+
+    Utf8ByteLengthFilter(int maxBytes) {
+        mMaxBytes = maxBytes;
+    }
+
+    @Override
+    public CharSequence filter(CharSequence source, int start, int end,
+            Spanned dest, int dstart, int dend) {
+        int srcByteCount = 0;
+        // Count UTF-8 bytes in source substring.
+        for (int i = start; i < end; i++) {
+            char c = source.charAt(i);
+            srcByteCount += (c < (char) 0x0080) ? 1 : (c < (char) 0x0800 ? 2 : 3);
+        }
+        int destLen = dest.length();
+        int destByteCount = 0;
+        // Count UTF-8 bytes in destination excluding replaced section.
+        for (int i = 0; i < destLen; i++) {
+            if (i < dstart || i >= dend) {
+                char c = dest.charAt(i);
+                destByteCount += (c < (char) 0x0080) ? 1 : (c < (char) 0x0800 ? 2 : 3);
+            }
+        }
+        int keepBytes = mMaxBytes - destByteCount;
+        if (keepBytes <= 0) {
+            return "";
+        } else if (keepBytes >= srcByteCount) {
+            return null; // Use original source string.
+        } else {
+            // Find end position of largest sequence that fits in keepBytes.
+            for (int i = start; i < end; i++) {
+                char c = source.charAt(i);
+                keepBytes -= (c < (char) 0x0080) ? 1 : (c < (char) 0x0800 ? 2 : 3);
+                if (keepBytes < 0) {
+                    return source.subSequence(start, i);
+                }
+            }
+            // If the entire substring fits, we should have returned null above, so this line should
+            // not be reached. If for some reason it is, use the original source string.
+            return null;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/common/ActivityResultCallback.java b/src/com/android/car/settings/common/ActivityResultCallback.java
new file mode 100644
index 0000000..e94c9b5
--- /dev/null
+++ b/src/com/android/car/settings/common/ActivityResultCallback.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.content.Intent;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Handles activity results after a {@link FragmentController} fires {@link
+ * FragmentController#startActivityForResult(Intent, int, ActivityResultCallback)}
+ * or {@link FragmentController#startIntentSenderForResult}.
+ */
+public interface ActivityResultCallback {
+
+    /**
+     * Callback used when an activity started by
+     * {@link FragmentController#startActivityForResult(Intent,
+     * int, ActivityResultCallback)} or {@link FragmentController#startIntentSenderForResult}
+     * receives a result.
+     */
+    void processActivityResult(int requestCode, int resultCode, @Nullable Intent data);
+}
diff --git a/src/com/android/car/settings/common/AnimationUtil.java b/src/com/android/car/settings/common/AnimationUtil.java
deleted file mode 100644
index 4966c67..0000000
--- a/src/com/android/car/settings/common/AnimationUtil.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.common;
-
-import android.app.ActivityOptions;
-import android.content.Context;
-
-import com.android.car.settings.R;
-
-/**
- * Contains util function for animations.
- */
-public class AnimationUtil {
-    private AnimationUtil() {
-    }
-
-    /**
-     * Animation that slide the new activity in from right.
-     */
-    public static ActivityOptions slideInFromRightOption(Context context) {
-        return ActivityOptions.makeCustomAnimation(
-                context, R.anim.trans_right_in , R.anim.trans_fade_out);
-    }
-}
diff --git a/src/com/android/car/settings/common/BaseCarSettingsActivity.java b/src/com/android/car/settings/common/BaseCarSettingsActivity.java
new file mode 100644
index 0000000..97243af
--- /dev/null
+++ b/src/com/android/car/settings/common/BaseCarSettingsActivity.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager.OnUxRestrictionsChangedListener;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.os.Bundle;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import com.android.car.apps.common.util.Themes;
+import com.android.car.settings.R;
+
+/**
+ * Base activity class for car settings, provides a action bar with a back button that goes to
+ * previous activity.
+ */
+public abstract class BaseCarSettingsActivity extends FragmentActivity implements
+        FragmentController, OnUxRestrictionsChangedListener, UxRestrictionsProvider,
+        OnBackStackChangedListener, PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+    private static final Logger LOG = new Logger(BaseCarSettingsActivity.class);
+
+    private CarUxRestrictionsHelper mUxRestrictionsHelper;
+    private View mRestrictedMessage;
+    // Default to minimum restriction.
+    private CarUxRestrictions mCarUxRestrictions = new CarUxRestrictions.Builder(
+            /* reqOpt= */ true,
+            CarUxRestrictions.UX_RESTRICTIONS_BASELINE,
+            /* timestamp= */ 0
+    ).build();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.car_setting_activity);
+        if (mUxRestrictionsHelper == null) {
+            mUxRestrictionsHelper = new CarUxRestrictionsHelper(/* context= */ this, /* listener= */
+                    this);
+        }
+        mUxRestrictionsHelper.start();
+        getSupportFragmentManager().addOnBackStackChangedListener(this);
+        mRestrictedMessage = findViewById(R.id.restricted_message);
+
+        launchIfDifferent(getInitialFragment());
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mUxRestrictionsHelper.stop();
+        mUxRestrictionsHelper = null;
+    }
+
+    @Override
+    public void onBackPressed() {
+        super.onBackPressed();
+        hideKeyboard();
+        // If the backstack is empty, finish the activity.
+        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
+            finish();
+        }
+    }
+
+    @Override
+    public void launchFragment(Fragment fragment) {
+        if (fragment instanceof DialogFragment) {
+            throw new IllegalArgumentException(
+                    "cannot launch dialogs with launchFragment() - use showDialog() instead");
+        }
+
+        getSupportFragmentManager()
+                .beginTransaction()
+                .setCustomAnimations(
+                        Themes.getAttrResourceId(/* context= */ this,
+                                android.R.attr.fragmentOpenEnterAnimation),
+                        Themes.getAttrResourceId(/* context= */ this,
+                                android.R.attr.fragmentOpenExitAnimation),
+                        Themes.getAttrResourceId(/* context= */ this,
+                                android.R.attr.fragmentCloseEnterAnimation),
+                        Themes.getAttrResourceId(/* context= */ this,
+                                android.R.attr.fragmentCloseExitAnimation))
+                .replace(R.id.fragment_container, fragment,
+                        Integer.toString(getSupportFragmentManager().getBackStackEntryCount()))
+                .addToBackStack(null)
+                .commit();
+    }
+
+    @Override
+    public void goBack() {
+        onBackPressed();
+    }
+
+    @Override
+    public void showBlockingMessage() {
+        Toast.makeText(this, R.string.restricted_while_driving, Toast.LENGTH_SHORT).show();
+    }
+
+    @Override
+    public void showDialog(DialogFragment dialogFragment, @Nullable String tag) {
+        dialogFragment.show(getSupportFragmentManager(), tag);
+    }
+
+    @Override
+    @Nullable
+    public DialogFragment findDialogByTag(String tag) {
+        Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
+        if (fragment instanceof DialogFragment) {
+            return (DialogFragment) fragment;
+        }
+        return null;
+    }
+
+    @Override
+    public void startActivityForResult(Intent intent, int requestCode,
+            ActivityResultCallback callback) {
+        throw new UnsupportedOperationException(
+                "Unimplemented for activities that implement FragmentController");
+    }
+
+    @Override
+    public void startIntentSenderForResult(IntentSender intent, int requestCode,
+            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, Bundle options,
+            ActivityResultCallback callback) {
+        throw new UnsupportedOperationException(
+                "Unimplemented for activities that implement FragmentController");
+    }
+
+    @Override
+    public void onUxRestrictionsChanged(CarUxRestrictions restrictionInfo) {
+        mCarUxRestrictions = restrictionInfo;
+        Fragment currentFragment = getCurrentFragment();
+        if (currentFragment instanceof OnUxRestrictionsChangedListener) {
+            ((OnUxRestrictionsChangedListener) currentFragment)
+                    .onUxRestrictionsChanged(restrictionInfo);
+        }
+        updateBlockingView(currentFragment);
+    }
+
+    @Override
+    public CarUxRestrictions getCarUxRestrictions() {
+        return mCarUxRestrictions;
+    }
+
+    @Override
+    public void onBackStackChanged() {
+        onUxRestrictionsChanged(getCarUxRestrictions());
+    }
+
+    @Override
+    public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
+        if (pref.getFragment() != null) {
+            Fragment fragment = Fragment.instantiate(/* context= */ this, pref.getFragment(),
+                    pref.getExtras());
+            launchFragment(fragment);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Gets the fragment to show onCreate. If null, the activity will not perform an initial
+     * fragment transaction.
+     */
+    @Nullable
+    protected abstract Fragment getInitialFragment();
+
+    protected void launchIfDifferent(Fragment newFragment) {
+        Fragment currentFragment = getCurrentFragment();
+        if ((newFragment != null) && differentFragment(newFragment, currentFragment)) {
+            LOG.d("launchIfDifferent: " + newFragment + " replacing " + currentFragment);
+            launchFragment(newFragment);
+        }
+    }
+
+    protected Fragment getCurrentFragment() {
+        return getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+    }
+
+    /**
+     * Returns {code true} if newFragment is different from current fragment.
+     */
+    private boolean differentFragment(Fragment newFragment, Fragment currentFragment) {
+        return (currentFragment == null)
+                || (!currentFragment.getClass().equals(newFragment.getClass()));
+    }
+
+    private void hideKeyboard() {
+        InputMethodManager imm = (InputMethodManager) this.getSystemService(
+                Context.INPUT_METHOD_SERVICE);
+        imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
+    }
+
+    private void updateBlockingView(@Nullable Fragment currentFragment) {
+        if (currentFragment instanceof BaseFragment) {
+            boolean canBeShown = ((BaseFragment) currentFragment).canBeShown(mCarUxRestrictions);
+            mRestrictedMessage.setVisibility(canBeShown ? View.GONE : View.VISIBLE);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/common/BaseFragment.java b/src/com/android/car/settings/common/BaseFragment.java
index 49981c3..8b00e6b 100644
--- a/src/com/android/car/settings/common/BaseFragment.java
+++ b/src/com/android/car/settings/common/BaseFragment.java
@@ -11,84 +11,33 @@
  * 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
+ * limitations under the License.
  */
 
 package com.android.car.settings.common;
 
-import android.annotation.NonNull;
 import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager;
 import android.content.Context;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.FrameLayout;
 import android.widget.TextView;
 
 import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
 import androidx.fragment.app.Fragment;
 
 import com.android.car.settings.R;
 
-import java.util.Set;
-
 /**
  * Base fragment for setting activity.
  */
-public abstract class BaseFragment extends Fragment {
-    public static final String EXTRA_TITLE_ID = "extra_title_id";
-    public static final String EXTRA_LAYOUT = "extra_layout";
-    public static final String EXTRA_ACTION_BAR_LAYOUT = "extra_action_bar_layout";
-    /**
-     * For indicating a fragment is running in Setup Wizard
-     */
-    public static final String EXTRA_RUNNING_IN_SETUP_WIZARD = "extra_running_in_setup_wizard";
-
-    /**
-     * Controls the transition of fragment.
-     */
-    public interface FragmentController {
-        /**
-         * Launches fragment in the main container of current activity.
-         */
-        void launchFragment(BaseFragment fragment);
-
-        /**
-         * Pops the top off the fragment stack.
-         * @return {@code false} if there's no stack to pop, {@code true} otherwise
-         */
-        void goBack();
-
-        /**
-         * Shows a message that current feature is not available when driving.
-         */
-        void showDOBlockingMessage();
-    }
-
-    /**
-     * Provides current CarUxRestrictions.
-     */
-    public interface UXRestrictionsProvider {
-
-        /**
-         * Fetches current CarUxRestrictions
-         */
-        @NonNull
-        CarUxRestrictions getCarUxRestrictions();
-    }
-
-    @LayoutRes
-    protected int mLayout;
-
-    @LayoutRes
-    private int mActionBarLayout;
-
-    @StringRes
-    private int mTitleId;
+public abstract class BaseFragment extends Fragment implements
+        CarUxRestrictionsManager.OnUxRestrictionsChangedListener {
 
     /**
      * Assume The activity holds this fragment also implements the FragmentController.
@@ -99,17 +48,11 @@
     }
 
     /**
-     * Assume The activity holds this fragment also implements the UXRestrictionsProvider.
+     * Assume The activity holds this fragment also implements the UxRestrictionsProvider.
      * This function should be called after onAttach()
      */
     protected final CarUxRestrictions getCurrentRestrictions() {
-        return ((UXRestrictionsProvider) getActivity()).getCarUxRestrictions();
-    }
-
-    protected static Bundle getBundle() {
-        Bundle bundle = new Bundle();
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar);
-        return bundle;
+        return ((UxRestrictionsProvider) getActivity()).getCarUxRestrictions();
     }
 
     /**
@@ -120,60 +63,87 @@
         return !CarUxRestrictionsHelper.isNoSetup(carUxRestrictions);
     }
 
+    @Override
+    public void onUxRestrictionsChanged(CarUxRestrictions restrictionInfo) {
+    }
+
     /**
-     * Notifies the fragment with the latest CarUxRestrictions change.
+     * Returns the layout id to use with the {@link ActionBar}. Subclasses should override this
+     * method to customize the action bar layout. The default action bar contains a back button
+     * and the title.
      */
-    protected void onUxRestrictionChanged(@NonNull CarUxRestrictions carUxRestrictions) {
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar;
+    }
+
+    /**
+     * Returns the layout id of the current Fragment.
+     */
+    @LayoutRes
+    protected abstract int getLayoutId();
+
+    /**
+     * Returns the string id for the current Fragment title. Subclasses should override this
+     * method to set the title to display. Use {@link #setTitle(CharSequence)} to update the
+     * displayed title while resumed. The default title is the Settings Activity label.
+     */
+    @StringRes
+    protected int getTitleId() {
+        return R.string.settings_label;
+    }
+
+    /**
+     * Should be used to override fragment's title. This should only be called after
+     * {@link #onActivityCreated(Bundle)}.
+     *
+     * @param title CharSequence to set as the new title.
+     */
+    protected final void setTitle(CharSequence title) {
+        TextView titleView = requireActivity().findViewById(R.id.title);
+        if (titleView != null) {
+            titleView.setText(title);
+        }
     }
 
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
         if (!(getActivity() instanceof FragmentController)) {
-            throw new IllegalArgumentException("Must attach to an FragmentController");
+            throw new IllegalStateException("Must attach to a FragmentController");
         }
-        if (!(getActivity() instanceof UXRestrictionsProvider)) {
-            throw new IllegalArgumentException("Must attach to an UXRestrictionsProvider");
+        if (!(getActivity() instanceof UxRestrictionsProvider)) {
+            throw new IllegalStateException("Must attach to a UxRestrictionsProvider");
         }
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Set<String> extraKeys = getArguments().keySet();
-        if (extraKeys.contains(EXTRA_ACTION_BAR_LAYOUT)) {
-            mActionBarLayout = getArguments().getInt(EXTRA_ACTION_BAR_LAYOUT);
-        } else {
-            throw new IllegalArgumentException("must specify a actionBar layout");
-        }
-        if (extraKeys.contains(EXTRA_LAYOUT)) {
-            mLayout = getArguments().getInt(EXTRA_LAYOUT);
-        } else {
-            throw new IllegalArgumentException("must specify a layout");
-        }
-        if (extraKeys.contains(EXTRA_TITLE_ID)) {
-            mTitleId = getArguments().getInt(EXTRA_TITLE_ID);
-        } else {
-            throw new IllegalArgumentException("must specify a title");
+    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        @LayoutRes int layoutId = getLayoutId();
+        return inflater.inflate(layoutId, container, false);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        FrameLayout actionBarContainer = requireActivity().findViewById(R.id.action_bar);
+        if (actionBarContainer != null) {
+            actionBarContainer.removeAllViews();
+            getLayoutInflater().inflate(getActionBarLayoutId(), actionBarContainer);
+
+            TextView titleView = actionBarContainer.requireViewById(R.id.title);
+            titleView.setText(getTitleId());
+            actionBarContainer.requireViewById(R.id.action_bar_icon_container).setOnClickListener(
+                    v -> onBackPressed());
         }
     }
 
+
     @Override
     public void onStart() {
         super.onStart();
-        onUxRestrictionChanged(getCurrentRestrictions());
-    }
-
-    /**
-     * Should be used to override fragment's title.
-     * Should be called after {@code super.onActivityCreated}, so that it's called AFTER the default title
-     * setter.
-     *
-     * @param title CharSequence to set as the new title.
-     */
-    protected final void setTitle(CharSequence title) {
-        TextView titleView = getActivity().findViewById(R.id.title);
-        titleView.setText(title);
+        onUxRestrictionsChanged(getCurrentRestrictions());
     }
 
     /**
@@ -182,26 +152,4 @@
     protected void onBackPressed() {
         getFragmentController().goBack();
     }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        return inflater.inflate(mLayout, container, false);
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
-        actionBar.setDisplayHomeAsUpEnabled(false);
-        actionBar.setCustomView(mActionBarLayout);
-        actionBar.setDisplayShowCustomEnabled(true);
-        // make the toolbar take the whole width.
-        Toolbar toolbar = (Toolbar) actionBar.getCustomView().getParent();
-        toolbar.setPadding(0, 0, 0, 0);
-        getActivity().findViewById(R.id.action_bar_icon_container).setOnClickListener(
-                v -> onBackPressed());
-        TextView titleView = getActivity().findViewById(R.id.title);
-        titleView.setText(mTitleId);
-    }
 }
diff --git a/src/com/android/car/settings/common/ButtonPreference.java b/src/com/android/car/settings/common/ButtonPreference.java
new file mode 100644
index 0000000..28e4ad1
--- /dev/null
+++ b/src/com/android/car/settings/common/ButtonPreference.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.Preference;
+
+/**
+ * {@link Preference} with a secondary clickable button on the side.
+ * {@link #setLayoutResource(int)} or the {@code widgetLayout} resource may be used to specify
+ * the icon to display in the button.
+ *
+ * <p>Note: the button is enabled even when {@link #isEnabled()} is {@code false}.
+ */
+public class ButtonPreference extends TwoActionPreference {
+
+    /**
+     * Interface definition for a callback to be invoked when the button is clicked.
+     */
+    public interface OnButtonClickListener {
+        /**
+         * Called when a button has been clicked.
+         *
+         * @param preference the preference whose button was clicked.
+         */
+        void onButtonClick(ButtonPreference preference);
+    }
+
+    private OnButtonClickListener mOnButtonClickListener;
+
+    public ButtonPreference(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    public ButtonPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public ButtonPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ButtonPreference(Context context) {
+        super(context);
+    }
+
+    /**
+     * Sets an {@link OnButtonClickListener} to be invoked when the button is clicked.
+     */
+    public void setOnButtonClickListener(OnButtonClickListener listener) {
+        mOnButtonClickListener = listener;
+    }
+
+    /** Virtually clicks the button contained inside this preference. */
+    public void performButtonClick() {
+        if (isActionShown()) {
+            if (mOnButtonClickListener != null) {
+                mOnButtonClickListener.onButtonClick(this);
+            }
+        }
+    }
+
+    @Override
+    protected void onBindWidgetFrame(View widgetFrame) {
+        widgetFrame.setOnClickListener(v -> performButtonClick());
+    }
+}
diff --git a/src/com/android/car/settings/common/CarSettingActivity.java b/src/com/android/car/settings/common/CarSettingActivity.java
index b79b047..1a33ccc 100644
--- a/src/com/android/car/settings/common/CarSettingActivity.java
+++ b/src/com/android/car/settings/common/CarSettingActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -11,144 +11,90 @@
  * 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
+ * limitations under the License.
  */
+
 package com.android.car.settings.common;
 
-import android.annotation.Nullable;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Toast;
 
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
-import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment.UXRestrictionsProvider;
-import com.android.car.settings.quicksettings.QuickSettingFragment;
 
 /**
- * Base activity class for car settings, provides a action bar with a back button that goes to
- * previous activity.
+ * Root activity used for most of the Settings app. This activity provides additional functionality
+ * which handles intents.
  */
-public class CarSettingActivity extends AppCompatActivity implements
-        BaseFragment.FragmentController, UXRestrictionsProvider, OnBackStackChangedListener{
-    private CarUxRestrictionsHelper mUxRestrictionsHelper;
-    private View mRestrictedMessage;
-    // Default to minimum restriction.
-    private CarUxRestrictions mCarUxRestrictions = new CarUxRestrictions.Builder(
-            /* reqOpt= */ true,
-            CarUxRestrictions.UX_RESTRICTIONS_BASELINE,
-            /* timestamp= */ 0
-    ).build();
+public class CarSettingActivity extends BaseCarSettingsActivity {
+
+    private static final Logger LOG = new Logger(CarSettingActivity.class);
+
+    private static final String KEY_HAS_NEW_INTENT =
+            "com.android.car.settings.common.CarSettingActivity.KEY_HAS_NEW_INTENT";
+
+    private boolean mHasNewIntent = true;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.app_compat_activity);
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
-        if (mUxRestrictionsHelper == null) {
-            mUxRestrictionsHelper =
-                    new CarUxRestrictionsHelper(this, carUxRestrictions -> {
-                        mCarUxRestrictions = carUxRestrictions;
-                        BaseFragment currentFragment = getCurrentFragment();
-                        if (currentFragment != null) {
-                            currentFragment.onUxRestrictionChanged(carUxRestrictions);
-                            updateBlockingView(currentFragment);
-                        }
-                    });
-        }
-        mUxRestrictionsHelper.start();
-        getSupportFragmentManager().addOnBackStackChangedListener(this);
-        mRestrictedMessage = findViewById(R.id.restricted_message);
-    }
-
-    @Override
-    public void onBackStackChanged() {
-        updateBlockingView(getCurrentFragment());
-    }
-
-    private void updateBlockingView(@Nullable BaseFragment currentFragment) {
-        if (currentFragment == null) {
-            return;
-        }
-        boolean canBeShown = currentFragment.canBeShown(mCarUxRestrictions);
-        mRestrictedMessage.setVisibility(canBeShown ? View.GONE : View.VISIBLE);
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        if (getCurrentFragment() == null) {
-            launchFragment(QuickSettingFragment.newInstance());
+        if (savedInstanceState != null) {
+            mHasNewIntent = savedInstanceState.getBoolean(KEY_HAS_NEW_INTENT, mHasNewIntent);
         }
     }
 
     @Override
-    public CarUxRestrictions getCarUxRestrictions() {
-        return mCarUxRestrictions;
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mUxRestrictionsHelper.stop();
-        mUxRestrictionsHelper = null;
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBoolean(KEY_HAS_NEW_INTENT, mHasNewIntent);
     }
 
     @Override
     public void onNewIntent(Intent intent) {
+        LOG.d("onNewIntent" + intent);
         setIntent(intent);
+        mHasNewIntent = true;
     }
 
     @Override
-    public void launchFragment(BaseFragment fragment) {
-        getSupportFragmentManager()
-                .beginTransaction()
-                .setCustomAnimations(
-                        R.animator.trans_right_in ,
-                        R.animator.trans_left_out,
-                        R.animator.trans_left_in,
-                        R.animator.trans_right_out)
-                .replace(R.id.fragment_container, fragment)
-                .addToBackStack(null)
-                .commit();
-    }
-
-    @Override
-    public void goBack() {
-        onBackPressed();
-    }
-
-    @Override
-    public void showDOBlockingMessage() {
-        Toast.makeText(
-                this, R.string.restricted_while_driving, Toast.LENGTH_SHORT).show();
-    }
-
-    @Override
-    public void onBackPressed() {
-        super.onBackPressed();
-        hideKeyboard();
-        // if the backstack is empty, finish the activity.
-        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
-            finish();
+    protected void onResume() {
+        super.onResume();
+        if (mHasNewIntent) {
+            Fragment fragment = FragmentResolver.getFragmentForIntent(/* context= */ this,
+                    getIntent());
+            launchIfDifferent(fragment);
+            mHasNewIntent = false;
         }
     }
 
-    private BaseFragment getCurrentFragment() {
-        return (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+    @Override
+    public void launchFragment(Fragment fragment) {
+        // Called before super to clear the back stack if necessary before launching the fragment
+        // in question.
+        if (fragment.getClass().getName().equals(
+                getString(R.string.config_settings_hierarchy_root_fragment))
+                && getSupportFragmentManager().getBackStackEntryCount() > 1) {
+            getSupportFragmentManager().popBackStackImmediate(/* name= */ null,
+                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
+        }
+
+        super.launchFragment(fragment);
     }
 
-    private void hideKeyboard() {
-        InputMethodManager imm = (InputMethodManager)this.getSystemService(
-                Context.INPUT_METHOD_SERVICE);
-        imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
+    /**
+     * Gets the fragment to show onCreate. This will only be launched if it is different from the
+     * current fragment shown.
+     */
+    @Override
+    @Nullable
+    protected Fragment getInitialFragment() {
+        if (getCurrentFragment() != null) {
+            return getCurrentFragment();
+        }
+        return Fragment.instantiate(this,
+                getString(R.string.config_settings_hierarchy_root_fragment));
     }
 }
diff --git a/src/com/android/car/settings/common/ConfirmationDialogFragment.java b/src/com/android/car/settings/common/ConfirmationDialogFragment.java
new file mode 100644
index 0000000..a9e9e68
--- /dev/null
+++ b/src/com/android/car/settings/common/ConfirmationDialogFragment.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.fragment.app.DialogFragment;
+
+/**
+ * Common dialog that can be used across the settings app to ask the user to confirm their desired
+ * action.
+ */
+public class ConfirmationDialogFragment extends DialogFragment implements
+        DialogInterface.OnClickListener {
+
+    /** Builder to help construct {@link ConfirmationDialogFragment}. */
+    public static class Builder {
+
+        private final Context mContext;
+        private Bundle mArgs;
+        private String mTitle;
+        private String mMessage;
+        private String mPosLabel;
+        private String mNegLabel;
+        private ConfirmListener mConfirmListener;
+        private RejectListener mRejectListener;
+
+        public Builder(Context context) {
+            mContext = context;
+        }
+
+        /** Sets the title. */
+        public Builder setTitle(String title) {
+            mTitle = title;
+            return this;
+        }
+
+        /** Sets the title. */
+        public Builder setTitle(@StringRes int title) {
+            mTitle = mContext.getString(title);
+            return this;
+        }
+
+        /** Sets the message. */
+        public Builder setMessage(String message) {
+            mMessage = message;
+            return this;
+        }
+
+        /** Sets the message. */
+        public Builder setMessage(@StringRes int message) {
+            mMessage = mContext.getString(message);
+            return this;
+        }
+
+        /** Sets the positive button label. */
+        public Builder setPositiveButton(String label, ConfirmListener confirmListener) {
+            mPosLabel = label;
+            mConfirmListener = confirmListener;
+            return this;
+        }
+
+        /** Sets the positive button label. */
+        public Builder setPositiveButton(@StringRes int label, ConfirmListener confirmListener) {
+            mPosLabel = mContext.getString(label);
+            mConfirmListener = confirmListener;
+            return this;
+        }
+
+        /** Sets the negative button label. */
+        public Builder setNegativeButton(String label, RejectListener rejectListener) {
+            mNegLabel = label;
+            mRejectListener = rejectListener;
+            return this;
+        }
+
+        /** Sets the negative button label. */
+        public Builder setNegativeButton(@StringRes int label, RejectListener rejectListener) {
+            mNegLabel = mContext.getString(label);
+            mRejectListener = rejectListener;
+            return this;
+        }
+
+        /** Adds an argument string to the argument bundle. */
+        public Builder addArgumentString(String argumentKey, String argument) {
+            if (mArgs == null) {
+                mArgs = new Bundle();
+            }
+            mArgs.putString(argumentKey, argument);
+            return this;
+        }
+
+        /** Adds an argument boolean to the argument bundle. */
+        public Builder addArgumentBoolean(String argumentKey, boolean argument) {
+            if (mArgs == null) {
+                mArgs = new Bundle();
+            }
+            mArgs.putBoolean(argumentKey, argument);
+            return this;
+        }
+
+        /** Adds an argument Parcelable to the argument bundle. */
+        public Builder addArgumentParcelable(String argumentKey, Parcelable argument) {
+            if (mArgs == null) {
+                mArgs = new Bundle();
+            }
+            mArgs.putParcelable(argumentKey, argument);
+            return this;
+        }
+
+        /** Constructs the {@link ConfirmationDialogFragment}. */
+        public ConfirmationDialogFragment build() {
+            return ConfirmationDialogFragment.init(this);
+        }
+    }
+
+    /** Identifier used to launch the dialog fragment. */
+    public static final String TAG = "ConfirmationDialogFragment";
+
+    // Argument keys are prefixed with TAG in order to reduce the changes of collision with user
+    // provided arguments.
+    private static final String ALL_ARGUMENTS_KEY = TAG + "_all_arguments";
+    private static final String ARGUMENTS_KEY = TAG + "_arguments";
+    private static final String TITLE_KEY = TAG + "_title";
+    private static final String MESSAGE_KEY = TAG + "_message";
+    private static final String POSITIVE_KEY = TAG + "_positive";
+    private static final String NEGATIVE_KEY = TAG + "_negative";
+
+    private String mTitle;
+    private String mMessage;
+    private String mPosLabel;
+    private String mNegLabel;
+    private ConfirmListener mConfirmListener;
+    private RejectListener mRejectListener;
+
+    /** Constructs the dialog fragment from the arguments provided in the {@link Builder} */
+    private static ConfirmationDialogFragment init(Builder builder) {
+        ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment();
+        Bundle args = new Bundle();
+        args.putBundle(ARGUMENTS_KEY, builder.mArgs);
+        args.putString(TITLE_KEY, builder.mTitle);
+        args.putString(MESSAGE_KEY, builder.mMessage);
+        args.putString(POSITIVE_KEY, builder.mPosLabel);
+        args.putString(NEGATIVE_KEY, builder.mNegLabel);
+        dialogFragment.setArguments(args);
+        dialogFragment.setConfirmListener(builder.mConfirmListener);
+        dialogFragment.setRejectListener(builder.mRejectListener);
+        return dialogFragment;
+    }
+
+    /**
+     * Since it is possible for the listeners to be unregistered on configuration change, provide a
+     * way to reattach the listeners.
+     */
+    public static void resetListeners(@Nullable ConfirmationDialogFragment dialogFragment,
+            @Nullable ConfirmListener confirmListener, @Nullable RejectListener rejectListener) {
+        if (dialogFragment != null) {
+            dialogFragment.setConfirmListener(confirmListener);
+            dialogFragment.setRejectListener(rejectListener);
+        }
+    }
+
+    /** Sets the listener which listens to a click on the positive button. */
+    private void setConfirmListener(ConfirmListener confirmListener) {
+        mConfirmListener = confirmListener;
+    }
+
+    /** Gets the listener which listens to a click on the positive button */
+    @Nullable
+    public ConfirmListener getConfirmListener() {
+        return mConfirmListener;
+    }
+
+    /** Sets the listener which listens to a click on the negative button. */
+    private void setRejectListener(RejectListener rejectListener) {
+        mRejectListener = rejectListener;
+    }
+
+    /** Gets the listener which listens to a click on the negative button. */
+    @Nullable
+    public RejectListener getRejectListener() {
+        return mRejectListener;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Bundle args = getArguments();
+        if (savedInstanceState != null) {
+            args = savedInstanceState.getBundle(ALL_ARGUMENTS_KEY);
+        }
+
+        if (args != null) {
+            mTitle = getArguments().getString(TITLE_KEY);
+            mMessage = getArguments().getString(MESSAGE_KEY);
+            mPosLabel = getArguments().getString(POSITIVE_KEY);
+            mNegLabel = getArguments().getString(NEGATIVE_KEY);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBundle(ALL_ARGUMENTS_KEY, getArguments());
+    }
+
+    @NonNull
+    @Override
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+        if (!TextUtils.isEmpty(mTitle)) {
+            builder.setTitle(mTitle);
+        }
+        if (!TextUtils.isEmpty(mMessage)) {
+            builder.setMessage(mMessage);
+        }
+        if (!TextUtils.isEmpty(mPosLabel)) {
+            builder.setPositiveButton(mPosLabel, this);
+        }
+        if (!TextUtils.isEmpty(mNegLabel)) {
+            builder.setNegativeButton(mNegLabel, this);
+        }
+        return builder.create();
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (which == DialogInterface.BUTTON_POSITIVE) {
+            if (mConfirmListener != null) {
+                mConfirmListener.onConfirm(getArguments().getBundle(ARGUMENTS_KEY));
+            }
+        } else if (which == DialogInterface.BUTTON_NEGATIVE) {
+            if (mRejectListener != null) {
+                mRejectListener.onReject(getArguments().getBundle(ARGUMENTS_KEY));
+            }
+        }
+    }
+
+    /** Listens to the confirmation action. */
+    public interface ConfirmListener {
+        /**
+         * Defines the action to take on confirm. The bundle will contain the arguments added when
+         * constructing the dialog through with {@link Builder#addArgumentString(String, String)}.
+         */
+        void onConfirm(@Nullable Bundle arguments);
+    }
+
+    /** Listens to the rejection action. */
+    public interface RejectListener {
+        /**
+         * Defines the action to take on reject. The bundle will contain the arguments added when
+         * constructing the dialog through with {@link Builder#addArgumentString(String, String)}.
+         */
+        void onReject(@Nullable Bundle arguments);
+    }
+}
diff --git a/src/com/android/car/settings/common/DOBlockingDialogFragment.java b/src/com/android/car/settings/common/DOBlockingDialogFragment.java
deleted file mode 100644
index 4023719..0000000
--- a/src/com/android/car/settings/common/DOBlockingDialogFragment.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.common;
-
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-import androidx.car.app.CarAlertDialog;
-import androidx.fragment.app.DialogFragment;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment.FragmentController;
-import com.android.car.settings.quicksettings.QuickSettingFragment;
-
-/**
- * A dialog to block non-distraction optimized view when restriction is applied.
- */
-public class DOBlockingDialogFragment extends DialogFragment implements
-        DialogInterface.OnClickListener {
-    public static final String DIALOG_TAG = "block_dialog_tag";
-    private static final String MESSAGE_ARG_KEY = "message";
-    private boolean mShowQuickSettingsMainScreen = true;
-
-    /**
-     * Creates a DOBlockingDialogFragment with a specified message
-     *
-     * @param message
-     * @return an instance of DOBlockingDialogFragment
-     */
-    public static DOBlockingDialogFragment newInstance(String message) {
-        DOBlockingDialogFragment fragment = new DOBlockingDialogFragment();
-
-        Bundle args = new Bundle();
-        args.putString(MESSAGE_ARG_KEY, message);
-        fragment.setArguments(args);
-
-        return fragment;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        Context context = getContext();
-        // If a message is not set, use the default message.
-        String message = getArguments().getString(MESSAGE_ARG_KEY);
-        if (message == null) {
-            message = getContext().getString(R.string.restricted_while_driving);
-        }
-        Dialog dialog = new CarAlertDialog.Builder(context)
-                .setBody(message)
-                .setPositiveButton(context.getString(R.string.okay),  /* listener= */ this)
-                .setCancelable(false)
-                .create();
-        return dialog;
-    }
-
-    /**
-     * Return to the quick settings main screen after the dialog is dismissed.
-     * @param showQuickSettingsMainScreen whether to return to the quick settings main screen, the
-     * default value is true
-     */
-    public void goBackToQuickSettingsMainScreen(boolean showQuickSettingsMainScreen) {
-        mShowQuickSettingsMainScreen = showQuickSettingsMainScreen;
-    }
-
-    // only one button, no need to check on negative.
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (mShowQuickSettingsMainScreen) {
-            ((FragmentController) getActivity()).launchFragment(
-                    QuickSettingFragment.newInstance());
-        }
-        dismiss();
-    }
-}
diff --git a/src/com/android/car/settings/common/DefaultRestrictionsPreferenceController.java b/src/com/android/car/settings/common/DefaultRestrictionsPreferenceController.java
new file mode 100644
index 0000000..bf479b0
--- /dev/null
+++ b/src/com/android/car/settings/common/DefaultRestrictionsPreferenceController.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+/**
+ * Concrete implementation of {@link PreferenceController} which allows for applying the default
+ * {@link #getAvailabilityStatus()} and {@link #onApplyUxRestrictions(CarUxRestrictions)}
+ * behavior to preferences which do not require additional controller logic.
+ */
+public final class DefaultRestrictionsPreferenceController extends
+        PreferenceController<Preference> {
+
+    public DefaultRestrictionsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+}
diff --git a/src/com/android/car/settings/common/EditTextPreferenceDialogFragment.java b/src/com/android/car/settings/common/EditTextPreferenceDialogFragment.java
new file mode 100644
index 0000000..4026fd4
--- /dev/null
+++ b/src/com/android/car/settings/common/EditTextPreferenceDialogFragment.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.text.InputType;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.preference.EditTextPreference;
+
+/**
+ * Presents a dialog with an {@link EditText} associated with an {@link EditTextPreference}.
+ *
+ * <p>Note: CarSettings needs to use custom dialog implementations in order to launch the platform
+ * {@link AlertDialog} instead of the one in the support library.
+ */
+public class EditTextPreferenceDialogFragment extends
+        SettingsPreferenceDialogFragment implements TextView.OnEditorActionListener {
+
+    private static final String SAVE_STATE_TEXT = "EditTextPreferenceDialogFragment.text";
+
+    private EditText mEditText;
+    private CharSequence mText;
+    private boolean mAllowEnterToSubmit = true;
+
+    /**
+     * Returns a new instance of {@link EditTextPreferenceDialogFragment} for the {@link
+     * EditTextPreference} with the given {@code key}.
+     */
+    public static EditTextPreferenceDialogFragment newInstance(String key) {
+        EditTextPreferenceDialogFragment fragment = new EditTextPreferenceDialogFragment();
+        Bundle b = new Bundle(/* capacity= */ 1);
+        b.putString(ARG_KEY, key);
+        fragment.setArguments(b);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState == null) {
+            mText = getEditTextPreference().getText();
+        } else {
+            mText = savedInstanceState.getCharSequence(SAVE_STATE_TEXT);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putCharSequence(SAVE_STATE_TEXT, mText);
+    }
+
+    @Override
+    protected void onBindDialogView(View view) {
+        super.onBindDialogView(view);
+
+        mEditText = view.findViewById(android.R.id.edit);
+
+        if (mEditText == null) {
+            throw new IllegalStateException(
+                    "Dialog view must contain an EditText with id @android:id/edit");
+        }
+
+        mEditText.requestFocus();
+        mEditText.setText(mText);
+        mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
+        mEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);
+        mEditText.setOnEditorActionListener(this);
+        // Place cursor at the end
+        mEditText.setSelection(mEditText.getText().length());
+    }
+
+    private EditTextPreference getEditTextPreference() {
+        return (EditTextPreference) getPreference();
+    }
+
+    @Override
+    protected boolean needInputMethod() {
+        return true;
+    }
+
+    @Override
+    protected void onDialogClosed(boolean positiveResult) {
+        if (positiveResult) {
+            String value = mEditText.getText().toString();
+            if (getEditTextPreference().callChangeListener(value)) {
+                getEditTextPreference().setText(value);
+            }
+        }
+    }
+
+    /** Allows enabling and disabling the ability to press enter to dismiss the dialog. */
+    public void setAllowEnterToSubmit(boolean isAllowed) {
+        mAllowEnterToSubmit = isAllowed;
+    }
+
+    /** Allows verifying if enter to submit is currently enabled. */
+    public boolean getAllowEnterToSubmit() {
+        return mAllowEnterToSubmit;
+    }
+
+    @Override
+    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+        if (actionId == EditorInfo.IME_ACTION_DONE && mAllowEnterToSubmit) {
+            CharSequence newValue = v.getText();
+
+            getEditTextPreference().callChangeListener(newValue);
+            dismiss();
+
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/car/settings/common/ErrorDialog.java b/src/com/android/car/settings/common/ErrorDialog.java
new file mode 100644
index 0000000..8872577
--- /dev/null
+++ b/src/com/android/car/settings/common/ErrorDialog.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.os.Bundle;
+
+import androidx.annotation.StringRes;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+
+/**
+ * Dialog to inform that an action failed.
+ */
+public class ErrorDialog extends DialogFragment {
+    private static final String ERROR_DIALOG_TITLE_KEY = "error_dialog_title";
+    private static final String DIALOG_TAG = "ErrorDialogTag";
+
+    /**
+     * Shows the error dialog.
+     *
+     * @param parent Fragment associated with the dialog.
+     * @param title  Title for the error dialog.
+     */
+    public static ErrorDialog show(Fragment parent, @StringRes int title) {
+        ErrorDialog dialog = newInstance(title);
+        dialog.setTargetFragment(parent, 0);
+        dialog.show(parent.getFragmentManager(), DIALOG_TAG);
+        return dialog;
+    }
+
+    /**
+     * Creates an instance of error dialog with the appropriate title. This constructor should be
+     * used when starting an error dialog when we don't have a reference to the parent fragment.
+     */
+    public static ErrorDialog newInstance(@StringRes int title) {
+        ErrorDialog dialog = new ErrorDialog();
+        Bundle bundle = new Bundle();
+        bundle.putInt(ERROR_DIALOG_TITLE_KEY, title);
+        dialog.setArguments(bundle);
+        return dialog;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        return new AlertDialog.Builder(getContext())
+                .setTitle(getArguments().getInt(ERROR_DIALOG_TITLE_KEY))
+                .setPositiveButton(android.R.string.ok, /* listener =*/ null)
+                .create();
+    }
+}
diff --git a/src/com/android/car/settings/common/ExtraSettingsLoader.java b/src/com/android/car/settings/common/ExtraSettingsLoader.java
index 29fe307..1f51496 100644
--- a/src/com/android/car/settings/common/ExtraSettingsLoader.java
+++ b/src/com/android/car/settings/common/ExtraSettingsLoader.java
@@ -16,7 +16,7 @@
 
 package com.android.car.settings.common;
 
-import static com.android.settingslib.drawer.TileUtils.EXTRA_SETTINGS_ACTION;
+import static com.android.settingslib.drawer.CategoryKey.CATEGORY_DEVICE;
 import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON;
 import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
 import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE;
@@ -32,49 +32,44 @@
 import android.os.Bundle;
 import android.text.TextUtils;
 
-import androidx.car.widget.ListItem;
-import androidx.car.widget.TextListItem;
+import androidx.preference.Preference;
 
+import com.android.car.apps.common.util.Themes;
 import com.android.car.settings.R;
 
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
 /**
  * Loads Activity with TileUtils.EXTRA_SETTINGS_ACTION.
  */
+// TODO: investigate using SettingsLib Tiles.
 public class ExtraSettingsLoader {
     private static final Logger LOG = new Logger(ExtraSettingsLoader.class);
     private static final String META_DATA_PREFERENCE_CATEGORY = "com.android.settings.category";
-    public static final String WIRELESS_CATEGORY = "com.android.settings.category.wireless";
-    public static final String DEVICE_CATEGORY = "com.android.settings.category.device";
-    public static final String SYSTEM_CATEGORY = "com.android.settings.category.system";
-    public static final String PERSONAL_CATEGORY = "com.android.settings.category.personal";
+    private Map<Preference, Bundle> mPreferenceBundleMap;
     private final Context mContext;
 
     public ExtraSettingsLoader(Context context) {
         mContext = context;
+        mPreferenceBundleMap = new HashMap<>();
     }
 
     /**
-     * Returns a map of category and setting items pair loaded from 3rd party.
+     * Returns a map of {@link Preference} and {@link Bundle} representing settings injected from
+     * system apps and their metadata. The given intent must specify the action to use for
+     * resolving activities and a category with the key "com.android.settings.category" and one of
+     * the values in {@link com.android.settingslib.drawer.CategoryKey}.
+     *
+     * @param intent intent specifying the extra settings category to load
      */
-    public Map<String, Collection<ListItem>> load() {
+    public Map<Preference, Bundle> loadPreferences(Intent intent) {
         PackageManager pm = mContext.getPackageManager();
-        Intent intent = new Intent(EXTRA_SETTINGS_ACTION);
-        Map<String, Collection<ListItem>> extraSettings = new HashMap<>();
-        // initialize the categories
-        extraSettings.put(WIRELESS_CATEGORY, new LinkedList());
-        extraSettings.put(DEVICE_CATEGORY, new LinkedList());
-        extraSettings.put(SYSTEM_CATEGORY, new LinkedList());
-        extraSettings.put(PERSONAL_CATEGORY, new LinkedList());
-
         List<ResolveInfo> results = pm.queryIntentActivitiesAsUser(intent,
                 PackageManager.GET_META_DATA, ActivityManager.getCurrentUser());
 
+        String extraCategory = intent.getStringExtra(META_DATA_PREFERENCE_CATEGORY);
         for (ResolveInfo resolved : results) {
             if (!resolved.system) {
                 // Do not allow any app to be added to settings, only system ones.
@@ -129,18 +124,25 @@
             }
             Intent extraSettingIntent =
                     new Intent().setClassName(activityInfo.packageName, activityInfo.name);
-            if (category == null || !extraSettings.containsKey(category)) {
+            if (category == null) {
                 // If category is not specified or not supported, default to device.
-                category = DEVICE_CATEGORY;
+                category = CATEGORY_DEVICE;
             }
-            TextListItem item = new TextListItem(mContext);
-            item.setTitle(title);
-            item.setBody(summary);
-            item.setPrimaryActionIcon(icon.loadDrawable(mContext), /* useLargeIcon= */ false);
-            item.setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-            item.setOnClickListener(v -> mContext.startActivity(extraSettingIntent));
-            extraSettings.get(category).add(item);
+
+            if (!TextUtils.equals(extraCategory, category)) {
+                continue;
+            }
+            Preference preference = new Preference(mContext);
+            preference.setTitle(title);
+            preference.setSummary(summary);
+            if (icon != null) {
+                preference.setIcon(icon.loadDrawable(mContext));
+                preference.getIcon().setTintList(
+                        Themes.getAttrColorStateList(mContext, R.attr.iconColor));
+            }
+            preference.setIntent(extraSettingIntent);
+            mPreferenceBundleMap.put(preference, metaData);
         }
-        return extraSettings;
+        return mPreferenceBundleMap;
     }
 }
diff --git a/src/com/android/car/settings/common/ExtraSettingsPreferenceController.java b/src/com/android/car/settings/common/ExtraSettingsPreferenceController.java
new file mode 100644
index 0000000..11db5ab
--- /dev/null
+++ b/src/com/android/car/settings/common/ExtraSettingsPreferenceController.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import java.util.Map;
+
+/**
+ * Injects preferences from other system applications at a placeholder location. The placeholder
+ * should be a {@link PreferenceGroup} which sets the controller attribute to the fully qualified
+ * name of this class. The preference should contain an intent which will be passed to
+ * {@link ExtraSettingsLoader#loadPreferences(Intent)}.
+ *
+ * <p>For example:
+ * <pre>{@code
+ * <PreferenceCategory
+ *     android:key="@string/pk_system_extra_settings"
+ *     android:title="@string/system_extra_settings_title"
+ *     settings:controller="com.android.settings.common.ExtraSettingsPreferenceController">
+ *     <intent android:action="com.android.settings.action.EXTRA_SETTINGS">
+ *         <extra android:name="com.android.settings.category"
+ *                android:value="com.android.settings.category.system"/>
+ *     </intent>
+ * </PreferenceCategory>
+ * }</pre>
+ *
+ * @see ExtraSettingsLoader
+ */
+// TODO: investigate using SettingsLib Tiles.
+public class ExtraSettingsPreferenceController extends PreferenceController<PreferenceGroup> {
+
+    private ExtraSettingsLoader mExtraSettingsLoader;
+    private boolean mSettingsLoaded;
+
+    public ExtraSettingsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions restrictionInfo) {
+        super(context, preferenceKey, fragmentController, restrictionInfo);
+        mExtraSettingsLoader = new ExtraSettingsLoader(context);
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+    public void setExtraSettingsLoader(ExtraSettingsLoader extraSettingsLoader) {
+        mExtraSettingsLoader = extraSettingsLoader;
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        Map<Preference, Bundle> preferenceBundleMap = mExtraSettingsLoader.loadPreferences(
+                preference.getIntent());
+        if (!mSettingsLoaded) {
+            addExtraSettings(preferenceBundleMap);
+            mSettingsLoaded = true;
+        }
+        preference.setVisible(preference.getPreferenceCount() > 0);
+    }
+
+    /**
+     * Adds the extra settings from the system based on the intent that is passed in the preference
+     * group. All the preferences that resolve these intents will be added in the preference group.
+     *
+     * @param preferenceBundleMap a map of {@link Preference} and {@link Bundle} representing
+     * settings injected from system apps and their metadata.
+     */
+    protected void addExtraSettings(Map<Preference, Bundle> preferenceBundleMap) {
+        for (Preference setting : preferenceBundleMap.keySet()) {
+            getPreference().addPreference(setting);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/common/FragmentController.java b/src/com/android/car/settings/common/FragmentController.java
new file mode 100644
index 0000000..404dac0
--- /dev/null
+++ b/src/com/android/car/settings/common/FragmentController.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.content.Intent;
+import android.content.IntentSender;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+
+/**
+ * Controls launching {@link Fragment} instances and back navigation.
+ */
+public interface FragmentController {
+
+    /**
+     * Launches a Fragment in the main container of the current Activity. This cannot be used to
+     * show dialog fragments and will throw an IllegalArgumentException if attempted. The method
+     * {@link #showDialog} should be used instead.
+     */
+    void launchFragment(Fragment fragment);
+
+    /**
+     * Pops the top off the Fragment stack.
+     */
+    void goBack();
+
+    /**
+     * Shows a message to inform the user that the current feature is not available when driving.
+     */
+    void showBlockingMessage();
+
+    /**
+     * Shows dialog with given tag.
+     */
+    void showDialog(DialogFragment dialogFragment, @Nullable String tag);
+
+    /**
+     * Finds dialog by tag. This is primarily used to reattach listeners to dialogs after
+     * configuration change. This method will return null if the tag references a fragment that
+     * isn't a dialog fragment or no dialog with the given tag exists.
+     */
+    @Nullable
+    DialogFragment findDialogByTag(String tag);
+
+    /**
+     * Starts an activity for a result. When the result is received, the {@link
+     * ActivityResultCallback} is passed the result. Note that the implementer of this interface
+     * must ensure that the callback is valid throughout the lifecycle of the new activity that is
+     * created.
+     *
+     * @param intent      The intent used to start an activity.
+     * @param requestCode User defined code which is passed to the callback when the activity exits.
+     *                    Values must use the first 8 bits of the int (i.e. 0-255).
+     * @param callback    Defines how the result from the started activity should be handled.
+     */
+    void startActivityForResult(Intent intent, int requestCode, ActivityResultCallback callback);
+
+    /**
+     * Starts an intent sender for a result. When the result is received, the {@link
+     * ActivityResultCallback} is passed the result. Note that the implementer of this interface
+     * must ensure that the callback is valid throughout the lifecycle of the new activity that is
+     * created.
+     *
+     * @param intent       The IntentSender to launch.
+     * @param requestCode  User defined code which is passed to the callback when the activity
+     *                     exits. Values must use the first 8 bits of the int (i.e. 0-255).
+     * @param fillInIntent If non-null, this will be provided as the intent parameter to {@link
+     *                     IntentSender#sendIntent}.
+     * @param flagsMask    Intent flags in the original IntentSender that you would like to change.
+     * @param flagsValues  Desired values for any bits set in <var>flagsMask</var>
+     * @param options      Additional options for how the Activity should be started.
+     * @param callback     Defines how the result from the started IntentSender should be handled.
+     */
+    void startIntentSenderForResult(IntentSender intent, int requestCode,
+            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, Bundle options,
+            ActivityResultCallback callback)
+            throws IntentSender.SendIntentException;
+}
diff --git a/src/com/android/car/settings/common/FragmentResolver.java b/src/com/android/car/settings/common/FragmentResolver.java
new file mode 100644
index 0000000..dc8656c
--- /dev/null
+++ b/src/com/android/car/settings/common/FragmentResolver.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.R;
+import com.android.car.settings.accounts.AccountSettingsFragment;
+import com.android.car.settings.accounts.ChooseAccountFragment;
+import com.android.car.settings.applications.ApplicationDetailsFragment;
+import com.android.car.settings.applications.ApplicationsSettingsFragment;
+import com.android.car.settings.applications.defaultapps.DefaultAutofillPickerFragment;
+import com.android.car.settings.applications.specialaccess.ModifySystemSettingsFragment;
+import com.android.car.settings.applications.specialaccess.NotificationAccessFragment;
+import com.android.car.settings.applications.specialaccess.UsageAccessFragment;
+import com.android.car.settings.bluetooth.BluetoothSettingsFragment;
+import com.android.car.settings.datausage.DataUsageFragment;
+import com.android.car.settings.datetime.DatetimeSettingsFragment;
+import com.android.car.settings.display.DisplaySettingsFragment;
+import com.android.car.settings.home.HomepageFragment;
+import com.android.car.settings.inputmethod.KeyboardFragment;
+import com.android.car.settings.language.LanguagePickerFragment;
+import com.android.car.settings.location.LocationScanningFragment;
+import com.android.car.settings.network.MobileNetworkFragment;
+import com.android.car.settings.network.NetworkAndInternetFragment;
+import com.android.car.settings.quicksettings.QuickSettingFragment;
+import com.android.car.settings.sound.SoundSettingsFragment;
+import com.android.car.settings.storage.StorageSettingsFragment;
+import com.android.car.settings.system.AboutSettingsFragment;
+import com.android.car.settings.users.UsersListFragment;
+import com.android.car.settings.wifi.WifiSettingsFragment;
+import com.android.car.settings.wifi.preferences.WifiPreferencesFragment;
+
+
+/**
+ * Maps an Action string to a {@link Fragment} that can handle this Action.
+ */
+public class FragmentResolver {
+
+    private static final Logger LOG = new Logger(FragmentResolver.class);
+
+    private FragmentResolver() {
+    }
+
+    /**
+     * Returns a {@link Fragment} that can handle the given action, returns {@code null} if no
+     * {@link Fragment} that can handle this {@link Intent} can be found. Keep the order of intent
+     * actions same as in the manifest.
+     */
+    @Nullable
+    static Fragment getFragmentForIntent(Context context, @Nullable Intent intent) {
+        if (intent == null) {
+            return null;
+        }
+        String action = intent.getAction();
+        if (action == null) {
+            return null;
+        }
+        switch (action) {
+            case Settings.ACTION_SETTINGS:
+                return new HomepageFragment();
+
+            case Settings.ACTION_NIGHT_DISPLAY_SETTINGS:
+                return new QuickSettingFragment();
+
+            case Settings.ACTION_DISPLAY_SETTINGS:
+                return new DisplaySettingsFragment();
+
+            case Settings.ACTION_SOUND_SETTINGS:
+            case Settings.Panel.ACTION_VOLUME:
+                return new SoundSettingsFragment();
+
+            case Settings.Panel.ACTION_INTERNET_CONNECTIVITY:
+                return new NetworkAndInternetFragment();
+
+            case WifiManager.ACTION_PICK_WIFI_NETWORK:
+            case Settings.ACTION_WIFI_SETTINGS:
+            case Settings.ACTION_WIRELESS_SETTINGS:
+            case Settings.Panel.ACTION_WIFI:
+                return new WifiSettingsFragment();
+
+            case Settings.ACTION_WIFI_IP_SETTINGS:
+                return new WifiPreferencesFragment();
+
+            case Settings.ACTION_DATA_USAGE_SETTINGS:
+            case Settings.ACTION_MOBILE_DATA_USAGE:
+                return new DataUsageFragment();
+
+            case Settings.ACTION_DATA_ROAMING_SETTINGS:
+            case Settings.ACTION_NETWORK_OPERATOR_SETTINGS:
+                return new MobileNetworkFragment();
+
+            case Settings.ACTION_BLUETOOTH_SETTINGS:
+                return new BluetoothSettingsFragment();
+
+            case Settings.ACTION_LOCATION_SCANNING_SETTINGS:
+                return new LocationScanningFragment();
+
+            case Settings.ACTION_APPLICATION_SETTINGS:
+            case Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS:
+            case Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS:
+                return new ApplicationsSettingsFragment();
+
+            case Settings.ACTION_APPLICATION_DETAILS_SETTINGS:
+            case Settings.ACTION_NOTIFICATION_SETTINGS:
+            case Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS:
+            case Settings.ACTION_APP_NOTIFICATION_SETTINGS:
+                String pkg = intent.getStringExtra(Settings.EXTRA_APP_PACKAGE);
+                if (TextUtils.isEmpty(pkg)) {
+                    LOG.w("No package provided for application detailed intent");
+                    Uri uri = intent.getData();
+                    if (uri == null) {
+                        LOG.w("No uri provided for application detailed intent");
+                        return null;
+                    }
+                    pkg = uri.getSchemeSpecificPart();
+                }
+                return ApplicationDetailsFragment.getInstance(pkg);
+
+            case Settings.ACTION_MANAGE_WRITE_SETTINGS:
+                return new ModifySystemSettingsFragment();
+
+            case Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS:
+                return new NotificationAccessFragment();
+
+            case Settings.ACTION_USAGE_ACCESS_SETTINGS:
+                return new UsageAccessFragment();
+
+            case Intent.ACTION_QUICK_CLOCK:
+            case Settings.ACTION_DATE_SETTINGS:
+                return new DatetimeSettingsFragment();
+
+            case Settings.ACTION_USER_SETTINGS:
+                return new UsersListFragment();
+
+            case Settings.ACTION_ADD_ACCOUNT:
+                return new ChooseAccountFragment();
+
+            case Settings.ACTION_SYNC_SETTINGS:
+                return new AccountSettingsFragment();
+
+            case Settings.ACTION_INTERNAL_STORAGE_SETTINGS:
+                return new StorageSettingsFragment();
+
+            case Settings.ACTION_LOCALE_SETTINGS:
+                return new LanguagePickerFragment();
+
+            case Settings.ACTION_REQUEST_SET_AUTOFILL_SERVICE:
+                return new DefaultAutofillPickerFragment();
+
+            case Settings.ACTION_INPUT_METHOD_SETTINGS:
+                return new KeyboardFragment();
+
+            case Settings.ACTION_DEVICE_INFO_SETTINGS:
+            case Settings.DEVICE_NAME_SETTINGS:
+                return new AboutSettingsFragment();
+
+            default:
+                return Fragment.instantiate(context,
+                        context.getString(R.string.config_settings_hierarchy_root_fragment));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/common/ListController.java b/src/com/android/car/settings/common/ListController.java
deleted file mode 100644
index e863f92..0000000
--- a/src/com/android/car/settings/common/ListController.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.common;
-
-/**
- * Interface of list adapter for ListItem.
- */
-public interface ListController {
-    /**
-     * Triggers UI update on the list.
-     */
-    void refreshList();
-}
diff --git a/src/com/android/car/settings/common/ListItemSettingsFragment.java b/src/com/android/car/settings/common/ListItemSettingsFragment.java
deleted file mode 100644
index 829b1c1..0000000
--- a/src/com/android/car/settings/common/ListItemSettingsFragment.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.common;
-
-import android.os.Bundle;
-
-import androidx.car.widget.ListItemAdapter;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.PagedListView;
-
-import com.android.car.settings.R;
-
-/**
- * Settings page that only contain a list of items.
- * <p>
- * Uses support library ListItemAdapter, unlike ListSettingsFragment that uses the car-list
- * lists.
- */
-public abstract class ListItemSettingsFragment extends BaseFragment implements ListController {
-    private ListItemAdapter mListAdapter;
-
-    /**
-     * Gets bundle adding the list_fragment layout to it.
-     */
-    protected static Bundle getBundle() {
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_LAYOUT, R.layout.list_fragment);
-        return bundle;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        mListAdapter = new ListItemAdapter(getContext(), getItemProvider());
-
-        PagedListView listView = getView().findViewById(R.id.list);
-        listView.setAdapter(mListAdapter);
-        listView.setDividerVisibilityManager(mListAdapter);
-    }
-
-    @Override
-    public void refreshList() {
-        mListAdapter.notifyDataSetChanged();
-    }
-
-    /**
-     * Called in onActivityCreated.
-     * Gets ListItemProvider that should provide items to show up in the list.
-     */
-    public abstract ListItemProvider getItemProvider();
-}
diff --git a/src/com/android/car/settings/common/ListSettingsFragment.java b/src/com/android/car/settings/common/ListSettingsFragment.java
deleted file mode 100644
index 0b32735..0000000
--- a/src/com/android/car/settings/common/ListSettingsFragment.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.common;
-
-import android.os.Bundle;
-
-import androidx.car.widget.DayNightStyle;
-import androidx.car.widget.PagedListView;
-
-import com.android.car.list.TypedPagedListAdapter;
-import com.android.car.settings.R;
-
-import java.util.ArrayList;
-
-/**
- * Settings page that only contain a list of items.
- */
-public abstract class ListSettingsFragment extends BaseFragment {
-
-    protected PagedListView mListView;
-    protected TypedPagedListAdapter mPagedListAdapter;
-
-    protected static Bundle getBundle() {
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_LAYOUT, R.layout.list_fragment);
-        return bundle;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        mListView = (PagedListView) getView().findViewById(R.id.list);
-        mListView.setDayNightStyle(DayNightStyle.AUTO);
-        mPagedListAdapter = new TypedPagedListAdapter(getLineItems());
-        mListView.setAdapter(mPagedListAdapter);
-    }
-
-    /**
-     * Gets a List of LineItems to show up in this activity.
-     */
-    public abstract ArrayList<TypedPagedListAdapter.LineItem> getLineItems();
-}
diff --git a/src/com/android/car/settings/common/LogicalPreferenceGroup.java b/src/com/android/car/settings/common/LogicalPreferenceGroup.java
new file mode 100644
index 0000000..a3a2c45
--- /dev/null
+++ b/src/com/android/car/settings/common/LogicalPreferenceGroup.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+
+/**
+ * {@link PreferenceGroup} which does not display a title, icon, or summary. This allows for
+ * logical grouping of preferences without indications in the UI.
+ */
+public class LogicalPreferenceGroup extends PreferenceGroup {
+
+    public LogicalPreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        setLayoutResource(R.layout.logical_preference_group);
+    }
+
+    public LogicalPreferenceGroup(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public LogicalPreferenceGroup(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public LogicalPreferenceGroup(Context context) {
+        this(context, null);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        holder.setDividerAllowedAbove(false);
+    }
+}
diff --git a/src/com/android/car/settings/common/MasterSwitchPreference.java b/src/com/android/car/settings/common/MasterSwitchPreference.java
new file mode 100644
index 0000000..2156cce
--- /dev/null
+++ b/src/com/android/car/settings/common/MasterSwitchPreference.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+
+import com.android.car.settings.R;
+
+/** A preference that can be clicked on one side and toggled on another. */
+public class MasterSwitchPreference extends TwoActionPreference {
+
+    /**
+     * Interface definition for a callback to be invoked when the switch is toggled.
+     */
+    public interface OnSwitchToggleListener {
+        /**
+         * Called when a switch was toggled.
+         *
+         * @param preference the preference whose switch was toggled.
+         * @param isChecked  the new state of the switch.
+         */
+        void onToggle(MasterSwitchPreference preference, boolean isChecked);
+    }
+
+    private Switch mSwitch;
+    private boolean mIsChecked;
+    private OnSwitchToggleListener mToggleListener;
+
+    private final CompoundButton.OnCheckedChangeListener mCheckedChangeListener =
+            (buttonView, isChecked) -> {
+                if (mToggleListener != null) {
+                    mToggleListener.onToggle(this, isChecked);
+                }
+            };
+
+    public MasterSwitchPreference(Context context, AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init();
+    }
+
+    public MasterSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    public MasterSwitchPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public MasterSwitchPreference(Context context) {
+        super(context);
+        init();
+    }
+
+    private void init() {
+        setWidgetLayoutResource(R.layout.master_switch_widget);
+    }
+
+    /** Sets the listener that handles the change in switch state. */
+    public void setSwitchToggleListener(OnSwitchToggleListener listener) {
+        mToggleListener = listener;
+    }
+
+    /** Gets the listener that handles the change in switch state. */
+    public OnSwitchToggleListener getSwitchToggleListener() {
+        return mToggleListener;
+    }
+
+    @Override
+    protected void onBindWidgetFrame(View widgetFrame) {
+        mSwitch = widgetFrame.findViewById(R.id.master_switch);
+        mSwitch.setChecked(mIsChecked);
+        mSwitch.setOnCheckedChangeListener(mCheckedChangeListener);
+        widgetFrame.setOnClickListener(v -> setSwitchChecked(!mIsChecked));
+    }
+
+    /**
+     * Sets the state of the switch. Can be set even when it isn't visible or bound in order to set
+     * the initial state.
+     */
+    public void setSwitchChecked(boolean checked) {
+        mIsChecked = checked;
+        if (!isActionShown()) {
+            return;
+        }
+
+        if (mSwitch != null) {
+            mSwitch.setChecked(checked);
+        }
+    }
+
+    /** Gets the state of the switch. */
+    public boolean isSwitchChecked() {
+        return mIsChecked;
+    }
+}
diff --git a/src/com/android/car/settings/common/PasswordEditTextPreference.java b/src/com/android/car/settings/common/PasswordEditTextPreference.java
new file mode 100644
index 0000000..bd45544
--- /dev/null
+++ b/src/com/android/car/settings/common/PasswordEditTextPreference.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.car.settings.R;
+
+/**
+ * Extends {@link ValidatedEditTextPreference} for password input. When {@link SettingsFragment}
+ * detects an instance of this class, it creates a new instance of {@link
+ * PasswordEditTextPreferenceDialogFragment} so that the input is obscured on the dialog's TextEdit.
+ */
+public class PasswordEditTextPreference extends ValidatedEditTextPreference {
+
+    public PasswordEditTextPreference(Context context) {
+        super(context);
+        init();
+    }
+
+    public PasswordEditTextPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public PasswordEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init();
+    }
+
+    public PasswordEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init();
+    }
+
+    private void init() {
+        setDialogLayoutResource(R.layout.preference_dialog_password_edittext);
+        setPersistent(false);
+    }
+}
diff --git a/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragment.java b/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragment.java
new file mode 100644
index 0000000..982f2c8
--- /dev/null
+++ b/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragment.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.os.Bundle;
+import android.text.InputType;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+
+import com.android.car.settings.R;
+
+/**
+ * Extends {@link ValidatedEditTextPreferenceDialogFragment} for entering password input. Obscures
+ * password input by default and reveals a checkbox that toggles the password visibility.
+ */
+public class PasswordEditTextPreferenceDialogFragment extends
+        ValidatedEditTextPreferenceDialogFragment {
+
+    private EditText mEditText;
+
+    /**
+     * Returns a new instance of {@link PasswordEditTextPreferenceDialogFragment} for the {@link
+     * PasswordEditTextPreference} with the given {@code key}.
+     */
+    public static PasswordEditTextPreferenceDialogFragment newInstance(String key) {
+        PasswordEditTextPreferenceDialogFragment fragment =
+                new PasswordEditTextPreferenceDialogFragment();
+        Bundle b = new Bundle(/* capacity= */ 1);
+        b.putString(ARG_KEY, key);
+        fragment.setArguments(b);
+        return fragment;
+    }
+
+
+    @Override
+    protected void onBindDialogView(View view) {
+        super.onBindDialogView(view);
+
+        mEditText = view.findViewById(android.R.id.edit);
+        mEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+        CheckBox cb = view.findViewById(R.id.checkbox);
+        cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                if (isChecked) {
+                    mEditText.setInputType(InputType.TYPE_CLASS_TEXT
+                            | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
+                } else {
+                    mEditText.setInputType(InputType.TYPE_CLASS_TEXT
+                            | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+                }
+                // Place cursor at the end
+                mEditText.setSelection(mEditText.getText().length());
+            }
+        });
+    }
+}
diff --git a/src/com/android/car/settings/common/PreferenceController.java b/src/com/android/car/settings/common/PreferenceController.java
new file mode 100644
index 0000000..5dfe4ee
--- /dev/null
+++ b/src/com/android/car/settings/common/PreferenceController.java
@@ -0,0 +1,472 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager.OnUxRestrictionsChangedListener;
+import android.content.Context;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Controller which encapsulates the business logic associated with a {@link Preference}. All car
+ * settings controllers should extend this class.
+ *
+ * <p>Controllers are responsible for populating and modifying the presentation of an associated
+ * preference while responding to changes in system state. This is enabled via {@link
+ * SettingsFragment} which registers controllers as observers on its lifecycle and dispatches
+ * {@link CarUxRestrictions} change events to the controllers via the {@link
+ * OnUxRestrictionsChangedListener} interface.
+ *
+ * <p>Controllers should be instantiated from XML. To do so, define a preference and include the
+ * {@code controller} attribute in the preference tag and assign the fully qualified class name.
+ *
+ * <p>For example:
+ * <pre>{@code
+ * <Preference
+ *     android:key="my_preference_key"
+ *     android:title="@string/my_preference_title"
+ *     android:icon="@drawable/ic_settings"
+ *     android:fragment="com.android.settings.foo.MyFragment"
+ *     settings:controller="com.android.settings.foo.MyPreferenceController"/>
+ * }</pre>
+ *
+ * <p>Subclasses must implement {@link #getPreferenceType()} to define the upper bound type on the
+ * {@link Preference} that the controller is associated with. For example, a bound of {@link
+ * androidx.preference.PreferenceGroup} indicates that the controller will utilize preference group
+ * methods in its operation. {@link #setPreference(Preference)} will throw an {@link
+ * IllegalArgumentException} if not passed a subclass of the upper bound type.
+ *
+ * <p>Subclasses may implement any or all of the following methods (see method Javadocs for more
+ * information):
+ *
+ * <ul>
+ * <li>{@link #checkInitialized()}
+ * <li>{@link #onCreateInternal()}
+ * <li>{@link #getAvailabilityStatus()}
+ * <li>{@link #onStartInternal()}
+ * <li>{@link #onResumeInternal()}
+ * <li>{@link #onPauseInternal()}
+ * <li>{@link #onStopInternal()}
+ * <li>{@link #onDestroyInternal()}
+ * <li>{@link #updateState(Preference)}
+ * <li>{@link #onApplyUxRestrictions(CarUxRestrictions)}
+ * <li>{@link #handlePreferenceChanged(Preference, Object)}
+ * <li>{@link #handlePreferenceClicked(Preference)}
+ * </ul>
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ *            expects to operate.
+ */
+public abstract class PreferenceController<V extends Preference> implements
+        DefaultLifecycleObserver,
+        OnUxRestrictionsChangedListener {
+
+    /**
+     * Denotes the availability of a setting.
+     *
+     * @see #getAvailabilityStatus()
+     */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({AVAILABLE, CONDITIONALLY_UNAVAILABLE, UNSUPPORTED_ON_DEVICE, DISABLED_FOR_USER})
+    public @interface AvailabilityStatus {
+    }
+
+    /**
+     * The setting is available.
+     */
+    public static final int AVAILABLE = 0;
+
+    /**
+     * The setting is currently unavailable but may become available in the future. Use
+     * {@link #DISABLED_FOR_USER} if it describes the condition more accurately.
+     */
+    public static final int CONDITIONALLY_UNAVAILABLE = 1;
+
+    /**
+     * The setting is not and will not be supported by this device.
+     */
+    public static final int UNSUPPORTED_ON_DEVICE = 2;
+
+    /**
+     * The setting cannot be changed by the current user.
+     */
+    public static final int DISABLED_FOR_USER = 3;
+
+    /**
+     * Indicates whether all Preferences are configured to ignore UX Restrictions Event.
+     */
+    private final boolean mAlwaysIgnoreUxRestrictions;
+
+    /**
+     * Set of the keys of Preferences that ignore UX Restrictions. When mAlwaysIgnoreUxRestrictions
+     * is configured to be false, then only the Preferences whose keys are contained in this Set
+     * ignore UX Restrictions.
+     */
+    private final Set<String> mPreferencesIgnoringUxRestrictions;
+
+    private final Context mContext;
+    private final String mPreferenceKey;
+    private final FragmentController mFragmentController;
+
+    private CarUxRestrictions mUxRestrictions;
+    private V mPreference;
+    private boolean mIsCreated;
+
+    /**
+     * Controllers should be instantiated from XML. To pass additional arguments see
+     * {@link SettingsFragment#use(Class, int)}.
+     */
+    public PreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        mContext = context;
+        mPreferenceKey = preferenceKey;
+        mFragmentController = fragmentController;
+        mUxRestrictions = uxRestrictions;
+        mPreferencesIgnoringUxRestrictions = new HashSet<String>(Arrays.asList(
+                mContext.getResources().getStringArray(R.array.config_ignore_ux_restrictions)));
+        mAlwaysIgnoreUxRestrictions =
+                mContext.getResources().getBoolean(R.bool.config_always_ignore_ux_restrictions);
+    }
+
+    /**
+     * Returns the context used to construct the controller.
+     */
+    protected final Context getContext() {
+        return mContext;
+    }
+
+    /**
+     * Returns the key for the preference managed by this controller set at construction.
+     */
+    protected final String getPreferenceKey() {
+        return mPreferenceKey;
+    }
+
+    /**
+     * Returns the {@link FragmentController} used to launch fragments and go back to previous
+     * fragments. This is set at construction.
+     */
+    protected final FragmentController getFragmentController() {
+        return mFragmentController;
+    }
+
+    /**
+     * Returns the current {@link CarUxRestrictions} applied to the controller. Subclasses may use
+     * this to limit which content is displayed in the associated preference. May be called anytime.
+     */
+    protected final CarUxRestrictions getUxRestrictions() {
+        return mUxRestrictions;
+    }
+
+    /**
+     * Returns the preference associated with this controller. This may be used in any of the
+     * lifecycle methods, as the preference is set before they are called..
+     */
+    protected final V getPreference() {
+        return mPreference;
+    }
+
+    /**
+     * Called by {@link SettingsFragment} to associate the controller with its preference after the
+     * screen is created. This is guaranteed to be called before {@link #onCreateInternal()}.
+     *
+     * @throws IllegalArgumentException if the given preference does not match the type
+     *                                  returned by {@link #getPreferenceType()}
+     * @throws IllegalStateException    if subclass defined initialization is not
+     *                                  complete.
+     */
+    final void setPreference(Preference preference) {
+        PreferenceUtil.requirePreferenceType(preference, getPreferenceType());
+        mPreference = getPreferenceType().cast(preference);
+        mPreference.setOnPreferenceChangeListener(
+                (changedPref, newValue) -> handlePreferenceChanged(
+                        getPreferenceType().cast(changedPref), newValue));
+        mPreference.setOnPreferenceClickListener(
+                clickedPref -> handlePreferenceClicked(getPreferenceType().cast(clickedPref)));
+        checkInitialized();
+    }
+
+    /**
+     * Called by {@link SettingsFragment} to notify that the applied ux restrictions have changed.
+     * The controller will refresh its UI accordingly unless it is not yet created. In that case,
+     * the UI will refresh once created.
+     */
+    @Override
+    public final void onUxRestrictionsChanged(CarUxRestrictions uxRestrictions) {
+        mUxRestrictions = uxRestrictions;
+        refreshUi();
+    }
+
+    /**
+     * Updates the preference presentation based on its {@link #getAvailabilityStatus()} status. If
+     * the controller is available, the associated preference is shown and a call to {@link
+     * #updateState(Preference)} and {@link #onApplyUxRestrictions(CarUxRestrictions)} are
+     * dispatched to allow the controller to modify the presentation for the current state. If the
+     * controller is not available, the associated preference is hidden from the screen. This is a
+     * no-op if the controller is not yet created.
+     */
+    public final void refreshUi() {
+        if (!mIsCreated) {
+            return;
+        }
+        if (getAvailabilityStatus() == AVAILABLE) {
+            mPreference.setVisible(true);
+            mPreference.setEnabled(true);
+            updateState(mPreference);
+            onApplyUxRestrictions(mUxRestrictions);
+        } else {
+            mPreference.setVisible(false);
+        }
+    }
+
+    // Controller lifecycle ========================================================================
+
+    /**
+     * Dispatches a call to {@link #onCreateInternal()} and {@link #refreshUi()} to enable
+     * controllers to setup initial state before a preference is visible. If the controller is
+     * {@link #UNSUPPORTED_ON_DEVICE}, the preference is hidden and no further action is taken.
+     */
+    @Override
+    public final void onCreate(@NonNull LifecycleOwner owner) {
+        if (getAvailabilityStatus() == UNSUPPORTED_ON_DEVICE) {
+            mPreference.setVisible(false);
+            return;
+        }
+        onCreateInternal();
+        mIsCreated = true;
+        refreshUi();
+    }
+
+    /**
+     * Dispatches a call to {@link #onStartInternal()} and {@link #refreshUi()} to account for any
+     * state changes that may have occurred while the controller was stopped. Returns immediately
+     * if the controller is {@link #UNSUPPORTED_ON_DEVICE}.
+     */
+    @Override
+    public final void onStart(@NonNull LifecycleOwner owner) {
+        if (getAvailabilityStatus() == UNSUPPORTED_ON_DEVICE) {
+            return;
+        }
+        onStartInternal();
+        refreshUi();
+    }
+
+    /**
+     * Notifies that the controller is resumed by dispatching a call to {@link #onResumeInternal()}.
+     * Returns immediately if the controller is {@link #UNSUPPORTED_ON_DEVICE}.
+     */
+    @Override
+    public final void onResume(@NonNull LifecycleOwner owner) {
+        if (getAvailabilityStatus() == UNSUPPORTED_ON_DEVICE) {
+            return;
+        }
+        onResumeInternal();
+    }
+
+    /**
+     * Notifies that the controller is paused by dispatching a call to {@link #onPauseInternal()}.
+     * Returns immediately if the controller is {@link #UNSUPPORTED_ON_DEVICE}.
+     */
+    @Override
+    public final void onPause(@NonNull LifecycleOwner owner) {
+        if (getAvailabilityStatus() == UNSUPPORTED_ON_DEVICE) {
+            return;
+        }
+        onPauseInternal();
+    }
+
+    /**
+     * Notifies that the controller is stopped by dispatching a call to {@link #onStopInternal()}.
+     * Returns immediately if the controller is {@link #UNSUPPORTED_ON_DEVICE}.
+     */
+    @Override
+    public final void onStop(@NonNull LifecycleOwner owner) {
+        if (getAvailabilityStatus() == UNSUPPORTED_ON_DEVICE) {
+            return;
+        }
+        onStopInternal();
+    }
+
+    /**
+     * Notifies that the controller is destroyed by dispatching a call to {@link
+     * #onDestroyInternal()}. Returns immediately if the controller is
+     * {@link #UNSUPPORTED_ON_DEVICE}.
+     */
+    @Override
+    public final void onDestroy(@NonNull LifecycleOwner owner) {
+        if (getAvailabilityStatus() == UNSUPPORTED_ON_DEVICE) {
+            return;
+        }
+        mIsCreated = false;
+        onDestroyInternal();
+    }
+
+    // Methods for override ========================================================================
+
+    /**
+     * Returns the upper bound type of the preference on which this controller will operate.
+     */
+    protected abstract Class<V> getPreferenceType();
+
+    /**
+     * Subclasses may override this method to throw {@link IllegalStateException} if any expected
+     * post-instantiation setup is not completed using {@link SettingsFragment#use(Class, int)}
+     * prior to associating the controller with its preference. This will be called before the
+     * controller lifecycle begins.
+     */
+    protected void checkInitialized() {
+    }
+
+    /**
+     * Returns the {@link AvailabilityStatus} for the setting. This status is used to determine
+     * if the setting should be shown or hidden. Defaults to {@link #AVAILABLE}. This will be
+     * called before the controller lifecycle begins and on refresh events.
+     */
+    @AvailabilityStatus
+    protected int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    /**
+     * Subclasses may override this method to complete any operations needed at creation time e.g.
+     * loading static configuration.
+     *
+     * <p>Note: this will not be called on {@link #UNSUPPORTED_ON_DEVICE} controllers.
+     */
+    protected void onCreateInternal() {
+    }
+
+    /**
+     * Subclasses may override this method to complete any operations needed each time the
+     * controller is started e.g. registering broadcast receivers.
+     *
+     * <p>Note: this will not be called on {@link #UNSUPPORTED_ON_DEVICE} controllers.
+     */
+    protected void onStartInternal() {
+    }
+
+    /**
+     * Subclasses may override this method to complete any operations needed each time the
+     * controller is resumed. Prefer to use {@link #onStartInternal()} unless absolutely necessary
+     * as controllers may not be resumed in a multi-display scenario.
+     *
+     * <p>Note: this will not be called on {@link #UNSUPPORTED_ON_DEVICE} controllers.
+     */
+    protected void onResumeInternal() {
+    }
+
+    /**
+     * Subclasses may override this method to complete any operations needed each time the
+     * controller is paused. Prefer to use {@link #onStartInternal()} unless absolutely necessary
+     * as controllers may not be resumed in a multi-display scenario.
+     *
+     * <p>Note: this will not be called on {@link #UNSUPPORTED_ON_DEVICE} controllers.
+     */
+    protected void onPauseInternal() {
+    }
+
+    /**
+     * Subclasses may override this method to complete any operations needed each time the
+     * controller is stopped e.g. unregistering broadcast receivers.
+     *
+     * <p>Note: this will not be called on {@link #UNSUPPORTED_ON_DEVICE} controllers.
+     */
+    protected void onStopInternal() {
+    }
+
+    /**
+     * Subclasses may override this method to complete any operations needed when the controller is
+     * destroyed e.g. freeing up held resources.
+     *
+     * <p>Note: this will not be called on {@link #UNSUPPORTED_ON_DEVICE} controllers.
+     */
+    protected void onDestroyInternal() {
+    }
+
+    /**
+     * Subclasses may override this method to update the presentation of the preference for the
+     * current system state (summary, switch state, etc). If the preference has dynamic content
+     * (such as preferences added to a group), it may be updated here as well.
+     *
+     * <p>Important: Operations should be idempotent as this may be called multiple times.
+     *
+     * <p>Note: this will only be called when the following are true:
+     * <ul>
+     * <li>{@link #getAvailabilityStatus()} returns {@link #AVAILABLE}
+     * <li>{@link #onCreateInternal()} has completed.
+     * </ul>
+     */
+    protected void updateState(V preference) {
+    }
+
+    /**
+     * Updates the preference enabled status given the {@code restrictionInfo}. This will be called
+     * before the controller lifecycle begins and on refresh events. The preference is disabled by
+     * default when {@link CarUxRestrictions#UX_RESTRICTIONS_NO_SETUP} is set in {@code
+     * uxRestrictions}. Subclasses may override this method to modify enabled state based on
+     * additional driving restrictions.
+     */
+    protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
+        if (!isUxRestrictionsIgnored(mAlwaysIgnoreUxRestrictions,
+                mPreferencesIgnoringUxRestrictions)
+                && CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
+            mPreference.setEnabled(false);
+        }
+    }
+
+    /**
+     * Called when the associated preference is changed by the user. This is called before the state
+     * of the preference is updated and before the state is persisted.
+     *
+     * @param preference the changed preference.
+     * @param newValue   the new value of the preference.
+     * @return {@code true} to update the state of the preference with the new value. Defaults to
+     * {@code true}.
+     */
+    protected boolean handlePreferenceChanged(V preference, Object newValue) {
+        return true;
+    }
+
+    /**
+     * Called when the preference associated with this controller is clicked. Subclasses may
+     * choose to handle the click event.
+     *
+     * @param preference the clicked preference.
+     * @return {@code true} if click is handled and further propagation should cease. Defaults to
+     * {@code false}.
+     */
+    protected boolean handlePreferenceClicked(V preference) {
+        return false;
+    }
+
+    protected boolean isUxRestrictionsIgnored(boolean allIgnores, Set prefsThatIgnore) {
+        return allIgnores || prefsThatIgnore.contains(mPreferenceKey);
+    }
+}
diff --git a/src/com/android/car/settings/common/PreferenceControllerListHelper.java b/src/com/android/car/settings/common/PreferenceControllerListHelper.java
new file mode 100644
index 0000000..2c1360b
--- /dev/null
+++ b/src/com/android/car/settings/common/PreferenceControllerListHelper.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import static com.android.car.settings.common.PreferenceXmlParser.METADATA_CONTROLLER;
+import static com.android.car.settings.common.PreferenceXmlParser.METADATA_KEY;
+
+import android.annotation.NonNull;
+import android.annotation.XmlRes;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper to load {@link PreferenceController} instances from XML. Based on com.android
+ * .settings.core.PreferenceControllerListHelper.
+ */
+class PreferenceControllerListHelper {
+    private PreferenceControllerListHelper() {
+    }
+
+    /**
+     * Creates a list of {@link PreferenceController}.
+     *
+     * @param context the {@link Context} used to instantiate the controllers.
+     * @param xmlResId the XML resource containing the metadata of the controllers to
+     *         create.
+     * @param fragmentController a valid {@link FragmentController} the preference
+     *         controllers can use to navigate.
+     * @param uxRestrictions the current {@link CarUxRestrictions}.
+     * @throws IllegalArgumentException if the XML resource cannot be parsed, if the XML
+     *         resource contains elements which declare controllers without preference keys, if the
+     *         XML resource contains controllers which cannot be instantiated successfully.
+     */
+    @NonNull
+    static List<PreferenceController> getPreferenceControllersFromXml(Context context,
+            @XmlRes int xmlResId, FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        List<PreferenceController> controllers = new ArrayList<>();
+        List<Bundle> preferenceMetadata;
+        try {
+            preferenceMetadata = PreferenceXmlParser.extractMetadata(context, xmlResId,
+                    PreferenceXmlParser.MetadataFlag.FLAG_NEED_KEY
+                            | PreferenceXmlParser.MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
+        } catch (IOException | XmlPullParserException e) {
+            throw new IllegalArgumentException(
+                    "Failed to parse preference XML for getting controllers", e);
+        }
+
+        for (Bundle metadata : preferenceMetadata) {
+            String controllerName = metadata.getString(METADATA_CONTROLLER);
+            if (TextUtils.isEmpty(controllerName)) {
+                continue; // Preference does not require a controller.
+            }
+            String key = metadata.getString(METADATA_KEY);
+            if (TextUtils.isEmpty(key)) {
+                throw new IllegalArgumentException("Missing key for controller: " + controllerName);
+            }
+            controllers.add(createInstance(controllerName, context, key, fragmentController,
+                    uxRestrictions));
+        }
+
+        return controllers;
+    }
+
+    private static PreferenceController createInstance(String controllerName,
+            Context context, String key, FragmentController fragmentController,
+            CarUxRestrictions restrictionInfo) {
+        try {
+            Class<?> clazz = Class.forName(controllerName);
+            Constructor<?> preferenceConstructor = clazz.getConstructor(Context.class, String.class,
+                    FragmentController.class, CarUxRestrictions.class);
+            Object[] params = new Object[]{context, key, fragmentController, restrictionInfo};
+            return (PreferenceController) preferenceConstructor.newInstance(params);
+        } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException
+                | InvocationTargetException | IllegalAccessException e) {
+            throw new IllegalArgumentException(
+                    "Invalid preference controller: " + controllerName, e);
+        }
+    }
+}
+
diff --git a/src/com/android/car/settings/common/PreferenceUtil.java b/src/com/android/car/settings/common/PreferenceUtil.java
new file mode 100644
index 0000000..6cfb64c
--- /dev/null
+++ b/src/com/android/car/settings/common/PreferenceUtil.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import androidx.preference.Preference;
+
+/** Contains utility function to operate on Preferences. */
+public class PreferenceUtil {
+
+    /** Ensures that the preference of given type. */
+    public static boolean checkPreferenceType(Preference preference, Class expectedType) {
+        return expectedType.isInstance(preference);
+    }
+
+    /**
+     * Requires that the preference is of given type.
+     *
+     * @throws IllegalArgumentException if the preference is not of the given type.
+     */
+    public static void requirePreferenceType(Preference preference, Class expectedType) {
+        if (!checkPreferenceType(preference, expectedType)) {
+            throw new IllegalArgumentException(
+                    "Preference should be of type " + expectedType.getName());
+        }
+    }
+}
diff --git a/src/com/android/car/settings/common/PreferenceXmlParser.java b/src/com/android/car/settings/common/PreferenceXmlParser.java
new file mode 100644
index 0000000..3e904d3
--- /dev/null
+++ b/src/com/android/car/settings/common/PreferenceXmlParser.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.annotation.NonNull;
+import android.annotation.XmlRes;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.util.Xml;
+
+import androidx.annotation.IntDef;
+
+import com.android.car.settings.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Utility class to parse elements of XML preferences. This is a reduced version of {@code com
+ * .android.settings.core.PreferenceXmlParserUtils}.
+ */
+public class PreferenceXmlParser {
+
+    private static final Logger LOG = new Logger(PreferenceXmlParser.class);
+
+    private static final String PREF_TAG_ENDS_WITH = "Preference";
+    private static final String PREF_GROUP_TAG_ENDS_WITH = "PreferenceGroup";
+    private static final List<String> SUPPORTED_PREF_TYPES = Arrays.asList("Preference",
+            "PreferenceCategory", "PreferenceScreen");
+
+    /**
+     * Flag definition to indicate which metadata should be extracted when
+     * {@link #extractMetadata(Context, int, int)} is called. The flags can be combined by using |
+     * (binary or).
+     */
+    @IntDef(flag = true, value = {
+            MetadataFlag.FLAG_NEED_KEY,
+            MetadataFlag.FLAG_NEED_PREF_CONTROLLER})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface MetadataFlag {
+        int FLAG_NEED_KEY = 1;
+        int FLAG_NEED_PREF_CONTROLLER = 1 << 1;
+    }
+
+    static final String METADATA_KEY = "key";
+    static final String METADATA_CONTROLLER = "controller";
+
+    /**
+     * Extracts metadata from each preference XML and puts them into a {@link Bundle}.
+     *
+     * @param xmlResId xml res id of a preference screen
+     * @param flags one or more of {@link MetadataFlag}
+     * @return a list of Bundles containing the extracted metadata
+     */
+    @NonNull
+    public static List<Bundle> extractMetadata(Context context, @XmlRes int xmlResId, int flags)
+            throws IOException, XmlPullParserException {
+        final List<Bundle> metadata = new ArrayList<>();
+        if (xmlResId <= 0) {
+            LOG.d(xmlResId + " is invalid.");
+            return metadata;
+        }
+        final XmlResourceParser parser = context.getResources().getXml(xmlResId);
+
+        int type;
+        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && type != XmlPullParser.START_TAG) {
+            // Parse next until start tag is found
+        }
+        final int outerDepth = parser.getDepth();
+
+        do {
+            if (type != XmlPullParser.START_TAG) {
+                continue;
+            }
+            final String nodeName = parser.getName();
+            if (!SUPPORTED_PREF_TYPES.contains(nodeName) && !nodeName.endsWith(PREF_TAG_ENDS_WITH)
+                    && !nodeName.endsWith(PREF_GROUP_TAG_ENDS_WITH)) {
+                continue;
+            }
+            final Bundle preferenceMetadata = new Bundle();
+            final AttributeSet attrs = Xml.asAttributeSet(parser);
+            final TypedArray preferenceAttributes = context.obtainStyledAttributes(attrs,
+                    R.styleable.Preference);
+
+            if (hasFlag(flags, MetadataFlag.FLAG_NEED_KEY)) {
+                preferenceMetadata.putString(METADATA_KEY, getKey(preferenceAttributes));
+            }
+            if (hasFlag(flags, MetadataFlag.FLAG_NEED_PREF_CONTROLLER)) {
+                preferenceMetadata.putString(METADATA_CONTROLLER,
+                        getController(preferenceAttributes));
+            }
+            metadata.add(preferenceMetadata);
+
+            preferenceAttributes.recycle();
+        } while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth));
+        parser.close();
+
+        return metadata;
+    }
+
+    private static boolean hasFlag(int flags, @MetadataFlag int flag) {
+        return (flags & flag) != 0;
+    }
+
+    private static String getKey(TypedArray styledAttributes) {
+        return styledAttributes.getString(com.android.internal.R.styleable.Preference_key);
+    }
+
+    private static String getController(TypedArray styledAttributes) {
+        return styledAttributes.getString(R.styleable.Preference_controller);
+    }
+}
diff --git a/src/com/android/car/settings/common/ProgressBarPreference.java b/src/com/android/car/settings/common/ProgressBarPreference.java
new file mode 100644
index 0000000..98ab9b6
--- /dev/null
+++ b/src/com/android/car/settings/common/ProgressBarPreference.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+
+/**
+ * Preference which shows a progress bar. The progress bar layout shown can be changed by setting
+ * the xml layout attribute. The canonical example can be seen in
+ * {@link R.layout#progress_bar_preference}.
+ */
+public class ProgressBarPreference extends Preference {
+
+    private CharSequence mMinLabel;
+    private CharSequence mMaxLabel;
+
+    private int mMin;
+    private int mMax;
+    private int mProgress;
+
+    public ProgressBarPreference(
+            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init(attrs);
+    }
+
+    public ProgressBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(attrs);
+    }
+
+    public ProgressBarPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(attrs);
+    }
+
+    public ProgressBarPreference(Context context) {
+        super(context);
+        init(/* attrs= */ null);
+    }
+
+    private void init(AttributeSet attrs) {
+        TypedArray a = getContext().obtainStyledAttributes(attrs,
+                R.styleable.ProgressBarPreference);
+
+        mMin = a.getInteger(R.styleable.ProgressBarPreference_min, 0);
+        mMax = a.getInteger(R.styleable.ProgressBarPreference_max, 100);
+        mProgress = a.getInteger(R.styleable.ProgressBarPreference_progress, 0);
+        mMinLabel = a.getString(R.styleable.ProgressBarPreference_minLabel);
+        mMaxLabel = a.getString(R.styleable.ProgressBarPreference_maxLabel);
+
+        a.recycle();
+    }
+
+    /** Sets the min label of the progress bar. */
+    public void setMinLabel(CharSequence startLabel) {
+        if (mMinLabel != startLabel) {
+            mMinLabel = startLabel;
+            notifyChanged();
+        }
+    }
+
+    /** Sets the max label of the progress bar. */
+    public void setMaxLabel(CharSequence endLabel) {
+        if (mMaxLabel != endLabel) {
+            mMaxLabel = endLabel;
+            notifyChanged();
+        }
+    }
+
+    /** Sets the minimum possible value of the progress bar. */
+    public void setMin(int min) {
+        if (mMin != min) {
+            mMin = min;
+            notifyChanged();
+        }
+    }
+
+    /** Sets the maximum possible value of the progress bar. */
+    public void setMax(int max) {
+        if (mMax != max) {
+            mMax = max;
+            notifyChanged();
+        }
+    }
+
+    /** Sets the current progress value of the progress bar. */
+    public void setProgress(int progress) {
+        if (mProgress != progress) {
+            mProgress = progress;
+            notifyChanged();
+        }
+    }
+
+    /** Returns the current progress value of the progress bar. */
+    public int getProgress() {
+        return mProgress;
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+
+        ProgressBar progressBar = (ProgressBar) view.findViewById(android.R.id.progress);
+        progressBar.setMin(mMin);
+        progressBar.setMax(mMax);
+        progressBar.setProgress(mProgress);
+
+        View progressBarLabels = view.findViewById(R.id.progress_bar_labels);
+        if (TextUtils.isEmpty(mMinLabel) && TextUtils.isEmpty(mMaxLabel)) {
+            progressBarLabels.setVisibility(View.GONE);
+        } else {
+            progressBarLabels.setVisibility(View.VISIBLE);
+
+            TextView minLabel = (TextView) view.findViewById(android.R.id.text1);
+            if (minLabel != null) {
+                minLabel.setText(mMinLabel);
+            }
+            TextView maxLabel = (TextView) view.findViewById(android.R.id.text2);
+            if (maxLabel != null) {
+                maxLabel.setText(mMaxLabel);
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/common/SeekBarPreference.java b/src/com/android/car/settings/common/SeekBarPreference.java
new file mode 100644
index 0000000..7ebd9a5
--- /dev/null
+++ b/src/com/android/car/settings/common/SeekBarPreference.java
@@ -0,0 +1,399 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+
+/**
+ * Car Setting's own version of SeekBarPreference.
+ *
+ * The code is directly taken from androidx.preference.SeekBarPreference. However it has 1 main
+ * functionality difference. There is a new field which can enable continuous updates while the
+ * seek bar value is changing. This can be set programmatically by using the {@link
+ * #setContinuousUpdate() setContinuousUpdate} method.
+ */
+public class SeekBarPreference extends Preference {
+
+    private int mSeekBarValue;
+    private int mMin;
+    private int mMax;
+    private int mSeekBarIncrement;
+    private boolean mTrackingTouch;
+    private SeekBar mSeekBar;
+    private TextView mSeekBarValueTextView;
+    private boolean mAdjustable; // whether the seekbar should respond to the left/right keys
+    private boolean mShowSeekBarValue; // whether to show the seekbar value TextView next to the bar
+    private boolean mContinuousUpdate; // whether scrolling provides continuous calls to listener
+
+    private static final String TAG = "SeekBarPreference";
+
+    /**
+     * Listener reacting to the SeekBar changing value by the user
+     */
+    private SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
+            new SeekBar.OnSeekBarChangeListener() {
+                @Override
+                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                    if (fromUser && (mContinuousUpdate || !mTrackingTouch)) {
+                        syncValueInternal(seekBar);
+                    }
+                }
+
+                @Override
+                public void onStartTrackingTouch(SeekBar seekBar) {
+                    mTrackingTouch = true;
+                }
+
+                @Override
+                public void onStopTrackingTouch(SeekBar seekBar) {
+                    mTrackingTouch = false;
+                    if (seekBar.getProgress() + mMin != mSeekBarValue) {
+                        syncValueInternal(seekBar);
+                    }
+                }
+            };
+
+    /**
+     * Listener reacting to the user pressing DPAD left/right keys if {@code
+     * adjustable} attribute is set to true; it transfers the key presses to the SeekBar
+     * to be handled accordingly.
+     */
+    private View.OnKeyListener mSeekBarKeyListener = new View.OnKeyListener() {
+        @Override
+        public boolean onKey(View v, int keyCode, KeyEvent event) {
+            if (event.getAction() != KeyEvent.ACTION_DOWN) {
+                return false;
+            }
+
+            if (!mAdjustable && (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
+                    || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)) {
+                // Right or left keys are pressed when in non-adjustable mode; Skip the keys.
+                return false;
+            }
+
+            // We don't want to propagate the click keys down to the seekbar view since it will
+            // create the ripple effect for the thumb.
+            if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
+                return false;
+            }
+
+            if (mSeekBar == null) {
+                Log.e(TAG, "SeekBar view is null and hence cannot be adjusted.");
+                return false;
+            }
+            return mSeekBar.onKeyDown(keyCode, event);
+        }
+    };
+
+    public SeekBarPreference(
+            Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        TypedArray a = context.obtainStyledAttributes(
+                attrs, R.styleable.SeekBarPreference, defStyleAttr, defStyleRes);
+
+        /**
+         * The ordering of these two statements are important. If we want to set max first, we need
+         * to perform the same steps by changing min/max to max/min as following:
+         * mMax = a.getInt(...) and setMin(...).
+         */
+        mMin = a.getInt(R.styleable.SeekBarPreference_min, 0);
+        setMax(a.getInt(R.styleable.SeekBarPreference_android_max, 100));
+        setSeekBarIncrement(a.getInt(R.styleable.SeekBarPreference_seekBarIncrement, 0));
+        mAdjustable = a.getBoolean(R.styleable.SeekBarPreference_adjustable, true);
+        mShowSeekBarValue = a.getBoolean(R.styleable.SeekBarPreference_showSeekBarValue, true);
+        a.recycle();
+    }
+
+    public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public SeekBarPreference(Context context, AttributeSet attrs) {
+        this(context, attrs, R.attr.seekBarPreferenceStyle);
+    }
+
+    public SeekBarPreference(Context context) {
+        this(context, null);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+        view.itemView.setOnKeyListener(mSeekBarKeyListener);
+        mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
+        mSeekBarValueTextView = (TextView) view.findViewById(R.id.seekbar_value);
+        if (mShowSeekBarValue) {
+            mSeekBarValueTextView.setVisibility(View.VISIBLE);
+        } else {
+            mSeekBarValueTextView.setVisibility(View.GONE);
+            mSeekBarValueTextView = null;
+        }
+
+        if (mSeekBar == null) {
+            Log.e(TAG, "SeekBar view is null in onBindViewHolder.");
+            return;
+        }
+        mSeekBar.setOnSeekBarChangeListener(mSeekBarChangeListener);
+        mSeekBar.setMax(mMax - mMin);
+        // If the increment is not zero, use that. Otherwise, use the default mKeyProgressIncrement
+        // in AbsSeekBar when it's zero. This default increment value is set by AbsSeekBar
+        // after calling setMax. That's why it's important to call setKeyProgressIncrement after
+        // calling setMax() since setMax() can change the increment value.
+        if (mSeekBarIncrement != 0) {
+            mSeekBar.setKeyProgressIncrement(mSeekBarIncrement);
+        } else {
+            mSeekBarIncrement = mSeekBar.getKeyProgressIncrement();
+        }
+
+        mSeekBar.setProgress(mSeekBarValue - mMin);
+        if (mSeekBarValueTextView != null) {
+            mSeekBarValueTextView.setText(String.valueOf(mSeekBarValue));
+        }
+        mSeekBar.setEnabled(isEnabled());
+    }
+
+    @Override
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        setValue(restoreValue ? getPersistedInt(mSeekBarValue)
+                : (Integer) defaultValue);
+    }
+
+    @Override
+    protected Object onGetDefaultValue(TypedArray a, int index) {
+        return a.getInt(index, 0);
+    }
+
+    /** Setter for the minimum value allowed on seek bar. */
+    public void setMin(int min) {
+        if (min > mMax) {
+            min = mMax;
+        }
+        if (min != mMin) {
+            mMin = min;
+            notifyChanged();
+        }
+    }
+
+    /** Getter for the minimum value allowed on seek bar. */
+    public int getMin() {
+        return mMin;
+    }
+
+    /** Setter for the maximum value allowed on seek bar. */
+    public final void setMax(int max) {
+        if (max < mMin) {
+            max = mMin;
+        }
+        if (max != mMax) {
+            mMax = max;
+            notifyChanged();
+        }
+    }
+
+    /**
+     * Returns the amount of increment change via each arrow key click. This value is derived
+     * from
+     * user's specified increment value if it's not zero. Otherwise, the default value is picked
+     * from the default mKeyProgressIncrement value in {@link android.widget.AbsSeekBar}.
+     *
+     * @return The amount of increment on the SeekBar performed after each user's arrow key press.
+     */
+    public final int getSeekBarIncrement() {
+        return mSeekBarIncrement;
+    }
+
+    /**
+     * Sets the increment amount on the SeekBar for each arrow key press.
+     *
+     * @param seekBarIncrement The amount to increment or decrement when the user presses an
+     *                         arrow key.
+     */
+    public final void setSeekBarIncrement(int seekBarIncrement) {
+        if (seekBarIncrement != mSeekBarIncrement) {
+            mSeekBarIncrement = Math.min(mMax - mMin, Math.abs(seekBarIncrement));
+            notifyChanged();
+        }
+    }
+
+    /** Getter for the maximum value allowed on seek bar. */
+    public int getMax() {
+        return mMax;
+    }
+
+    /** Setter for the functionality which allows for changing the values via keyboard arrows. */
+    public void setAdjustable(boolean adjustable) {
+        mAdjustable = adjustable;
+    }
+
+    /** Getter for the functionality which allows for changing the values via keyboard arrows. */
+    public boolean isAdjustable() {
+        return mAdjustable;
+    }
+
+    /** Setter for the functionality which allows for continuous triggering of listener code. */
+    public void setContinuousUpdate(boolean continuousUpdate) {
+        mContinuousUpdate = continuousUpdate;
+    }
+
+    /** Setter for the whether the text should be visible. */
+    public void setShowSeekBarValue(boolean showSeekBarValue) {
+        mShowSeekBarValue = showSeekBarValue;
+    }
+
+    /** Setter for the current value of the seek bar. */
+    public void setValue(int seekBarValue) {
+        setValueInternal(seekBarValue, true);
+    }
+
+    private void setValueInternal(int seekBarValue, boolean notifyChanged) {
+        if (seekBarValue < mMin) {
+            seekBarValue = mMin;
+        }
+        if (seekBarValue > mMax) {
+            seekBarValue = mMax;
+        }
+
+        if (seekBarValue != mSeekBarValue) {
+            mSeekBarValue = seekBarValue;
+            if (mSeekBarValueTextView != null) {
+                mSeekBarValueTextView.setText(String.valueOf(mSeekBarValue));
+            }
+            persistInt(seekBarValue);
+            if (notifyChanged) {
+                notifyChanged();
+            }
+        }
+    }
+
+    /** Getter for the current value of the seek bar. */
+    public int getValue() {
+        return mSeekBarValue;
+    }
+
+    /**
+     * Persist the seekBar's seekbar value if callChangeListener
+     * returns true, otherwise set the seekBar's value to the stored value
+     */
+    private void syncValueInternal(SeekBar seekBar) {
+        int seekBarValue = mMin + seekBar.getProgress();
+        if (seekBarValue != mSeekBarValue) {
+            if (callChangeListener(seekBarValue)) {
+                setValueInternal(seekBarValue, false);
+            } else {
+                seekBar.setProgress(mSeekBarValue - mMin);
+            }
+        }
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        final Parcelable superState = super.onSaveInstanceState();
+        if (isPersistent()) {
+            // No need to save instance state since it's persistent
+            return superState;
+        }
+
+        // Save the instance state
+        final SeekBarPreference.SavedState myState = new SeekBarPreference.SavedState(superState);
+        myState.mSeekBarValue = mSeekBarValue;
+        myState.mMin = mMin;
+        myState.mMax = mMax;
+        return myState;
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        if (!state.getClass().equals(SeekBarPreference.SavedState.class)) {
+            // Didn't save state for us in onSaveInstanceState
+            super.onRestoreInstanceState(state);
+            return;
+        }
+
+        // Restore the instance state
+        SeekBarPreference.SavedState myState = (SeekBarPreference.SavedState) state;
+        super.onRestoreInstanceState(myState.getSuperState());
+        mSeekBarValue = myState.mSeekBarValue;
+        mMin = myState.mMin;
+        mMax = myState.mMax;
+        notifyChanged();
+    }
+
+    /**
+     * SavedState, a subclass of {@link BaseSavedState}, will store the state
+     * of MyPreference, a subclass of Preference.
+     * <p>
+     * It is important to always call through to super methods.
+     */
+    private static class SavedState extends BaseSavedState {
+        int mSeekBarValue;
+        int mMin;
+        int mMax;
+
+        SavedState(Parcel source) {
+            super(source);
+
+            // Restore the click counter
+            mSeekBarValue = source.readInt();
+            mMin = source.readInt();
+            mMax = source.readInt();
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+
+            // Save the click counter
+            dest.writeInt(mSeekBarValue);
+            dest.writeInt(mMin);
+            dest.writeInt(mMax);
+        }
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        @SuppressWarnings("unused")
+        public static final Parcelable.Creator<SeekBarPreference.SavedState> CREATOR =
+                new Parcelable.Creator<SeekBarPreference.SavedState>() {
+                    @Override
+                    public SeekBarPreference.SavedState createFromParcel(Parcel in) {
+                        return new SeekBarPreference.SavedState(in);
+                    }
+
+                    @Override
+                    public SeekBarPreference.SavedState[] newArray(int size) {
+                        return new SeekBarPreference
+                                .SavedState[size];
+                    }
+                };
+    }
+}
diff --git a/src/com/android/car/settings/common/SettingsFragment.java b/src/com/android/car/settings/common/SettingsFragment.java
new file mode 100644
index 0000000..85d8085
--- /dev/null
+++ b/src/com/android/car/settings/common/SettingsFragment.java
@@ -0,0 +1,378 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.os.Bundle;
+import android.util.ArrayMap;
+import android.util.SparseArray;
+import android.util.TypedValue;
+import android.view.ContextThemeWrapper;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+import androidx.constraintlayout.widget.Guideline;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.EditTextPreference;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
+import com.android.car.settings.R;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Base fragment for all settings. Subclasses must provide a resource id via
+ * {@link #getPreferenceScreenResId()} for the XML resource which defines the preferences to
+ * display and controllers to update their state. This class is responsible for displaying the
+ * preferences, creating {@link PreferenceController} instances from the metadata, and
+ * associating the preferences with their corresponding controllers.
+ *
+ * <p>{@code preferenceTheme} must be specified in the application theme, and the parent to which
+ * this fragment attaches must implement {@link UxRestrictionsProvider} and
+ * {@link FragmentController} or an {@link IllegalStateException} will be thrown during
+ * {@link #onAttach(Context)}. Changes to driving state restrictions are propagated to
+ * controllers.
+ */
+public abstract class SettingsFragment extends PreferenceFragmentCompat implements
+        CarUxRestrictionsManager.OnUxRestrictionsChangedListener, FragmentController {
+
+    @VisibleForTesting
+    static final String DIALOG_FRAGMENT_TAG =
+            "com.android.car.settings.common.SettingsFragment.DIALOG";
+
+    private static final int MAX_NUM_PENDING_ACTIVITY_RESULT_CALLBACKS = 0xff - 1;
+
+    private final Map<Class, List<PreferenceController>> mPreferenceControllersLookup =
+            new ArrayMap<>();
+    private final List<PreferenceController> mPreferenceControllers = new ArrayList<>();
+    private final SparseArray<ActivityResultCallback> mActivityResultCallbackMap =
+            new SparseArray<>();
+
+    private CarUxRestrictions mUxRestrictions;
+    private int mCurrentRequestIndex = 0;
+
+    /**
+     * Returns the resource id for the preference XML of this fragment.
+     */
+    @XmlRes
+    protected abstract int getPreferenceScreenResId();
+
+    /**
+     * Returns the layout id to use as the activity action bar. Subclasses should override this
+     * method to customize the action bar layout (e.g. additional buttons, switches, etc.). The
+     * default action bar contains a back button and the title.
+     */
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar;
+    }
+
+    /**
+     * Returns the controller of the given {@code clazz} for the given {@code
+     * preferenceKeyResId}. Subclasses may use this method in {@link #onAttach(Context)} to call
+     * setters on controllers to pass additional arguments after construction.
+     *
+     * <p>For example:
+     * <pre>{@code
+     * @Override
+     * public void onAttach(Context context) {
+     *     super.onAttach(context);
+     *     use(MyPreferenceController.class, R.string.pk_my_key).setMyArg(myArg);
+     * }
+     * }</pre>
+     *
+     * <p>Important: Use judiciously to minimize tight coupling between controllers and fragments.
+     */
+    @SuppressWarnings("unchecked") // Class is used as map key.
+    protected <T extends PreferenceController> T use(Class<T> clazz,
+            @StringRes int preferenceKeyResId) {
+        List<PreferenceController> controllerList = mPreferenceControllersLookup.get(clazz);
+        if (controllerList != null) {
+            String preferenceKey = getString(preferenceKeyResId);
+            for (PreferenceController controller : controllerList) {
+                if (controller.getPreferenceKey().equals(preferenceKey)) {
+                    return (T) controller;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        if (!(getActivity() instanceof UxRestrictionsProvider)) {
+            throw new IllegalStateException("Must attach to a UxRestrictionsProvider");
+        }
+        if (!(getActivity() instanceof FragmentController)) {
+            throw new IllegalStateException("Must attach to a FragmentController");
+        }
+
+        TypedValue tv = new TypedValue();
+        getActivity().getTheme().resolveAttribute(androidx.preference.R.attr.preferenceTheme, tv,
+                true);
+        int theme = tv.resourceId;
+        if (theme == 0) {
+            throw new IllegalStateException("Must specify preferenceTheme in theme");
+        }
+        // Construct a context with the theme as controllers may create new preferences.
+        Context styledContext = new ContextThemeWrapper(getActivity(), theme);
+
+        mUxRestrictions = ((UxRestrictionsProvider) requireActivity()).getCarUxRestrictions();
+        mPreferenceControllers.clear();
+        mPreferenceControllers.addAll(
+                PreferenceControllerListHelper.getPreferenceControllersFromXml(styledContext,
+                        getPreferenceScreenResId(), /* fragmentController= */ this,
+                        mUxRestrictions));
+
+        Lifecycle lifecycle = getLifecycle();
+        mPreferenceControllers.forEach(controller -> {
+            lifecycle.addObserver(controller);
+            mPreferenceControllersLookup.computeIfAbsent(controller.getClass(),
+                    k -> new ArrayList<>(/* initialCapacity= */ 1)).add(controller);
+        });
+    }
+
+    /**
+     * Inflates the preferences from {@link #getPreferenceScreenResId()} and associates the
+     * preference with their corresponding {@link PreferenceController} instances.
+     */
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        @XmlRes int resId = getPreferenceScreenResId();
+        if (resId <= 0) {
+            throw new IllegalStateException(
+                    "Fragment must specify a preference screen resource ID");
+        }
+        addPreferencesFromResource(resId);
+        PreferenceScreen screen = getPreferenceScreen();
+        for (PreferenceController controller : mPreferenceControllers) {
+            controller.setPreference(screen.findPreference(controller.getPreferenceKey()));
+        }
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        FrameLayout actionBarContainer = requireActivity().findViewById(R.id.action_bar);
+        if (actionBarContainer != null) {
+            actionBarContainer.removeAllViews();
+            getLayoutInflater().inflate(getActionBarLayoutId(), actionBarContainer);
+
+            TextView titleView = actionBarContainer.requireViewById(R.id.title);
+            titleView.setText(getPreferenceScreen().getTitle());
+
+            // If the fragment is root, change the back button to settings icon.
+            ImageView imageView = actionBarContainer.requireViewById(R.id.back_button);
+            FragmentManager fragmentManager = requireActivity().getSupportFragmentManager();
+            if (fragmentManager.getBackStackEntryCount() == 1
+                    && fragmentManager.findFragmentByTag("0") != null
+                    && fragmentManager.findFragmentByTag("0").getClass().getName().equals(
+                    getString(R.string.config_settings_hierarchy_root_fragment))) {
+                if (getContext().getResources()
+                        .getBoolean(R.bool.config_show_settings_root_exit_icon)) {
+                    imageView.setImageResource(R.drawable.ic_launcher_settings);
+                    imageView.setTag(R.id.back_button, R.drawable.ic_launcher_settings);
+                } else {
+                    hideExitIcon();
+                }
+            } else {
+                imageView.setTag(R.id.back_button, R.drawable.ic_arrow_back);
+                actionBarContainer.requireViewById(R.id.action_bar_icon_container)
+                        .setOnClickListener(
+                                v -> requireActivity().onBackPressed());
+            }
+        }
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        Lifecycle lifecycle = getLifecycle();
+        mPreferenceControllers.forEach(lifecycle::removeObserver);
+        mActivityResultCallbackMap.clear();
+    }
+
+    /**
+     * Notifies {@link PreferenceController} instances of changes to {@link CarUxRestrictions}.
+     */
+    @Override
+    public void onUxRestrictionsChanged(CarUxRestrictions uxRestrictions) {
+        if (!uxRestrictions.isSameRestrictions(mUxRestrictions)) {
+            mUxRestrictions = uxRestrictions;
+            for (PreferenceController controller : mPreferenceControllers) {
+                controller.onUxRestrictionsChanged(uxRestrictions);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>Settings needs to launch custom dialog types in order to extend the Device Default theme.
+     *
+     * @param preference The Preference object requesting the dialog.
+     */
+    @Override
+    public void onDisplayPreferenceDialog(Preference preference) {
+        // check if dialog is already showing
+        if (findDialogByTag(DIALOG_FRAGMENT_TAG) != null) {
+            return;
+        }
+
+        DialogFragment dialogFragment;
+        if (preference instanceof ValidatedEditTextPreference) {
+            if (preference instanceof PasswordEditTextPreference) {
+                dialogFragment = PasswordEditTextPreferenceDialogFragment.newInstance(
+                        preference.getKey());
+            } else {
+                dialogFragment = ValidatedEditTextPreferenceDialogFragment.newInstance(
+                        preference.getKey());
+            }
+        } else if (preference instanceof EditTextPreference) {
+            dialogFragment = EditTextPreferenceDialogFragment.newInstance(preference.getKey());
+        } else if (preference instanceof ListPreference) {
+            dialogFragment = SettingsListPreferenceDialogFragment.newInstance(preference.getKey());
+        } else {
+            throw new IllegalArgumentException(
+                    "Tried to display dialog for unknown preference type. Did you forget to "
+                            + "override onDisplayPreferenceDialog()?");
+        }
+
+        dialogFragment.setTargetFragment(/* fragment= */ this, /* requestCode= */ 0);
+        showDialog(dialogFragment, DIALOG_FRAGMENT_TAG);
+    }
+
+    @Override
+    public void launchFragment(Fragment fragment) {
+        ((FragmentController) requireActivity()).launchFragment(fragment);
+    }
+
+    @Override
+    public void goBack() {
+        requireActivity().onBackPressed();
+    }
+
+    @Override
+    public void showBlockingMessage() {
+        Toast.makeText(getContext(), R.string.restricted_while_driving, Toast.LENGTH_SHORT).show();
+    }
+
+    @Override
+    public void showDialog(DialogFragment dialogFragment, @Nullable String tag) {
+        dialogFragment.show(getFragmentManager(), tag);
+    }
+
+    @Nullable
+    @Override
+    public DialogFragment findDialogByTag(String tag) {
+        Fragment fragment = getFragmentManager().findFragmentByTag(tag);
+        if (fragment instanceof DialogFragment) {
+            return (DialogFragment) fragment;
+        }
+        return null;
+    }
+
+    @Override
+    public void startActivityForResult(Intent intent, int requestCode,
+            ActivityResultCallback callback) {
+        validateRequestCodeForPreferenceController(requestCode);
+        int requestIndex = allocateRequestIndex(callback);
+        super.startActivityForResult(intent, ((requestIndex + 1) << 8) + (requestCode & 0xff));
+    }
+
+    @Override
+    public void startIntentSenderForResult(IntentSender intent, int requestCode,
+            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, Bundle options,
+            ActivityResultCallback callback)
+            throws IntentSender.SendIntentException {
+        validateRequestCodeForPreferenceController(requestCode);
+        int requestIndex = allocateRequestIndex(callback);
+        super.startIntentSenderForResult(intent, ((requestIndex + 1) << 8) + (requestCode & 0xff),
+                fillInIntent, flagsMask, flagsValues, /* extraFlags= */ 0, options);
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        int requestIndex = (requestCode >> 8) & 0xff;
+        if (requestIndex != 0) {
+            requestIndex--;
+            ActivityResultCallback callback = mActivityResultCallbackMap.get(requestIndex);
+            mActivityResultCallbackMap.remove(requestIndex);
+            if (callback != null) {
+                callback.processActivityResult(requestCode & 0xff, resultCode, data);
+            }
+        }
+    }
+
+    // Allocates the next available startActivityForResult request index.
+    private int allocateRequestIndex(ActivityResultCallback callback) {
+        // Sanity check that we haven't exhausted the request index space.
+        if (mActivityResultCallbackMap.size() >= MAX_NUM_PENDING_ACTIVITY_RESULT_CALLBACKS) {
+            throw new IllegalStateException(
+                    "Too many pending activity result callbacks.");
+        }
+
+        // Find an unallocated request index in the mPendingFragmentActivityResults map.
+        while (mActivityResultCallbackMap.indexOfKey(mCurrentRequestIndex) >= 0) {
+            mCurrentRequestIndex =
+                    (mCurrentRequestIndex + 1) % MAX_NUM_PENDING_ACTIVITY_RESULT_CALLBACKS;
+        }
+
+        mActivityResultCallbackMap.put(mCurrentRequestIndex, callback);
+        return mCurrentRequestIndex;
+    }
+
+    /**
+     * Checks whether the given request code is a valid code by masking it with 0xff00. Throws an
+     * {@link IllegalArgumentException} if the code is not valid.
+     */
+    private static void validateRequestCodeForPreferenceController(int requestCode) {
+        if ((requestCode & 0xff00) != 0) {
+            throw new IllegalArgumentException("Can only use lower 8 bits for requestCode");
+        }
+    }
+
+    private void hideExitIcon() {
+        requireActivity().findViewById(R.id.action_bar_icon_container)
+                .setVisibility(FrameLayout.GONE);
+
+        Guideline guideLine = (Guideline) requireActivity().findViewById(R.id.start_margin);
+        guideLine.setGuidelineBegin(getResources()
+                .getDimensionPixelOffset(R.dimen.action_bar_no_icon_start_margin));
+    }
+}
diff --git a/src/com/android/car/settings/common/SettingsListPreferenceDialogFragment.java b/src/com/android/car/settings/common/SettingsListPreferenceDialogFragment.java
new file mode 100644
index 0000000..1e32c59
--- /dev/null
+++ b/src/com/android/car/settings/common/SettingsListPreferenceDialogFragment.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.preference.ListPreference;
+
+/**
+ * Presents a dialog with a list of options associated with a {@link ListPreference}.
+ *
+ * <p>Note: this is borrowed as-is from androidx.preference.EditTextPreferenceDialogFragmentCompat
+ * with updates to formatting to match the project style. CarSettings needs to use custom dialog
+ * implementations in order to launch the platform {@link AlertDialog} instead of the one in the
+ * support library.
+ */
+public class SettingsListPreferenceDialogFragment extends SettingsPreferenceDialogFragment {
+
+    private static final String SAVE_STATE_INDEX = "SettingsListPreferenceDialogFragment.index";
+    private static final String SAVE_STATE_ENTRIES = "SettingsListPreferenceDialogFragment.entries";
+    private static final String SAVE_STATE_ENTRY_VALUES =
+            "SettingsListPreferenceDialogFragment.entryValues";
+
+    private int mClickedDialogEntryIndex;
+    private CharSequence[] mEntries;
+    private CharSequence[] mEntryValues;
+
+    /**
+     * Returns a new instance of {@link SettingsListPreferenceDialogFragment} for the {@link
+     * ListPreference} with the given {@code key}.
+     */
+    public static SettingsListPreferenceDialogFragment newInstance(String key) {
+        SettingsListPreferenceDialogFragment fragment = new SettingsListPreferenceDialogFragment();
+        Bundle b = new Bundle(/* capacity= */ 1);
+        b.putString(ARG_KEY, key);
+        fragment.setArguments(b);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState == null) {
+            ListPreference preference = getListPreference();
+
+            if (preference.getEntries() == null || preference.getEntryValues() == null) {
+                throw new IllegalStateException(
+                        "ListPreference requires an entries array and an entryValues array.");
+            }
+
+            mClickedDialogEntryIndex = preference.findIndexOfValue(preference.getValue());
+            mEntries = preference.getEntries();
+            mEntryValues = preference.getEntryValues();
+        } else {
+            mClickedDialogEntryIndex = savedInstanceState.getInt(SAVE_STATE_INDEX, 0);
+            mEntries = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRIES);
+            mEntryValues = savedInstanceState.getCharSequenceArray(SAVE_STATE_ENTRY_VALUES);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt(SAVE_STATE_INDEX, mClickedDialogEntryIndex);
+        outState.putCharSequenceArray(SAVE_STATE_ENTRIES, mEntries);
+        outState.putCharSequenceArray(SAVE_STATE_ENTRY_VALUES, mEntryValues);
+    }
+
+    private ListPreference getListPreference() {
+        return (ListPreference) getPreference();
+    }
+
+    @Override
+    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+        super.onPrepareDialogBuilder(builder);
+
+        builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
+                (dialog, which) -> {
+                    mClickedDialogEntryIndex = which;
+
+                    // Clicking on an item simulates the positive button click, and dismisses the
+                    // dialog.
+                    SettingsListPreferenceDialogFragment.this.onClick(dialog,
+                            DialogInterface.BUTTON_POSITIVE);
+                    dialog.dismiss();
+                });
+
+        // The typical interaction for list-based dialogs is to have click-on-an-item dismiss the
+        // dialog instead of the user having to press 'Ok'.
+        builder.setPositiveButton(null, null);
+    }
+
+    @Override
+    public void onDialogClosed(boolean positiveResult) {
+        if (positiveResult && mClickedDialogEntryIndex >= 0) {
+            String value = mEntryValues[mClickedDialogEntryIndex].toString();
+            ListPreference preference = getListPreference();
+            if (preference.callChangeListener(value)) {
+                preference.setValue(value);
+            }
+        }
+    }
+
+}
diff --git a/src/com/android/car/settings/common/SettingsPreferenceDialogFragment.java b/src/com/android/car/settings/common/SettingsPreferenceDialogFragment.java
new file mode 100644
index 0000000..01ca5c6
--- /dev/null
+++ b/src/com/android/car/settings/common/SettingsPreferenceDialogFragment.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.preference.DialogPreference;
+import androidx.preference.PreferenceFragmentCompat;
+
+/**
+ * Abstract base class which presents a dialog associated with a {@link
+ * androidx.preference.DialogPreference}. Since the preference object may not be available during
+ * fragment re-creation, the necessary information for displaying the dialog is read once during
+ * the initial call to {@link #onCreate(Bundle)} and saved/restored in the saved instance state.
+ * Custom subclasses should also follow this pattern.
+ *
+ * <p>Note: this is borrowed as-is from androidx.preference.PreferenceDialogFragmentCompat with
+ * updates to formatting to match the project style. CarSettings needs to use custom dialog
+ * implementations in order to launch the platform {@link AlertDialog} instead of the one in the
+ * support library.
+ */
+public abstract class SettingsPreferenceDialogFragment extends DialogFragment implements
+        DialogInterface.OnClickListener {
+
+    protected static final String ARG_KEY = "key";
+
+    private static final String SAVE_STATE_TITLE = "SettingsPreferenceDialogFragment.title";
+    private static final String SAVE_STATE_POSITIVE_TEXT =
+            "SettingsPreferenceDialogFragment.positiveText";
+    private static final String SAVE_STATE_NEGATIVE_TEXT =
+            "SettingsPreferenceDialogFragment.negativeText";
+    private static final String SAVE_STATE_MESSAGE = "SettingsPreferenceDialogFragment.message";
+    private static final String SAVE_STATE_LAYOUT = "SettingsPreferenceDialogFragment.layout";
+    private static final String SAVE_STATE_ICON = "SettingsPreferenceDialogFragment.icon";
+
+    private DialogPreference mPreference;
+
+    private CharSequence mDialogTitle;
+    private CharSequence mPositiveButtonText;
+    private CharSequence mNegativeButtonText;
+    private CharSequence mDialogMessage;
+    @LayoutRes
+    private int mDialogLayoutRes;
+
+    private BitmapDrawable mDialogIcon;
+
+    /** Which button was clicked. */
+    private int mWhichButtonClicked;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Fragment rawFragment = getTargetFragment();
+        if (!(rawFragment instanceof DialogPreference.TargetFragment)) {
+            throw new IllegalStateException(
+                    "Target fragment must implement TargetFragment interface");
+        }
+
+        DialogPreference.TargetFragment fragment =
+                (DialogPreference.TargetFragment) rawFragment;
+
+        String key = getArguments().getString(ARG_KEY);
+        if (savedInstanceState == null) {
+            mPreference = (DialogPreference) fragment.findPreference(key);
+            mDialogTitle = mPreference.getDialogTitle();
+            mPositiveButtonText = mPreference.getPositiveButtonText();
+            mNegativeButtonText = mPreference.getNegativeButtonText();
+            mDialogMessage = mPreference.getDialogMessage();
+            mDialogLayoutRes = mPreference.getDialogLayoutResource();
+
+            Drawable icon = mPreference.getDialogIcon();
+            if (icon == null || icon instanceof BitmapDrawable) {
+                mDialogIcon = (BitmapDrawable) icon;
+            } else {
+                Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(),
+                        icon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+                Canvas canvas = new Canvas(bitmap);
+                icon.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+                icon.draw(canvas);
+                mDialogIcon = new BitmapDrawable(getResources(), bitmap);
+            }
+        } else {
+            mDialogTitle = savedInstanceState.getCharSequence(SAVE_STATE_TITLE);
+            mPositiveButtonText = savedInstanceState.getCharSequence(SAVE_STATE_POSITIVE_TEXT);
+            mNegativeButtonText = savedInstanceState.getCharSequence(SAVE_STATE_NEGATIVE_TEXT);
+            mDialogMessage = savedInstanceState.getCharSequence(SAVE_STATE_MESSAGE);
+            mDialogLayoutRes = savedInstanceState.getInt(SAVE_STATE_LAYOUT, 0);
+            Bitmap bitmap = savedInstanceState.getParcelable(SAVE_STATE_ICON);
+            if (bitmap != null) {
+                mDialogIcon = new BitmapDrawable(getResources(), bitmap);
+            }
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(@NonNull Bundle outState) {
+        super.onSaveInstanceState(outState);
+
+        outState.putCharSequence(SAVE_STATE_TITLE, mDialogTitle);
+        outState.putCharSequence(SAVE_STATE_POSITIVE_TEXT, mPositiveButtonText);
+        outState.putCharSequence(SAVE_STATE_NEGATIVE_TEXT, mNegativeButtonText);
+        outState.putCharSequence(SAVE_STATE_MESSAGE, mDialogMessage);
+        outState.putInt(SAVE_STATE_LAYOUT, mDialogLayoutRes);
+        if (mDialogIcon != null) {
+            outState.putParcelable(SAVE_STATE_ICON, mDialogIcon.getBitmap());
+        }
+    }
+
+    @Override
+    @NonNull
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        Context context = getActivity();
+        mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE;
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(context)
+                .setTitle(mDialogTitle)
+                .setIcon(mDialogIcon)
+                .setPositiveButton(mPositiveButtonText, this)
+                .setNegativeButton(mNegativeButtonText, this);
+
+        View contentView = onCreateDialogView(context);
+        if (contentView != null) {
+            onBindDialogView(contentView);
+            builder.setView(contentView);
+        } else {
+            builder.setMessage(mDialogMessage);
+        }
+
+        onPrepareDialogBuilder(builder);
+
+        // Create the dialog
+        Dialog dialog = builder.create();
+        if (needInputMethod()) {
+            // Request input only after the dialog is shown. This is to prevent an issue where the
+            // dialog view collapsed the content on small displays.
+            dialog.setOnShowListener(d -> requestInputMethod(dialog));
+        }
+
+        return dialog;
+    }
+
+    /**
+     * Get the preference that requested this dialog. Available after {@link #onCreate(Bundle)} has
+     * been called on the {@link PreferenceFragmentCompat} which launched this dialog.
+     *
+     * @return the {@link DialogPreference} associated with this dialog.
+     */
+    public DialogPreference getPreference() {
+        if (mPreference == null) {
+            String key = getArguments().getString(ARG_KEY);
+            DialogPreference.TargetFragment fragment =
+                    (DialogPreference.TargetFragment) getTargetFragment();
+            mPreference = (DialogPreference) fragment.findPreference(key);
+        }
+        return mPreference;
+    }
+
+    /**
+     * Prepares the dialog builder to be shown when the preference is clicked. Use this to set
+     * custom properties on the dialog.
+     *
+     * <p>Do not {@link AlertDialog.Builder#create()} or {@link AlertDialog.Builder#show()}.
+     */
+    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+    }
+
+    /**
+     * Returns whether the preference needs to display a soft input method when the dialog is
+     * displayed. Default is false. Subclasses should override this method if they need the soft
+     * input method brought up automatically.
+     *
+     * <p>Note: Ensure your subclass manually requests focus (ideally in {@link
+     * #onBindDialogView(View)}) for the input field in order to
+     * correctly attach the input method to the field.
+     */
+    protected boolean needInputMethod() {
+        return false;
+    }
+
+    /**
+     * Sets the required flags on the dialog window to enable input method window to show up.
+     */
+    private void requestInputMethod(Dialog dialog) {
+        Window window = dialog.getWindow();
+        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+    }
+
+    /**
+     * Creates the content view for the dialog (if a custom content view is required). By default,
+     * it inflates the dialog layout resource if it is set.
+     *
+     * @return the content View for the dialog.
+     * @see DialogPreference#setLayoutResource(int)
+     */
+    protected View onCreateDialogView(Context context) {
+        int resId = mDialogLayoutRes;
+        if (resId == 0) {
+            return null;
+        }
+
+        LayoutInflater inflater = LayoutInflater.from(context);
+        return inflater.inflate(resId, null);
+    }
+
+    /**
+     * Binds views in the content View of the dialog to data.
+     *
+     * <p>Make sure to call through to the superclass implementation.
+     *
+     * @param view the content View of the dialog, if it is custom.
+     */
+    @CallSuper
+    protected void onBindDialogView(View view) {
+        View dialogMessageView = view.findViewById(android.R.id.message);
+
+        if (dialogMessageView != null) {
+            CharSequence message = mDialogMessage;
+            int newVisibility = View.GONE;
+
+            if (!TextUtils.isEmpty(message)) {
+                if (dialogMessageView instanceof TextView) {
+                    ((TextView) dialogMessageView).setText(message);
+                }
+
+                newVisibility = View.VISIBLE;
+            }
+
+            if (dialogMessageView.getVisibility() != newVisibility) {
+                dialogMessageView.setVisibility(newVisibility);
+            }
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        mWhichButtonClicked = which;
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        super.onDismiss(dialog);
+        onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE);
+    }
+
+    /**
+     * Called when the dialog is dismissed.
+     *
+     * @param positiveResult {@code true} if the dialog was dismissed with {@link
+     *                       DialogInterface#BUTTON_POSITIVE}.
+     */
+    protected abstract void onDialogClosed(boolean positiveResult);
+}
diff --git a/src/com/android/car/settings/common/TwoActionPreference.java b/src/com/android/car/settings/common/TwoActionPreference.java
new file mode 100644
index 0000000..73ee0b9
--- /dev/null
+++ b/src/com/android/car/settings/common/TwoActionPreference.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+
+/**
+ * A preference which can perform two actions. The secondary action is shown by default.
+ * {@link #showAction(boolean)} may be used to manually set the visibility of the action.
+ */
+public abstract class TwoActionPreference extends Preference {
+
+    private boolean mIsActionShown;
+
+    public TwoActionPreference(Context context, AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init(attrs);
+    }
+
+    public TwoActionPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(attrs);
+    }
+
+    public TwoActionPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(attrs);
+    }
+
+    public TwoActionPreference(Context context) {
+        super(context);
+        init(/* attrs= */ null);
+    }
+
+    private void init(AttributeSet attrs) {
+        setLayoutResource(R.layout.two_action_preference);
+        TypedArray preferenceAttributes = getContext().obtainStyledAttributes(attrs,
+                R.styleable.TwoActionPreference);
+        mIsActionShown = preferenceAttributes.getBoolean(
+                R.styleable.TwoActionPreference_actionShown, true);
+    }
+
+    /**
+     * Sets whether the secondary action is visible in the preference.
+     *
+     * @param isShown {@code true} if the secondary action should be shown.
+     */
+    public void showAction(boolean isShown) {
+        mIsActionShown = isShown;
+        notifyChanged();
+    }
+
+    /** Returns {@code true} if action is shown. */
+    public boolean isActionShown() {
+        return mIsActionShown;
+    }
+
+    @Override
+    public final void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        View actionConatiner = holder.findViewById(R.id.action_widget_container);
+        View widgetFrame = holder.findViewById(android.R.id.widget_frame);
+        if (mIsActionShown) {
+            actionConatiner.setVisibility(View.VISIBLE);
+            onBindWidgetFrame(widgetFrame);
+        } else {
+            actionConatiner.setVisibility(View.GONE);
+        }
+    }
+
+    /**
+     * Binds the created View for the second action.
+     *
+     * <p>This is a good place to set properties on any custom view.
+     *
+     * @param widgetFrame The widget frame which controls the 2nd action.
+     */
+    protected abstract void onBindWidgetFrame(View widgetFrame);
+}
diff --git a/src/com/android/car/settings/common/UxRestrictionsProvider.java b/src/com/android/car/settings/common/UxRestrictionsProvider.java
new file mode 100644
index 0000000..65196f9
--- /dev/null
+++ b/src/com/android/car/settings/common/UxRestrictionsProvider.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+
+/**
+ * Provides current {@link CarUxRestrictions}.
+ */
+public interface UxRestrictionsProvider {
+
+    /**
+     * Returns the current {@link CarUxRestrictions}.
+     */
+    CarUxRestrictions getCarUxRestrictions();
+}
diff --git a/src/com/android/car/settings/common/ValidatedEditTextPreference.java b/src/com/android/car/settings/common/ValidatedEditTextPreference.java
new file mode 100644
index 0000000..3c46b9b
--- /dev/null
+++ b/src/com/android/car/settings/common/ValidatedEditTextPreference.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import androidx.preference.EditTextPreference;
+import androidx.preference.PreferenceViewHolder;
+
+/**
+ * Extends {@link EditTextPreference} to add optional {@link Validator} logic. Validator is passed
+ * on to {@link ValidatedEditTextPreferenceDialogFragment} to be attached to its View.
+ */
+public class ValidatedEditTextPreference extends EditTextPreference {
+
+    /** Defines the validation logic used in this preference. */
+    public interface Validator {
+        /** Returns true only if the value provided meets validation criteria. */
+        boolean isTextValid(String value);
+    }
+
+    private Validator mValidator;
+    private int mInputType;
+
+    public ValidatedEditTextPreference(Context context) {
+        super(context);
+    }
+
+    public ValidatedEditTextPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ValidatedEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public ValidatedEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    /** Sets the text input type of the summary field. */
+    public void setSummaryInputType(int inputType) {
+        mInputType = inputType;
+        notifyChanged();
+    }
+
+    /** Gets the text input type of the summary field. */
+    public int getSummaryInputType() {
+        return mInputType;
+    }
+
+    /**
+     * Sets the {@link Validator}. Validator has to be set before the Preference is
+     * clicked for it to be attached to the Dialog's EditText.
+     */
+    public void setValidator(Validator validator) {
+        mValidator = validator;
+    }
+
+    /**
+     * Gets the {@link Validator} for {@link EditTextPreferenceDialogFragment} to attach
+     * to its own View.
+     */
+    public Validator getValidator() {
+        return mValidator;
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+
+        TextView summaryView = (TextView) holder.findViewById(android.R.id.summary);
+        summaryView.setInputType(mInputType);
+    }
+}
diff --git a/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragment.java b/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragment.java
new file mode 100644
index 0000000..8819951
--- /dev/null
+++ b/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragment.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+
+/**
+ * Adds optional text validation logic to {@link EditTextPreferenceDialogFragment}. Disables
+ * Positive Button and the ability to press Enter to submit the dialog if the input is invalid.
+ * Validator must be provided by {@link ValidatedEditTextPreference} before launching the Dialog
+ * Fragment for it to be attached to its View.
+ */
+public class ValidatedEditTextPreferenceDialogFragment extends
+        EditTextPreferenceDialogFragment implements TextView.OnEditorActionListener {
+
+    private final EditTextWatcher mTextWatcher = new EditTextWatcher();
+
+    private ValidatedEditTextPreference.Validator mValidator;
+    private EditText mEditText;
+
+    /**
+     * Returns a new instance of {@link ValidatedEditTextPreferenceDialogFragment} for the
+     * {@link ValidatedEditTextPreference} with the given {@code key}.
+     */
+    public static ValidatedEditTextPreferenceDialogFragment newInstance(String key) {
+        ValidatedEditTextPreferenceDialogFragment fragment =
+                new ValidatedEditTextPreferenceDialogFragment();
+        Bundle b = new Bundle(/* capacity= */ 1);
+        b.putString(ARG_KEY, key);
+        fragment.setArguments(b);
+        return fragment;
+    }
+
+    @Override
+    protected void onBindDialogView(View view) {
+        super.onBindDialogView(view);
+        mEditText = view.findViewById(android.R.id.edit);
+        if (getPreference() instanceof ValidatedEditTextPreference) {
+            ValidatedEditTextPreference.Validator validator =
+                    ((ValidatedEditTextPreference) getPreference()).getValidator();
+            if (validator != null) {
+                attachValidatorToView(view, validator);
+            }
+        }
+
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        allowDialogSubmissionOnlyIfValidInput((AlertDialog) getDialog());
+    }
+
+    private void attachValidatorToView(View view, ValidatedEditTextPreference.Validator validator) {
+        mValidator = validator;
+        EditText editText = view.findViewById(android.R.id.edit);
+        if (mValidator != null && editText != null) {
+            editText.removeTextChangedListener(mTextWatcher);
+            editText.addTextChangedListener(mTextWatcher);
+        }
+    }
+
+    private class EditTextWatcher implements TextWatcher {
+        @Override
+        public void onTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void beforeTextChanged(CharSequence s, int start, int before, int count) {
+        }
+
+        @Override
+        public void afterTextChanged(Editable s) {
+            allowDialogSubmissionOnlyIfValidInput((AlertDialog) getDialog());
+        }
+    }
+
+    private void allowDialogSubmissionOnlyIfValidInput(AlertDialog dialog) {
+        if (dialog != null && mValidator != null && mEditText != null) {
+            boolean valid = mValidator.isTextValid(mEditText.getText().toString());
+            dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(valid);
+            setAllowEnterToSubmit(valid);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/datausage/AppDataUsageFragment.java b/src/com/android/car/settings/datausage/AppDataUsageFragment.java
new file mode 100644
index 0000000..2c756e2
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppDataUsageFragment.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.NetworkPolicy;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.format.DateUtils;
+import android.util.Pair;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+import androidx.loader.app.LoaderManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import java.time.ZonedDateTime;
+import java.util.Iterator;
+
+/**
+ * Screen to display list of applications using the data.
+ */
+public class AppDataUsageFragment extends SettingsFragment {
+
+    private static final Logger LOG = new Logger(AppDataUsageFragment.class);
+
+    private static final String ARG_NETWORK_SUB_ID = "network_sub_id";
+    /** Value to represent that the subscription id hasn't been computed yet. */
+    private static final int SUB_ID_NULL = Integer.MIN_VALUE;
+
+    private AppsNetworkStatsManager mAppsNetworkStatsManager;
+    private NetworkPolicyEditor mPolicyEditor;
+    private NetworkTemplate mNetworkTemplate;
+
+    private Bundle mBundle;
+
+    /**
+     * Creates a new instance of the {@link AppDataUsageFragment}, which shows settings related to
+     * the given {@code subId}.
+     */
+    public static AppDataUsageFragment newInstance(int subId) {
+        AppDataUsageFragment fragment = new AppDataUsageFragment();
+        Bundle args = new Bundle();
+        args.putInt(ARG_NETWORK_SUB_ID, subId);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.app_data_usage_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
+        int subId = getArguments() != null
+                ? getArguments().getInt(ARG_NETWORK_SUB_ID, SUB_ID_NULL) : SUB_ID_NULL;
+        if (subId == SUB_ID_NULL) {
+            LOG.d("Cannot get the subscription id from arguments. Switching to default "
+                    + "subscription Id: " + subId);
+            SubscriptionManager subscriptionManager = context.getSystemService(
+                    SubscriptionManager.class);
+            subId = DataUsageUtils.getDefaultSubscriptionId(subscriptionManager);
+        }
+        mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(telephonyManager, subId);
+        mPolicyEditor = new NetworkPolicyEditor(NetworkPolicyManager.from(context));
+        mAppsNetworkStatsManager = new AppsNetworkStatsManager(getContext());
+        mAppsNetworkStatsManager.registerListener(
+                use(AppDataUsagePreferenceController.class, R.string.pk_app_data_usage_detail));
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mBundle = getBundleForNetworkStats();
+
+        LoaderManager loaderManager = LoaderManager.getInstance(this);
+        mAppsNetworkStatsManager.startLoading(loaderManager, mBundle);
+    }
+
+    private Bundle getBundleForNetworkStats() {
+        long historyStart = System.currentTimeMillis();
+        long historyEnd = historyStart + 1;
+
+        long start = 0;
+        long end = 0;
+
+        boolean hasCycles = false;
+
+        NetworkPolicy policy = mPolicyEditor.getPolicy(mNetworkTemplate);
+        if (policy != null) {
+            Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = NetworkPolicyManager
+                    .cycleIterator(policy);
+            while (it.hasNext()) {
+                Pair<ZonedDateTime, ZonedDateTime> cycle = it.next();
+                start = cycle.first.toInstant().toEpochMilli();
+                end = cycle.second.toInstant().toEpochMilli();
+                hasCycles = true;
+            }
+        }
+
+        if (!hasCycles) {
+            // no policy defined cycles; show entry for each four-week period
+            long cycleEnd = historyEnd;
+            while (cycleEnd > historyStart) {
+                long cycleStart = cycleEnd - (DateUtils.WEEK_IN_MILLIS * 4);
+
+                start = cycleStart;
+                end = cycleEnd;
+                cycleEnd = cycleStart;
+            }
+        }
+
+        return SummaryForAllUidLoader.buildArgs(mNetworkTemplate, start, end);
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+    Bundle getBundle() {
+        return mBundle;
+    }
+}
diff --git a/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java b/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
new file mode 100644
index 0000000..577a602
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppDataUsagePreferenceController.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.TrafficStats.UID_REMOVED;
+import static android.net.TrafficStats.UID_TETHERING;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.net.NetworkStats;
+import android.os.UserHandle;
+import android.util.SparseArray;
+
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.settingslib.AppItem;
+import com.android.settingslib.net.UidDetail;
+import com.android.settingslib.net.UidDetailProvider;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import javax.annotation.Nullable;
+
+/**
+ * Controller that adds all the applications using the data sorted by the amount of data used. The
+ * first application that used most amount of data will be at the top with progress 100 percentage.
+ * All other progress are calculated relatively.
+ */
+public class AppDataUsagePreferenceController extends
+        PreferenceController<PreferenceGroup> implements AppsNetworkStatsManager.Callback {
+
+    private final UidDetailProvider mUidDetailProvider;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public AppDataUsagePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mUidDetailProvider = new UidDetailProvider(getContext());
+        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    public void onDataLoaded(@Nullable NetworkStats stats, @Nullable int[] restrictedUids) {
+        List<AppItem> items = new ArrayList<>();
+        long largest = 0;
+
+        List<UserInfo> profiles = mCarUserManagerHelper.getAllUsers();
+        SparseArray<AppItem> knownItems = new SparseArray<AppItem>();
+
+        NetworkStats.Entry entry = null;
+        if (stats != null) {
+            for (int i = 0; i < stats.size(); i++) {
+                entry = stats.getValues(i, entry);
+                long size = aggregateDataUsage(knownItems, items, entry, profiles);
+                largest = Math.max(size, largest);
+            }
+        }
+
+        updateRestrictedState(restrictedUids, knownItems, items, profiles);
+        sortAndAddPreferences(items, largest);
+    }
+
+    private long aggregateDataUsage(SparseArray<AppItem> knownItems, List<AppItem> items,
+            NetworkStats.Entry entry, List<UserInfo> profiles) {
+        int currentUserId = mCarUserManagerHelper.getCurrentProcessUserId();
+
+        // Decide how to collapse items together.
+        int uid = entry.uid;
+
+        int collapseKey;
+        int category;
+        int userId = UserHandle.getUserId(uid);
+
+        if (isUidValid(uid)) {
+            collapseKey = uid;
+            category = AppItem.CATEGORY_APP;
+            return accumulate(collapseKey, knownItems, entry, category, items);
+        }
+
+        if (!UserHandle.isApp(uid)) {
+            collapseKey = android.os.Process.SYSTEM_UID;
+            category = AppItem.CATEGORY_APP;
+            return accumulate(collapseKey, knownItems, entry, category, items);
+        }
+
+        if (profileContainsUserId(profiles, userId) && userId == currentUserId) {
+            // Add to app item.
+            collapseKey = uid;
+            category = AppItem.CATEGORY_APP;
+            return accumulate(collapseKey, knownItems, entry, category, items);
+        }
+
+        if (profileContainsUserId(profiles, userId) && userId != currentUserId) {
+            // Add to a managed user item.
+            int managedKey = UidDetailProvider.buildKeyForUser(userId);
+            long usersLargest = accumulate(managedKey, knownItems, entry, AppItem.CATEGORY_USER,
+                    items);
+            collapseKey = uid;
+            category = AppItem.CATEGORY_APP;
+            long appLargest = accumulate(collapseKey, knownItems, entry, category, items);
+            return Math.max(usersLargest, appLargest);
+        }
+
+        // If it is a removed user add it to the removed users' key.
+        Optional<UserInfo> info = profiles.stream().filter(
+                userInfo -> userInfo.id == userId).findFirst();
+        if (!info.isPresent()) {
+            collapseKey = UID_REMOVED;
+            category = AppItem.CATEGORY_APP;
+        } else {
+            // Add to other user item.
+            collapseKey = UidDetailProvider.buildKeyForUser(userId);
+            category = AppItem.CATEGORY_USER;
+        }
+
+        return accumulate(collapseKey, knownItems, entry, category, items);
+    }
+
+    /**
+     * UID does not belong to a regular app and maybe belongs to a removed application or
+     * application using for tethering traffic.
+     */
+    private boolean isUidValid(int uid) {
+        return !UserHandle.isApp(uid) && (uid == UID_REMOVED || uid == UID_TETHERING);
+    }
+
+    private boolean profileContainsUserId(List<UserInfo> profiles, int userId) {
+        return profiles.stream().anyMatch(userInfo -> userInfo.id == userId);
+    }
+
+    private void updateRestrictedState(@Nullable int[] restrictedUids,
+            SparseArray<AppItem> knownItems, List<AppItem> items, List<UserInfo> profiles) {
+        if (restrictedUids == null) {
+            return;
+        }
+
+        for (int i = 0; i < restrictedUids.length; ++i) {
+            int uid = restrictedUids[i];
+            // Only splice in restricted state for current user or managed users.
+            if (!profileContainsUserId(profiles, uid)) {
+                continue;
+            }
+
+            AppItem item = knownItems.get(uid);
+            if (item == null) {
+                item = new AppItem(uid);
+                item.total = -1;
+                items.add(item);
+                knownItems.put(item.key, item);
+            }
+            item.restricted = true;
+        }
+    }
+
+    private void sortAndAddPreferences(List<AppItem> items, long largest) {
+        Collections.sort(items);
+        for (int i = 0; i < items.size(); i++) {
+            int percentTotal = largest != 0 ? (int) (items.get(i).total * 100 / largest) : 0;
+            AppDataUsagePreference preference = new AppDataUsagePreference(getContext(),
+                    items.get(i), percentTotal, mUidDetailProvider);
+            getPreference().addPreference(preference);
+        }
+    }
+
+    /**
+     * Accumulate data usage of a network stats entry for the item mapped by the collapse key.
+     * Creates the item if needed.
+     *
+     * @param collapseKey the collapse key used to map the item.
+     * @param knownItems collection of known (already existing) items.
+     * @param entry the network stats entry to extract data usage from.
+     * @param itemCategory the item is categorized on the list view by this category. Must be
+     */
+    private static long accumulate(int collapseKey, SparseArray<AppItem> knownItems,
+            NetworkStats.Entry entry, int itemCategory, List<AppItem> items) {
+        int uid = entry.uid;
+        AppItem item = knownItems.get(collapseKey);
+        if (item == null) {
+            item = new AppItem(collapseKey);
+            item.category = itemCategory;
+            items.add(item);
+            knownItems.put(item.key, item);
+        }
+        item.addUid(uid);
+        item.total += entry.rxBytes + entry.txBytes;
+        return item.total;
+    }
+
+    private class AppDataUsagePreference extends ProgressBarPreference {
+
+        private final AppItem mItem;
+        private final int mPercent;
+        private UidDetail mDetail;
+
+        AppDataUsagePreference(Context context, AppItem item, int percent,
+                UidDetailProvider provider) {
+            super(context);
+            mItem = item;
+            mPercent = percent;
+            setLayoutResource(R.layout.progress_bar_preference);
+            setKey(String.valueOf(item.key));
+            if (item.restricted && item.total <= 0) {
+                setSummary(R.string.data_usage_app_restricted);
+            } else {
+                CharSequence s = DataUsageUtils.bytesToIecUnits(context, item.total);
+                setSummary(s);
+            }
+            mDetail = provider.getUidDetail(item.key, false /* blocking */);
+            if (mDetail != null) {
+                setAppInfo();
+            } else {
+                ThreadUtils.postOnBackgroundThread(() -> {
+                    mDetail = provider.getUidDetail(mItem.key, true /* blocking */);
+                    ThreadUtils.postOnMainThread(() -> setAppInfo());
+                });
+            }
+        }
+
+        private void setAppInfo() {
+            if (mDetail != null) {
+                setIcon(mDetail.icon);
+                setTitle(mDetail.label);
+                setProgress(mPercent);
+            } else {
+                setIcon(null);
+                setTitle(null);
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/datausage/AppsNetworkStatsManager.java b/src/com/android/car/settings/datausage/AppsNetworkStatsManager.java
new file mode 100644
index 0000000..2fc6cbc
--- /dev/null
+++ b/src/com/android/car/settings/datausage/AppsNetworkStatsManager.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
+
+import android.content.Context;
+import android.net.INetworkStatsService;
+import android.net.INetworkStatsSession;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkStats;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+import com.android.car.settings.common.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+/**
+ * Class to manage the callbacks needed to calculate network stats for an application.
+ */
+public class AppsNetworkStatsManager {
+
+    /**
+     * Callback that is called once the AppsNetworkStats is loaded.
+     */
+    public interface Callback {
+        /**
+         * Called when the data is successfully loaded from
+         * {@link AppsNetworkStatsManager.AppsNetworkStatsResult}.
+         */
+        void onDataLoaded(@Nullable NetworkStats stats, @Nullable int[] restrictedUids);
+    }
+
+    private static final Logger LOG = new Logger(AppsNetworkStatsManager.class);
+    private static final int NETWORK_STATS_ID = 1;
+
+    private final Context mContext;
+    private final NetworkPolicyManager mNetworkPolicyManager;
+    private final List<AppsNetworkStatsManager.Callback> mAppsNetworkStatsListeners =
+            new ArrayList<>();
+
+    private INetworkStatsSession mStatsSession;
+
+    AppsNetworkStatsManager(Context context) {
+        mContext = context;
+        mNetworkPolicyManager = NetworkPolicyManager.from(context);
+        try {
+            mStatsSession = INetworkStatsService.Stub.asInterface(
+                    ServiceManager.getService(Context.NETWORK_STATS_SERVICE)).openSession();
+        } catch (RemoteException e) {
+            LOG.e("Could not open a network session", e);
+        }
+    }
+
+    /**
+     * Registers a listener that will be notified once the data is loaded.
+     */
+    public void registerListener(AppsNetworkStatsManager.Callback appsNetworkStatsListener) {
+        if (!mAppsNetworkStatsListeners.contains(appsNetworkStatsListener)) {
+            mAppsNetworkStatsListeners.add(appsNetworkStatsListener);
+        }
+    }
+
+    /**
+     * Unregisters the listener.
+     */
+    public void unregisterListener(AppsNetworkStatsManager.Callback appsNetworkStatsListener) {
+        mAppsNetworkStatsListeners.remove(appsNetworkStatsListener);
+    }
+
+    /**
+     * Start calculating the storage stats.
+     */
+    public void startLoading(LoaderManager loaderManager, Bundle bundle) {
+        loaderManager.restartLoader(NETWORK_STATS_ID, bundle, new AppsNetworkStatsResult());
+    }
+
+    private void onAppsNetworkStatsLoaded(NetworkStats stats, int[] restrictedUids) {
+        for (AppsNetworkStatsManager.Callback listener : mAppsNetworkStatsListeners) {
+            listener.onDataLoaded(stats, restrictedUids);
+        }
+    }
+
+    /**
+     * Callback to calculate applications network stats.
+     */
+    private class AppsNetworkStatsResult implements LoaderManager.LoaderCallbacks<NetworkStats> {
+        @Override
+        public Loader<NetworkStats> onCreateLoader(int id, Bundle args) {
+            return new SummaryForAllUidLoader(mContext, mStatsSession, args);
+        }
+
+        @Override
+        public void onLoadFinished(Loader<NetworkStats> loader, NetworkStats data) {
+            int[] restrictedUids = mNetworkPolicyManager.getUidsWithPolicy(
+                    POLICY_REJECT_METERED_BACKGROUND);
+            onAppsNetworkStatsLoaded(data, restrictedUids);
+        }
+
+        @Override
+        public void onLoaderReset(Loader<NetworkStats> loader) {
+            onAppsNetworkStatsLoaded(/* stats= */ null, /* restrictedUids= */ new int[0]);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceController.java b/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceController.java
new file mode 100644
index 0000000..9d0f96a
--- /dev/null
+++ b/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceController.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.text.format.Time;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Preference which opens a {@link UsageCycleResetDayOfMonthPickerDialog} in order to pick the date
+ * on which the data warning/limit cycle should end.
+ */
+public class CycleResetDayOfMonthPickerPreferenceController extends
+        DataWarningAndLimitBasePreferenceController<Preference> implements
+        UsageCycleResetDayOfMonthPickerDialog.ResetDayOfMonthPickedListener {
+
+    private static final String CYCLE_PICKER_DIALOG_TAG = "cycle_picker_dialog_tag";
+
+    public CycleResetDayOfMonthPickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        UsageCycleResetDayOfMonthPickerDialog dialog =
+                (UsageCycleResetDayOfMonthPickerDialog) getFragmentController().findDialogByTag(
+                        CYCLE_PICKER_DIALOG_TAG);
+        if (dialog != null) {
+            dialog.setResetDayOfMonthPickedListener(/* listener= */ this);
+        }
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+
+        UsageCycleResetDayOfMonthPickerDialog dialog =
+                UsageCycleResetDayOfMonthPickerDialog.newInstance(
+                        getNetworkPolicyEditor().getPolicyCycleDay(getNetworkTemplate()));
+        dialog.setResetDayOfMonthPickedListener(/* listener= */ this);
+        getFragmentController().showDialog(dialog, CYCLE_PICKER_DIALOG_TAG);
+        return true;
+    }
+
+    @Override
+    public void onDayOfMonthPicked(int dayOfMonth) {
+        getNetworkPolicyEditor().setPolicyCycleDay(getNetworkTemplate(), dayOfMonth,
+                new Time().timezone);
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataLimitPreferenceController.java b/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
new file mode 100644
index 0000000..c0f208b
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataLimitPreferenceController.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.NetworkPolicy.LIMIT_DISABLED;
+import static android.net.NetworkPolicy.WARNING_DISABLED;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.datausage.UsageBytesThresholdPickerDialog.BytesThresholdPickedListener;
+
+/** Controls setting the data limit threshold. */
+public class DataLimitPreferenceController extends
+        DataWarningAndLimitBasePreferenceController<PreferenceGroup> implements
+        Preference.OnPreferenceChangeListener, ConfirmationDialogFragment.ConfirmListener,
+        Preference.OnPreferenceClickListener {
+
+    @VisibleForTesting
+    static final float LIMIT_BYTES_MULTIPLIER = 1.2f;
+    private static final long GIB_IN_BYTES = 1024 * 1024 * 1024;
+
+    private final BytesThresholdPickedListener mThresholdPickedListener = numBytes -> {
+        getNetworkPolicyEditor().setPolicyLimitBytes(getNetworkTemplate(), numBytes);
+        refreshUi();
+    };
+
+    private TwoStatePreference mEnableDataLimitPreference;
+    private Preference mSetDataLimitPreference;
+
+    public DataLimitPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mEnableDataLimitPreference = (TwoStatePreference) getPreference().findPreference(
+                getContext().getString(R.string.pk_data_set_limit));
+        mEnableDataLimitPreference.setOnPreferenceChangeListener(this);
+        mSetDataLimitPreference = getPreference().findPreference(
+                getContext().getString(R.string.pk_data_limit));
+        mSetDataLimitPreference.setOnPreferenceClickListener(this);
+
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG),
+                /* confirmListener= */ this,
+                /* rejectListener= */ null);
+
+        UsageBytesThresholdPickerDialog dialog =
+                (UsageBytesThresholdPickerDialog) getFragmentController().findDialogByTag(
+                        UsageBytesThresholdPickerDialog.TAG);
+        if (dialog != null) {
+            dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
+        }
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        long limitBytes = getNetworkPolicyEditor().getPolicyLimitBytes(getNetworkTemplate());
+
+        if (limitBytes == LIMIT_DISABLED) {
+            mEnableDataLimitPreference.setChecked(false);
+            mSetDataLimitPreference.setSummary(null);
+        } else {
+            mEnableDataLimitPreference.setChecked(true);
+            mSetDataLimitPreference.setSummary(
+                    DataUsageUtils.bytesToIecUnits(getContext(), limitBytes));
+        }
+        mSetDataLimitPreference.setEnabled(mEnableDataLimitPreference.isChecked());
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean enabled = (Boolean) newValue;
+        if (!enabled) {
+            getNetworkPolicyEditor().setPolicyLimitBytes(getNetworkTemplate(), LIMIT_DISABLED);
+            refreshUi();
+            return true;
+        }
+
+        ConfirmationDialogFragment dialogFragment =
+                new ConfirmationDialogFragment.Builder(getContext())
+                        .setTitle(R.string.data_usage_limit_dialog_title)
+                        .setMessage(R.string.data_usage_limit_dialog_mobile)
+                        .setPositiveButton(android.R.string.ok, this)
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .build();
+        getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
+
+        // This preference is enabled / disabled by ConfirmationDialogFragment.
+        return false;
+    }
+
+    @Override
+    public void onConfirm(@Nullable Bundle arguments) {
+        long warningBytes = getNetworkPolicyEditor().getPolicyWarningBytes(getNetworkTemplate());
+        long minLimitBytes = 0;
+        if (warningBytes != WARNING_DISABLED) {
+            minLimitBytes = (long) (warningBytes * LIMIT_BYTES_MULTIPLIER);
+        }
+
+        long limitBytes = Math.max(5 * GIB_IN_BYTES, minLimitBytes);
+
+        getNetworkPolicyEditor().setPolicyLimitBytes(getNetworkTemplate(), limitBytes);
+        refreshUi();
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+                R.string.data_usage_limit_editor_title,
+                getNetworkPolicyEditor().getPolicyLimitBytes(getNetworkTemplate()));
+        dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
+        getFragmentController().showDialog(dialog, UsageBytesThresholdPickerDialog.TAG);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageEntryPreferenceController.java b/src/com/android/car/settings/datausage/DataUsageEntryPreferenceController.java
new file mode 100644
index 0000000..be74b3c
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageEntryPreferenceController.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.network.NetworkUtils;
+
+/** Preference controller which shows how much data has been used so far. */
+public class DataUsageEntryPreferenceController extends PreferenceController<Preference> {
+
+    public DataUsageEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!NetworkUtils.hasMobileNetwork(
+                getContext().getSystemService(ConnectivityManager.class))) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        return AVAILABLE;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(formatUsedData());
+    }
+
+    private CharSequence formatUsedData() {
+        SubscriptionManager subscriptionManager = getContext().getSystemService(
+                SubscriptionManager.class);
+        int defaultSubId = subscriptionManager.getDefaultSubscriptionId();
+        if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            return null;
+        }
+        SubscriptionPlan defaultPlan = DataUsageUtils.getPrimaryPlan(subscriptionManager,
+                defaultSubId);
+        if (defaultPlan == null) {
+            return null;
+        }
+
+        return DataUsageUtils.bytesToIecUnits(getContext(), defaultPlan.getDataUsageBytes());
+    }
+
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageFragment.java b/src/com/android/car/settings/datausage/DataUsageFragment.java
new file mode 100644
index 0000000..7eaf80f
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Data usage settings homepage. */
+public class DataUsageFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.data_usage_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsagePreferenceController.java b/src/com/android/car/settings/datausage/DataUsagePreferenceController.java
new file mode 100644
index 0000000..b0febdd
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsagePreferenceController.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.telephony.SubscriptionManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller to handle the business logic for AppDataUsage preference on the data usage screen
+ */
+public class DataUsagePreferenceController extends PreferenceController<Preference> {
+
+    private int mSubId = Integer.MIN_VALUE;
+
+    private SubscriptionManager mSubscriptionManager;
+
+    public DataUsagePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        int subId = mSubId != Integer.MIN_VALUE ? mSubId : getDefaultSubId();
+        AppDataUsageFragment appDataUsageFragment = AppDataUsageFragment.newInstance(subId);
+        getFragmentController().launchFragment(appDataUsageFragment);
+        return true;
+    }
+
+    /**
+     * Sets the subId for which data usage will be loaded. If this is not set then default subId
+     * will be used to load data.
+     */
+    public void setSubId(int subId) {
+        mSubId = subId;
+    }
+
+    private int getDefaultSubId() {
+        return DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager);
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/car/settings/datausage/DataUsageSummaryPreference.java
new file mode 100644
index 0000000..79f2952
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageSummaryPreference.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.content.Intent;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.StyleRes;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ProgressBarPreference;
+
+/** Extends {@link ProgressBarPreference} in order to support multiple text fields. */
+public class DataUsageSummaryPreference extends ProgressBarPreference {
+
+    private CharSequence mDataLimitText;
+    private CharSequence mRemainingBillingCycleText;
+    private CharSequence mCarrierInfoText;
+    private Intent mManageSubscriptionIntent;
+    @StyleRes
+    private int mCarrierInfoTextStyle = R.style.DataUsageSummaryCarrierInfoTextAppearance;
+
+    public DataUsageSummaryPreference(Context context, AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init();
+    }
+
+    public DataUsageSummaryPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    public DataUsageSummaryPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public DataUsageSummaryPreference(Context context) {
+        super(context);
+        init();
+    }
+
+    private void init() {
+        setLayoutResource(R.layout.data_usage_summary_preference);
+    }
+
+    /** Sets the data limit text. */
+    public void setDataLimitText(CharSequence text) {
+        if (!TextUtils.equals(mDataLimitText, text)) {
+            mDataLimitText = text;
+            notifyChanged();
+        }
+    }
+
+    /** Gets the data limit text. */
+    public CharSequence getDataLimitText() {
+        return mDataLimitText;
+    }
+
+    /** Sets the remaining billing cycle description. */
+    public void setRemainingBillingCycleText(CharSequence text) {
+        if (!TextUtils.equals(mRemainingBillingCycleText, text)) {
+            mRemainingBillingCycleText = text;
+            notifyChanged();
+        }
+    }
+
+    /** Gets the remaining billing cycle description. */
+    public CharSequence getRemainingBillingCycleText() {
+        return mRemainingBillingCycleText;
+    }
+
+    /** Sets the carrier info text. */
+    public void setCarrierInfoText(CharSequence text) {
+        if (!TextUtils.equals(mCarrierInfoText, text)) {
+            mCarrierInfoText = text;
+            notifyChanged();
+        }
+    }
+
+    /** Gets the carrier info text. */
+    public CharSequence getCarrierInfoText() {
+        return mCarrierInfoText;
+    }
+
+    /** Sets the carrier info text style. */
+    public void setCarrierInfoTextStyle(@StyleRes int styleId) {
+        if (mCarrierInfoTextStyle != styleId) {
+            mCarrierInfoTextStyle = styleId;
+            notifyChanged();
+        }
+    }
+
+    /** Gets the carrier info text style. */
+    @StyleRes
+    public int getCarrierInfoTextStyle() {
+        return mCarrierInfoTextStyle;
+    }
+
+    /** Sets the manage subscription intent. */
+    public void setManageSubscriptionIntent(Intent intent) {
+        mManageSubscriptionIntent = intent;
+        notifyChanged();
+    }
+
+    /** Gets the manage subscription intent. */
+    public Intent getManageSubscriptionIntent() {
+        return mManageSubscriptionIntent;
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+
+        setTextAndVisibility((TextView) view.findViewById(R.id.data_limit_text), mDataLimitText);
+        setTextAndVisibility((TextView) view.findViewById(R.id.remaining_billing_cycle_time_text),
+                mRemainingBillingCycleText);
+        TextView carrierInfo = (TextView) view.findViewById(R.id.carrier_info_text);
+        setTextAndVisibility(carrierInfo, mCarrierInfoText);
+        carrierInfo.setTextAppearance(mCarrierInfoTextStyle);
+
+        Button button = (Button) view.findViewById(R.id.manage_subscription_button);
+        if (mManageSubscriptionIntent != null) {
+            button.setVisibility(View.VISIBLE);
+            button.setOnClickListener(v -> getContext().startActivity(mManageSubscriptionIntent));
+        } else {
+            button.setVisibility(View.GONE);
+        }
+    }
+
+    private void setTextAndVisibility(TextView textView, CharSequence value) {
+        if (!TextUtils.isEmpty(value)) {
+            textView.setText(value);
+            textView.setVisibility(View.VISIBLE);
+        } else {
+            textView.setVisibility(View.GONE);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
new file mode 100644
index 0000000..aff3089
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkTemplate;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.telephony.TelephonyManager;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.format.Formatter;
+import android.text.style.AbsoluteSizeSpan;
+import android.util.RecurrenceRule;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.network.NetworkUtils;
+import com.android.settingslib.net.DataUsageController;
+import com.android.settingslib.utils.StringUtil;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Business logic for setting the {@link DataUsageSummaryPreference} with the current data usage and
+ * the appropriate summary text.
+ */
+public class DataUsageSummaryPreferenceController extends
+        PreferenceController<DataUsageSummaryPreference> {
+
+    private static final long MILLIS_IN_A_DAY = TimeUnit.DAYS.toMillis(1);
+    private static final long MILLIS_IN_AN_HOUR = TimeUnit.HOURS.toMillis(1);
+    private static final long MILLIS_IN_A_MINUTE = TimeUnit.MINUTES.toMillis(1);
+    private static final long MILLIS_IN_A_SECOND = TimeUnit.SECONDS.toMillis(1);
+    private static final int MAX_PROGRESS_BAR_VALUE = 1000;
+
+    @VisibleForTesting
+    static final long WARNING_AGE = TimeUnit.HOURS.toMillis(6L);
+
+    private final SubscriptionManager mSubscriptionManager;
+    private final TelephonyManager mTelephonyManager;
+    private final DataUsageController mDataUsageController;
+    private final NetworkTemplate mDefaultTemplate;
+
+    /** Name of the carrier, or null if not available */
+    @Nullable
+    private CharSequence mCarrierName;
+    /** The number of registered plans, [0,N] */
+    private int mDataplanCount;
+    /** The time of the last update in milliseconds since the epoch, or -1 if unknown */
+    private long mSnapshotTime;
+    /** The size of the first registered plan if one exists. -1 if no information is available. */
+    private long mDataplanSize = -1;
+    /**
+     * Limit to track. Size of the first registered plan if one exists. Otherwise size of data limit
+     * or warning.
+     */
+    private long mDataplanTrackingThreshold;
+    /** The number of bytes used since the start of the cycle. */
+    private long mDataplanUse;
+    /** The ending time of the billing cycle in ms since the epoch */
+    private long mCycleEnd;
+    private Intent mManageSubscriptionIntent;
+
+    public DataUsageSummaryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+        mTelephonyManager = context.getSystemService(TelephonyManager.class);
+        mDataUsageController = new DataUsageController(context);
+
+        int defaultSubId = DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager);
+        mDefaultTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager, defaultSubId);
+    }
+
+    @Override
+    protected Class<DataUsageSummaryPreference> getPreferenceType() {
+        return DataUsageSummaryPreference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return NetworkUtils.hasSim(mTelephonyManager) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        getPreference().setMin(0);
+        getPreference().setMax(MAX_PROGRESS_BAR_VALUE);
+    }
+
+    @Override
+    protected void updateState(DataUsageSummaryPreference preference) {
+        DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
+                mDefaultTemplate);
+
+        if (mSubscriptionManager != null) {
+            refreshDataplanInfo(info);
+        }
+
+        preference.setTitle(getUsageText());
+        preference.setManageSubscriptionIntent(mManageSubscriptionIntent);
+
+        preference.setDataLimitText(getLimitText(info));
+        preference.setRemainingBillingCycleText(getRemainingBillingCycleTimeText());
+
+        // Carrier Info has special styling based on when it was last updated.
+        preference.setCarrierInfoText(getCarrierInfoText());
+        long updateAgeMillis = calculateTruncatedUpdateAge(mSnapshotTime);
+        if (updateAgeMillis <= WARNING_AGE) {
+            preference.setCarrierInfoTextStyle(R.style.DataUsageSummaryCarrierInfoTextAppearance);
+        } else {
+            preference.setCarrierInfoTextStyle(
+                    R.style.DataUsageSummaryCarrierInfoWarningTextAppearance);
+        }
+
+        // Set the progress bar values.
+        preference.setMinLabel(DataUsageUtils.bytesToIecUnits(getContext(), /* byteValue= */ 0));
+        preference.setMaxLabel(
+                DataUsageUtils.bytesToIecUnits(getContext(), mDataplanTrackingThreshold));
+        preference.setProgress(scaleUsage(mDataplanUse, mDataplanTrackingThreshold));
+    }
+
+    private CharSequence getUsageText() {
+        Formatter.BytesResult usedResult = Formatter.formatBytes(getContext().getResources(),
+                mDataplanUse, Formatter.FLAG_CALCULATE_ROUNDED | Formatter.FLAG_IEC_UNITS);
+        SpannableString usageNumberText = new SpannableString(usedResult.value);
+        int textSize = getContext().getResources().getDimensionPixelSize(
+                R.dimen.usage_number_text_size);
+
+        // Set the usage text (only the number) to the size defined by usage_number_text_size.
+        usageNumberText.setSpan(new AbsoluteSizeSpan(textSize), /* start= */ 0,
+                usageNumberText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+        CharSequence template = getContext().getText(R.string.data_used_formatted);
+        CharSequence usageText = TextUtils.expandTemplate(template, usageNumberText,
+                usedResult.units);
+        return usageText;
+    }
+
+
+    private CharSequence getLimitText(DataUsageController.DataUsageInfo info) {
+        if (info.warningLevel > 0 && info.limitLevel > 0) {
+            return TextUtils.expandTemplate(
+                    getContext().getText(R.string.cell_data_warning_and_limit),
+                    DataUsageUtils.bytesToIecUnits(getContext(), info.warningLevel),
+                    DataUsageUtils.bytesToIecUnits(getContext(), info.limitLevel));
+        } else if (info.warningLevel > 0) {
+            return TextUtils.expandTemplate(getContext().getText(R.string.cell_data_warning),
+                    DataUsageUtils.bytesToIecUnits(getContext(), info.warningLevel));
+        } else if (info.limitLevel > 0) {
+            return TextUtils.expandTemplate(getContext().getText(R.string.cell_data_limit),
+                    DataUsageUtils.bytesToIecUnits(getContext(), info.limitLevel));
+        }
+
+        return null;
+    }
+
+    private CharSequence getRemainingBillingCycleTimeText() {
+        long millisLeft = mCycleEnd - System.currentTimeMillis();
+        if (millisLeft <= 0) {
+            return getContext().getString(R.string.billing_cycle_none_left);
+        } else {
+            int daysLeft = (int) (millisLeft / MILLIS_IN_A_DAY);
+            return daysLeft < 1
+                    ? getContext().getString(R.string.billing_cycle_less_than_one_day_left)
+                    : getContext().getResources().getQuantityString(
+                            R.plurals.billing_cycle_days_left, daysLeft, daysLeft);
+        }
+    }
+
+    private CharSequence getCarrierInfoText() {
+        if (mDataplanCount > 0 && mSnapshotTime >= 0L) {
+            long updateAgeMillis = calculateTruncatedUpdateAge(mSnapshotTime);
+
+            int textResourceId;
+            CharSequence updateTime = null;
+            if (updateAgeMillis == 0) {
+                if (mCarrierName != null) {
+                    textResourceId = R.string.carrier_and_update_now_text;
+                } else {
+                    textResourceId = R.string.no_carrier_update_now_text;
+                }
+            } else {
+                if (mCarrierName != null) {
+                    textResourceId = R.string.carrier_and_update_text;
+                } else {
+                    textResourceId = R.string.no_carrier_update_text;
+                }
+                updateTime = StringUtil.formatElapsedTime(getContext(),
+                        updateAgeMillis, /* withSeconds= */ false);
+            }
+            return TextUtils.expandTemplate(getContext().getText(textResourceId), mCarrierName,
+                    updateTime);
+        }
+
+        return null;
+    }
+
+    private void refreshDataplanInfo(DataUsageController.DataUsageInfo info) {
+        // Reset data before overwriting.
+        mCarrierName = null;
+        mDataplanCount = 0;
+        mSnapshotTime = -1L;
+        mDataplanSize = -1L;
+        mDataplanTrackingThreshold = getSummaryLimit(info);
+        mDataplanUse = info.usageLevel;
+        mCycleEnd = info.cycleEnd;
+
+        int defaultSubId = SubscriptionManager.getDefaultSubscriptionId();
+        SubscriptionInfo subInfo = mSubscriptionManager.getDefaultDataSubscriptionInfo();
+        if (subInfo != null) {
+            mCarrierName = subInfo.getCarrierName();
+            List<SubscriptionPlan> plans = mSubscriptionManager.getSubscriptionPlans(defaultSubId);
+            SubscriptionPlan primaryPlan = DataUsageUtils.getPrimaryPlan(mSubscriptionManager,
+                    defaultSubId);
+            if (primaryPlan != null) {
+                mDataplanCount = plans.size();
+                mDataplanSize = primaryPlan.getDataLimitBytes();
+                if (mDataplanSize == SubscriptionPlan.BYTES_UNLIMITED) {
+                    mDataplanSize = -1L;
+                }
+                mDataplanTrackingThreshold = mDataplanSize;
+                mDataplanUse = primaryPlan.getDataUsageBytes();
+
+                RecurrenceRule rule = primaryPlan.getCycleRule();
+                if (rule != null && rule.start != null && rule.end != null) {
+                    mCycleEnd = rule.end.toEpochSecond() * MILLIS_IN_A_SECOND;
+                }
+                mSnapshotTime = primaryPlan.getDataUsageTime();
+            }
+        }
+        mManageSubscriptionIntent = mSubscriptionManager.createManageSubscriptionIntent(
+                defaultSubId);
+    }
+
+    /** Scales the current usage to be an integer between 0 and {@link #MAX_PROGRESS_BAR_VALUE}. */
+    private int scaleUsage(long usage, long maxUsage) {
+        if (maxUsage == 0) {
+            return 0;
+        }
+        return (int) ((usage / (float) maxUsage) * MAX_PROGRESS_BAR_VALUE);
+    }
+
+    /**
+     * Gets the max displayed limit based on {@link DataUsageController.DataUsageInfo}.
+     *
+     * @return the most appropriate limit for the data usage summary. Use the total usage when it
+     * is higher than the limit and warning level. Use the limit when it is set and less than usage.
+     * Otherwise use warning level.
+     */
+    private static long getSummaryLimit(DataUsageController.DataUsageInfo info) {
+        long limit = info.limitLevel;
+        if (limit <= 0) {
+            limit = info.warningLevel;
+        }
+        if (info.usageLevel > limit) {
+            limit = info.usageLevel;
+        }
+        return limit;
+    }
+
+    /**
+     * Returns the time since the last carrier update, as defined by {@link #mSnapshotTime},
+     * truncated to the nearest day / hour / minute in milliseconds, or 0 if less than 1 min.
+     */
+    private long calculateTruncatedUpdateAge(long snapshotTime) {
+        long updateAgeMillis = System.currentTimeMillis() - snapshotTime;
+
+        // Round to nearest whole unit
+        if (updateAgeMillis >= MILLIS_IN_A_DAY) {
+            return (updateAgeMillis / MILLIS_IN_A_DAY) * MILLIS_IN_A_DAY;
+        } else if (updateAgeMillis >= MILLIS_IN_AN_HOUR) {
+            return (updateAgeMillis / MILLIS_IN_AN_HOUR) * MILLIS_IN_AN_HOUR;
+        } else if (updateAgeMillis >= MILLIS_IN_A_MINUTE) {
+            return (updateAgeMillis / MILLIS_IN_A_MINUTE) * MILLIS_IN_A_MINUTE;
+        } else {
+            return 0;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataUsageUtils.java b/src/com/android/car/settings/datausage/DataUsageUtils.java
new file mode 100644
index 0000000..ea85ccb
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataUsageUtils.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.telephony.TelephonyManager;
+import android.text.BidiFormatter;
+import android.text.format.Formatter;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.internal.util.CollectionUtils;
+
+import java.util.List;
+
+/** Provides helpful utilities related to data usage. */
+public final class DataUsageUtils {
+
+    @VisibleForTesting
+    static final long PETA = 1000000000000000L;
+
+    private DataUsageUtils() {
+    }
+
+    /**
+     * Returns the mobile network template given the subscription id.
+     */
+    public static NetworkTemplate getMobileNetworkTemplate(TelephonyManager telephonyManager,
+            int subscriptionId) {
+        NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll(
+                telephonyManager.getSubscriberId(subscriptionId));
+        return NetworkTemplate.normalize(mobileAll, telephonyManager.getMergedSubscriberIds());
+    }
+
+    /**
+     * Returns the default subscription if available else returns
+     * {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}.
+     */
+    public static int getDefaultSubscriptionId(SubscriptionManager subscriptionManager) {
+        if (subscriptionManager == null) {
+            return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        }
+        SubscriptionInfo subscriptionInfo = subscriptionManager.getDefaultDataSubscriptionInfo();
+        if (subscriptionInfo == null) {
+            List<SubscriptionInfo> list = subscriptionManager.getAllSubscriptionInfoList();
+            if (list.size() == 0) {
+                return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+            }
+            subscriptionInfo = list.get(0);
+        }
+        return subscriptionInfo.getSubscriptionId();
+    }
+
+    /**
+     * Format byte value to readable string using IEC units.
+     */
+    public static CharSequence bytesToIecUnits(Context context, long byteValue) {
+        Formatter.BytesResult res = Formatter.formatBytes(context.getResources(), byteValue,
+                Formatter.FLAG_IEC_UNITS);
+        return BidiFormatter.getInstance().unicodeWrap(context.getString(
+                com.android.internal.R.string.fileSizeSuffix, res.value, res.units));
+    }
+
+    /**
+     * Returns the primary subscription plan. Returns {@code null} if {@link SubscriptionPlan}
+     * doesn't exist for a given subscriptionId or if the first {@link SubscriptionPlan} has
+     * invalid properties.
+     */
+    @Nullable
+    public static SubscriptionPlan getPrimaryPlan(SubscriptionManager subManager,
+            int subscriptionId) {
+        List<SubscriptionPlan> plans = subManager.getSubscriptionPlans(subscriptionId);
+        if (CollectionUtils.isEmpty(plans)) {
+            return null;
+        }
+        // First plan in the list is the primary plan
+        SubscriptionPlan plan = plans.get(0);
+        return plan.getDataLimitBytes() > 0
+                && saneSize(plan.getDataUsageBytes())
+                && plan.getCycleRule() != null ? plan : null;
+    }
+
+    private static boolean saneSize(long value) {
+        return value >= 0L && value < PETA;
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataWarningAndLimitActivity.java b/src/com/android/car/settings/datausage/DataWarningAndLimitActivity.java
new file mode 100644
index 0000000..5f0aef2
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataWarningAndLimitActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/** Separate activity to enter the data warning and limit settings via activity name. */
+public class DataWarningAndLimitActivity extends BaseCarSettingsActivity {
+
+    @Nullable
+    @Override
+    protected Fragment getInitialFragment() {
+        NetworkTemplate template = getIntent().getParcelableExtra(
+                NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE);
+        return DataWarningAndLimitFragment.newInstance(template);
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataWarningAndLimitBasePreferenceController.java b/src/com/android/car/settings/datausage/DataWarningAndLimitBasePreferenceController.java
new file mode 100644
index 0000000..b8315b8
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataWarningAndLimitBasePreferenceController.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.NetworkPolicyEditor;
+
+/**
+ * Defines the shared getters and setters used by {@link PreferenceController} implementations
+ * related to data usage warning and limit.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ *            expects to operate.
+ */
+public abstract class DataWarningAndLimitBasePreferenceController<V extends Preference> extends
+        PreferenceController<V> {
+
+    private NetworkPolicyEditor mNetworkPolicyEditor;
+    private NetworkTemplate mNetworkTemplate;
+
+    public DataWarningAndLimitBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /** Gets the {@link NetworkPolicyEditor}. */
+    public NetworkPolicyEditor getNetworkPolicyEditor() {
+        return mNetworkPolicyEditor;
+    }
+
+    /** Sets the {@link NetworkPolicyEditor}. */
+    public void setNetworkPolicyEditor(NetworkPolicyEditor networkPolicyEditor) {
+        mNetworkPolicyEditor = networkPolicyEditor;
+    }
+
+    /** Gets the {@link NetworkTemplate}. */
+    public NetworkTemplate getNetworkTemplate() {
+        return mNetworkTemplate;
+    }
+
+    /** Sets the {@link NetworkTemplate}. */
+    public void setNetworkTemplate(NetworkTemplate networkTemplate) {
+        mNetworkTemplate = networkTemplate;
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataWarningAndLimitFragment.java b/src/com/android/car/settings/datausage/DataWarningAndLimitFragment.java
new file mode 100644
index 0000000..c8b172a
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataWarningAndLimitFragment.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.NetworkPolicyEditor;
+
+import java.util.Arrays;
+import java.util.List;
+
+/** Screen to set data warning and limit thresholds. */
+public class DataWarningAndLimitFragment extends SettingsFragment {
+
+    private TelephonyManager mTelephonyManager;
+    private SubscriptionManager mSubscriptionManager;
+    private NetworkPolicyEditor mPolicyEditor;
+    private NetworkTemplate mNetworkTemplate;
+
+    /**
+     * Creates a new instance of {@link DataWarningAndLimitFragment} with the given template. If the
+     * template is {@code null}, the fragment will use the default data network template.
+     */
+    public static DataWarningAndLimitFragment newInstance(@Nullable NetworkTemplate template) {
+        DataWarningAndLimitFragment fragment = new DataWarningAndLimitFragment();
+        Bundle args = new Bundle();
+        args.putParcelable(NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE, template);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.data_warning_and_limit_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mPolicyEditor = new NetworkPolicyEditor(NetworkPolicyManager.from(context));
+        mNetworkTemplate = getArguments().getParcelable(
+                NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE);
+        if (mNetworkTemplate == null) {
+            mTelephonyManager = context.getSystemService(TelephonyManager.class);
+            mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+            mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(mTelephonyManager,
+                    DataUsageUtils.getDefaultSubscriptionId(mSubscriptionManager));
+        }
+
+        // Loads the current policies to the policy editor cache.
+        mPolicyEditor.read();
+
+        List<DataWarningAndLimitBasePreferenceController> preferenceControllers =
+                Arrays.asList(
+                        use(CycleResetDayOfMonthPickerPreferenceController.class,
+                                R.string.pk_data_usage_cycle),
+                        use(DataWarningPreferenceController.class, R.string.pk_data_warning_group),
+                        use(DataLimitPreferenceController.class, R.string.pk_data_limit_group));
+
+        for (DataWarningAndLimitBasePreferenceController preferenceController :
+                preferenceControllers) {
+            preferenceController.setNetworkPolicyEditor(mPolicyEditor);
+            preferenceController.setNetworkTemplate(mNetworkTemplate);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/datausage/DataWarningPreferenceController.java b/src/com/android/car/settings/datausage/DataWarningPreferenceController.java
new file mode 100644
index 0000000..b16857a
--- /dev/null
+++ b/src/com/android/car/settings/datausage/DataWarningPreferenceController.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.NetworkPolicy.WARNING_DISABLED;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.datausage.UsageBytesThresholdPickerDialog.BytesThresholdPickedListener;
+import com.android.settingslib.net.DataUsageController;
+
+/** Controls setting the data warning threshold. */
+public class DataWarningPreferenceController extends
+        DataWarningAndLimitBasePreferenceController<PreferenceGroup> implements
+        Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
+
+    private final DataUsageController mDataUsageController;
+    private final BytesThresholdPickedListener mThresholdPickedListener = numBytes -> {
+        getNetworkPolicyEditor().setPolicyWarningBytes(getNetworkTemplate(), numBytes);
+        refreshUi();
+    };
+
+    private TwoStatePreference mEnableDataWarningPreference;
+    private Preference mSetDataWarningPreference;
+
+    public DataWarningPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mDataUsageController = new DataUsageController(getContext());
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mEnableDataWarningPreference = (TwoStatePreference) getPreference().findPreference(
+                getContext().getString(R.string.pk_data_set_warning));
+        mEnableDataWarningPreference.setOnPreferenceChangeListener(this);
+        mSetDataWarningPreference = getPreference().findPreference(
+                getContext().getString(R.string.pk_data_warning));
+        mSetDataWarningPreference.setOnPreferenceClickListener(this);
+
+        UsageBytesThresholdPickerDialog dialog =
+                (UsageBytesThresholdPickerDialog) getFragmentController().findDialogByTag(
+                        UsageBytesThresholdPickerDialog.TAG);
+        if (dialog != null) {
+            dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
+        }
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        long warningBytes = getNetworkPolicyEditor().getPolicyWarningBytes(getNetworkTemplate());
+        if (warningBytes == WARNING_DISABLED) {
+            mSetDataWarningPreference.setSummary(null);
+            mEnableDataWarningPreference.setChecked(false);
+        } else {
+            mSetDataWarningPreference.setSummary(
+                    DataUsageUtils.bytesToIecUnits(getContext(), warningBytes));
+            mEnableDataWarningPreference.setChecked(true);
+        }
+
+        mSetDataWarningPreference.setEnabled(mEnableDataWarningPreference.isChecked());
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean enabled = (Boolean) newValue;
+        getNetworkPolicyEditor().setPolicyWarningBytes(getNetworkTemplate(),
+                enabled ? mDataUsageController.getDefaultWarningLevel() : WARNING_DISABLED);
+        refreshUi();
+        return true;
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+                R.string.data_usage_warning_editor_title,
+                getNetworkPolicyEditor().getPolicyWarningBytes(getNetworkTemplate()));
+        dialog.setBytesThresholdPickedListener(mThresholdPickedListener);
+        getFragmentController().showDialog(dialog, UsageBytesThresholdPickerDialog.TAG);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/datausage/SummaryForAllUidLoader.java b/src/com/android/car/settings/datausage/SummaryForAllUidLoader.java
new file mode 100644
index 0000000..f65a978
--- /dev/null
+++ b/src/com/android/car/settings/datausage/SummaryForAllUidLoader.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.content.Context;
+import android.net.INetworkStatsSession;
+import android.net.NetworkStats;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.os.RemoteException;
+
+import androidx.loader.content.AsyncTaskLoader;
+
+/**
+ * Fetches the network stats using the {@link INetworkStatsSession}.
+ *
+ * <p>Class is taken from {@link com.android.settingslib.net.SummaryForAllUidLoader}. The only
+ * difference is we are using {@link AsyncTaskLoader} instead of {@link
+ * android.content.AsyncTaskLoader}.
+ */
+public class SummaryForAllUidLoader extends AsyncTaskLoader<NetworkStats> {
+    private static final String KEY_TEMPLATE = "template";
+    private static final String KEY_START = "start";
+    private static final String KEY_END = "end";
+
+    private final INetworkStatsSession mSession;
+    private final Bundle mArgs;
+
+    /**
+     * Builds the bundle given the template, start and end.
+     */
+    public static Bundle buildArgs(NetworkTemplate template, long start, long end) {
+        Bundle args = new Bundle();
+        args.putParcelable(KEY_TEMPLATE, template);
+        args.putLong(KEY_START, start);
+        args.putLong(KEY_END, end);
+        return args;
+    }
+
+    public SummaryForAllUidLoader(Context context, INetworkStatsSession session, Bundle args) {
+        super(context);
+        mSession = session;
+        mArgs = args;
+    }
+
+    @Override
+    protected void onStartLoading() {
+        super.onStartLoading();
+        forceLoad();
+    }
+
+    @Override
+    public NetworkStats loadInBackground() {
+        NetworkTemplate template = mArgs.getParcelable(KEY_TEMPLATE);
+        long start = mArgs.getLong(KEY_START);
+        long end = mArgs.getLong(KEY_END);
+
+        try {
+            return mSession.getSummaryForAllUid(template, start, end, /* includeTags= */ false);
+        } catch (RemoteException e) {
+            return null;
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        super.onStopLoading();
+        cancelLoad();
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+        cancelLoad();
+    }
+}
diff --git a/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialog.java b/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialog.java
new file mode 100644
index 0000000..02169d4
--- /dev/null
+++ b/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialog.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.NumberPicker;
+
+import androidx.annotation.IntegerRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.DialogFragment;
+
+import com.android.car.settings.R;
+
+/** Dialog that is used to pick the data usage warning/limit threshold bytes. */
+public class UsageBytesThresholdPickerDialog extends DialogFragment implements
+        DialogInterface.OnClickListener {
+
+    /** Tag used to identify dialog in {@link androidx.fragment.app.FragmentManager}. */
+    public static final String TAG = "UsageBytesThresholdPickerDialog";
+    private static final String ARG_DIALOG_TITLE_RES = "arg_dialog_title_res";
+    private static final String ARG_CURRENT_THRESHOLD = "arg_current_threshold";
+    private static final float MB_GB_SUFFIX_THRESHOLD = 1.5f;
+
+    @VisibleForTesting
+    static final long MIB_IN_BYTES = 1024 * 1024;
+    @VisibleForTesting
+    static final long GIB_IN_BYTES = MIB_IN_BYTES * 1024;
+    @VisibleForTesting
+    static final long MAX_DATA_LIMIT_BYTES = 50000 * GIB_IN_BYTES;
+
+    // Number pickers can be used to pick strings as well.
+    private NumberPicker mBytesUnits;
+    private View mUpArrow;
+    private View mDownArrow;
+    private EditText mThresholdEditor;
+    private BytesThresholdPickedListener mBytesThresholdPickedListener;
+    private long mCurrentThreshold;
+
+    /**
+     * Creates a new instance of the {@link UsageBytesThresholdPickerDialog} with the
+     * {@code currentThreshold} represented with the best units available.
+     */
+    public static UsageBytesThresholdPickerDialog newInstance(@IntegerRes int dialogTitle,
+            long currentThreshold) {
+        UsageBytesThresholdPickerDialog dialog = new UsageBytesThresholdPickerDialog();
+        Bundle args = new Bundle();
+        args.putInt(ARG_DIALOG_TITLE_RES, dialogTitle);
+        args.putLong(ARG_CURRENT_THRESHOLD, currentThreshold);
+        dialog.setArguments(args);
+        return dialog;
+    }
+
+    /** Sets a {@link BytesThresholdPickedListener}. */
+    public void setBytesThresholdPickedListener(
+            BytesThresholdPickedListener bytesThresholdPickedListener) {
+        mBytesThresholdPickedListener = bytesThresholdPickedListener;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+
+        // Use builder context to keep consistent theme.
+        LayoutInflater inflater = LayoutInflater.from(builder.getContext());
+        View view = inflater.inflate(R.layout.usage_bytes_threshold_picker,
+                /* root= */ null, /* attachToRoot= */ false);
+
+        mCurrentThreshold = getArguments().getLong(ARG_CURRENT_THRESHOLD);
+        if (mCurrentThreshold < 0) {
+            mCurrentThreshold = 0;
+        }
+
+        String[] units = getContext().getResources().getStringArray(R.array.bytes_picker_sizes);
+        mBytesUnits = view.findViewById(R.id.bytes_units);
+        mBytesUnits.setMinValue(0);
+        mBytesUnits.setMaxValue(units.length - 1);
+        mBytesUnits.setDisplayedValues(units);
+
+        mThresholdEditor = view.findViewById(R.id.bytes_threshold);
+
+        mUpArrow = view.findViewById(R.id.up_arrow_container);
+        mUpArrow.setOnClickListener(v -> mBytesUnits.setValue(mBytesUnits.getValue() - 1));
+
+        mDownArrow = view.findViewById(R.id.down_arrow_container);
+        mDownArrow.setOnClickListener(v -> mBytesUnits.setValue(mBytesUnits.getValue() + 1));
+
+        updateCurrentView(mCurrentThreshold);
+
+        return builder
+                .setTitle(getArguments().getInt(ARG_DIALOG_TITLE_RES))
+                .setView(view)
+                .setPositiveButton(R.string.usage_bytes_threshold_picker_positive_button,
+                        /* onClickListener= */ this)
+                .create();
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (which == DialogInterface.BUTTON_POSITIVE) {
+            long newThreshold = getCurrentThreshold();
+            if (mBytesThresholdPickedListener != null
+                    && mCurrentThreshold != newThreshold) {
+                mBytesThresholdPickedListener.onThresholdPicked(newThreshold);
+            }
+        }
+    }
+
+    /** Gets the threshold currently represented by this {@link UsageBytesThresholdPickerDialog}. */
+    public long getCurrentThreshold() {
+        String bytesString = mThresholdEditor.getText().toString();
+        if (bytesString.isEmpty() || bytesString.equals(".")) {
+            bytesString = "0";
+        }
+
+        long bytes = (long) (Float.valueOf(bytesString) * (mBytesUnits.getValue() == 0
+                ? MIB_IN_BYTES : GIB_IN_BYTES));
+
+        // To fix the overflow problem.
+        long correctedBytes = Math.min(MAX_DATA_LIMIT_BYTES, bytes);
+
+        return correctedBytes;
+    }
+
+    @VisibleForTesting
+    void setThresholdEditor(long threshold) {
+        updateCurrentView(threshold);
+    }
+
+    private void updateCurrentView(long threshold) {
+        String bytesText;
+        if (threshold > MB_GB_SUFFIX_THRESHOLD * GIB_IN_BYTES) {
+            bytesText = formatText(threshold / (float) GIB_IN_BYTES);
+            mBytesUnits.setValue(1);
+        } else {
+            bytesText = formatText(threshold / (float) MIB_IN_BYTES);
+            mBytesUnits.setValue(0);
+        }
+        mThresholdEditor.setText(bytesText);
+        mThresholdEditor.setSelection(0, bytesText.length());
+    }
+
+    private String formatText(float v) {
+        v = Math.round(v * 100) / 100f;
+        return String.valueOf(v);
+    }
+
+    /** A listener that is called when a date is selected. */
+    public interface BytesThresholdPickedListener {
+        /** A method that determines how to process the selected day of month. */
+        void onThresholdPicked(long numBytes);
+    }
+}
diff --git a/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialog.java b/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialog.java
new file mode 100644
index 0000000..17b5ece
--- /dev/null
+++ b/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialog.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.NumberPicker;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.DialogFragment;
+
+import com.android.car.settings.R;
+
+/** Dialog that is used to pick the start day of month to track a data usage cycle. */
+public class UsageCycleResetDayOfMonthPickerDialog extends DialogFragment {
+
+    private static final String ARG_SELECTED_DAY_OF_MONTH = "arg_selected_day_of_month";
+
+    /**
+     * Defines the time frequency at which touch listener should be triggered when holding either
+     * arrow button.
+     */
+    @VisibleForTesting
+    static final int TIME_INTERVAL_MILLIS = 250;
+
+    private static final int MIN_DAY = 1;
+    private static final int MAX_DAY = 31;
+    private ResetDayOfMonthPickedListener mResetDayOfMonthPickedListener;
+    private NumberPicker mCycleDayOfMonthPicker;
+    private View mUpArrow;
+    private View mDownArrow;
+
+    /**
+     * Creates a new instance of the {@link UsageCycleResetDayOfMonthPickerDialog} with the {@link
+     * NumberPicker} set to showing the value {@code startDayOfMonth}.
+     */
+    public static UsageCycleResetDayOfMonthPickerDialog newInstance(int startDayOfMonth) {
+        UsageCycleResetDayOfMonthPickerDialog dialog = new UsageCycleResetDayOfMonthPickerDialog();
+        Bundle args = new Bundle();
+        args.putInt(ARG_SELECTED_DAY_OF_MONTH, startDayOfMonth);
+        dialog.setArguments(args);
+        return dialog;
+    }
+
+    /** Sets a {@link ResetDayOfMonthPickedListener}. */
+    public void setResetDayOfMonthPickedListener(
+            ResetDayOfMonthPickedListener resetDayOfMonthPickedListener) {
+        mResetDayOfMonthPickedListener = resetDayOfMonthPickedListener;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+
+        // Use builder context to keep consistent theme.
+        LayoutInflater inflater = LayoutInflater.from(builder.getContext());
+        View view = inflater.inflate(R.layout.usage_cycle_reset_day_of_month_picker,
+                /* root= */ null, /* attachToRoot= */ false);
+
+        int cycleDayOfMonth = getArguments().getInt(ARG_SELECTED_DAY_OF_MONTH);
+        if (cycleDayOfMonth < MIN_DAY) {
+            cycleDayOfMonth = MIN_DAY;
+        }
+        if (cycleDayOfMonth > MAX_DAY) {
+            cycleDayOfMonth = MAX_DAY;
+        }
+
+        mCycleDayOfMonthPicker = view.findViewById(R.id.cycle_reset_day_of_month);
+        mCycleDayOfMonthPicker.setMinValue(MIN_DAY);
+        mCycleDayOfMonthPicker.setMaxValue(MAX_DAY);
+        mCycleDayOfMonthPicker.setValue(cycleDayOfMonth);
+        mCycleDayOfMonthPicker.setWrapSelectorWheel(true);
+
+        mUpArrow = view.findViewById(R.id.up_arrow_container);
+        mUpArrow.setOnTouchListener(new CycleArrowTouchListener(
+                () -> mCycleDayOfMonthPicker.setValue(mCycleDayOfMonthPicker.getValue() - 1),
+                TIME_INTERVAL_MILLIS));
+
+        mDownArrow = view.findViewById(R.id.down_arrow_container);
+        mDownArrow.setOnTouchListener(new CycleArrowTouchListener(
+                () -> mCycleDayOfMonthPicker.setValue(mCycleDayOfMonthPicker.getValue() + 1),
+                TIME_INTERVAL_MILLIS));
+
+        return builder
+                .setTitle(R.string.cycle_reset_day_of_month_picker_title)
+                .setView(view)
+                .setPositiveButton(R.string.cycle_reset_day_of_month_picker_positive_button,
+                        (dialog, which) -> {
+                            if (which == DialogInterface.BUTTON_POSITIVE) {
+                                if (mResetDayOfMonthPickedListener != null) {
+                                    mResetDayOfMonthPickedListener.onDayOfMonthPicked(
+                                            mCycleDayOfMonthPicker.getValue());
+                                }
+                            }
+                        })
+                .create();
+    }
+
+    /** Gets the current day of month selected by the {@link NumberPicker}. */
+    public int getSelectedDayOfMonth() {
+        return mCycleDayOfMonthPicker.getValue();
+    }
+
+    /** A listener that is called when a date is selected. */
+    public interface ResetDayOfMonthPickedListener {
+        /** A method that determines how to process the selected day of month. */
+        void onDayOfMonthPicked(int dayOfMonth);
+    }
+
+    private static class CycleArrowTouchListener implements View.OnTouchListener {
+
+        private final IntervalActionListener mIntervalActionListener;
+        private final long mTimeIntervalMillis;
+
+        private Handler mHandler = new Handler();
+        private Runnable mAction;
+
+        CycleArrowTouchListener(IntervalActionListener listener, long timeIntervalMillis) {
+            mIntervalActionListener = listener;
+            mTimeIntervalMillis = timeIntervalMillis;
+
+            mAction = () -> {
+                mHandler.postDelayed(this.mAction, mTimeIntervalMillis);
+                maybeTriggerAction();
+            };
+        }
+
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            switch (event.getAction()) {
+                case MotionEvent.ACTION_DOWN:
+                    mHandler.removeCallbacks(mAction);
+                    mHandler.postDelayed(mAction, mTimeIntervalMillis);
+                    maybeTriggerAction();
+                    v.setPressed(true);
+                    return true;
+                case MotionEvent.ACTION_UP:
+                case MotionEvent.ACTION_CANCEL:
+                    mHandler.removeCallbacks(mAction);
+                    v.setPressed(false);
+                    return true;
+            }
+            return false;
+        }
+
+        private void maybeTriggerAction() {
+            if (mIntervalActionListener != null) {
+                mIntervalActionListener.takeAction();
+            }
+        }
+
+        /** Action that should be taken per time interval that the button is held. */
+        interface IntervalActionListener {
+            /** Defines the action to take at each time interval. */
+            void takeAction();
+        }
+    }
+}
diff --git a/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceController.java b/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceController.java
new file mode 100644
index 0000000..f311e6f
--- /dev/null
+++ b/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Business logic which controls the auto datetime toggle.
+ */
+public class AutoDatetimeTogglePreferenceController extends
+        PreferenceController<TwoStatePreference> {
+
+    public AutoDatetimeTogglePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(isEnabled());
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean isAutoDatetimeEnabled = (boolean) newValue;
+        Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.AUTO_TIME,
+                isAutoDatetimeEnabled ? 1 : 0);
+
+        getContext().sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        return true;
+    }
+
+    private boolean isEnabled() {
+        return Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.AUTO_TIME, 0) > 0;
+    }
+}
diff --git a/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceController.java b/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceController.java
new file mode 100644
index 0000000..2f001cf
--- /dev/null
+++ b/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Business logic for the toggle which chooses to use the network provided time zone.
+ */
+public class AutoTimeZoneTogglePreferenceController extends
+        PreferenceController<TwoStatePreference> {
+
+    public AutoTimeZoneTogglePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean isAutoTimezoneEnabled = (boolean) newValue;
+        Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.AUTO_TIME_ZONE,
+                isAutoTimezoneEnabled ? 1 : 0);
+
+        getContext().sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        return true;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(isEnabled());
+    }
+
+    private boolean isEnabled() {
+        return Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.AUTO_TIME_ZONE, 0) > 0;
+    }
+}
diff --git a/src/com/android/car/settings/datetime/DatePickerFragment.java b/src/com/android/car/settings/datetime/DatePickerFragment.java
index 4a2af00..67714c7 100644
--- a/src/com/android/car/settings/datetime/DatePickerFragment.java
+++ b/src/com/android/car/settings/datetime/DatePickerFragment.java
@@ -22,6 +22,9 @@
 import android.widget.Button;
 import android.widget.DatePicker;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
 
@@ -35,14 +38,22 @@
 
     private DatePicker mDatePicker;
 
-    public static DatePickerFragment getInstance() {
-        DatePickerFragment datePickerFragment = new DatePickerFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.date_picker_title);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.date_picker);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        datePickerFragment.setArguments(bundle);
-        return datePickerFragment;
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return R.layout.date_picker;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return R.string.date_picker_title;
     }
 
     @Override
diff --git a/src/com/android/car/settings/datetime/DatePickerPreferenceController.java b/src/com/android/car/settings/datetime/DatePickerPreferenceController.java
new file mode 100644
index 0000000..a4b193c
--- /dev/null
+++ b/src/com/android/car/settings/datetime/DatePickerPreferenceController.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.text.format.DateFormat;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.Calendar;
+
+/**
+ * Business logic for the preference which allows for picking the date.
+ */
+public class DatePickerPreferenceController extends PreferenceController<Preference> {
+
+    private final IntentFilter mIntentFilter;
+    private final BroadcastReceiver mTimeChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUi();
+        }
+    };
+
+    public DatePickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        // Listens to all three actions because they can all affect the date shown on the
+        // screen.
+        mIntentFilter = new IntentFilter();
+        mIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
+        mIntentFilter.addAction(Intent.ACTION_TIME_TICK);
+        mIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /** Starts the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStartInternal() {
+        getContext().registerReceiver(mTimeChangeReceiver, mIntentFilter);
+    }
+
+    /** Stops the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStopInternal() {
+        getContext().unregisterReceiver(mTimeChangeReceiver);
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        preference.setSummary(DateFormat.getLongDateFormat(getContext()).format(
+                Calendar.getInstance().getTime()));
+        preference.setEnabled(!autoDatetimeIsEnabled());
+    }
+
+    private boolean autoDatetimeIsEnabled() {
+        return Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.AUTO_TIME, 0) > 0;
+    }
+}
+
diff --git a/src/com/android/car/settings/datetime/DateTimeToggleLineItem.java b/src/com/android/car/settings/datetime/DateTimeToggleLineItem.java
deleted file mode 100644
index 3ade8f5..0000000
--- a/src/com/android/car/settings/datetime/DateTimeToggleLineItem.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.datetime;
-
-import android.content.Context;
-import android.content.Intent;
-import android.provider.Settings;
-
-import androidx.car.widget.TextListItem;
-
-/**
- * A LineItem that displays and sets system auto date/time.
- */
-class DateTimeToggleLineItem extends TextListItem
-        implements DatetimeSettingsFragment.ListRefreshObserver {
-    private Context mContext;
-    private final String mSettingString;
-
-    public DateTimeToggleLineItem(Context context, String title, String desc,
-            String settingString) {
-        super(context);
-        mContext = context;
-        mSettingString = settingString;
-        setTitle(title);
-        setBody(desc);
-        setSwitch(
-                isChecked(),
-                /* showDivider= */ false,
-                (button, isChecked) -> {
-                    Settings.Global.putInt(
-                            mContext.getContentResolver(),
-                            mSettingString,
-                            isChecked ? 1 : 0);
-                    mContext.sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
-                });
-    }
-
-    @Override
-    public void onPreRefresh() {
-        setSwitchState(isChecked());
-    }
-
-    private boolean isChecked() {
-        return Settings.Global.getInt(mContext.getContentResolver(), mSettingString, 0) > 0;
-    }
-}
diff --git a/src/com/android/car/settings/datetime/DatetimeSettingsFragment.java b/src/com/android/car/settings/datetime/DatetimeSettingsFragment.java
index 3d5cb97..265c127 100644
--- a/src/com/android/car/settings/datetime/DatetimeSettingsFragment.java
+++ b/src/com/android/car/settings/datetime/DatetimeSettingsFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -13,106 +13,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License
  */
+
 package com.android.car.settings.datetime;
 
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.provider.Settings;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.ListItemProvider.ListProvider;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Configures date and time.
  */
-public class DatetimeSettingsFragment extends ListItemSettingsFragment {
-    private static final IntentFilter TIME_CHANGED_FILTER =
-            new IntentFilter(Intent.ACTION_TIME_CHANGED);
-
+public class DatetimeSettingsFragment extends SettingsFragment {
     // Minimum time is Nov 5, 2007, 0:00.
     public static final long MIN_DATE = 1194220800000L;
 
-    private List<ListItem> mListItems;
-
-    private final TimeChangedBroadCastReceiver mTimeChangedBroadCastReceiver =
-            new TimeChangedBroadCastReceiver();
-
-    /**
-     * Observes list refreshes.
-     */
-    public interface ListRefreshObserver {
-
-        /**
-         * Gets called when the list is about to refresh. Subclass should set the view to ListItem
-         * state, so can be reflected on next fresh.
-         */
-        void onPreRefresh();
-    }
-
-    public static DatetimeSettingsFragment getInstance() {
-        DatetimeSettingsFragment datetimeSettingsFragment = new DatetimeSettingsFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.date_and_time_settings_title);
-        datetimeSettingsFragment.setArguments(bundle);
-        return datetimeSettingsFragment;
-    }
-
     @Override
-    public ListItemProvider getItemProvider() {
-        return new ListProvider(initializeListItems());
-    }
-
-    private List<ListItem> initializeListItems() {
-        mListItems = new ArrayList<>();
-        mListItems.add(new DateTimeToggleLineItem(getContext(),
-                getString(R.string.date_time_auto),
-                getString(R.string.date_time_auto_summary),
-                Settings.Global.AUTO_TIME));
-        mListItems.add(new DateTimeToggleLineItem(getContext(),
-                getString(R.string.zone_auto),
-                getString(R.string.zone_auto_summary),
-                Settings.Global.AUTO_TIME_ZONE));
-        mListItems.add(new SetDateLineItem(getContext(), getFragmentController()));
-        mListItems.add(new SetTimeLineItem(getContext(), getFragmentController()));
-        mListItems.add(new SetTimeZoneLineItem(getContext(), getFragmentController()));
-        mListItems.add(new TimeFormatToggleLineItem(getContext()));
-        return mListItems;
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        getActivity().registerReceiver(mTimeChangedBroadCastReceiver, TIME_CHANGED_FILTER);
-        refreshList();
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        getActivity().unregisterReceiver(mTimeChangedBroadCastReceiver);
-    }
-
-    private class TimeChangedBroadCastReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            for (ListItem listItem : mListItems) {
-                if (!(listItem instanceof ListRefreshObserver)) {
-                    throw new IllegalArgumentException(
-                            "all list items should be ListRefreshObserver");
-                }
-                ((ListRefreshObserver) listItem).onPreRefresh();
-            }
-            refreshList();
-        }
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.datetime_settings_fragment;
     }
 }
diff --git a/src/com/android/car/settings/datetime/SetDateLineItem.java b/src/com/android/car/settings/datetime/SetDateLineItem.java
deleted file mode 100644
index 1705632..0000000
--- a/src/com/android/car/settings/datetime/SetDateLineItem.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.datetime;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.text.format.DateFormat;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.BaseFragment.FragmentController;
-
-import java.util.Calendar;
-
-/**
- * A LineItem that displays and sets system date.
- */
-class SetDateLineItem extends TextListItem implements DatetimeSettingsFragment.ListRefreshObserver {
-
-    private final Context mContext;
-    private final FragmentController mFragmentController;
-
-    public SetDateLineItem(Context context, BaseFragment.FragmentController fragmentController) {
-        super(context);
-        mContext = context;
-        mFragmentController = fragmentController;
-        setTitle(context.getString(R.string.date_time_set_date));
-        updateLineItemData();
-    }
-
-    @Override
-    public void onPreRefresh() {
-        updateLineItemData();
-    }
-
-    private void updateLineItemData() {
-        setBody(DateFormat.getLongDateFormat(mContext).format(Calendar.getInstance().getTime()));
-        if (isEnabled()) {
-            setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-            setOnClickListener(v ->
-                    mFragmentController.launchFragment(DatePickerFragment.getInstance()));
-        } else {
-            setSupplementalIcon(null, /* showDivider= */ false);
-            setOnClickListener(null);
-        }
-    }
-
-    private boolean isEnabled() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.AUTO_TIME, 0) <= 0;
-    }
-}
diff --git a/src/com/android/car/settings/datetime/SetTimeLineItem.java b/src/com/android/car/settings/datetime/SetTimeLineItem.java
deleted file mode 100644
index 9deef6d..0000000
--- a/src/com/android/car/settings/datetime/SetTimeLineItem.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.datetime;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.text.format.DateFormat;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.BaseFragment.FragmentController;
-
-import java.util.Calendar;
-
-/**
- * A LineItem that displays and sets system time.
- */
-class SetTimeLineItem extends TextListItem implements DatetimeSettingsFragment.ListRefreshObserver {
-
-    private final Context mContext;
-    private final FragmentController mFragmentController;
-
-    public SetTimeLineItem(Context context, BaseFragment.FragmentController fragmentController) {
-        super(context);
-        mContext = context;
-        mFragmentController = fragmentController;
-        setTitle(context.getString(R.string.date_time_set_time));
-        updateLineItemData();
-    }
-
-    @Override
-    public void onPreRefresh() {
-        updateLineItemData();
-    }
-
-    private void updateLineItemData() {
-        setBody(DateFormat.getTimeFormat(mContext).format(Calendar.getInstance().getTime()));
-        if (isEnabled()) {
-            setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-            setOnClickListener(v ->
-                    mFragmentController.launchFragment(TimePickerFragment.getInstance()));
-        } else {
-            setSupplementalIcon(null, /* showDivider= */ false);
-            setOnClickListener(null);
-        }
-    }
-
-    private boolean isEnabled() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.AUTO_TIME, 0) <= 0;
-    }
-}
diff --git a/src/com/android/car/settings/datetime/SetTimeZoneLineItem.java b/src/com/android/car/settings/datetime/SetTimeZoneLineItem.java
deleted file mode 100644
index c2ae8d4..0000000
--- a/src/com/android/car/settings/datetime/SetTimeZoneLineItem.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.datetime;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.BaseFragment.FragmentController;
-import com.android.settingslib.datetime.ZoneGetter;
-
-import java.util.Calendar;
-
-/**
- * A LineItem that displays and sets time zone.
- */
-class SetTimeZoneLineItem extends TextListItem
-        implements DatetimeSettingsFragment.ListRefreshObserver {
-
-    private final Context mContext;
-    private final FragmentController mFragmentController;
-
-    public SetTimeZoneLineItem(Context context, BaseFragment.FragmentController fragmentController) {
-        super(context);
-        mContext = context;
-        mFragmentController = fragmentController;
-        setTitle(context.getString(R.string.date_time_set_timezone));
-        setBody(getDesc());
-        updateLineItemData();
-    }
-
-    @Override
-    public void onPreRefresh() {
-        updateLineItemData();
-    }
-
-    private void updateLineItemData() {
-        if (isEnabled()) {
-            setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-            setOnClickListener(v ->
-                    mFragmentController.launchFragment(TimeZonePickerFragment.getInstance()));
-        } else {
-            setSupplementalIcon(null, /* showDivider= */ false);
-            setOnClickListener(null);
-        }
-    }
-
-    private String getDesc() {
-        Calendar now = Calendar.getInstance();
-        return ZoneGetter.getTimeZoneOffsetAndName(mContext, now.getTimeZone(), now.getTime())
-                .toString();
-    }
-
-    private boolean isEnabled() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.AUTO_TIME_ZONE, 0) <= 0;
-    }
-}
diff --git a/src/com/android/car/settings/datetime/TimeFormatToggleLineItem.java b/src/com/android/car/settings/datetime/TimeFormatToggleLineItem.java
deleted file mode 100644
index 8174a4b..0000000
--- a/src/com/android/car/settings/datetime/TimeFormatToggleLineItem.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.datetime;
-
-import android.content.Context;
-import android.content.Intent;
-import android.provider.Settings;
-import android.text.format.DateFormat;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-
-import java.util.Calendar;
-
-/**
- * A LineItem that displays and sets system time format.
- */
-class TimeFormatToggleLineItem extends TextListItem
-        implements DatetimeSettingsFragment.ListRefreshObserver {
-    private static final String HOURS_12 = "12";
-    private static final String HOURS_24 = "24";
-    private static final int DEMO_YEAR = 2017;
-    private static final int DEMO_MONTH = 11;
-    private static final int DEMO_DAY_OF_MONTH = 31;
-    private static final int DEMO_HOUR_OF_DAY = 13;
-    private static final int DEMO_MINUTE = 0;
-    private static final int DEMO_SECOND = 0;
-
-    private final Calendar mTimeFormatDemoDate = Calendar.getInstance();
-
-    private Context mContext;
-
-    public TimeFormatToggleLineItem(Context context) {
-        super(context);
-        setTitle(context.getString(R.string.date_time_24hour));
-        mContext = context;
-        mTimeFormatDemoDate.set(
-                DEMO_YEAR,
-                DEMO_MONTH,
-                DEMO_DAY_OF_MONTH,
-                DEMO_HOUR_OF_DAY,
-                DEMO_MINUTE,
-                DEMO_SECOND);
-        setBody(getDesc());
-        setSwitch(
-                isChecked(),
-                /* showDivider= */ false,
-                (button, is24Hour) -> {
-                    Settings.System.putString(mContext.getContentResolver(),
-                            Settings.System.TIME_12_24,
-                            is24Hour ? HOURS_24 : HOURS_12);
-                    Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
-                    int timeFormatPreference =
-                            is24Hour ? Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR
-                                    : Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR;
-                    timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT,
-                            timeFormatPreference);
-                    mContext.sendBroadcast(timeChanged);
-                });
-    }
-
-    @Override
-    public void onPreRefresh() {
-        setBody(getDesc());
-        setSwitchState(isChecked());
-    }
-
-    private boolean isChecked() {
-        return DateFormat.is24HourFormat(mContext);
-    }
-
-    private String getDesc() {
-        return DateFormat.getTimeFormat(mContext)
-                .format(mTimeFormatDemoDate.getTime());
-    }
-}
diff --git a/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceController.java b/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceController.java
new file mode 100644
index 0000000..74e73a1
--- /dev/null
+++ b/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceController.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.text.format.DateFormat;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.Calendar;
+
+/**
+ * Business logic for toggle which chooses between 12 hour or 24 hour formats.
+ */
+public class TimeFormatTogglePreferenceController extends PreferenceController<TwoStatePreference> {
+    public static final String HOURS_12 = "12";
+    public static final String HOURS_24 = "24";
+
+    private static final int DEMO_MONTH = 11;
+    private static final int DEMO_DAY_OF_MONTH = 31;
+    private static final int DEMO_HOUR_OF_DAY = 13;
+    private static final int DEMO_MINUTE = 0;
+    private static final int DEMO_SECOND = 0;
+    private final Calendar mTimeFormatDemoDate = Calendar.getInstance();
+    private final BroadcastReceiver mTimeChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUi();
+        }
+    };
+
+    public TimeFormatTogglePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    /** Starts the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStartInternal() {
+        // Listens to ACTION_TIME_CHANGED because the description needs to be changed based on
+        // the ACTION_TIME_CHANGED intent that this toggle sends.
+        getContext().registerReceiver(mTimeChangeReceiver,
+                new IntentFilter(Intent.ACTION_TIME_CHANGED));
+    }
+
+    /** Stops the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStopInternal() {
+        getContext().unregisterReceiver(mTimeChangeReceiver);
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        Calendar now = Calendar.getInstance();
+        mTimeFormatDemoDate.setTimeZone(now.getTimeZone());
+        // We use December 31st because it's unambiguous when demonstrating the date format.
+        // We use 13:00 so we can demonstrate the 12/24 hour options.
+        mTimeFormatDemoDate.set(now.get(Calendar.YEAR), DEMO_MONTH, DEMO_DAY_OF_MONTH,
+                DEMO_HOUR_OF_DAY, DEMO_MINUTE, DEMO_SECOND);
+        preference.setSummary(
+                DateFormat.getTimeFormat(getContext()).format(mTimeFormatDemoDate.getTime()));
+        preference.setChecked(is24Hour());
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean isUse24HourFormatEnabled = (boolean) newValue;
+        Settings.System.putString(getContext().getContentResolver(),
+                Settings.System.TIME_12_24,
+                isUse24HourFormatEnabled ? HOURS_24 : HOURS_12);
+        Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
+        int timeFormatPreference =
+                isUse24HourFormatEnabled ? Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR
+                        : Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR;
+        timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT,
+                timeFormatPreference);
+        getContext().sendBroadcast(timeChanged);
+        return true;
+    }
+
+    private boolean is24Hour() {
+        return DateFormat.is24HourFormat(getContext());
+    }
+}
diff --git a/src/com/android/car/settings/datetime/TimePickerFragment.java b/src/com/android/car/settings/datetime/TimePickerFragment.java
index 8d971f3..2e0cdcd 100644
--- a/src/com/android/car/settings/datetime/TimePickerFragment.java
+++ b/src/com/android/car/settings/datetime/TimePickerFragment.java
@@ -11,7 +11,7 @@
  * 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
+ * limitations under the License.
  */
 
 package com.android.car.settings.datetime;
@@ -23,6 +23,9 @@
 import android.widget.Button;
 import android.widget.TimePicker;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
 
@@ -36,14 +39,22 @@
 
     private TimePicker mTimePicker;
 
-    public static TimePickerFragment getInstance() {
-        TimePickerFragment timePickerFragment = new TimePickerFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.time_picker_title);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.time_picker);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        timePickerFragment.setArguments(bundle);
-        return timePickerFragment;
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return R.layout.time_picker;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return R.string.time_picker_title;
     }
 
     @Override
diff --git a/src/com/android/car/settings/datetime/TimePickerPreferenceController.java b/src/com/android/car/settings/datetime/TimePickerPreferenceController.java
new file mode 100644
index 0000000..c4bdc97
--- /dev/null
+++ b/src/com/android/car/settings/datetime/TimePickerPreferenceController.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+import android.text.format.DateFormat;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.Calendar;
+
+/**
+ * Business logic for the preference which allows for time selection.
+ */
+public class TimePickerPreferenceController extends PreferenceController<Preference> {
+
+    private final IntentFilter mIntentFilter;
+    private final BroadcastReceiver mTimeChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUi();
+        }
+    };
+
+    public TimePickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        // ACTION_TIME_CHANGED listens to changes to the autoDatetime toggle to update the time.
+        // ACTION_TIME_TICK listens to the minute changes to update the shown time.
+        // ACTION_TIMEZONE_CHANGED listens to time zone changes to update the shown time.
+        mIntentFilter = new IntentFilter();
+        mIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
+        mIntentFilter.addAction(Intent.ACTION_TIME_TICK);
+        mIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /** Starts the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStartInternal() {
+        getContext().registerReceiver(mTimeChangeReceiver, mIntentFilter);
+    }
+
+    /** Stops the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStopInternal() {
+        getContext().unregisterReceiver(mTimeChangeReceiver);
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        preference.setSummary(
+                DateFormat.getTimeFormat(getContext()).format(Calendar.getInstance().getTime()));
+        preference.setEnabled(!autoDatetimeIsEnabled());
+    }
+
+    private boolean autoDatetimeIsEnabled() {
+        return Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.AUTO_TIME, 0) > 0;
+    }
+}
diff --git a/src/com/android/car/settings/datetime/TimeZoneLineItem.java b/src/com/android/car/settings/datetime/TimeZoneLineItem.java
deleted file mode 100644
index 5813a09..0000000
--- a/src/com/android/car/settings/datetime/TimeZoneLineItem.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.datetime;
-
-import android.annotation.NonNull;
-import android.app.AlarmManager;
-import android.content.Context;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.settingslib.datetime.ZoneGetter;
-
-import java.util.Map;
-
-/**
- * A LineItem that displays available time zone.
- */
-class TimeZoneLineItem extends TextListItem {
-
-    public interface TimeZoneChangeListener {
-        void onTimeZoneChanged();
-    }
-
-    public TimeZoneLineItem(
-            Context context,
-            @NonNull TimeZoneChangeListener listener,
-            Map<String, Object> timeZone) {
-        super(context);
-        setTitle(timeZone.get(ZoneGetter.KEY_DISPLAYNAME).toString());
-        setBody(timeZone.get(ZoneGetter.KEY_GMT).toString());
-        setOnClickListener(v -> {
-            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
-            am.setTimeZone((String) timeZone.get(ZoneGetter.KEY_ID));
-            listener.onTimeZoneChanged();
-        });
-    }
-}
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerFragment.java b/src/com/android/car/settings/datetime/TimeZonePickerFragment.java
deleted file mode 100644
index 2bb3ccc..0000000
--- a/src/com/android/car/settings/datetime/TimeZonePickerFragment.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.datetime;
-
-
-import android.content.Intent;
-import android.os.Bundle;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.settingslib.datetime.ZoneGetter;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Lists all time zone and its offset from GMT.
- */
-public class TimeZonePickerFragment extends ListItemSettingsFragment implements
-        TimeZoneLineItem.TimeZoneChangeListener {
-    private List<Map<String, Object>> mZoneList;
-
-    public static TimeZonePickerFragment getInstance() {
-        TimeZonePickerFragment timeZonePickerFragment = new TimeZonePickerFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.date_time_set_timezone_title);
-        timeZonePickerFragment.setArguments(bundle);
-        return timeZonePickerFragment;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mZoneList = ZoneGetter.getZonesList(getContext());
-        super.onActivityCreated(savedInstanceState);
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return new ListItemProvider.ListProvider(getListItems());
-    }
-
-    private List<ListItem> getListItems() {
-        List<ListItem> lineItems = new ArrayList<>();
-        for (Map<String, Object> zone : mZoneList) {
-            lineItems.add(new TimeZoneLineItem(getContext(), this, zone));
-        }
-        return lineItems;
-    }
-
-    @Override
-    public void onTimeZoneChanged() {
-        getContext().sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
-        getFragmentController().goBack();
-    }
-}
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerPreferenceController.java b/src/com/android/car/settings/datetime/TimeZonePickerPreferenceController.java
new file mode 100644
index 0000000..6a45f72
--- /dev/null
+++ b/src/com/android/car/settings/datetime/TimeZonePickerPreferenceController.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.datetime.ZoneGetter;
+
+import java.util.Calendar;
+
+/**
+ * Business logic for the preference that allows for changing the timezone.
+ */
+public class TimeZonePickerPreferenceController extends PreferenceController<Preference> {
+
+    private final IntentFilter mIntentFilter;
+    private final BroadcastReceiver mTimeChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUi();
+        }
+    };
+
+    public TimeZonePickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+
+        // Listen to ACTION_TIME_CHANGED because it could be sent by the autoTimeZone toggle.
+        // Listen to ACTION_TIMEZONE_CHANGED because the change in timezone should update the
+        // description of the preference.
+        mIntentFilter = new IntentFilter();
+        mIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
+        mIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /** Starts the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStartInternal() {
+        getContext().registerReceiver(mTimeChangeReceiver, mIntentFilter);
+    }
+
+    /** Stops the broadcast receiver which listens for time changes */
+    @Override
+    protected void onStopInternal() {
+        getContext().unregisterReceiver(mTimeChangeReceiver);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        Calendar now = Calendar.getInstance();
+        preference.setSummary(ZoneGetter.getTimeZoneOffsetAndName(getContext(), now.getTimeZone(),
+                now.getTime()));
+        preference.setEnabled(!autoTimezoneIsEnabled());
+    }
+
+    private boolean autoTimezoneIsEnabled() {
+        return Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.AUTO_TIME_ZONE, 0) > 0;
+    }
+}
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerScreenFragment.java b/src/com/android/car/settings/datetime/TimeZonePickerScreenFragment.java
new file mode 100644
index 0000000..3b83c9e
--- /dev/null
+++ b/src/com/android/car/settings/datetime/TimeZonePickerScreenFragment.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+import java.util.TimeZone;
+
+/**
+ * Lists all time zone and its offset from GMT.
+ */
+public class TimeZonePickerScreenFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.timezone_picker_screen_fragment;
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        scrollToPreference(TimeZone.getDefault().getID());
+    }
+}
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java b/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
new file mode 100644
index 0000000..601225c
--- /dev/null
+++ b/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceController.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import android.app.AlarmManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.datetime.ZoneGetter;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Business logic which will populate the timezone options.
+ */
+public class TimeZonePickerScreenPreferenceController extends
+        PreferenceController<PreferenceGroup> {
+
+    private List<Preference> mZonesList;
+    @VisibleForTesting
+    AlarmManager mAlarmManager;
+
+    public TimeZonePickerScreenPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        if (mZonesList == null) {
+            constructTimeZoneList();
+        }
+        for (Preference zonePreference : mZonesList) {
+            preferenceGroup.addPreference(zonePreference);
+        }
+    }
+
+    private void constructTimeZoneList() {
+        // We load all of the time zones on the UI thread. However it shouldn't be very expensive
+        // and also shouldn't take a long time. We can revisit this to setup background work and
+        // paging, if it becomes an issue.
+        List<Map<String, Object>> zones = ZoneGetter.getZonesList(getContext());
+        setZonesList(zones);
+    }
+
+    @VisibleForTesting
+    void setZonesList(List<Map<String, Object>> zones) {
+        Collections.sort(zones, new TimeZonesComparator());
+        mZonesList = new ArrayList<>();
+        for (Map<String, Object> zone : zones) {
+            mZonesList.add(createTimeZonePreference(zone));
+        }
+    }
+
+    /** Construct a time zone preference based on the Map object given by {@link ZoneGetter}. */
+    private Preference createTimeZonePreference(Map<String, Object> timeZone) {
+        Preference preference = new Preference(getContext());
+        preference.setKey(timeZone.get(ZoneGetter.KEY_ID).toString());
+        preference.setTitle(timeZone.get(ZoneGetter.KEY_DISPLAY_LABEL).toString());
+        preference.setSummary(timeZone.get(ZoneGetter.KEY_OFFSET_LABEL).toString());
+        preference.setOnPreferenceClickListener(pref -> {
+            mAlarmManager.setTimeZone(timeZone.get(ZoneGetter.KEY_ID).toString());
+            getFragmentController().goBack();
+
+            // Note: This is intentionally ACTION_TIME_CHANGED, not ACTION_TIMEZONE_CHANGED.
+            // Timezone change is handled by the alarm manager. This broadcast message is used
+            // to update the clock and other time related displays that the time has changed due
+            // to a change in the timezone.
+            getContext().sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+            return true;
+        });
+        return preference;
+    }
+
+    /** Compares the timezone objects returned by {@link ZoneGetter}. */
+    private static final class TimeZonesComparator implements Comparator<Map<String, Object>> {
+
+        /** Compares timezones based on 1. offset, 2. display label/name. */
+        TimeZonesComparator() {
+        }
+
+        @Override
+        public int compare(Map<String, Object> map1, Map<String, Object> map2) {
+            int timeZoneOffsetCompare = compareWithKey(map1, map2, ZoneGetter.KEY_OFFSET);
+
+            // If equivalent timezone offset, compare based on display label.
+            if (timeZoneOffsetCompare == 0) {
+                return compareWithKey(map1, map2, ZoneGetter.KEY_DISPLAY_LABEL);
+            }
+
+            return timeZoneOffsetCompare;
+        }
+
+        private int compareWithKey(Map<String, Object> map1, Map<String, Object> map2,
+                String comparisonKey) {
+            Object value1 = map1.get(comparisonKey);
+            Object value2 = map2.get(comparisonKey);
+            if (!isComparable(value1) || !isComparable(value2)) {
+                throw new IllegalArgumentException(
+                        "Cannot use Map which has values that are not Comparable");
+            }
+            return ((Comparable) value1).compareTo(value2);
+        }
+
+        private boolean isComparable(Object value) {
+            return (value != null) && (value instanceof Comparable);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/development/DevelopmentSettingsUtil.java b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
new file mode 100644
index 0000000..63ded44
--- /dev/null
+++ b/src/com/android/car/settings/development/DevelopmentSettingsUtil.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2018 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.car.settings.development;
+
+import android.app.ActivityManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+
+import com.android.car.settings.R;
+import com.android.settingslib.development.DevelopmentSettingsEnabler;
+
+/**
+ * A utility to set/check development settings mode.
+ *
+ * <p>Shared logic with {@link com.android.settingslib.development.DevelopmentSettingsEnabler} with
+ * modifications to use CarUserManagerHelper instead of UserManager.
+ */
+public class DevelopmentSettingsUtil {
+
+    private DevelopmentSettingsUtil() {
+    }
+
+    /**
+     * Sets the global toggle for developer settings and sends out a local broadcast to notify other
+     * of this change.
+     */
+    public static void setDevelopmentSettingsEnabled(Context context, boolean enable) {
+        Settings.Global.putInt(context.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, enable ? 1 : 0);
+
+        // Used to enable developer options module.
+        ComponentName targetName = ComponentName.unflattenFromString(
+                context.getString(R.string.config_dev_options_module));
+        setDeveloperOptionsEnabledState(context, targetName, showDeveloperOptions(context));
+    }
+
+    /**
+     * Checks that the development settings should be enabled. Returns true if global toggle is set,
+     * debugging is allowed for user, and the user is an admin or a demo user.
+     */
+    public static boolean isDevelopmentSettingsEnabled(Context context,
+            CarUserManagerHelper carUserManagerHelper) {
+        boolean settingEnabled = Settings.Global.getInt(context.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, Build.IS_ENG ? 1 : 0) != 0;
+        boolean hasRestriction = carUserManagerHelper.hasUserRestriction(
+                UserManager.DISALLOW_DEBUGGING_FEATURES,
+                carUserManagerHelper.getCurrentProcessUserInfo());
+        boolean isAdminOrDemo = carUserManagerHelper.isCurrentProcessAdminUser()
+                || carUserManagerHelper.isCurrentProcessDemoUser();
+        return isAdminOrDemo && !hasRestriction && settingEnabled;
+    }
+
+    /** Checks whether the device is provisioned or not. */
+    public static boolean isDeviceProvisioned(Context context) {
+        return Settings.Global.getInt(context.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+    }
+
+    private static boolean showDeveloperOptions(Context context) {
+        CarUserManagerHelper carUserManagerHelper = new CarUserManagerHelper(context);
+        boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context)
+                && !isMonkeyRunning();
+        boolean isAdminOrDemo = carUserManagerHelper.isCurrentProcessAdminUser()
+                || carUserManagerHelper.isCurrentProcessDemoUser();
+        if (UserHandle.MU_ENABLED && !isAdminOrDemo) {
+            showDev = false;
+        }
+
+        return showDev;
+    }
+
+    private static void setDeveloperOptionsEnabledState(Context context, ComponentName component,
+            boolean enabled) {
+        PackageManager pm = context.getPackageManager();
+        int state = pm.getComponentEnabledSetting(component);
+        boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+        if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
+            pm.setComponentEnabledSetting(component, enabled
+                            ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+                            : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                    PackageManager.DONT_KILL_APP);
+        }
+    }
+
+    private static boolean isMonkeyRunning() {
+        return ActivityManager.isUserAMonkey();
+    }
+}
diff --git a/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceController.java b/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceController.java
new file mode 100644
index 0000000..5c9cb33
--- /dev/null
+++ b/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceController.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018 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.car.settings.display;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic for controlling the adaptive brightness setting. */
+public class AdaptiveBrightnessTogglePreferenceController extends
+        PreferenceController<TwoStatePreference> {
+
+    public AdaptiveBrightnessTogglePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(isAdaptiveBrightnessChecked());
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return supportsAdaptiveBrightness() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean enableAdaptiveBrightness = (boolean) newValue;
+        Settings.System.putInt(getContext().getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                enableAdaptiveBrightness ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+                        : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+        return true;
+    }
+
+    private boolean isAdaptiveBrightnessChecked() {
+        int brightnessMode = Settings.System.getInt(getContext().getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+        return brightnessMode != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
+    }
+
+    private boolean supportsAdaptiveBrightness() {
+        return getContext().getResources().getBoolean(R.bool.config_automatic_brightness_available);
+    }
+}
diff --git a/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
new file mode 100644
index 0000000..02ec623
--- /dev/null
+++ b/src/com/android/car/settings/display/BrightnessLevelPreferenceController.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 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.car.settings.display;
+
+import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
+import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
+import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.PowerManager;
+import android.provider.Settings;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.SeekBarPreference;
+
+/** Business logic for changing the brightness of the display. */
+public class BrightnessLevelPreferenceController extends PreferenceController<SeekBarPreference> {
+
+    private static final Logger LOG = new Logger(BrightnessLevelPreferenceController.class);
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final int mMaximumBacklight;
+    private final int mMinimumBacklight;
+
+    public BrightnessLevelPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        mMaximumBacklight = powerManager.getMaximumScreenBrightnessSetting();
+        mMinimumBacklight = powerManager.getMinimumScreenBrightnessSetting();
+    }
+
+    @Override
+    protected Class<SeekBarPreference> getPreferenceType() {
+        return SeekBarPreference.class;
+    }
+
+    @Override
+    protected void updateState(SeekBarPreference preference) {
+        preference.setMax(GAMMA_SPACE_MAX);
+        preference.setValue(getSeekbarValue());
+        preference.setContinuousUpdate(true);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(SeekBarPreference preference, Object newValue) {
+        int gamma = (Integer) newValue;
+        int linear = convertGammaToLinear(gamma, mMinimumBacklight, mMaximumBacklight);
+        Settings.System.putIntForUser(getContext().getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS, linear,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+        return true;
+    }
+
+    private int getSeekbarValue() {
+        int gamma = GAMMA_SPACE_MAX;
+        try {
+            int linear = Settings.System.getIntForUser(getContext().getContentResolver(),
+                    Settings.System.SCREEN_BRIGHTNESS,
+                    mCarUserManagerHelper.getCurrentProcessUserId());
+            gamma = convertLinearToGamma(linear, mMinimumBacklight, mMaximumBacklight);
+        } catch (Settings.SettingNotFoundException e) {
+            LOG.w("Can't find setting for SCREEN_BRIGHTNESS.");
+        }
+        return gamma;
+    }
+}
diff --git a/src/com/android/car/settings/display/BrightnessLineItem.java b/src/com/android/car/settings/display/BrightnessLineItem.java
deleted file mode 100644
index f89527e..0000000
--- a/src/com/android/car/settings/display/BrightnessLineItem.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.display;
-
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-
-import androidx.car.widget.SeekbarListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.Logger;
-
-/**
- * A LineItem that displays and sets display brightness.
- */
-public class BrightnessLineItem extends SeekbarListItem {
-    private static final Logger LOG = new Logger(BrightnessLineItem.class);
-    private static final int MAX_BRIGHTNESS = 255;
-    private final Context mContext;
-
-    /**
-     * Handles brightness change from user
-     */
-    private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener =
-            new OnSeekBarChangeListener() {
-                @Override
-                public void onStartTrackingTouch(SeekBar seekBar) {
-                    // no-op
-                }
-
-                @Override
-                public void onStopTrackingTouch(SeekBar seekBar) {
-                    // no-op
-                }
-
-                @Override
-                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-                    Settings.System.putInt(
-                            mContext.getContentResolver(), SCREEN_BRIGHTNESS, progress);
-                }
-            };
-
-    public BrightnessLineItem(Context context) {
-        super(context);
-        mContext = context;
-        setMax(MAX_BRIGHTNESS);
-        setProgress(getSeekbarValue(context));
-        setOnSeekBarChangeListener(mOnSeekBarChangeListener);
-        setText(context.getString(R.string.brightness));
-    }
-
-    private static int getSeekbarValue(Context context) {
-        int currentBrightness = 0;
-        try {
-            currentBrightness = Settings.System.getInt(context.getContentResolver(),
-                    SCREEN_BRIGHTNESS);
-        } catch (Settings.SettingNotFoundException e) {
-            LOG.w("Can't find setting for SCREEN_BRIGHTNESS.");
-        }
-        return currentBrightness;
-    }
-}
diff --git a/src/com/android/car/settings/display/DisplaySettingsFragment.java b/src/com/android/car/settings/display/DisplaySettingsFragment.java
index f808906..97e5359 100644
--- a/src/com/android/car/settings/display/DisplaySettingsFragment.java
+++ b/src/com/android/car/settings/display/DisplaySettingsFragment.java
@@ -15,77 +15,19 @@
  */
 package com.android.car.settings.display;
 
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE;
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.provider.Settings;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.ListItemProvider.ListProvider;
-import androidx.car.widget.TextListItem;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
- * Activity to host Display related preferences.
+ * Preference fragment to host Display related preferences.
  */
-public class DisplaySettingsFragment extends ListItemSettingsFragment {
-
-    /**
-     * Gets a new instance of this class.
-     */
-    public static DisplaySettingsFragment newInstance() {
-        DisplaySettingsFragment displaySettingsFragment = new DisplaySettingsFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.display_settings);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar);
-        displaySettingsFragment.setArguments(bundle);
-        return displaySettingsFragment;
-    }
+public class DisplaySettingsFragment extends SettingsFragment {
 
     @Override
-    public ListItemProvider getItemProvider() {
-        return new ListProvider(getLineItems());
-    }
-
-    private List<ListItem> getLineItems() {
-        List<ListItem> lineItems = new ArrayList<>();
-        Context context = getContext();
-        if (supportsAdaptiveBrightness()) {
-            TextListItem adaptiveBrightnessItem = new TextListItem(context);
-            adaptiveBrightnessItem.setTitle(context.getString(R.string.auto_brightness_title));
-            adaptiveBrightnessItem.setBody(
-                    context.getString(R.string.auto_brightness_summary));
-            adaptiveBrightnessItem.setSwitch(
-                    isAdaptiveBrightnessChecked(),
-                    /* showDivider= */false,
-                    (button, isChecked) ->
-                            Settings.System.putInt(context.getContentResolver(),
-                                    SCREEN_BRIGHTNESS_MODE,
-                                    isChecked ? SCREEN_BRIGHTNESS_MODE_AUTOMATIC
-                                            : SCREEN_BRIGHTNESS_MODE_MANUAL));
-            lineItems.add(adaptiveBrightnessItem);
-        }
-        lineItems.add(new BrightnessLineItem(context));
-        return lineItems;
-    }
-
-    private boolean isAdaptiveBrightnessChecked() {
-        int brightnessMode = Settings.System.getInt(getContext().getContentResolver(),
-                SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
-        return brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL;
-    }
-
-    private boolean supportsAdaptiveBrightness() {
-        return getContext().getResources().getBoolean(
-                com.android.internal.R.bool.config_automatic_brightness_available);
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.display_settings_fragment;
     }
 }
diff --git a/src/com/android/car/settings/home/BluetoothLineItem.java b/src/com/android/car/settings/home/BluetoothLineItem.java
deleted file mode 100644
index c9ee22d..0000000
--- a/src/com/android/car/settings/home/BluetoothLineItem.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.home;
-
-import android.annotation.DrawableRes;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothManager;
-import android.content.Context;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Switch;
-
-import com.android.car.list.IconToggleLineItem;
-import com.android.car.settings.R;
-import com.android.car.settings.bluetooth.BluetoothSettingsFragment;
-import com.android.car.settings.common.BaseFragment;
-
-
-/**
- * Represents the Bluetooth line item on settings home page.
- */
-public class BluetoothLineItem extends IconToggleLineItem {
-    private BluetoothAdapter mBluetoothAdapter;
-    private BaseFragment.FragmentController mFragmentController;
-
-    public BluetoothLineItem(Context context, BaseFragment.FragmentController fragmentController) {
-        super(context.getText(R.string.bluetooth_settings), context);
-        mFragmentController = fragmentController;
-        mBluetoothAdapter =
-                ((BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE))
-                        .getAdapter();
-    }
-
-    @Override
-    public boolean onToggleTouched(Switch toggleSwitch, MotionEvent event) {
-        if (!isBluetoothAvailable()) {
-            return true;
-        }
-        // intercept touch event, so we can process the request and update the switch
-        // state accordingly
-        if (event.getAction() == MotionEvent.ACTION_DOWN) {
-            if (isChecked()) {
-                mBluetoothAdapter.disable();
-            } else {
-                mBluetoothAdapter.enable();
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public boolean isExpandable() {
-        return false;
-    }
-
-    @Override
-    public boolean isClickable() {
-        return isBluetoothAvailable();
-    }
-
-    @Override
-    public void onClick(View view) {
-        if (isBluetoothAvailable()) {
-            mFragmentController.launchFragment(BluetoothSettingsFragment.getInstance());
-        }
-    }
-
-    @Override
-    public CharSequence getDesc() {
-        return mContext.getText(R.string.bluetooth_settings_summary);
-    }
-
-    @Override
-    public boolean isChecked() {
-        return isBluetoothAvailable() && mBluetoothAdapter.isEnabled();
-    }
-
-    @Override
-    public @DrawableRes int getIcon() {
-        return getIconRes(isBluetoothAvailable() && mBluetoothAdapter.isEnabled());
-    }
-
-    public void onBluetoothStateChanged(boolean enabled) {
-        if (mIconUpdateListener != null) {
-            mIconUpdateListener.onUpdateIcon(getIconRes(enabled));
-        }
-        if (mSwitchStateUpdateListener != null) {
-            mSwitchStateUpdateListener.onToggleChanged(enabled);
-        }
-    }
-
-    private boolean isBluetoothAvailable() {
-        return mBluetoothAdapter != null;
-    }
-
-    private @DrawableRes int getIconRes(boolean enabled) {
-        return enabled
-                ? R.drawable.ic_settings_bluetooth : R.drawable.ic_settings_bluetooth_disabled;
-    }
-}
diff --git a/src/com/android/car/settings/home/ExtraSettingsLoader.java b/src/com/android/car/settings/home/ExtraSettingsLoader.java
deleted file mode 100644
index ea0ba35..0000000
--- a/src/com/android/car/settings/home/ExtraSettingsLoader.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package com.android.car.settings.home;
-
-import static com.android.settingslib.drawer.TileUtils.EXTRA_SETTINGS_ACTION;
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON;
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-import android.text.TextUtils;
-
-import com.android.car.list.LaunchAppLineItem;
-import com.android.car.list.TypedPagedListAdapter;
-import com.android.car.settings.R;
-import com.android.car.settings.common.Logger;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Loads Activity with TileUtils.EXTRA_SETTINGS_ACTION.
- * TODO: remove after all list new switched to androidx.car.widget
- */
-public class ExtraSettingsLoader {
-    private static final Logger LOG = new Logger(ExtraSettingsLoader.class);
-    private static final String META_DATA_PREFERENCE_CATEGORY = "com.android.settings.category";
-    public static final String WIRELESS_CATEGORY = "com.android.settings.category.wireless";
-    public static final String DEVICE_CATEGORY = "com.android.settings.category.device";
-    public static final String SYSTEM_CATEGORY = "com.android.settings.category.system";
-    public static final String PERSONAL_CATEGORY = "com.android.settings.category.personal";
-    private final Context mContext;
-
-    public ExtraSettingsLoader(Context context) {
-        mContext = context;
-    }
-
-    public Map<String, Collection<TypedPagedListAdapter.LineItem>> load() {
-        PackageManager pm = mContext.getPackageManager();
-        Intent intent = new Intent(EXTRA_SETTINGS_ACTION);
-        Map<String, Collection<TypedPagedListAdapter.LineItem>> extraSettings = new HashMap<>();
-        // initialize the categories
-        extraSettings.put(WIRELESS_CATEGORY, new LinkedList());
-        extraSettings.put(DEVICE_CATEGORY, new LinkedList());
-        extraSettings.put(SYSTEM_CATEGORY, new LinkedList());
-        extraSettings.put(PERSONAL_CATEGORY, new LinkedList());
-
-        List<ResolveInfo> results = pm.queryIntentActivitiesAsUser(intent,
-                PackageManager.GET_META_DATA, ActivityManager.getCurrentUser());
-
-        for (ResolveInfo resolved : results) {
-            if (!resolved.system) {
-                // Do not allow any app to add to settings, only system ones.
-                continue;
-            }
-            String title = null;
-            String summary = null;
-            String category = null;
-            ActivityInfo activityInfo = resolved.activityInfo;
-            Bundle metaData = activityInfo.metaData;
-            try {
-                Resources res = pm.getResourcesForApplication(activityInfo.packageName);
-                if (metaData.containsKey(META_DATA_PREFERENCE_TITLE)) {
-                    if (metaData.get(META_DATA_PREFERENCE_TITLE) instanceof Integer) {
-                        title = res.getString(metaData.getInt(META_DATA_PREFERENCE_TITLE));
-                    } else {
-                        title = metaData.getString(META_DATA_PREFERENCE_TITLE);
-                    }
-                }
-                if (metaData.containsKey(META_DATA_PREFERENCE_SUMMARY)) {
-                    if (metaData.get(META_DATA_PREFERENCE_SUMMARY) instanceof Integer) {
-                        summary = res.getString(metaData.getInt(META_DATA_PREFERENCE_SUMMARY));
-                    } else {
-                        summary = metaData.getString(META_DATA_PREFERENCE_SUMMARY);
-                    }
-                } else {
-                    LOG.d("no description.");
-                }
-                if (metaData.containsKey(META_DATA_PREFERENCE_CATEGORY)) {
-                    if (metaData.get(META_DATA_PREFERENCE_CATEGORY) instanceof Integer) {
-                        category = res.getString(metaData.getInt(META_DATA_PREFERENCE_CATEGORY));
-                    } else {
-                        category = metaData.getString(META_DATA_PREFERENCE_CATEGORY);
-                    }
-                } else {
-                    LOG.d("no category.");
-                }
-            } catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) {
-                LOG.d("Couldn't find info", e);
-            }
-            if (TextUtils.isEmpty(title)) {
-                LOG.d("no title.");
-                title = activityInfo.loadLabel(pm).toString();
-            }
-            Integer iconRes = null;
-            Icon icon = null;
-            if (metaData.containsKey(META_DATA_PREFERENCE_ICON)) {
-                iconRes = metaData.getInt(META_DATA_PREFERENCE_ICON);
-                icon = Icon.createWithResource(activityInfo.packageName, iconRes);
-            } else {
-                icon = Icon.createWithResource(mContext, R.drawable.ic_settings_gear);
-                LOG.d("no icon.");
-            }
-            Intent extraSettingIntent =
-                    new Intent().setClassName(activityInfo.packageName, activityInfo.name);
-            if (category == null || !extraSettings.containsKey(category)) {
-                // If category is not specified or not supported, default to device.
-                category = DEVICE_CATEGORY;
-            }
-            extraSettings.get(category).add(new LaunchAppLineItem(
-                    title, icon, mContext, summary, extraSettingIntent));
-        }
-        return extraSettings;
-    }
-}
diff --git a/src/com/android/car/settings/home/HomepageFragment.java b/src/com/android/car/settings/home/HomepageFragment.java
index d7d286b..9ca03ae 100644
--- a/src/com/android/car/settings/home/HomepageFragment.java
+++ b/src/com/android/car/settings/home/HomepageFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -11,244 +11,34 @@
  * 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
+ * limitations under the License.
  */
+
 package com.android.car.settings.home;
 
-
-import static com.android.car.settings.home.ExtraSettingsLoader.DEVICE_CATEGORY;
-import static com.android.car.settings.home.ExtraSettingsLoader.PERSONAL_CATEGORY;
-import static com.android.car.settings.home.ExtraSettingsLoader.WIRELESS_CATEGORY;
-
-import android.bluetooth.BluetoothAdapter;
-import android.car.user.CarUserManagerHelper;
-import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
 
-import com.android.car.list.LaunchAppLineItem;
-import com.android.car.list.TypedPagedListAdapter;
+import androidx.annotation.XmlRes;
+
 import com.android.car.settings.R;
-import com.android.car.settings.accounts.AccountsListFragment;
-import com.android.car.settings.applications.ApplicationSettingsFragment;
-import com.android.car.settings.common.ListSettingsFragment;
-import com.android.car.settings.common.Logger;
-import com.android.car.settings.datetime.DatetimeSettingsFragment;
-import com.android.car.settings.display.DisplaySettingsFragment;
-import com.android.car.settings.security.SettingsScreenLockActivity;
-import com.android.car.settings.sound.SoundSettingsFragment;
-import com.android.car.settings.suggestions.SettingsSuggestionsController;
-import com.android.car.settings.system.SystemSettingsFragment;
-import com.android.car.settings.users.UsersListFragment;
-import com.android.car.settings.wifi.CarWifiManager;
-import com.android.car.settings.wifi.WifiUtil;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Homepage for settings for car.
  */
-public class HomepageFragment extends ListSettingsFragment implements
-        CarWifiManager.Listener,
-        SettingsSuggestionsController.Listener {
-    private static final Logger LOG = new Logger(HomepageFragment.class);
+public class HomepageFragment extends SettingsFragment {
 
-    private SettingsSuggestionsController mSettingsSuggestionsController;
-    private CarWifiManager mCarWifiManager;
-    private WifiLineItem mWifiLineItem;
-    private BluetoothLineItem mBluetoothLineItem;
-    private CarUserManagerHelper mCarUserManagerHelper;
-    // This tracks the number of suggestions currently shown in the fragment. This is based off of
-    // the assumption that suggestions are 0 through (num suggestions - 1) in the adapter. Do not
-    // change this assumption without updating the code in onSuggestionLoaded.
-    private int mNumSettingsSuggestions;
-
-    private final BroadcastReceiver mBtStateReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-
-            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
-                int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
-                        BluetoothAdapter.ERROR);
-                switch (state) {
-                    case BluetoothAdapter.STATE_TURNING_OFF:
-                        // TODO show a different status icon?
-                    case BluetoothAdapter.STATE_OFF:
-                        mBluetoothLineItem.onBluetoothStateChanged(false);
-                        break;
-                    default:
-                        mBluetoothLineItem.onBluetoothStateChanged(true);
-                }
-            }
-        }
-    };
-
-    private final IntentFilter mBtStateChangeFilter =
-            new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
-
-    /**
-     * Gets an instance of this class.
-     */
-    public static HomepageFragment newInstance() {
-        HomepageFragment homepageFragment = new HomepageFragment();
-        Bundle bundle = ListSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.settings_label);
-        homepageFragment.setArguments(bundle);
-        return homepageFragment;
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.homepage_fragment;
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        LOG.v("onActivityCreated: " + savedInstanceState);
-        mSettingsSuggestionsController =
-                new SettingsSuggestionsController(
-                        getContext(),
-                        getLoaderManager(),
-                        /* listener= */ this);
-        mCarWifiManager = new CarWifiManager(getContext(), /* listener= */ this);
-        if (WifiUtil.isWifiAvailable(getContext())) {
-            mWifiLineItem = new WifiLineItem(
-                    getContext(), mCarWifiManager, getFragmentController());
-        }
-        mBluetoothLineItem = new BluetoothLineItem(getContext(), getFragmentController());
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
-
-        // reset the suggestion count.
-        mNumSettingsSuggestions = 0;
-
-        // Call super after the wifiLineItem and BluetoothLineItem are setup, because
-        // those are needed in super.onCreate().
-        super.onActivityCreated(savedInstanceState);
-    }
-
-    @Override
-    public void onAccessPointsChanged() {
-        // don't care
-    }
-
-    @Override
-    public void onWifiStateChanged(int state) {
-        mWifiLineItem.onWifiStateChanged(state);
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        mCarWifiManager.start();
-        mSettingsSuggestionsController.start();
-        getActivity().registerReceiver(mBtStateReceiver, mBtStateChangeFilter);
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        mCarWifiManager.stop();
-        mSettingsSuggestionsController.stop();
-        getActivity().unregisterReceiver(mBtStateReceiver);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        mCarWifiManager.destroy();
-    }
-
-    @Override
-    public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
-        ExtraSettingsLoader extraSettingsLoader = new ExtraSettingsLoader(getContext());
-        Map<String, Collection<TypedPagedListAdapter.LineItem>> extraSettings =
-                extraSettingsLoader.load();
-        ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
-        lineItems.add(new SimpleIconTransitionLineItem(
-                R.string.display_settings,
-                R.drawable.ic_settings_display,
-                getContext(),
-                null,
-                DisplaySettingsFragment.newInstance(),
-                getFragmentController()));
-        lineItems.add(new SimpleIconTransitionLineItem(
-                R.string.sound_settings,
-                R.drawable.ic_settings_sound,
-                getContext(),
-                null,
-                SoundSettingsFragment.newInstance(),
-                getFragmentController()));
-        if (mWifiLineItem != null) {
-            lineItems.add(mWifiLineItem);
-        }
-        lineItems.addAll(extraSettings.get(WIRELESS_CATEGORY));
-        lineItems.add(mBluetoothLineItem);
-        lineItems.add(new SimpleIconTransitionLineItem(
-                R.string.applications_settings,
-                R.drawable.ic_settings_applications,
-                getContext(),
-                null,
-                ApplicationSettingsFragment.newInstance(),
-                getFragmentController()));
-        lineItems.add(new SimpleIconTransitionLineItem(
-                R.string.date_and_time_settings_title,
-                R.drawable.ic_settings_date_time,
-                getContext(),
-                null,
-                DatetimeSettingsFragment.getInstance(),
-                getFragmentController()));
-        lineItems.add(new SimpleIconTransitionLineItem(
-                R.string.users_list_title,
-                R.drawable.ic_user,
-                getContext(),
-                null,
-                UsersListFragment.newInstance(),
-                getFragmentController()));
-
-        // Guest users can't set screen locks or add/remove accounts.
-        if (!mCarUserManagerHelper.isCurrentProcessGuestUser()) {
-            lineItems.add(new SimpleIconTransitionLineItem(
-                    R.string.accounts_settings_title,
-                    R.drawable.ic_account,
-                    getContext(),
-                    null,
-                    AccountsListFragment.newInstance(),
-                    getFragmentController()));
-            lineItems.add(new LaunchAppLineItem(
-                    getString(R.string.security_settings_title),
-                    Icon.createWithResource(getContext(), R.drawable.ic_lock),
-                    getContext(),
-                    null,
-                    new Intent(getContext(), SettingsScreenLockActivity.class)));
-        }
-
-        lineItems.add(new SimpleIconTransitionLineItem(
-                R.string.system_setting_title,
-                R.drawable.ic_settings_about,
-                getContext(),
-                null,
-                SystemSettingsFragment.getInstance(),
-                getFragmentController()));
-
-        lineItems.addAll(extraSettings.get(DEVICE_CATEGORY));
-        lineItems.addAll(extraSettings.get(PERSONAL_CATEGORY));
-        return lineItems;
-    }
-
-    @Override
-    public void onSuggestionsLoaded(ArrayList<TypedPagedListAdapter.LineItem> suggestions) {
-        LOG.v("onDeferredSuggestionsLoaded");
-        for (int index = 0; index < mNumSettingsSuggestions; index++) {
-            mPagedListAdapter.remove(0);
-        }
-        mNumSettingsSuggestions = suggestions.size();
-        mPagedListAdapter.addAll(0, suggestions);
-    }
-
-    @Override
-    public void onSuggestionDismissed(int adapterPosition) {
-        LOG.v("onSuggestionDismissed adapterPosition " + adapterPosition);
-        mPagedListAdapter.remove(adapterPosition);
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        // TODO: Re-enable suggestions once more use cases are supported.
+        // use(SuggestionsPreferenceController.class, R.string.pk_suggestions).setLoaderManager(
+        //        LoaderManager.getInstance(/* owner= */ this));
     }
 }
diff --git a/src/com/android/car/settings/home/SimpleIconTransitionLineItem.java b/src/com/android/car/settings/home/SimpleIconTransitionLineItem.java
deleted file mode 100644
index 6665d22..0000000
--- a/src/com/android/car/settings/home/SimpleIconTransitionLineItem.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.home;
-
-import android.annotation.DrawableRes;
-import android.annotation.StringRes;
-import android.content.Context;
-import android.view.View;
-
-import com.android.car.list.SimpleIconLineItem;
-import com.android.car.settings.common.BaseFragment;
-
-/**
- * This class extends {@link SimpleIconLineItem} and adds the onClick behavior to
- * trigger the fragmentController to launch a new fragment when clicked.
- * The fragment passed in is what will be launched.
- */
-public class SimpleIconTransitionLineItem extends SimpleIconLineItem {
-
-    private BaseFragment.FragmentController mFragmentController;
-    private BaseFragment mFragment;
-
-    public SimpleIconTransitionLineItem(
-            @StringRes int title,
-            @DrawableRes int iconRes,
-            Context context,
-            CharSequence desc,
-            BaseFragment fragment,
-            BaseFragment.FragmentController fragmentController) {
-        super(title, iconRes, context, desc);
-        mFragment = fragment;
-        mFragmentController = fragmentController;
-    }
-
-    public void onClick(View view) {
-        mFragmentController.launchFragment(mFragment);
-    }
-
-}
diff --git a/src/com/android/car/settings/home/WifiLineItem.java b/src/com/android/car/settings/home/WifiLineItem.java
deleted file mode 100644
index ba2f265..0000000
--- a/src/com/android/car/settings/home/WifiLineItem.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.home;
-
-import android.annotation.DrawableRes;
-import android.content.Context;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Switch;
-
-import com.android.car.list.IconToggleLineItem;
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.wifi.CarWifiManager;
-import com.android.car.settings.wifi.WifiSettingsFragment;
-import com.android.car.settings.wifi.WifiUtil;
-
-
-/**
- * Represents the wifi line item on settings home page.
- */
-public class WifiLineItem extends IconToggleLineItem {
-    private final Context mContext;
-    private final CarWifiManager mCarWifiManager;
-    private BaseFragment.FragmentController mFragmentController;
-
-    public WifiLineItem(
-            Context context,
-            CarWifiManager carWifiManager,
-            BaseFragment.FragmentController fragmentController) {
-        super(context.getText(R.string.wifi_settings), context);
-        mContext = context;
-        mCarWifiManager = carWifiManager;
-        mFragmentController = fragmentController;
-    }
-
-    @Override
-    public boolean onToggleTouched(Switch toggleSwitch, MotionEvent event) {
-        // intercept touch event, so we can process the request and update the switch
-        // state accordingly
-        if (event.getAction() == MotionEvent.ACTION_DOWN) {
-            mCarWifiManager.setWifiEnabled(!isChecked());
-        }
-        return true;
-    }
-
-    @Override
-    public void onClick(View view) {
-        mFragmentController.launchFragment(WifiSettingsFragment.newInstance());
-    }
-
-    @Override
-    public CharSequence getDesc() {
-        return mContext.getText(R.string.wifi_settings_summary);
-    }
-
-    @Override
-    public boolean isChecked() {
-        return mCarWifiManager.isWifiEnabled();
-    }
-
-    @Override
-    public boolean isExpandable() {
-        return true;
-    }
-
-    @Override
-    public @DrawableRes int getIcon() {
-        return WifiUtil.getIconRes(mCarWifiManager.getWifiState());
-    }
-
-    public void onWifiStateChanged(int state) {
-        if (mIconUpdateListener != null) {
-            mIconUpdateListener.onUpdateIcon(WifiUtil.getIconRes(state));
-        }
-        if (mSwitchStateUpdateListener != null) {
-            mSwitchStateUpdateListener.onToggleChanged(WifiUtil.isWifiOn(state));
-        }
-    }
-
-}
diff --git a/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceController.java b/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceController.java
new file mode 100644
index 0000000..8c48a05
--- /dev/null
+++ b/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceController.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.util.ArrayMap;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/** Updates the enabled keyboard list. */
+public class EnabledKeyboardPreferenceController extends
+        PreferenceController<PreferenceGroup> {
+    private static final Logger LOG = new Logger(EnabledKeyboardPreferenceController.class);
+
+    private final Map<String, Preference> mPreferences = new ArrayMap<>();
+    private final InputMethodManager mInputMethodManager;
+    private final DevicePolicyManager mDevicePolicyManager;
+    private final PackageManager mPackageManager;
+
+    public EnabledKeyboardPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPackageManager = context.getPackageManager();
+        mDevicePolicyManager =
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mInputMethodManager =
+                (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        List<Preference> preferencesToDisplay = new ArrayList<>();
+        Set<String> preferencesToRemove = new HashSet<>(mPreferences.keySet());
+        List<String> permittedList = mDevicePolicyManager.getPermittedInputMethodsForCurrentUser();
+        List<InputMethodInfo> inputMethodInfos = mInputMethodManager.getEnabledInputMethodList();
+        int size = (inputMethodInfos == null) ? 0 : inputMethodInfos.size();
+        for (int i = 0; i < size; ++i) {
+            InputMethodInfo inputMethodInfo = inputMethodInfos.get(i);
+            // permittedList is Null means that all input methods are allowed.
+            boolean isAllowedByOrganization = (permittedList == null)
+                    || permittedList.contains(inputMethodInfo.getPackageName());
+            if (!isAllowedByOrganization) {
+                continue;
+            }
+
+            Preference preference = createPreference(inputMethodInfo);
+            if (mPreferences.containsKey(preference.getKey())) {
+                Preference displayedPreference = mPreferences.get(preference.getKey());
+                if (arePreferencesDifferent(displayedPreference, preference)) {
+                    preferencesToDisplay.add(preference);
+                } else {
+                    preferencesToRemove.remove(preference.getKey());
+                }
+            } else {
+                preferencesToDisplay.add(preference);
+            }
+        }
+        updatePreferenceGroup(preferenceGroup, preferencesToDisplay, preferencesToRemove);
+    }
+
+    private void updatePreferenceGroup(
+            PreferenceGroup preferenceGroup, List<Preference> preferencesToDisplay,
+            Set<String> preferencesToRemove) {
+        Collections.sort(preferencesToDisplay, Comparator.comparing(
+                (Preference a) -> a.getTitle().toString())
+                .thenComparing((Preference a) -> a.getSummary().toString()));
+
+        for (String key : preferencesToRemove) {
+            preferenceGroup.removePreference(mPreferences.get(key));
+            mPreferences.remove(key);
+        }
+
+        for (int i = 0; i < preferencesToDisplay.size(); ++i) {
+            Preference pref = preferencesToDisplay.get(i);
+            pref.setOrder(i);
+            mPreferences.put(pref.getKey(), pref);
+            preferenceGroup.addPreference(pref);
+        }
+    }
+
+    /**
+     * Creates a preference.
+     */
+    private Preference createPreference(InputMethodInfo inputMethodInfo) {
+        Preference preference = new Preference(getContext());
+        preference.setKey(String.valueOf(inputMethodInfo.hashCode()));
+        preference.setIcon(InputMethodUtil.getPackageIcon(mPackageManager, inputMethodInfo));
+        preference.setTitle(InputMethodUtil.getPackageLabel(mPackageManager, inputMethodInfo));
+        preference.setSummary(InputMethodUtil.getSummaryString(
+                getContext(), mInputMethodManager, inputMethodInfo));
+        preference.setOnPreferenceClickListener(pref -> {
+            try {
+                Intent intent = new Intent(Intent.ACTION_MAIN);
+                String settingsActivity = inputMethodInfo.getSettingsActivity();
+                intent.setClassName(inputMethodInfo.getPackageName(), settingsActivity);
+                // Invoke a settings activity of an input method.
+                getContext().startActivity(intent);
+            } catch (final ActivityNotFoundException e) {
+                LOG.d("IME's Settings Activity Not Found. " + e);
+            }
+            return true;
+        });
+        return preference;
+    }
+
+    private boolean arePreferencesDifferent(Preference lhs, Preference rhs) {
+        return !Objects.equals(lhs.getTitle(), rhs.getTitle())
+                || !Objects.equals(lhs.getSummary(), rhs.getSummary());
+    }
+}
diff --git a/src/com/android/car/settings/inputmethod/InputMethodUtil.java b/src/com/android/car/settings/inputmethod/InputMethodUtil.java
new file mode 100644
index 0000000..8100b02
--- /dev/null
+++ b/src/com/android/car/settings/inputmethod/InputMethodUtil.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settingslib.inputmethod.InputMethodAndSubtypeUtil;
+
+import java.util.List;
+
+/** Keyboard utility class. */
+public final class InputMethodUtil {
+    /**
+     * Delimiter for Enabled Input Methods' concatenated string.
+     */
+    public static final char INPUT_METHOD_DELIMITER = ':';
+    /**
+     * Splitter for Enabled Input Methods' concatenated string.
+     */
+    public static final TextUtils.SimpleStringSplitter sInputMethodSplitter =
+            new TextUtils.SimpleStringSplitter(INPUT_METHOD_DELIMITER);
+    @VisibleForTesting
+    static final Drawable NO_ICON = new ColorDrawable(Color.TRANSPARENT);
+
+    private InputMethodUtil() {
+    }
+
+    /** Returns package icon. */
+    public static Drawable getPackageIcon(@NonNull PackageManager packageManager,
+            @NonNull InputMethodInfo inputMethodInfo) {
+        Drawable icon;
+        try {
+            icon = packageManager.getApplicationIcon(inputMethodInfo.getPackageName());
+        } catch (NameNotFoundException e) {
+            icon = NO_ICON;
+        }
+
+        return icon;
+    }
+
+    /** Returns package label. */
+    public static String getPackageLabel(@NonNull PackageManager packageManager,
+            @NonNull InputMethodInfo inputMethodInfo) {
+        return inputMethodInfo.loadLabel(packageManager).toString();
+    }
+
+    /** Returns input method summary. */
+    public static String getSummaryString(@NonNull Context context,
+            @NonNull InputMethodManager inputMethodManager,
+            @NonNull InputMethodInfo inputMethodInfo) {
+        List<InputMethodSubtype> subtypes =
+                inputMethodManager.getEnabledInputMethodSubtypeList(
+                        inputMethodInfo, /* allowsImplicitlySelectedSubtypes= */ true);
+        return InputMethodAndSubtypeUtil.getSubtypeLocaleNameListAsSentence(
+                subtypes, context, inputMethodInfo);
+    }
+
+    /**
+     * Check if input method is enabled.
+     *
+     * @return {@code true} if the input method is enabled.
+     */
+    public static boolean isInputMethodEnabled(ContentResolver resolver,
+            InputMethodInfo inputMethodInfo) {
+        sInputMethodSplitter.setString(getEnabledInputMethodsConcatenatedIds(resolver));
+        while (sInputMethodSplitter.hasNext()) {
+            String inputMethodId = sInputMethodSplitter.next();
+            if (inputMethodId.equals(inputMethodInfo.getId())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Enable an input method using its InputMethodInfo.
+     */
+    public static void enableInputMethod(ContentResolver resolver,
+            InputMethodInfo inputMethodInfo) {
+        if (isInputMethodEnabled(resolver, inputMethodInfo)) {
+            return;
+        }
+
+        StringBuilder builder = new StringBuilder();
+        builder.append(getEnabledInputMethodsConcatenatedIds(resolver));
+
+        if (!builder.toString().isEmpty()) {
+            builder.append(INPUT_METHOD_DELIMITER);
+        }
+
+        builder.append(inputMethodInfo.getId());
+
+        setEnabledInputMethodsConcatenatedIds(resolver, builder.toString());
+    }
+
+    /**
+     * Disable an input method if its not the default system input method or if there exists another
+     * enabled input method that can also be set as the default system input method.
+     */
+    public static void disableInputMethod(Context context, InputMethodManager inputMethodManager,
+            InputMethodInfo inputMethodInfo) {
+        List<InputMethodInfo> enabledInputMethodInfos = inputMethodManager
+                .getEnabledInputMethodList();
+        StringBuilder builder = new StringBuilder();
+
+        boolean foundAnotherEnabledDefaultInputMethod = false;
+        boolean isSystemDefault = isDefaultInputMethod(context.getContentResolver(),
+                inputMethodInfo);
+        for (InputMethodInfo enabledInputMethodInfo : enabledInputMethodInfos) {
+            if (enabledInputMethodInfo.getId().equals(inputMethodInfo.getId())) {
+                continue;
+            }
+
+            if (builder.length() > 0) {
+                builder.append(INPUT_METHOD_DELIMITER);
+            }
+
+            builder.append(enabledInputMethodInfo.getId());
+
+            if (isSystemDefault && enabledInputMethodInfo.isDefault(context)) {
+                foundAnotherEnabledDefaultInputMethod = true;
+                setDefaultInputMethodId(context.getContentResolver(),
+                        enabledInputMethodInfo.getId());
+            }
+        }
+
+        if (isSystemDefault && !foundAnotherEnabledDefaultInputMethod) {
+            return;
+        }
+
+        setEnabledInputMethodsConcatenatedIds(context.getContentResolver(), builder.toString());
+    }
+
+    private static String getEnabledInputMethodsConcatenatedIds(ContentResolver resolver) {
+        return Settings.Secure.getString(resolver, Settings.Secure.ENABLED_INPUT_METHODS);
+    }
+
+    private static String getDefaultInputMethodId(ContentResolver resolver) {
+        return Settings.Secure.getString(resolver, Settings.Secure.DEFAULT_INPUT_METHOD);
+    }
+
+    private static boolean isDefaultInputMethod(ContentResolver resolver,
+            InputMethodInfo inputMethodInfo) {
+        return inputMethodInfo.getId().equals(getDefaultInputMethodId(resolver));
+    }
+
+    private static void setEnabledInputMethodsConcatenatedIds(ContentResolver resolver,
+            String enabledInputMethodIds) {
+        Settings.Secure.putString(resolver, Settings.Secure.ENABLED_INPUT_METHODS,
+                enabledInputMethodIds);
+    }
+
+    private static void setDefaultInputMethodId(ContentResolver resolver,
+            String defaultInputMethodId) {
+        Settings.Secure.putString(resolver, Settings.Secure.DEFAULT_INPUT_METHOD,
+                defaultInputMethodId);
+    }
+}
diff --git a/src/com/android/car/settings/inputmethod/KeyboardFragment.java b/src/com/android/car/settings/inputmethod/KeyboardFragment.java
new file mode 100644
index 0000000..f46c3e1
--- /dev/null
+++ b/src/com/android/car/settings/inputmethod/KeyboardFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Keyboard settings fragment which lists enabled keyboards and a manage keyboard button. */
+public class KeyboardFragment extends SettingsFragment {
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.keyboard_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/inputmethod/KeyboardManagementFragment.java b/src/com/android/car/settings/inputmethod/KeyboardManagementFragment.java
new file mode 100644
index 0000000..9230365
--- /dev/null
+++ b/src/com/android/car/settings/inputmethod/KeyboardManagementFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Keyboard management screen for all available keyboards management. **/
+public class KeyboardManagementFragment extends SettingsFragment {
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.keyboard_management_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
new file mode 100644
index 0000000..e643867
--- /dev/null
+++ b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/** Updates the available keyboard list. */
+public class KeyboardManagementPreferenceController extends
+        PreferenceController<PreferenceGroup> {
+    @VisibleForTesting
+    static final String DIRECT_BOOT_WARN_DIALOG_TAG = "DirectBootWarnDialog";
+    @VisibleForTesting
+    static final String SECURITY_WARN_DIALOG_TAG = "SecurityWarnDialog";
+    private static final String KEY_INPUT_METHOD_INFO = "INPUT_METHOD_INFO";
+    private final InputMethodManager mInputMethodManager;
+    private final DevicePolicyManager mDevicePolicyManager;
+    private final PackageManager mPackageManager;
+    private final ConfirmationDialogFragment.ConfirmListener mDirectBootWarnConfirmListener =
+            args -> {
+                InputMethodInfo inputMethodInfo = args.getParcelable(KEY_INPUT_METHOD_INFO);
+                InputMethodUtil.enableInputMethod(getContext().getContentResolver(),
+                        inputMethodInfo);
+                refreshUi();
+            };
+    private final ConfirmationDialogFragment.RejectListener mRejectListener = args ->
+            refreshUi();
+    private final ConfirmationDialogFragment.ConfirmListener mSecurityWarnDialogConfirmListener =
+            args -> {
+                InputMethodInfo inputMethodInfo = args.getParcelable(KEY_INPUT_METHOD_INFO);
+                // The user confirmed to enable a 3rd party IME, but we might need to prompt if
+                // it's not
+                // Direct Boot aware.
+                if (inputMethodInfo.getServiceInfo().directBootAware) {
+                    InputMethodUtil.enableInputMethod(getContext().getContentResolver(),
+                            inputMethodInfo);
+                    refreshUi();
+                } else {
+                    showDirectBootWarnDialog(inputMethodInfo);
+                }
+            };
+
+    public KeyboardManagementPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPackageManager = context.getPackageManager();
+        mDevicePolicyManager =
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mInputMethodManager =
+                (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+
+        ConfirmationDialogFragment dialogFragment = (ConfirmationDialogFragment)
+                getFragmentController().findDialogByTag(DIRECT_BOOT_WARN_DIALOG_TAG);
+        ConfirmationDialogFragment.resetListeners(dialogFragment,
+                mDirectBootWarnConfirmListener,
+                mRejectListener);
+
+        dialogFragment = (ConfirmationDialogFragment) getFragmentController()
+                .findDialogByTag(SECURITY_WARN_DIALOG_TAG);
+        ConfirmationDialogFragment.resetListeners(dialogFragment,
+                mSecurityWarnDialogConfirmListener,
+                mRejectListener);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        List<String> permittedInputMethods = mDevicePolicyManager
+                .getPermittedInputMethodsForCurrentUser();
+        Set<String> permittedInputMethodsSet = permittedInputMethods == null ? null : new HashSet<>(
+                permittedInputMethods);
+
+        preferenceGroup.removeAll();
+
+        List<InputMethodInfo> inputMethodInfos = mInputMethodManager.getInputMethodList();
+        if (inputMethodInfos == null || inputMethodInfos.size() == 0) {
+            return;
+        }
+
+        Collections.sort(inputMethodInfos, Comparator.comparing(
+                (InputMethodInfo a) -> InputMethodUtil.getPackageLabel(mPackageManager, a))
+                .thenComparing((InputMethodInfo a) -> InputMethodUtil.getSummaryString(getContext(),
+                        mInputMethodManager, a)));
+
+        for (InputMethodInfo inputMethodInfo : inputMethodInfos) {
+            if (!isInputMethodAllowedByOrganization(permittedInputMethodsSet, inputMethodInfo)) {
+                continue;
+            }
+
+            Preference preference = createSwitchPreference(inputMethodInfo);
+
+            preference.setEnabled(!isOnlyEnabledDefaultInputMethod(inputMethodInfo));
+
+            preferenceGroup.addPreference(preference);
+        }
+    }
+
+    private boolean isInputMethodAllowedByOrganization(Set<String> permittedList,
+            InputMethodInfo inputMethodInfo) {
+        // permittedList is null means that all input methods are allowed.
+        return (permittedList == null) || permittedList.contains(inputMethodInfo.getPackageName());
+    }
+
+    /**
+     * Check if given input method is the only enabled input method that can be a default system
+     * input method.
+     *
+     * @return {@code true} if input method is the only input method that can be a default system
+     * input method.
+     */
+    private boolean isOnlyEnabledDefaultInputMethod(InputMethodInfo inputMethodInfo) {
+        if (!inputMethodInfo.isDefault(getContext())) {
+            return false;
+        }
+
+        List<InputMethodInfo> inputMethodInfos = mInputMethodManager.getEnabledInputMethodList();
+
+        for (InputMethodInfo imi : inputMethodInfos) {
+            if (!imi.isDefault(getContext())) {
+                continue;
+            }
+
+            if (!imi.getId().equals(inputMethodInfo.getId())) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Create a SwitchPreference to enable/disable an input method.
+     *
+     * @return {@code SwitchPreference} which allows a user to enable/disable an input method.
+     */
+    private SwitchPreference createSwitchPreference(InputMethodInfo inputMethodInfo) {
+        SwitchPreference switchPreference = new SwitchPreference(getContext());
+        switchPreference.setKey(String.valueOf(inputMethodInfo.getId()));
+        switchPreference.setIcon(InputMethodUtil.getPackageIcon(mPackageManager, inputMethodInfo));
+        switchPreference.setTitle(InputMethodUtil.getPackageLabel(mPackageManager,
+                inputMethodInfo));
+        switchPreference.setChecked(InputMethodUtil.isInputMethodEnabled(getContext()
+                .getContentResolver(), inputMethodInfo));
+        switchPreference.setSummary(InputMethodUtil.getSummaryString(getContext(),
+                mInputMethodManager, inputMethodInfo));
+
+        switchPreference.setOnPreferenceChangeListener((switchPref, newValue) -> {
+            boolean enable = (boolean) newValue;
+            if (enable) {
+                showSecurityWarnDialog(inputMethodInfo);
+            } else {
+                InputMethodUtil.disableInputMethod(getContext(), mInputMethodManager,
+                        inputMethodInfo);
+                refreshUi();
+            }
+            return false;
+        });
+        return switchPreference;
+    }
+
+    private void showDirectBootWarnDialog(InputMethodInfo inputMethodInfo) {
+        ConfirmationDialogFragment dialog = new ConfirmationDialogFragment.Builder(getContext())
+                .setMessage(getContext().getString(R.string.direct_boot_unaware_dialog_message_car))
+                .setPositiveButton(android.R.string.ok, mDirectBootWarnConfirmListener)
+                .setNegativeButton(android.R.string.cancel, mRejectListener)
+                .addArgumentParcelable(KEY_INPUT_METHOD_INFO, inputMethodInfo)
+                .build();
+
+        getFragmentController().showDialog(dialog, DIRECT_BOOT_WARN_DIALOG_TAG);
+    }
+
+    private void showSecurityWarnDialog(InputMethodInfo inputMethodInfo) {
+        CharSequence label = inputMethodInfo.loadLabel(mPackageManager);
+
+        ConfirmationDialogFragment dialog = new ConfirmationDialogFragment.Builder(getContext())
+                .setTitle(android.R.string.dialog_alert_title)
+                .setMessage(getContext().getString(R.string.ime_security_warning, label))
+                .setPositiveButton(android.R.string.ok, mSecurityWarnDialogConfirmListener)
+                .setNegativeButton(android.R.string.cancel, mRejectListener)
+                .addArgumentParcelable(KEY_INPUT_METHOD_INFO, inputMethodInfo)
+                .build();
+
+        getFragmentController().showDialog(dialog, SECURITY_WARN_DIALOG_TAG);
+    }
+}
diff --git a/src/com/android/car/settings/inputmethod/KeyboardPreferenceController.java b/src/com/android/car/settings/inputmethod/KeyboardPreferenceController.java
new file mode 100644
index 0000000..8c08738
--- /dev/null
+++ b/src/com/android/car/settings/inputmethod/KeyboardPreferenceController.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.icu.text.ListFormatter;
+import android.text.BidiFormatter;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Updates the keyboard settings entry summary with the currently enabled keyboard. */
+public class KeyboardPreferenceController extends PreferenceController<Preference> {
+    private static final String SUMMARY_EMPTY = "";
+
+    private final InputMethodManager mInputMethodManager;
+    private final DevicePolicyManager mDevicePolicyManager;
+    private final PackageManager mPackageManager;
+
+    public KeyboardPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPackageManager = context.getPackageManager();
+        mDevicePolicyManager =
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        mInputMethodManager =
+                (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        List<InputMethodInfo> inputMethodInfos =
+                mInputMethodManager.getEnabledInputMethodList();
+        if (inputMethodInfos == null) {
+            preference.setSummary(SUMMARY_EMPTY);
+            return;
+        }
+
+        // permittedList == null means all input methods are allowed.
+        List<String> permittedList =
+                mDevicePolicyManager.getPermittedInputMethodsForCurrentUser();
+        List<String> labels = new ArrayList<>();
+
+        for (InputMethodInfo inputMethodInfo : inputMethodInfos) {
+            boolean isAllowedByOrganization = permittedList == null
+                    || permittedList.contains(inputMethodInfo.getPackageName());
+            if (!isAllowedByOrganization) {
+                continue;
+            }
+            labels.add(InputMethodUtil.getPackageLabel(mPackageManager, inputMethodInfo));
+        }
+        if (labels.isEmpty()) {
+            preference.setSummary(SUMMARY_EMPTY);
+            return;
+        }
+
+        BidiFormatter bidiFormatter = BidiFormatter.getInstance();
+
+        List<String> summaries = new ArrayList<>();
+        for (String label : labels) {
+            summaries.add(bidiFormatter.unicodeWrap(label));
+        }
+        preference.setSummary(ListFormatter.getInstance().format(summaries));
+    }
+}
diff --git a/src/com/android/car/settings/language/ChildLocalePickerFragment.java b/src/com/android/car/settings/language/ChildLocalePickerFragment.java
new file mode 100644
index 0000000..b5fc5ba
--- /dev/null
+++ b/src/com/android/car/settings/language/ChildLocalePickerFragment.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.widget.TextView;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.internal.app.LocaleStore;
+
+import java.util.Locale;
+
+/** Secondary screen for language selection, when a language has multiple locales. */
+public class ChildLocalePickerFragment extends SettingsFragment {
+
+    /**
+     * Creates a ChildLocalePickerFragment with the parent locale info included in the arguments.
+     */
+    public static ChildLocalePickerFragment newInstance(LocaleStore.LocaleInfo parentLocaleInfo) {
+        Bundle bundle = new Bundle();
+        bundle.putSerializable(LocaleUtil.LOCALE_BUNDLE_KEY, parentLocaleInfo.getLocale());
+        ChildLocalePickerFragment fragment = new ChildLocalePickerFragment();
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+
+    private LanguageBasePreferenceController.LocaleSelectedListener mLocaleSelectedListener;
+    private LocaleStore.LocaleInfo mParentLocaleInfo;
+
+    /**
+     * Allows the creator of ChildLocalePickerFragment to include a listener for when the child
+     * locale is selected.
+     */
+    public void registerChildLocaleSelectedListener(
+            LanguageBasePreferenceController.LocaleSelectedListener listener) {
+        mLocaleSelectedListener = listener;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        Locale locale = (Locale) getArguments().getSerializable(LocaleUtil.LOCALE_BUNDLE_KEY);
+        mParentLocaleInfo = LocaleStore.getLocaleInfo(locale);
+        use(ChildLocalePickerPreferenceController.class,
+                R.string.pk_child_locale_picker).setParentLocaleInfo(mParentLocaleInfo);
+        use(ChildLocalePickerPreferenceController.class,
+                R.string.pk_child_locale_picker).setLocaleSelectedListener(
+                mLocaleSelectedListener);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        TextView titleView = getActivity().findViewById(R.id.title);
+        titleView.setText(mParentLocaleInfo.getFullNameNative());
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.child_locale_picker_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/language/ChildLocalePickerPreferenceController.java b/src/com/android/car/settings/language/ChildLocalePickerPreferenceController.java
new file mode 100644
index 0000000..55fcfef
--- /dev/null
+++ b/src/com/android/car/settings/language/ChildLocalePickerPreferenceController.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.app.LocaleStore;
+
+import java.util.Set;
+
+/** Business logic for handling a secondary page for languages which have multiple locales. */
+public class ChildLocalePickerPreferenceController extends LanguageBasePreferenceController {
+
+    private LocaleStore.LocaleInfo mParentLocaleInfo;
+
+    public ChildLocalePickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /** Set the parent locale info which should be used to provide options in this second screen. */
+    public void setParentLocaleInfo(LocaleStore.LocaleInfo parentLocaleInfo) {
+        mParentLocaleInfo = parentLocaleInfo;
+    }
+
+    @Override
+    protected LocalePreferenceProvider defineLocaleProvider() {
+        Set<LocaleStore.LocaleInfo> mLocaleInfoSet = LocaleStore.getLevelLocales(
+                getContext(),
+                getExclusionSet(),
+                mParentLocaleInfo,
+                /* translatedOnly= */ true);
+
+        return LocalePreferenceProvider.newInstance(getContext(), mLocaleInfoSet,
+                mParentLocaleInfo);
+    }
+}
diff --git a/src/com/android/car/settings/language/LanguageBasePreferenceController.java b/src/com/android/car/settings/language/LanguageBasePreferenceController.java
new file mode 100644
index 0000000..6e626b8
--- /dev/null
+++ b/src/com/android/car/settings/language/LanguageBasePreferenceController.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.app.LocalePicker;
+import com.android.internal.app.LocaleStore;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Common business logic shared between the primary and secondary screens for language selection.
+ */
+public abstract class LanguageBasePreferenceController extends
+        PreferenceController<PreferenceGroup> implements Preference.OnPreferenceClickListener {
+
+    /** Actions that should be taken on selection of the preference. */
+    public interface LocaleSelectedListener {
+        /** Handle selection of locale. */
+        void onLocaleSelected(LocaleStore.LocaleInfo localeInfo);
+    }
+
+    private Set<String> mExclusionSet = new HashSet<>();
+    private LocaleSelectedListener mLocaleSelectedListener;
+
+    public LanguageBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /** Register a listener for when a locale is selected. */
+    public void setLocaleSelectedListener(LocaleSelectedListener listener) {
+        mLocaleSelectedListener = listener;
+    }
+
+    /** Gets the exclusion set. */
+    public Set<String> getExclusionSet() {
+        return mExclusionSet;
+    }
+
+    /** Defines the locale provider that should be used by the given preference controller. */
+    protected abstract LocalePreferenceProvider defineLocaleProvider();
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        // Only populate if the preference group is empty.
+        if (preferenceGroup.getPreferenceCount() == 0) {
+            defineLocaleProvider().populateBasePreference(preferenceGroup, this);
+        }
+    }
+
+    /**
+     * Defines the action that should be taken when a locale with children is clicked. By default,
+     * does nothing.
+     */
+    protected void handleLocaleWithChildren(LocaleStore.LocaleInfo parentLocaleInfo) {
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        LocaleStore.LocaleInfo localeInfo = LocaleUtil.getLocaleArgument(preference);
+
+        // Preferences without a associated locale should not be acted on.
+        if (localeInfo == null) {
+            return false;
+        }
+
+        if (localeInfo.getParent() == null) {
+            // The locale only has the language info. Need to look up the sub-level
+            // locale to get the country/region info as well.
+            Set<LocaleStore.LocaleInfo> subLocales = LocaleStore.getLevelLocales(
+                    getContext(),
+                    getExclusionSet(),
+                    /* parent */ localeInfo,
+                    /* translatedOnly */ true);
+
+            if (subLocales.size() > 1) {
+                handleLocaleWithChildren(localeInfo);
+                return true;
+            }
+
+            if (subLocales.size() < 1) {
+                return false;
+            }
+
+            // If only 1 sublocale, just operate as if there are no sublocales.
+            localeInfo = subLocales.iterator().next();
+        }
+
+        LocalePicker.updateLocale(localeInfo.getLocale());
+        if (mLocaleSelectedListener != null) {
+            mLocaleSelectedListener.onLocaleSelected(localeInfo);
+        }
+        getFragmentController().goBack();
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/language/LanguagePickerFragment.java b/src/com/android/car/settings/language/LanguagePickerFragment.java
new file mode 100644
index 0000000..9d3fd54
--- /dev/null
+++ b/src/com/android/car/settings/language/LanguagePickerFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Fragment for showing the list of languages. */
+public class LanguagePickerFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.language_picker_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/language/LanguagePickerPreferenceController.java b/src/com/android/car/settings/language/LanguagePickerPreferenceController.java
new file mode 100644
index 0000000..fd6d9d4
--- /dev/null
+++ b/src/com/android/car/settings/language/LanguagePickerPreferenceController.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Build;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.app.LocaleStore;
+
+import java.util.Locale;
+import java.util.Set;
+
+/** Business logic for showing and acting on languages in the language settings screen. */
+public class LanguagePickerPreferenceController extends LanguageBasePreferenceController {
+
+    public LanguagePickerPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected LocalePreferenceProvider defineLocaleProvider() {
+        Set<LocaleStore.LocaleInfo> localeInfoSet = LocaleStore.getLevelLocales(
+                getContext(),
+                getExclusionSet(),
+                /* parent= */ null,
+                /* translatedOnly= */ true);
+        maybeAddPseudoLocale(localeInfoSet);
+
+        return LocalePreferenceProvider.newInstance(getContext(), localeInfoSet,
+                /* parentLocale= */ null);
+    }
+
+    @Override
+    protected void handleLocaleWithChildren(LocaleStore.LocaleInfo parentLocaleInfo) {
+        ChildLocalePickerFragment fragment = ChildLocalePickerFragment.newInstance(
+                parentLocaleInfo);
+        fragment.registerChildLocaleSelectedListener(
+                localeInfo -> getFragmentController().goBack());
+        getFragmentController().launchFragment(fragment);
+    }
+
+    /**
+     * Add a pseudo locale in debug build for testing RTL.
+     *
+     * @param localeInfos the set of {@link LocaleStore.LocaleInfo} to which the locale is added.
+     */
+    private void maybeAddPseudoLocale(Set<LocaleStore.LocaleInfo> localeInfos) {
+        if (Build.IS_USERDEBUG) {
+            // The ar-XB pseudo-locale is RTL.
+            localeInfos.add(LocaleStore.getLocaleInfo(new Locale("ar", "XB")));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java b/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
new file mode 100644
index 0000000..a363ad9
--- /dev/null
+++ b/src/com/android/car/settings/language/LanguageSettingsEntryPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settingslib.language.LanguagePickerUtils;
+import com.android.internal.app.LocaleHelper;
+
+import java.util.Locale;
+
+/** Updates the language settings entry summary with the currently configured locale. */
+public class LanguageSettingsEntryPreferenceController extends PreferenceController<Preference> {
+
+    public LanguageSettingsEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        Locale locale = LanguagePickerUtils.getConfiguredLocale();
+        preference.setSummary(
+                LocaleHelper.getDisplayName(locale, locale, /* sentenceCase= */ true));
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+}
diff --git a/src/com/android/car/settings/language/LanguagesAndInputFragment.java b/src/com/android/car/settings/language/LanguagesAndInputFragment.java
new file mode 100644
index 0000000..d815da0
--- /dev/null
+++ b/src/com/android/car/settings/language/LanguagesAndInputFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Groups together settings related to languages and input. */
+public class LanguagesAndInputFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.languages_and_input_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/language/LocalePreferenceProvider.java b/src/com/android/car/settings/language/LocalePreferenceProvider.java
new file mode 100644
index 0000000..7fd21aa
--- /dev/null
+++ b/src/com/android/car/settings/language/LocalePreferenceProvider.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceUtil;
+import com.android.car.settingslib.R;
+import com.android.car.settingslib.language.LanguagePickerUtils;
+import com.android.internal.app.LocaleStore;
+import com.android.internal.app.SuggestedLocaleAdapter;
+
+import java.util.Set;
+
+/**
+ * Provides a wrapper around the {@link SuggestedLocaleAdapter} to create Preferences to populate
+ * the Language Settings screen.
+ */
+public class LocalePreferenceProvider {
+
+    private static final Logger LOG = new Logger(LanguagePickerPreferenceController.class);
+
+    /** Creates a new instance of the preference provider. */
+    public static LocalePreferenceProvider newInstance(Context context,
+            Set<LocaleStore.LocaleInfo> localeInfoSet,
+            @Nullable LocaleStore.LocaleInfo parentLocale) {
+        SuggestedLocaleAdapter adapter = LanguagePickerUtils.createSuggestedLocaleAdapter(context,
+                localeInfoSet, parentLocale);
+        return new LocalePreferenceProvider(context, adapter);
+    }
+
+    /**
+     * Header types are copied from {@link SuggestedLocaleAdapter} in order to be able to
+     * determine the header rows.
+     */
+    @VisibleForTesting
+    static final int TYPE_HEADER_SUGGESTED = 0;
+    @VisibleForTesting
+    static final int TYPE_HEADER_ALL_OTHERS = 1;
+    @VisibleForTesting
+    static final int TYPE_LOCALE = 2;
+
+    private final Context mContext;
+    private SuggestedLocaleAdapter mSuggestedLocaleAdapter;
+
+    @VisibleForTesting
+    LocalePreferenceProvider(Context context, SuggestedLocaleAdapter localeAdapter) {
+        mContext = context;
+        mSuggestedLocaleAdapter = localeAdapter;
+    }
+
+    /**
+     * Populates the base preference group based on the hierarchy provided by this provider.
+     *
+     * @param base     the preference container which will hold the language preferences created by
+     *                 this provider
+     * @param listener the click listener registered to the language/locale preferences contained in
+     *                 the base preference group
+     */
+    public void populateBasePreference(PreferenceGroup base,
+            Preference.OnPreferenceClickListener listener) {
+        /*
+         * LocalePreferenceProvider can give elements to be represented in 2 ways. In the first
+         * way, it simply provides the LocalePreferences which lists the available options. In the
+         * second way, this provider may also provide PreferenceCategories to break up the
+         * options into "Suggested" and "All others". The screen is constructed by taking a look
+         * at the type of Preference that is provided through LocalePreferenceProvider.
+         *
+         * In the first case (no subcategories), preferences are added directly to the base
+         * container. Otherwise, elements are added to the last category that was provided
+         * (stored in "category").
+         */
+        PreferenceCategory category = null;
+        for (int position = 0; position < mSuggestedLocaleAdapter.getCount(); position++) {
+            Preference preference = getPreference(position);
+            if (PreferenceUtil.checkPreferenceType(preference, PreferenceCategory.class)) {
+                category = (PreferenceCategory) preference;
+                base.addPreference(category);
+            } else {
+                preference.setOnPreferenceClickListener(listener);
+                if (category == null) {
+                    base.addPreference(preference);
+                } else {
+                    category.addPreference(preference);
+                }
+            }
+        }
+    }
+
+    /**
+     * Constructs a PreferenceCategory or Preference with locale arguments based on the type of item
+     * provided.
+     */
+    private Preference getPreference(int position) {
+        int type = mSuggestedLocaleAdapter.getItemViewType(position);
+        switch (type) {
+            case TYPE_HEADER_SUGGESTED:
+            case TYPE_HEADER_ALL_OTHERS:
+                PreferenceCategory category = new PreferenceCategory(mContext);
+                category.setTitle(type == TYPE_HEADER_SUGGESTED
+                        ? R.string.language_picker_list_suggested_header
+                        : R.string.language_picker_list_all_header);
+                return category;
+            case TYPE_LOCALE:
+                LocaleStore.LocaleInfo info =
+                        (LocaleStore.LocaleInfo) mSuggestedLocaleAdapter.getItem(position);
+                Preference preference = new Preference(mContext);
+                preference.setTitle(info.getFullNameNative());
+                LocaleUtil.setLocaleArgument(preference, info);
+                return preference;
+            default:
+                LOG.d("Attempting to get unknown type: " + type);
+                throw new IllegalStateException("Unknown locale list item type");
+        }
+    }
+}
diff --git a/src/com/android/car/settings/language/LocaleUtil.java b/src/com/android/car/settings/language/LocaleUtil.java
new file mode 100644
index 0000000..dc29b54
--- /dev/null
+++ b/src/com/android/car/settings/language/LocaleUtil.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+
+import com.android.internal.app.LocaleStore;
+
+import java.util.Locale;
+
+/** Utilities to get/set LocaleInfo from preferences. */
+public class LocaleUtil {
+    /** This key is also used to add Locale to the bundle for {@link ChildLocalePickerFragment}. */
+    public static final String LOCALE_BUNDLE_KEY = "locale_key";
+
+    /** Private constructor to prevent others from instantiating this class. */
+    private LocaleUtil() {
+    }
+
+    /** Extract the locale from the given locale info and add to preference arguments. */
+    public static void setLocaleArgument(Preference preference, LocaleStore.LocaleInfo localeInfo) {
+        preference.getExtras().putSerializable(LOCALE_BUNDLE_KEY, localeInfo.getLocale());
+    }
+
+    /** Extract the localeInfo from the preference, if it exists. */
+    @Nullable
+    public static LocaleStore.LocaleInfo getLocaleArgument(Preference preference) {
+        Locale locale = (Locale) preference.getExtras().getSerializable(LOCALE_BUNDLE_KEY);
+        if (locale == null) {
+            return null;
+        }
+        return LocaleStore.getLocaleInfo(locale);
+    }
+}
diff --git a/src/com/android/car/settings/location/BluetoothScanningPreferenceController.java b/src/com/android/car/settings/location/BluetoothScanningPreferenceController.java
new file mode 100644
index 0000000..1427bfd
--- /dev/null
+++ b/src/com/android/car/settings/location/BluetoothScanningPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Handles Bluetooth location scanning settings.
+ */
+public class BluetoothScanningPreferenceController extends
+        PreferenceController<TwoStatePreference> {
+
+    public BluetoothScanningPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_BLUETOOTH_LE) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0) == 1);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean isBluetoothScanningEnabled = (boolean) newValue;
+        Settings.Global.putInt(getContext().getContentResolver(),
+                Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, isBluetoothScanningEnabled ? 1 : 0);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/location/LocationFooterPreferenceController.java b/src/com/android/car/settings/location/LocationFooterPreferenceController.java
new file mode 100644
index 0000000..d2a1631
--- /dev/null
+++ b/src/com/android/car/settings/location/LocationFooterPreferenceController.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.location.LocationManager;
+
+import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Injects Location Footers into a {@link PreferenceGroup} with a matching key.
+ */
+public class LocationFooterPreferenceController extends PreferenceController<PreferenceGroup> {
+    private static final Logger LOG = new Logger(LocationFooterPreferenceController.class);
+    private static final Intent INJECT_INTENT =
+            new Intent(LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION);
+
+    private List<LocationFooter> mLocationFooters;
+    // List of Location Footer Injectors that will be used to broadcast a
+    // LocationManager.SETTINGS_FOOTER_REMOVED_ACTION intent on controller stop.
+    private final List<ComponentName> mFooterInjectors = new ArrayList<>();
+    private PackageManager mPackageManager;
+
+    public LocationFooterPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPackageManager = context.getPackageManager();
+    }
+
+    @VisibleForTesting
+    void setPackageManager(PackageManager packageManager) {
+        mPackageManager = packageManager;
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mLocationFooters = getInjectedLocationFooters();
+        for (LocationFooter footer : mLocationFooters) {
+            String footerString;
+            try {
+                footerString = mPackageManager
+                        .getResourcesForApplication(footer.mApplicationInfo)
+                        .getString(footer.mFooterStringRes);
+            } catch (PackageManager.NameNotFoundException exception) {
+                LOG.w("Resources not found for application "
+                        + footer.mApplicationInfo.packageName);
+                continue;
+            }
+
+            // For each injected footer: Create a new preference, set the summary
+            // and icon, then inject under the footer preference group.
+            Preference newPreference = new Preference(getContext());
+            newPreference.setSummary(footerString);
+            newPreference.setIcon(R.drawable.ic_settings_about);
+            getPreference().addPreference(newPreference);
+
+            // Send broadcast to the injector announcing a footer has been injected
+            sendBroadcast(footer.mComponentName,
+                    LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION);
+            // Add the component to the list of injectors so that
+            // it receives a broadcast when the footer is removed.
+            mFooterInjectors.add(footer.mComponentName);
+        }
+    }
+
+    /**
+     * Send a {@link LocationManager#SETTINGS_FOOTER_REMOVED_ACTION} broadcast to footer injectors
+     * when LocationSettingsFragment is stopped.
+     */
+    @Override
+    protected void onStopInternal() {
+        // Send broadcast to the footer injectors. Notify them the footer is not visible.
+        for (ComponentName componentName : mFooterInjectors) {
+            sendBroadcast(componentName, LocationManager.SETTINGS_FOOTER_REMOVED_ACTION);
+        }
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        mLocationFooters = null;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        preferenceGroup.setVisible(preferenceGroup.getPreferenceCount() > 0);
+    }
+
+    /**
+     * Return a list of strings provided by ACTION_INJECT_FOOTER broadcast receivers. If there
+     * are no injectors, an immutable emptry list is returned.
+     */
+    private List<LocationFooter> getInjectedLocationFooters() {
+        List<ResolveInfo> resolveInfos = mPackageManager.queryBroadcastReceivers(
+                INJECT_INTENT, PackageManager.GET_META_DATA);
+        if (resolveInfos == null) {
+            LOG.e("Unable to resolve intent " + INJECT_INTENT);
+            return Collections.emptyList();
+        } else {
+            LOG.d("Found broadcast receivers: " + resolveInfos);
+        }
+
+        List<LocationFooter> locationFooters = new ArrayList<>(resolveInfos.size());
+        for (ResolveInfo resolveInfo : resolveInfos) {
+            ActivityInfo activityInfo = resolveInfo.activityInfo;
+            ApplicationInfo appInfo = activityInfo.applicationInfo;
+
+            // If a non-system app tries to inject footer, ignore it
+            if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+                LOG.w("Ignoring attempt to inject footer from a non-system app: " + resolveInfo);
+                continue;
+            }
+
+            // If the injector does not have valid METADATA, ignore it
+            if (activityInfo.metaData == null) {
+                LOG.d("No METADATA in broadcast receiver " + activityInfo.name);
+                continue;
+            }
+
+            // Get the footer text resource id from broadcast receiver's metadata
+            int footerTextRes =
+                    activityInfo.metaData.getInt(LocationManager.METADATA_SETTINGS_FOOTER_STRING);
+            if (footerTextRes == 0) {
+                LOG.w("No mapping of integer exists for "
+                        + LocationManager.METADATA_SETTINGS_FOOTER_STRING);
+                continue;
+            }
+            locationFooters.add(new LocationFooter(footerTextRes, appInfo,
+                    new ComponentName(activityInfo.packageName, activityInfo.name)));
+        }
+        return locationFooters;
+    }
+
+    private void sendBroadcast(ComponentName componentName, String action) {
+        Intent intent = new Intent(action);
+        intent.setComponent(componentName);
+        getContext().sendBroadcast(intent);
+    }
+
+    /**
+     * Contains information related to a footer.
+     */
+    private static class LocationFooter {
+        // The string resource of the footer.
+        @StringRes
+        private final int mFooterStringRes;
+        // Application info of the receiver injecting this footer.
+        private final ApplicationInfo mApplicationInfo;
+        // The component that injected the footer. It must be a receiver of
+        // LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION broadcast.
+        private final ComponentName mComponentName;
+
+        LocationFooter(@StringRes int footerRes, ApplicationInfo appInfo,
+                ComponentName componentName) {
+            mFooterStringRes = footerRes;
+            mApplicationInfo = appInfo;
+            mComponentName = componentName;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/location/LocationScanningFragment.java b/src/com/android/car/settings/location/LocationScanningFragment.java
new file mode 100644
index 0000000..7b7fa5d
--- /dev/null
+++ b/src/com/android/car/settings/location/LocationScanningFragment.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Fragment that hosts Location Scanning settings.
+ */
+public class LocationScanningFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.location_scanning_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/location/LocationScanningPreferenceController.java b/src/com/android/car/settings/location/LocationScanningPreferenceController.java
new file mode 100644
index 0000000..9b7a259
--- /dev/null
+++ b/src/com/android/car/settings/location/LocationScanningPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Hides the Scanning entry if neither Wi-Fi nor Bluetooth are supported.
+ */
+public class LocationScanningPreferenceController extends PreferenceController<Preference> {
+
+    public LocationScanningPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        PackageManager packageManager = getContext().getPackageManager();
+        return (packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI)
+                || packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
+                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+}
diff --git a/src/com/android/car/settings/location/LocationServicesPreferenceController.java b/src/com/android/car/settings/location/LocationServicesPreferenceController.java
new file mode 100644
index 0000000..b17fb20
--- /dev/null
+++ b/src/com/android/car/settings/location/LocationServicesPreferenceController.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.location.SettingInjectorService;
+import android.os.UserHandle;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.location.SettingsInjector;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Injects Location Services into a {@link PreferenceGroup} with a matching key.
+ */
+public class LocationServicesPreferenceController extends PreferenceController<PreferenceGroup> {
+    private static final Logger LOG = new Logger(LocationServicesPreferenceController.class);
+    private static final IntentFilter INTENT_FILTER_INJECTED_SETTING_CHANGED = new IntentFilter(
+            SettingInjectorService.ACTION_INJECTED_SETTING_CHANGED);
+    private SettingsInjector mSettingsInjector;
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            LOG.i("Received injected settings change intent: " + intent);
+            mSettingsInjector.reloadStatusMessages();
+        }
+    };
+
+    public LocationServicesPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSettingsInjector = new SettingsInjector(context);
+    }
+
+    @VisibleForTesting
+    void setSettingsInjector(SettingsInjector injector) {
+        mSettingsInjector = injector;
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        int profileId = UserHandle.USER_CURRENT;
+        List<Preference> injectedSettings = getSortedInjectedPreferences(profileId);
+        for (Preference preference : injectedSettings) {
+            getPreference().addPreference(preference);
+        }
+    }
+
+    /**
+     * Called when the controller is started.
+     */
+    @Override
+    protected void onStartInternal() {
+        getContext().registerReceiver(mReceiver, INTENT_FILTER_INJECTED_SETTING_CHANGED);
+    }
+
+    /**
+     * Called when the controller is stopped.
+     */
+    @Override
+    protected void onStopInternal() {
+        getContext().unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+
+        preferenceGroup.setVisible(preferenceGroup.getPreferenceCount() > 0);
+    }
+
+    private List<Preference> getSortedInjectedPreferences(int profileId) {
+        List<Preference> sortedInjections = new ArrayList<>();
+        Map<Integer, List<Preference>> injections =
+                mSettingsInjector.getInjectedSettings(getContext(), profileId);
+        for (Map.Entry<Integer, List<Preference>> entry : injections.entrySet()) {
+            sortedInjections.addAll(entry.getValue());
+        }
+        Collections.sort(sortedInjections);
+        return sortedInjections;
+    }
+}
diff --git a/src/com/android/car/settings/location/LocationSettingsActivity.java b/src/com/android/car/settings/location/LocationSettingsActivity.java
new file mode 100644
index 0000000..732ab29
--- /dev/null
+++ b/src/com/android/car/settings/location/LocationSettingsActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.location;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/**
+ * Starts {@link LocationSettingsFragment} in a separate activity to help with back navigation flow.
+ */
+public class LocationSettingsActivity extends BaseCarSettingsActivity {
+
+    @Nullable
+    @Override
+    protected Fragment getInitialFragment() {
+        return new LocationSettingsFragment();
+    }
+}
diff --git a/src/com/android/car/settings/location/LocationSettingsFragment.java b/src/com/android/car/settings/location/LocationSettingsFragment.java
new file mode 100644
index 0000000..91591e9
--- /dev/null
+++ b/src/com/android/car/settings/location/LocationSettingsFragment.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.location.LocationManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.widget.Switch;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.Utils;
+
+/**
+ * Main page that hosts Location related preferences.
+ */
+public class LocationSettingsFragment extends SettingsFragment {
+    private static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED =
+            new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
+
+    private LocationManager mLocationManager;
+    private Switch mLocationSwitch;
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mLocationSwitch.setChecked(mLocationManager.isLocationEnabled());
+        }
+    };
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.location_settings_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_toggle;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mLocationSwitch = requireActivity().findViewById(R.id.toggle_switch);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        requireContext().registerReceiver(mReceiver, INTENT_FILTER_LOCATION_MODE_CHANGED);
+        updateLocationSwitch();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        requireContext().unregisterReceiver(mReceiver);
+    }
+
+    // Update the location master switch's state upon starting the fragment.
+    private void updateLocationSwitch() {
+        mLocationSwitch.setChecked(mLocationManager.isLocationEnabled());
+        mLocationSwitch.setOnCheckedChangeListener((buttonView, isChecked) ->
+                Utils.updateLocationEnabled(requireContext(), isChecked, UserHandle.myUserId(),
+                        Settings.Secure.LOCATION_CHANGER_SYSTEM_SETTINGS));
+    }
+}
diff --git a/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceController.java b/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceController.java
new file mode 100644
index 0000000..882517c
--- /dev/null
+++ b/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceController.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.app.Service;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.location.LocationManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Disables Recent Location Requests entry when location is off.
+ */
+public class RecentLocationRequestsEntryPreferenceController extends
+        PreferenceController<Preference> {
+
+    private static final IntentFilter INTENT_FILTER_LOCATION_MODE_CHANGED =
+            new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
+
+    private final LocationManager mLocationManager;
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            refreshUi();
+        }
+    };
+
+    public RecentLocationRequestsEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mLocationManager = (LocationManager) getContext().getSystemService(
+                Service.LOCATION_SERVICE);
+    }
+
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setEnabled(mLocationManager.isLocationEnabled());
+    }
+
+    @Override
+    protected void onStartInternal() {
+        getContext().registerReceiver(mReceiver, INTENT_FILTER_LOCATION_MODE_CHANGED);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        getContext().unregisterReceiver(mReceiver);
+    }
+}
diff --git a/src/com/android/car/settings/location/RecentLocationRequestsFragment.java b/src/com/android/car/settings/location/RecentLocationRequestsFragment.java
new file mode 100644
index 0000000..592225a
--- /dev/null
+++ b/src/com/android/car/settings/location/RecentLocationRequestsFragment.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Shows a list of applications that have requested location recently.
+ */
+public class RecentLocationRequestsFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.location_recent_requests_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/location/RecentLocationRequestsPreferenceController.java b/src/com/android/car/settings/location/RecentLocationRequestsPreferenceController.java
new file mode 100644
index 0000000..8253dec
--- /dev/null
+++ b/src/com/android/car/settings/location/RecentLocationRequestsPreferenceController.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.ApplicationDetailsFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.location.RecentLocationApps;
+import com.android.settingslib.location.RecentLocationApps.Request;
+
+import java.util.List;
+
+/**
+ * Displays all apps that have requested location recently.
+ */
+public class RecentLocationRequestsPreferenceController extends
+        PreferenceController<PreferenceGroup> {
+    private RecentLocationApps mRecentLocationApps;
+    // This list will always be sorted by most recent first.
+    private List<Request> mRecentLocationRequests;
+
+    public RecentLocationRequestsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mRecentLocationApps = new RecentLocationApps(context);
+    }
+
+    @VisibleForTesting
+    void setRecentLocationApps(RecentLocationApps apps) {
+        mRecentLocationApps = apps;
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup group) {
+        if (mRecentLocationRequests == null) {
+            // First time displaying a list.
+            mRecentLocationRequests =
+                    mRecentLocationApps.getAppListSorted(/* showSystemApps= */ true);
+        } else {
+            // If preferences were already added to the screen, get a new list
+            // and only update the displayed app-list if there is a difference.
+            List<Request> newRequests = mRecentLocationApps.getAppListSorted(true);
+            // listsEqual compares by elements' package names only, using List.equals() will
+            // not work because it will always return false since it also compares the time.
+            if (listsEqual(newRequests, mRecentLocationRequests)) {
+                return;
+            }
+            mRecentLocationRequests = newRequests;
+        }
+        if (mRecentLocationRequests.isEmpty()) {
+            Preference emptyMessagePref = new Preference(getContext());
+            emptyMessagePref.setTitle(R.string.location_settings_recent_requests_empty_message);
+            group.addPreference(emptyMessagePref);
+        } else {
+            group.removeAll();
+            for (Request request : mRecentLocationRequests) {
+                Preference appPref = createPreference(request);
+                group.addPreference(appPref);
+            }
+        }
+    }
+
+    private Preference createPreference(Request request) {
+        Preference pref = new Preference(getContext());
+        pref.setSummary(request.contentDescription);
+        pref.setIcon(request.icon);
+        pref.setTitle(request.label);
+        Intent intent = new Intent();
+        intent.setPackage(request.packageName);
+        ResolveInfo resolveInfo = getContext().getPackageManager().resolveActivity(intent,
+                PackageManager.MATCH_DEFAULT_ONLY);
+        pref.setOnPreferenceClickListener(p -> {
+            getFragmentController().launchFragment(
+                    ApplicationDetailsFragment.getInstance(resolveInfo.activityInfo.packageName));
+            return true;
+        });
+        return pref;
+    }
+
+    /**
+     * Compares two {@link Request} lists by the elements' package names.
+     *
+     * @param a The first list.
+     * @param b The second list.
+     * @return {@code true} if both lists have the same elements (by package name) and order.
+     */
+    private boolean listsEqual(List<Request> a, List<Request> b) {
+        if (a.size() != b.size()) {
+            return false;
+        }
+        for (int i = 0; i < a.size(); i++) {
+            if (!a.get(i).packageName.equals(b.get(i).packageName)) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/location/WifiScanningPreferenceController.java b/src/com/android/car/settings/location/WifiScanningPreferenceController.java
new file mode 100644
index 0000000..6a8031a
--- /dev/null
+++ b/src/com/android/car/settings/location/WifiScanningPreferenceController.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Handles Wi-Fi location scanning settings.
+ */
+public class WifiScanningPreferenceController extends PreferenceController<TwoStatePreference> {
+
+    public WifiScanningPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)
+                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean isWifiScanningEnabled = (boolean) newValue;
+        Settings.Global.putInt(getContext().getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, isWifiScanningEnabled ? 1 : 0);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/network/AddMobileNetworkPreferenceController.java b/src/com/android/car/settings/network/AddMobileNetworkPreferenceController.java
new file mode 100644
index 0000000..22d5d83
--- /dev/null
+++ b/src/com/android/car/settings/network/AddMobileNetworkPreferenceController.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static android.telephony.euicc.EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION;
+import static android.telephony.euicc.EuiccManager.EXTRA_FORCE_PROVISION;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.telephony.euicc.EuiccManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.List;
+
+/**
+ * Controls the visibility of the preference to add another mobile network based on if there is an
+ * activity to handle that intent.
+ */
+public class AddMobileNetworkPreferenceController extends PreferenceController<Preference> {
+
+    @VisibleForTesting
+    static final Intent ADD_NETWORK_INTENT = new Intent(
+            ACTION_PROVISION_EMBEDDED_SUBSCRIPTION).putExtra(EXTRA_FORCE_PROVISION, true);
+
+    public AddMobileNetworkPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        EuiccManager euiccManager = getContext().getSystemService(EuiccManager.class);
+        if (!euiccManager.isEnabled()) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+
+        List<ResolveInfo> resolveInfos = getContext().getPackageManager().queryIntentActivities(
+                ADD_NETWORK_INTENT, /* flags= */ 0);
+        if (resolveInfos.isEmpty()) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+
+        return AVAILABLE;
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        getContext().startActivity(ADD_NETWORK_INTENT);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java b/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
new file mode 100644
index 0000000..e0e8e3e
--- /dev/null
+++ b/src/com/android/car/settings/network/MobileDataTogglePreferenceController.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Business logic to control the toggle that enables/disables usage of mobile data. Does not have
+ * support for multi-sim.
+ */
+public class MobileDataTogglePreferenceController extends
+        PreferenceController<TwoStatePreference> implements
+        MobileNetworkUpdateManager.MobileNetworkUpdateListener {
+
+    @VisibleForTesting
+    static final String DISABLE_DIALOG_TAG = ConfirmationDialogFragment.TAG + "_DisableData";
+    @VisibleForTesting
+    static final String ENABLE_MULTISIM_DIALOG_TAG =
+            ConfirmationDialogFragment.TAG + "_EnableMultisim";
+
+    private final SubscriptionManager mSubscriptionManager;
+    private TelephonyManager mTelephonyManager;
+    private int mSubId;
+
+    private final ContentObserver mMobileDataChangeObserver = new ContentObserver(
+            new Handler(Looper.getMainLooper())) {
+        @Override
+        public void onChange(boolean selfChange) {
+            super.onChange(selfChange);
+            refreshUi();
+        }
+    };
+
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmDisableListener =
+            arguments -> setMobileDataEnabled(
+                    /* enabled= */ false, /* disableOtherSubscriptions= */ false);
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmMultiSimListener =
+            arguments -> setMobileDataEnabled(
+                    /* enabled= */ true, /* disableOtherSubscriptions= */ true);
+    private final ConfirmationDialogFragment.RejectListener mRejectRefreshListener =
+            arguments -> refreshUi();
+
+    public MobileDataTogglePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSubscriptionManager = getContext().getSystemService(SubscriptionManager.class);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    /** Sets the subscription id to be controlled by this controller. */
+    public void setSubId(int subId) {
+        mSubId = subId;
+        mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID ? AVAILABLE
+                : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        DISABLE_DIALOG_TAG), mConfirmDisableListener, mRejectRefreshListener);
+
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ENABLE_MULTISIM_DIALOG_TAG), mConfirmMultiSimListener,
+                mRejectRefreshListener);
+    }
+
+    @Override
+    protected void onStartInternal() {
+        if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            getContext().getContentResolver().registerContentObserver(getObservableUri(mSubId),
+                    /* notifyForDescendants= */ false, mMobileDataChangeObserver);
+        }
+    }
+
+    @Override
+    protected void onStopInternal() {
+        if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            getContext().getContentResolver().unregisterContentObserver(mMobileDataChangeObserver);
+        }
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setEnabled(!isOpportunistic());
+        preference.setChecked(
+                mTelephonyManager != null ? mTelephonyManager.isDataEnabled() : false);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean newToggleValue = (boolean) newValue;
+        boolean isMultiSim = (mTelephonyManager.getSimCount() > 1);
+        int defaultSubId = mSubscriptionManager.getDefaultDataSubscriptionId();
+        boolean needToDisableOthers = mSubscriptionManager.isActiveSubscriptionId(defaultSubId)
+                && mSubId != defaultSubId;
+
+        if (!newToggleValue && !isMultiSim) {
+            getFragmentController().showDialog(getConfirmDataDisableDialog(), DISABLE_DIALOG_TAG);
+        } else if (newToggleValue && isMultiSim && needToDisableOthers) {
+            getFragmentController().showDialog(getConfirmMultisimEnableDialog(),
+                    ENABLE_MULTISIM_DIALOG_TAG);
+        } else {
+            setMobileDataEnabled(newToggleValue, /* disableOtherSubscriptions= */ false);
+        }
+        return false;
+    }
+
+    @Override
+    public void onMobileNetworkUpdated(int subId) {
+        setSubId(subId);
+        refreshUi();
+    }
+
+    private void setMobileDataEnabled(boolean enabled, boolean disableOtherSubscriptions) {
+        NetworkUtils.setMobileDataEnabled(getContext(), mSubId, enabled, disableOtherSubscriptions);
+        refreshUi();
+    }
+
+    private boolean isOpportunistic() {
+        SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
+        return info != null && info.isOpportunistic();
+    }
+
+    private Uri getObservableUri(int subId) {
+        Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
+        if (TelephonyManager.from(getContext()).getSimCount() != 1) {
+            uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId);
+        }
+        return uri;
+    }
+
+    private ConfirmationDialogFragment getConfirmDataDisableDialog() {
+        return new ConfirmationDialogFragment.Builder(getContext())
+                .setMessage(R.string.confirm_mobile_data_disable)
+                .setPositiveButton(android.R.string.ok, mConfirmDisableListener)
+                .setNegativeButton(android.R.string.cancel, mRejectRefreshListener)
+                .build();
+    }
+
+    private ConfirmationDialogFragment getConfirmMultisimEnableDialog() {
+        SubscriptionInfo previousSubInfo =
+                mSubscriptionManager.getDefaultDataSubscriptionInfo();
+        SubscriptionInfo newSubInfo =
+                mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
+
+        String previousName = (previousSubInfo == null)
+                ? getContext().getResources().getString(R.string.sim_selection_required_pref)
+                : previousSubInfo.getDisplayName().toString();
+
+        String newName = (newSubInfo == null)
+                ? getContext().getResources().getString(R.string.sim_selection_required_pref)
+                : newSubInfo.getDisplayName().toString();
+
+        return new ConfirmationDialogFragment.Builder(getContext())
+                .setTitle(getContext().getString(R.string.sim_change_data_title, newName))
+                .setMessage(getContext().getString(R.string.sim_change_data_message,
+                        newName, previousName))
+                .setPositiveButton(getContext().getString(R.string.sim_change_data_ok, newName),
+                        mConfirmMultiSimListener)
+                .setNegativeButton(android.R.string.cancel, mRejectRefreshListener)
+                .build();
+    }
+}
diff --git a/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java b/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
new file mode 100644
index 0000000..534024b
--- /dev/null
+++ b/src/com/android/car/settings/network/MobileNetworkEntryPreferenceController.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.os.UserManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.List;
+
+/** Controls the preference for accessing mobile network settings. */
+public class MobileNetworkEntryPreferenceController extends
+        PreferenceController<Preference> implements
+        SubscriptionsChangeListener.SubscriptionsChangeAction {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final SubscriptionsChangeListener mChangeListener;
+    private final SubscriptionManager mSubscriptionManager;
+    private final ConnectivityManager mConnectivityManager;
+    private final TelephonyManager mTelephonyManager;
+
+    public MobileNetworkEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mChangeListener = new SubscriptionsChangeListener(context, /* action= */ this);
+        mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+        mConnectivityManager = context.getSystemService(ConnectivityManager.class);
+        mTelephonyManager = context.getSystemService(TelephonyManager.class);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mChangeListener.start();
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mChangeListener.stop();
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!NetworkUtils.hasMobileNetwork(mConnectivityManager)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+
+        boolean isNotAdmin = !mCarUserManagerHelper.getCurrentProcessUserInfo().isAdmin();
+        boolean hasRestriction = mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
+        if (isNotAdmin || hasRestriction) {
+            return DISABLED_FOR_USER;
+        }
+        return AVAILABLE;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        List<SubscriptionInfo> subs = SubscriptionUtils.getAvailableSubscriptions(
+                mSubscriptionManager, mTelephonyManager);
+        preference.setEnabled(!subs.isEmpty());
+        preference.setSummary(getSummary(subs));
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        List<SubscriptionInfo> subs = SubscriptionUtils.getAvailableSubscriptions(
+                mSubscriptionManager, mTelephonyManager);
+        if (subs.isEmpty()) {
+            return true;
+        }
+
+        if (subs.size() == 1) {
+            getFragmentController().launchFragment(
+                    MobileNetworkFragment.newInstance(subs.get(0).getSubscriptionId()));
+        } else {
+            getFragmentController().launchFragment(new MobileNetworkListFragment());
+        }
+        return true;
+    }
+
+    @Override
+    public void onSubscriptionsChanged() {
+        refreshUi();
+    }
+
+    private CharSequence getSummary(List<SubscriptionInfo> subs) {
+        int count = subs.size();
+        if (subs.isEmpty()) {
+            return null;
+        } else if (count == 1) {
+            return subs.get(0).getDisplayName();
+        } else {
+            return getContext().getResources().getQuantityString(
+                    R.plurals.mobile_network_summary_count, count, count);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/network/MobileNetworkFragment.java b/src/com/android/car/settings/network/MobileNetworkFragment.java
new file mode 100644
index 0000000..7411886
--- /dev/null
+++ b/src/com/android/car/settings/network/MobileNetworkFragment.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.internal.util.CollectionUtils;
+
+import com.google.android.collect.Lists;
+
+import java.util.List;
+
+/** Mobile network settings homepage. */
+public class MobileNetworkFragment extends SettingsFragment implements
+        MobileNetworkUpdateManager.MobileNetworkUpdateListener {
+
+    @VisibleForTesting
+    static final String ARG_NETWORK_SUB_ID = "network_sub_id";
+
+    private SubscriptionManager mSubscriptionManager;
+    private MobileNetworkUpdateManager mMobileNetworkUpdateManager;
+    private CharSequence mTitle;
+
+    /**
+     * Creates a new instance of the {@link MobileNetworkFragment}, which shows settings related to
+     * the given {@code subId}.
+     */
+    public static MobileNetworkFragment newInstance(int subId) {
+        MobileNetworkFragment fragment = new MobileNetworkFragment();
+        Bundle args = new Bundle();
+        args.putInt(ARG_NETWORK_SUB_ID, subId);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.mobile_network_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+
+        int subId = getArguments() != null
+                ? getArguments().getInt(ARG_NETWORK_SUB_ID, MobileNetworkUpdateManager.SUB_ID_NULL)
+                : MobileNetworkUpdateManager.SUB_ID_NULL;
+        mMobileNetworkUpdateManager = new MobileNetworkUpdateManager(context, subId);
+        getLifecycle().addObserver(mMobileNetworkUpdateManager);
+
+        List<MobileNetworkUpdateManager.MobileNetworkUpdateListener> listeners =
+                Lists.newArrayList(
+                        this,
+                        use(MobileDataTogglePreferenceController.class,
+                                R.string.pk_mobile_data_toggle),
+                        use(RoamingPreferenceController.class, R.string.pk_mobile_roaming_toggle));
+        for (MobileNetworkUpdateManager.MobileNetworkUpdateListener listener : listeners) {
+            mMobileNetworkUpdateManager.registerListener(listener);
+        }
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        if (mTitle != null) {
+            TextView titleView = requireActivity().findViewById(R.id.title);
+            titleView.setText(mTitle);
+        }
+    }
+
+    @Override
+    public void onMobileNetworkUpdated(int subId) {
+        SubscriptionInfo info = null;
+
+        if (subId != MobileNetworkUpdateManager.SUB_ID_NULL) {
+            for (SubscriptionInfo subscriptionInfo :
+                    mSubscriptionManager.getSelectableSubscriptionInfoList()) {
+                if (subscriptionInfo.getSubscriptionId() == subId) {
+                    info = subscriptionInfo;
+                }
+            }
+        }
+
+        if (info == null && !CollectionUtils.isEmpty(
+                mSubscriptionManager.getActiveSubscriptionInfoList())) {
+            info = mSubscriptionManager.getActiveSubscriptionInfoList().get(0);
+        }
+
+        if (info != null) {
+            TextView titleView = requireActivity().findViewById(R.id.title);
+
+            // It is possible for this to be called before the activity is fully created. If so,
+            // cache the value so that it can be constructed onActivityCreated.
+            mTitle = info.getDisplayName();
+            if (titleView != null) {
+                titleView.setText(mTitle);
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/network/MobileNetworkListFragment.java b/src/com/android/car/settings/network/MobileNetworkListFragment.java
new file mode 100644
index 0000000..4ec94fd
--- /dev/null
+++ b/src/com/android/car/settings/network/MobileNetworkListFragment.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Shows the list of mobile networks if there are multiple. Clicking into any one of these mobile
+ * networks shows {@link MobileNetworkFragment} for that specific mobile network.
+ */
+public class MobileNetworkListFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.mobile_network_list_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/network/MobileNetworkListPreferenceController.java b/src/com/android/car/settings/network/MobileNetworkListPreferenceController.java
new file mode 100644
index 0000000..c4fb438
--- /dev/null
+++ b/src/com/android/car/settings/network/MobileNetworkListPreferenceController.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.List;
+
+/** Business logic to populate the list of available mobile networks. */
+public class MobileNetworkListPreferenceController extends
+        PreferenceController<PreferenceGroup> implements
+        SubscriptionsChangeListener.SubscriptionsChangeAction {
+
+    private final SubscriptionsChangeListener mSubscriptionsChangeListener;
+    private final SubscriptionManager mSubscriptionManager;
+    private final TelephonyManager mTelephonyManager;
+
+    public MobileNetworkListPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+
+        mSubscriptionsChangeListener = new SubscriptionsChangeListener(context, /* action= */ this);
+        mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+        mTelephonyManager = context.getSystemService(TelephonyManager.class);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mSubscriptionsChangeListener.start();
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mSubscriptionsChangeListener.stop();
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        preferenceGroup.removeAll();
+
+        List<SubscriptionInfo> subscriptions = SubscriptionUtils.getAvailableSubscriptions(
+                mSubscriptionManager, mTelephonyManager);
+        for (SubscriptionInfo info : subscriptions) {
+            preferenceGroup.addPreference(createPreference(info));
+        }
+    }
+
+    @Override
+    public void onSubscriptionsChanged() {
+        refreshUi();
+    }
+
+    private Preference createPreference(SubscriptionInfo info) {
+        Preference preference = new Preference(getContext());
+        preference.setTitle(info.getDisplayName());
+        preference.setKey(Integer.toString(info.getSubscriptionId()));
+
+        boolean isEsim = info.isEmbedded();
+        if (mSubscriptionManager.isActiveSubscriptionId(info.getSubscriptionId())) {
+            preference.setSummary(isEsim ? R.string.mobile_network_active_esim
+                    : R.string.mobile_network_active_sim);
+        } else {
+            preference.setSummary(isEsim ? R.string.mobile_network_inactive_esim
+                    : R.string.mobile_network_inactive_sim);
+        }
+
+        preference.setOnPreferenceClickListener(pref -> {
+            MobileNetworkFragment fragment = MobileNetworkFragment.newInstance(
+                    info.getSubscriptionId());
+            getFragmentController().launchFragment(fragment);
+            return true;
+        });
+
+        return preference;
+    }
+}
diff --git a/src/com/android/car/settings/network/MobileNetworkUpdateManager.java b/src/com/android/car/settings/network/MobileNetworkUpdateManager.java
new file mode 100644
index 0000000..4b9a688
--- /dev/null
+++ b/src/com/android/car/settings/network/MobileNetworkUpdateManager.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.android.car.settings.common.Logger;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Listens to potential changes in subscription id and updates registered {@link
+ * MobileNetworkUpdateManager.MobileNetworkUpdateListener} with the new subscription id.
+ */
+public class MobileNetworkUpdateManager implements DefaultLifecycleObserver {
+
+    /** Value to represent that the subscription id hasn't been computed yet. */
+    static final int SUB_ID_NULL = Integer.MIN_VALUE;
+    private static final Logger LOG = new Logger(MobileNetworkUpdateManager.class);
+
+    private final List<MobileNetworkUpdateListener> mListeners = new ArrayList<>();
+    private final PhoneChangeReceiver mPhoneChangeReceiver;
+    private final SubscriptionManager mSubscriptionManager;
+    private List<SubscriptionInfo> mSubscriptionInfos;
+    private int mCurSubscriptionId;
+
+    private final SubscriptionManager.OnSubscriptionsChangedListener
+            mOnSubscriptionsChangeListener =
+            new SubscriptionManager.OnSubscriptionsChangedListener() {
+                @Override
+                public void onSubscriptionsChanged() {
+                    if (!Objects.equals(mSubscriptionInfos,
+                            mSubscriptionManager.getActiveSubscriptionInfoList(
+                                    /* userVisibleOnly= */ true))) {
+                        updateSubscriptions(/* forceRefresh= */ false);
+                    }
+                }
+            };
+
+    public MobileNetworkUpdateManager(Context context, int subId) {
+        mCurSubscriptionId = subId;
+        mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+        mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
+
+        mPhoneChangeReceiver = new PhoneChangeReceiver(context, () -> {
+            if (mCurSubscriptionId != SUB_ID_NULL) {
+                // When the radio changes (ex: CDMA->GSM), refresh the fragment.
+                // This is very rare.
+                LOG.d("Radio change (i.e. CDMA->GSM) received for valid subscription id: "
+                        + mCurSubscriptionId);
+                updateReceived(mCurSubscriptionId);
+            }
+        });
+    }
+
+    /**
+     * Registers a listener that will receive necessary updates to changes in the mobile network.
+     */
+    public void registerListener(MobileNetworkUpdateListener listener) {
+        mListeners.add(listener);
+    }
+
+    /**
+     * Unregisters a listener that was previously added via
+     * {@link MobileNetworkUpdateManager#registerListener(MobileNetworkUpdateListener)}. The
+     * provided argument must refer to the same object that was registered in order to securely be
+     * unregistered.
+     */
+    public void unregisterListener(MobileNetworkUpdateListener listener) {
+        mListeners.remove(listener);
+    }
+
+    @Override
+    public void onCreate(@NonNull LifecycleOwner owner) {
+        updateSubscriptions(/* forceRefresh= */ true);
+    }
+
+    @Override
+    public final void onStart(@NonNull LifecycleOwner owner) {
+        mPhoneChangeReceiver.register();
+        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
+    }
+
+    @Override
+    public final void onStop(@NonNull LifecycleOwner owner) {
+        mPhoneChangeReceiver.unregister();
+        mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
+    }
+
+    private void updateSubscriptions(boolean forceRefresh) {
+        LOG.d("updateSubscriptions called");
+        mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
+        int subId = getSubscriptionId();
+        if (forceRefresh || mCurSubscriptionId != subId) {
+            LOG.d("updateSubscriptions updated subscription id! prev: " + mCurSubscriptionId
+                    + " new: " + subId);
+            mCurSubscriptionId = subId;
+            updateReceived(mCurSubscriptionId);
+        }
+    }
+
+    private void updateReceived(int subId) {
+        for (MobileNetworkUpdateListener listener : mListeners) {
+            listener.onMobileNetworkUpdated(subId);
+        }
+    }
+
+    private int getSubscriptionId() {
+        SubscriptionInfo subscription = getSubscription();
+        return subscription != null ? subscription.getSubscriptionId()
+                : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+    }
+
+    /**
+     * First, find a subscription with the id provided at construction if it exists. If not, just
+     * return the first one in the mSubscriptionInfos list since it is already sorted by sim slot.
+     */
+    private SubscriptionInfo getSubscription() {
+        if (mCurSubscriptionId != SUB_ID_NULL) {
+            for (SubscriptionInfo subscriptionInfo :
+                    mSubscriptionManager.getSelectableSubscriptionInfoList()) {
+                if (subscriptionInfo.getSubscriptionId() == mCurSubscriptionId) {
+                    return subscriptionInfo;
+                }
+            }
+        }
+
+        return CollectionUtils.isEmpty(mSubscriptionInfos) ? null : mSubscriptionInfos.get(0);
+    }
+
+    /**
+     * Interface used by components listening to subscription id updates from {@link
+     * MobileNetworkUpdateManager}.
+     */
+    public interface MobileNetworkUpdateListener {
+        /** Called when there is a new subscription id that other components should be aware of. */
+        void onMobileNetworkUpdated(int subId);
+    }
+
+    /** Broadcast receiver which observes changes in radio technology (i.e. CDMA vs GSM). */
+    private static class PhoneChangeReceiver extends BroadcastReceiver {
+        private static final IntentFilter RADIO_TECHNOLOGY_CHANGED_FILTER = new IntentFilter(
+                TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
+
+        private Context mContext;
+        private PhoneChangeReceiver.OnChangeAction mOnChangeAction;
+
+        /** Action to take when receiver receives a non sticky broadcast intent. */
+        private interface OnChangeAction {
+            void onReceive();
+        }
+
+        PhoneChangeReceiver(Context context, PhoneChangeReceiver.OnChangeAction onChangeAction) {
+            mContext = context;
+            mOnChangeAction = onChangeAction;
+        }
+
+        void register() {
+            mContext.registerReceiver(this, RADIO_TECHNOLOGY_CHANGED_FILTER);
+        }
+
+        void unregister() {
+            mContext.unregisterReceiver(this);
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (!isInitialStickyBroadcast()) {
+                mOnChangeAction.onReceive();
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/network/NetworkAndInternetFragment.java b/src/com/android/car/settings/network/NetworkAndInternetFragment.java
new file mode 100644
index 0000000..8dc5e8a
--- /dev/null
+++ b/src/com/android/car/settings/network/NetworkAndInternetFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 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.car.settings.network;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Fragment for all wifi/mobile data connectivity preferences. */
+public class NetworkAndInternetFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.network_and_internet_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/network/NetworkUtils.java b/src/com/android/car/settings/network/NetworkUtils.java
new file mode 100644
index 0000000..f8aa104
--- /dev/null
+++ b/src/com/android/car/settings/network/NetworkUtils.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import java.util.List;
+
+/** Provides helpful utilities surrounding network related tasks. */
+public final class NetworkUtils {
+
+    private NetworkUtils() {
+    }
+
+    /** Returns {@code true} if device has a mobile network. */
+    public static boolean hasMobileNetwork(ConnectivityManager connectivityManager) {
+        Network[] networks = connectivityManager.getAllNetworks();
+        for (Network network : networks) {
+            NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
+            if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Returns {@code true} if device has a sim card. */
+    public static boolean hasSim(TelephonyManager telephonyManager) {
+        int simState = telephonyManager.getSimState();
+
+        // Note that pulling out the SIM card returns UNKNOWN, not ABSENT.
+        return simState != TelephonyManager.SIM_STATE_ABSENT
+                && simState != TelephonyManager.SIM_STATE_UNKNOWN;
+    }
+
+    /**
+     * Sets the mobile data enabled state based on {@code enabled} for the subscription defined by
+     * {@code subId}. If {@code disableOtherSubscriptions} is set, other subscriptions will be
+     * disabled unless they are opportunistic.
+     */
+    public static void setMobileDataEnabled(Context context, int subId, boolean enabled,
+            boolean disableOtherSubscriptions) {
+        TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class)
+                .createForSubscriptionId(subId);
+        SubscriptionManager subscriptionManager = context.getSystemService(
+                SubscriptionManager.class);
+        telephonyManager.setDataEnabled(enabled);
+
+        if (disableOtherSubscriptions) {
+            List<SubscriptionInfo> subInfoList =
+                    subscriptionManager.getActiveSubscriptionInfoList();
+            if (subInfoList != null) {
+                for (SubscriptionInfo subInfo : subInfoList) {
+                    // We never disable mobile data for opportunistic subscriptions.
+                    if (subInfo.getSubscriptionId() != subId && !subInfo.isOpportunistic()) {
+                        context.getSystemService(TelephonyManager.class).createForSubscriptionId(
+                                subInfo.getSubscriptionId()).setDataEnabled(false);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/network/RoamingPreferenceController.java b/src/com/android/car/settings/network/RoamingPreferenceController.java
new file mode 100644
index 0000000..8fba750
--- /dev/null
+++ b/src/com/android/car/settings/network/RoamingPreferenceController.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PersistableBundle;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic for toggling the roaming state. */
+// TODO: This preference should be available but unsearchable if subscription id is invalid.
+public class RoamingPreferenceController extends PreferenceController<TwoStatePreference> implements
+        MobileNetworkUpdateManager.MobileNetworkUpdateListener {
+
+    private final CarrierConfigManager mCarrierConfigManager;
+    private final RoamingStateChangeObserver mRoamingStateChangeObserver;
+    private TelephonyManager mTelephonyManager;
+    private int mSubId;
+
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmListener =
+            arguments -> setRoamingEnabled(true);
+
+    public RoamingPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
+        mRoamingStateChangeObserver = new RoamingStateChangeObserver(
+                new Handler(Looper.getMainLooper()), this::refreshUi);
+        mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    /** Set the subscription id for which the roaming toggle should take effect. */
+    public void setSubId(int subId) {
+        mSubId = subId;
+        mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mRoamingStateChangeObserver.register(getContext(), mSubId);
+
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG),
+                mConfirmListener,
+                /* rejectListener= */ null);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mRoamingStateChangeObserver.unregister(getContext());
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setEnabled(mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        preference.setChecked(
+                mTelephonyManager != null ? mTelephonyManager.isDataRoamingEnabled() : false);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean isEnabled = (boolean) newValue;
+        if (isEnabled && isDialogNeeded()) {
+            getFragmentController().showDialog(getRoamingAlertDialog(),
+                    ConfirmationDialogFragment.TAG);
+            return false;
+        }
+
+        setRoamingEnabled(isEnabled);
+        return true;
+    }
+
+    @Override
+    public void onMobileNetworkUpdated(int subId) {
+        setSubId(subId);
+        refreshUi();
+    }
+
+    private void setRoamingEnabled(boolean enabled) {
+        mTelephonyManager.setDataRoamingEnabled(enabled);
+        refreshUi();
+    }
+
+    private boolean isDialogNeeded() {
+        boolean isRoamingEnabled = mTelephonyManager.isDataRoamingEnabled();
+        PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
+
+        // Need dialog if we need to turn on roaming and the roaming charge indication is allowed.
+        if (!isRoamingEnabled && (carrierConfig == null || !carrierConfig.getBoolean(
+                CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL))) {
+            return true;
+        }
+        return false;
+    }
+
+    private ConfirmationDialogFragment getRoamingAlertDialog() {
+        return new ConfirmationDialogFragment.Builder(getContext())
+                .setTitle(R.string.roaming_alert_title)
+                .setMessage(R.string.roaming_warning)
+                .setPositiveButton(android.R.string.yes, mConfirmListener)
+                .setNegativeButton(android.R.string.no, /* rejectListener= */ null)
+                .build();
+    }
+
+    /** Observer that listens to data roaming change. */
+    private static class RoamingStateChangeObserver extends ContentObserver {
+
+        private Runnable mChangeListener;
+
+        RoamingStateChangeObserver(Handler handler, Runnable changeListener) {
+            super(handler);
+            mChangeListener = changeListener;
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            super.onChange(selfChange);
+            mChangeListener.run();
+        }
+
+        /** Register this observer to listen for updates to {@link Settings.Global#DATA_ROAMING}. */
+        public void register(Context context, int subId) {
+            Uri uri = Settings.Global.getUriFor(Settings.Global.DATA_ROAMING);
+            if (TelephonyManager.from(context).getSimCount() != 1) {
+                uri = Settings.Global.getUriFor(Settings.Global.DATA_ROAMING + subId);
+            }
+            context.getContentResolver().registerContentObserver(uri,
+                    /* notifyForDescendants= */ false, /* observer= */ this);
+        }
+
+        /** Unregister this observer. */
+        public void unregister(Context context) {
+            context.getContentResolver().unregisterContentObserver(/* observer= */ this);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/network/SubscriptionUtils.java b/src/com/android/car/settings/network/SubscriptionUtils.java
new file mode 100644
index 0000000..cf1eba9
--- /dev/null
+++ b/src/com/android/car/settings/network/SubscriptionUtils.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT;
+
+import static com.android.internal.util.CollectionUtils.emptyIfNull;
+
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.UiccSlotInfo;
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/** Shared logic related to dealing with multiple subscriptions. */
+public final class SubscriptionUtils {
+
+    private SubscriptionUtils() {
+    }
+
+    /**
+     * Returns the list of available subscriptions, accounting for duplicates possible through a
+     * virtual network provider.
+     */
+    public static List<SubscriptionInfo> getAvailableSubscriptions(
+            SubscriptionManager subscriptionManager, TelephonyManager telephonyManager) {
+        List<SubscriptionInfo> subscriptions = new ArrayList<>(
+                emptyIfNull(subscriptionManager.getSelectableSubscriptionInfoList()));
+
+        // Look for inactive but present physical SIMs that are missing from the selectable list.
+        List<UiccSlotInfo> missing = new ArrayList<>();
+        UiccSlotInfo[] slotsInfo = telephonyManager.getUiccSlotsInfo();
+        for (int i = 0; slotsInfo != null && i < slotsInfo.length; i++) {
+            UiccSlotInfo slotInfo = slotsInfo[i];
+            if (isInactiveInsertedPSim(slotInfo)) {
+                int index = slotInfo.getLogicalSlotIdx();
+                String cardId = slotInfo.getCardId();
+
+                boolean found = subscriptions.stream().anyMatch(
+                        info -> index == info.getSimSlotIndex() && cardId.equals(
+                                info.getCardString()));
+                if (!found) {
+                    missing.add(slotInfo);
+                }
+            }
+        }
+        if (!missing.isEmpty()) {
+            for (SubscriptionInfo info : subscriptionManager.getAllSubscriptionInfoList()) {
+                for (UiccSlotInfo slotInfo : missing) {
+                    if (info.getSimSlotIndex() == slotInfo.getLogicalSlotIdx()
+                            && info.getCardString().equals(slotInfo.getCardId())) {
+                        subscriptions.add(info);
+                        break;
+                    }
+                }
+            }
+        }
+
+        // With some carriers such as Google Fi which provide a sort of virtual service that spans
+        // across multiple underlying networks, we end up with subscription entries for the
+        // underlying networks that need to be hidden from the user in the UI.
+        for (Iterator<SubscriptionInfo> iter = subscriptions.iterator(); iter.hasNext(); ) {
+            SubscriptionInfo info = iter.next();
+            if (TextUtils.isEmpty(info.getMncString())) {
+                iter.remove();
+            }
+        }
+        return subscriptions;
+    }
+
+    private static boolean isInactiveInsertedPSim(UiccSlotInfo slotInfo) {
+        return !slotInfo.getIsEuicc() && !slotInfo.getIsActive()
+                && slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT;
+    }
+}
diff --git a/src/com/android/car/settings/network/SubscriptionsChangeListener.java b/src/com/android/car/settings/network/SubscriptionsChangeListener.java
new file mode 100644
index 0000000..dc77fe9
--- /dev/null
+++ b/src/com/android/car/settings/network/SubscriptionsChangeListener.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.telephony.SubscriptionManager;
+
+import com.android.internal.telephony.TelephonyIntents;
+
+/** Listens to changes in availability of telephony subscriptions. */
+public class SubscriptionsChangeListener {
+
+    /** Client defined action to trigger when there are subscription changes. */
+    public interface SubscriptionsChangeAction {
+        /** Action taken when subscriptions changed. */
+        void onSubscriptionsChanged();
+    }
+
+    private static final IntentFilter RADIO_TECH_CHANGED_FILTER = new IntentFilter(
+            TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
+
+    private final Context mContext;
+    private final SubscriptionManager mSubscriptionManager;
+    private final SubscriptionsChangeAction mSubscriptionsChangeAction;
+
+    private final SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionsChangedListener =
+            new SubscriptionManager.OnSubscriptionsChangedListener() {
+                @Override
+                public void onSubscriptionsChanged() {
+                    subscriptionsChangedCallback();
+                }
+            };
+
+    private final BroadcastReceiver mRadioTechChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (!isInitialStickyBroadcast()) {
+                subscriptionsChangedCallback();
+            }
+        }
+    };
+
+    public SubscriptionsChangeListener(Context context, SubscriptionsChangeAction action) {
+        mContext = context;
+        mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
+        mSubscriptionsChangeAction = action;
+    }
+
+    /** Starts the various listeners necessary to track changes in telephony subscriptions. */
+    public void start() {
+        mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionsChangedListener);
+        mContext.registerReceiver(mRadioTechChangeReceiver, RADIO_TECH_CHANGED_FILTER);
+    }
+
+    /** Stops the various listeners necessary to track changes in telephony subscriptions. */
+    public void stop() {
+        mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionsChangedListener);
+        mContext.unregisterReceiver(mRadioTechChangeReceiver);
+    }
+
+    private void subscriptionsChangedCallback() {
+        if (mSubscriptionsChangeAction != null) {
+            mSubscriptionsChangeAction.onSubscriptionsChanged();
+        }
+    }
+}
diff --git a/src/com/android/car/settings/quicksettings/BluetoothTile.java b/src/com/android/car/settings/quicksettings/BluetoothTile.java
index d82fe10..889e525 100644
--- a/src/com/android/car/settings/quicksettings/BluetoothTile.java
+++ b/src/com/android/car/settings/quicksettings/BluetoothTile.java
@@ -11,10 +11,10 @@
  * 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
+ * limitations under the License.
  */
-package com.android.car.settings.quicksettings;
 
+package com.android.car.settings.quicksettings;
 
 import android.annotation.DrawableRes;
 import android.annotation.Nullable;
@@ -27,6 +27,8 @@
 import android.view.View;
 
 import com.android.car.settings.R;
+import com.android.car.settings.bluetooth.BluetoothSettingsFragment;
+import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.Logger;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -40,6 +42,7 @@
     private final StateChangedListener mStateChangedListener;
     private LocalBluetoothAdapter mLocalAdapter;
     private LocalBluetoothManager mLocalManager;
+    private View.OnLongClickListener mLaunchBluetoothSettings;
 
     @DrawableRes
     private int mIconRes = R.drawable.ic_settings_bluetooth;
@@ -65,7 +68,7 @@
                         break;
                     default:
                         mIconRes = R.drawable.ic_settings_bluetooth;
-                        mText = mContext.getString(R.string.bluetooth_settings);
+                        mText = mContext.getString(R.string.bluetooth_settings_title);
                         mState = State.ON;
                 }
             } else if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
@@ -84,20 +87,19 @@
         }
     };
 
-    BluetoothTile(Context context, StateChangedListener stateChangedListener) {
+    BluetoothTile(
+            Context context,
+            StateChangedListener stateChangedListener,
+            FragmentController fragmentController) {
         mStateChangedListener = stateChangedListener;
         mContext = context;
-        IntentFilter mBtStateChangeFilter = new IntentFilter();
-        mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
-        mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
-        mContext.registerReceiver(mBtStateReceiver, mBtStateChangeFilter);
         mLocalManager = LocalBluetoothManager.getInstance(
                 mContext, /* onInitCallback= */ null);
         if (mLocalManager == null) {
             LOG.e("Bluetooth is not supported on this device");
             return;
         }
-        mText = mContext.getString(R.string.bluetooth_settings);
+        mText = mContext.getString(R.string.bluetooth_settings_title);
         mLocalAdapter = mLocalManager.getBluetoothAdapter();
         if (mLocalAdapter.isEnabled()) {
             mIconRes = R.drawable.ic_settings_bluetooth;
@@ -106,11 +108,15 @@
             mIconRes = R.drawable.ic_settings_bluetooth_disabled;
             mState = State.OFF;
         }
+        mLaunchBluetoothSettings = v -> {
+            fragmentController.launchFragment(new BluetoothSettingsFragment());
+            return true;
+        };
     }
 
     @Nullable
-    public View.OnClickListener getDeepDiveListener() {
-        return null;
+    public View.OnLongClickListener getOnLongClickListener() {
+        return mLaunchBluetoothSettings;
     }
 
     @Override
@@ -136,6 +142,14 @@
     }
 
     @Override
+    public void start() {
+        IntentFilter mBtStateChangeFilter = new IntentFilter();
+        mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+        mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
+        mContext.registerReceiver(mBtStateReceiver, mBtStateChangeFilter);
+    }
+
+    @Override
     public void stop() {
         mContext.unregisterReceiver(mBtStateReceiver);
     }
@@ -145,6 +159,6 @@
         if (mLocalAdapter == null) {
             return;
         }
-        mLocalAdapter.setBluetoothEnabled(mLocalAdapter.isEnabled() ? false : true);
+        mLocalAdapter.setBluetoothEnabled(!mLocalAdapter.isEnabled());
     }
 }
diff --git a/src/com/android/car/settings/quicksettings/BrightnessTile.java b/src/com/android/car/settings/quicksettings/BrightnessTile.java
index c98c70f..2ffab9f 100644
--- a/src/com/android/car/settings/quicksettings/BrightnessTile.java
+++ b/src/com/android/car/settings/quicksettings/BrightnessTile.java
@@ -17,8 +17,15 @@
 
 import static android.provider.Settings.System.SCREEN_BRIGHTNESS;
 
+import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
+import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
+import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
+
+import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
-import android.provider.Settings;
+import android.os.PowerManager;
+import android.provider.Settings.SettingNotFoundException;
+import android.provider.Settings.System;
 import android.widget.SeekBar;
 
 import com.android.car.settings.common.Logger;
@@ -28,11 +35,17 @@
  */
 public class BrightnessTile implements QuickSettingGridAdapter.SeekbarTile {
     private static final Logger LOG = new Logger(BrightnessTile.class);
-    private static final int MAX_BRIGHTNESS = 255;
+    private CarUserManagerHelper mCarUserManagerHelper;
     private final Context mContext;
+    private final int mMaximumBacklight;
+    private final int mMinimumBacklight;
 
     public BrightnessTile(Context context) {
         mContext = context;
+        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        mMaximumBacklight = powerManager.getMaximumScreenBrightnessSetting();
+        mMinimumBacklight = powerManager.getMinimumScreenBrightnessSetting();
     }
 
     @Override
@@ -46,29 +59,35 @@
     }
 
     @Override
-    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-        Settings.System.putInt(mContext.getContentResolver(), SCREEN_BRIGHTNESS, progress);
+    public void onProgressChanged(SeekBar seekBar, int gamma, boolean fromUser) {
+        int linear = convertGammaToLinear(gamma, mMinimumBacklight, mMaximumBacklight);
+        System.putIntForUser(mContext.getContentResolver(), SCREEN_BRIGHTNESS, linear,
+                             mCarUserManagerHelper.getCurrentForegroundUserId());
     }
 
     @Override
     public int getMax() {
-        return MAX_BRIGHTNESS;
+        return GAMMA_SPACE_MAX;
+    }
+
+    @Override
+    public void start() {
     }
 
     @Override
     public void stop() {
-        // nothing to do.
     }
 
     @Override
     public int getCurrent() {
-        int currentBrightness = 0;
+        int gamma = GAMMA_SPACE_MAX;
         try {
-            currentBrightness = Settings.System.getInt(mContext.getContentResolver(),
-                    SCREEN_BRIGHTNESS);
-        } catch (Settings.SettingNotFoundException e) {
+            int linear = System.getIntForUser(mContext.getContentResolver(), SCREEN_BRIGHTNESS,
+                                              mCarUserManagerHelper.getCurrentForegroundUserId());
+            gamma = convertLinearToGamma(linear, mMinimumBacklight, mMaximumBacklight);
+        } catch (SettingNotFoundException e) {
             LOG.w("Can't find setting for SCREEN_BRIGHTNESS.");
         }
-        return currentBrightness;
+        return gamma;
     }
 }
diff --git a/src/com/android/car/settings/quicksettings/CelluarTile.java b/src/com/android/car/settings/quicksettings/CelluarTile.java
index e1cafba..907a5a3 100644
--- a/src/com/android/car/settings/quicksettings/CelluarTile.java
+++ b/src/com/android/car/settings/quicksettings/CelluarTile.java
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.car.settings.quicksettings;
 
+package com.android.car.settings.quicksettings;
 
 import android.annotation.Nullable;
 import android.content.Context;
@@ -56,7 +56,7 @@
     }
 
     @Nullable
-    public View.OnClickListener getDeepDiveListener() {
+    public View.OnLongClickListener getOnLongClickListener() {
         return null;
     }
 
@@ -82,6 +82,10 @@
     }
 
     @Override
+    public void start() {
+    }
+
+    @Override
     public void stop() {
     }
 
diff --git a/src/com/android/car/settings/quicksettings/DayNightTile.java b/src/com/android/car/settings/quicksettings/DayNightTile.java
index e4c599c..4e05fd8 100644
--- a/src/com/android/car/settings/quicksettings/DayNightTile.java
+++ b/src/com/android/car/settings/quicksettings/DayNightTile.java
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.car.settings.quicksettings;
 
+package com.android.car.settings.quicksettings;
 
 import android.annotation.DrawableRes;
 import android.annotation.Nullable;
@@ -22,17 +22,19 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.view.View;
-import android.view.View.OnClickListener;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.display.DisplaySettingsFragment;
 
 /**
- * Controls Day night mode tile on quick setting page.
+ * Toggles auto or night mode tile on quick setting page.
  */
 public class DayNightTile implements QuickSettingGridAdapter.Tile {
     private final Context mContext;
     private final StateChangedListener mStateChangedListener;
     private final UiModeManager mUiModeManager;
+    private final View.OnLongClickListener mLaunchDisplaySettings;
 
     @DrawableRes
     private int mIconRes = R.drawable.ic_settings_night_display;
@@ -41,7 +43,10 @@
 
     private State mState = State.ON;
 
-    DayNightTile(Context context, StateChangedListener stateChangedListener) {
+    DayNightTile(
+            Context context,
+            StateChangedListener stateChangedListener,
+            FragmentController fragmentController) {
         mStateChangedListener = stateChangedListener;
         mContext = context;
         mUiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
@@ -51,11 +56,15 @@
             mState = State.OFF;
         }
         mText = mContext.getString(R.string.night_mode_tile_label);
+        mLaunchDisplaySettings = v -> {
+            fragmentController.launchFragment(new DisplaySettingsFragment());
+            return true;
+        };
     }
 
     @Nullable
-    public OnClickListener getDeepDiveListener() {
-        return null;
+    public View.OnLongClickListener getOnLongClickListener() {
+        return mLaunchDisplaySettings;
     }
 
     @Override
@@ -80,13 +89,17 @@
     }
 
     @Override
+    public void start() {
+    }
+
+    @Override
     public void stop() {
     }
 
     @Override
     public void onClick(View v) {
         if (mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES) {
-            mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
+            mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_AUTO);
         } else {
             mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
         }
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingFragment.java b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
index 9e177c6..1001e87 100644
--- a/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
+++ b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
@@ -13,18 +13,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.android.car.settings.quicksettings;
 
+import android.app.Activity;
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.content.pm.UserInfo;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.os.Bundle;
+import android.os.SystemProperties;
+import android.os.UserManager;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.widget.ImageView;
+import android.widget.Button;
+import android.widget.FrameLayout;
 import android.widget.TextView;
 
-import androidx.car.widget.PagedListView;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.Guideline;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
@@ -33,65 +46,145 @@
 import com.android.car.settings.users.UserIconProvider;
 import com.android.car.settings.users.UserSwitcherFragment;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
 /**
  * Shows a page to access frequently used settings.
  */
 public class QuickSettingFragment extends BaseFragment {
-    private CarUserManagerHelper  mCarUserManagerHelper;
+    // Time to delay refreshing the build info, if the clock is not correct.
+    private static final long BUILD_INFO_REFRESH_TIME_MS = TimeUnit.SECONDS.toMillis(5);
+    /**
+     * Indicates whether all Preferences are configured to ignore UX Restrictions Event.
+     */
+    private boolean mAllIgnoresUxRestrictions;
+
+    /**
+     * Set of the keys of Preferences that ignore UX Restrictions. When mAlwaysIgnoreUxRestrictions
+     * is configured to be false, then only the Preferences whose keys are contained in this Set
+     * ignore UX Restrictions.
+     */
+    private Set<String> mPreferencesIgnoringUxRestrictions;
+
+    private CarUserManagerHelper mCarUserManagerHelper;
     private UserIconProvider mUserIconProvider;
     private QuickSettingGridAdapter mGridAdapter;
-    private PagedListView mListView;
-    private View mFullSettingBtn;
+    private RecyclerView mListView;
+    private View mFullSettingsBtn;
     private View mUserSwitcherBtn;
     private HomeFragmentLauncher mHomeFragmentLauncher;
     private float mOpacityDisabled;
     private float mOpacityEnabled;
+    private TextView mBuildInfo;
 
-    /**
-     * Returns an instance of this class.
-     */
-    public static QuickSettingFragment newInstance() {
-        QuickSettingFragment quickSettingFragment = new QuickSettingFragment();
-        Bundle bundle = quickSettingFragment.getBundle();
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_quick_settings);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.quick_settings);
-        bundle.putInt(EXTRA_TITLE_ID, R.string.settings_label);
-        quickSettingFragment.setArguments(bundle);
-        return quickSettingFragment;
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_quick_settings;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return R.layout.quick_settings;
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         mHomeFragmentLauncher = new HomeFragmentLauncher();
-        getActivity().findViewById(R.id.action_bar_icon_container).setOnClickListener(
-                v -> getActivity().finish());
+        Activity activity = requireActivity();
 
-        mOpacityDisabled = getContext().getResources().getFloat(R.dimen.opacity_disabled);
-        mOpacityEnabled = getContext().getResources().getFloat(R.dimen.opacity_enabled);
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+        FragmentManager fragmentManager = ((FragmentActivity) activity).getSupportFragmentManager();
+        if (fragmentManager.getBackStackEntryCount() == 1
+                && fragmentManager.findFragmentByTag("0") != null
+                && fragmentManager.findFragmentByTag("0").getClass().getName().equals(
+                getString(R.string.config_settings_hierarchy_root_fragment))
+                && !getContext().getResources()
+                .getBoolean(R.bool.config_show_settings_root_exit_icon)) {
+            hideExitIcon();
+        }
+
+        activity.findViewById(R.id.action_bar_icon_container).setOnClickListener(
+                v -> activity.finish());
+
+        mOpacityDisabled = activity.getResources().getFloat(R.dimen.opacity_disabled);
+        mOpacityEnabled = activity.getResources().getFloat(R.dimen.opacity_enabled);
+        mCarUserManagerHelper = new CarUserManagerHelper(activity);
         mUserIconProvider = new UserIconProvider(mCarUserManagerHelper);
-        mListView = (PagedListView) getActivity().findViewById(R.id.list);
-        mGridAdapter = new QuickSettingGridAdapter(getContext());
-        mListView.getRecyclerView().setLayoutManager(mGridAdapter.getGridLayoutManager());
+        mListView = activity.findViewById(R.id.list);
+        mGridAdapter = new QuickSettingGridAdapter(activity);
+        mListView.setLayoutManager(mGridAdapter.getGridLayoutManager());
 
-        mFullSettingBtn = getActivity().findViewById(R.id.full_setting_btn);
-        mFullSettingBtn.setOnClickListener(mHomeFragmentLauncher);
-        mUserSwitcherBtn = getActivity().findViewById(R.id.user_switcher_btn);
+        mFullSettingsBtn = activity.findViewById(R.id.full_settings_btn);
+        mFullSettingsBtn.setOnClickListener(mHomeFragmentLauncher);
+        mUserSwitcherBtn = activity.findViewById(R.id.user_switcher_btn);
         mUserSwitcherBtn.setOnClickListener(v -> {
-            getFragmentController().launchFragment(UserSwitcherFragment.newInstance());
+            getFragmentController().launchFragment(new UserSwitcherFragment());
         });
+        setupUserButton(activity);
 
-        View exitBtn = getActivity().findViewById(R.id.exit_button);
+        View exitBtn = activity.findViewById(R.id.action_bar_icon_container);
         exitBtn.setOnClickListener(v -> getFragmentController().goBack());
 
         mGridAdapter
-                .addTile(new WifiTile(getContext(), mGridAdapter, getFragmentController()))
-                .addTile(new BluetoothTile(getContext(), mGridAdapter))
-                .addTile(new DayNightTile(getContext(), mGridAdapter))
-                .addTile(new CelluarTile(getContext(), mGridAdapter))
-                .addSeekbarTile(new BrightnessTile(getContext()));
+                .addTile(new WifiTile(activity, mGridAdapter, getFragmentController()))
+                .addTile(new BluetoothTile(activity, mGridAdapter, getFragmentController()))
+                .addTile(new DayNightTile(activity, mGridAdapter, getFragmentController()))
+                .addTile(new CelluarTile(activity, mGridAdapter))
+                .addSeekbarTile(new BrightnessTile(activity));
         mListView.setAdapter(mGridAdapter);
+
+        mPreferencesIgnoringUxRestrictions = new HashSet<String>(Arrays.asList(
+                getContext().getResources().getStringArray(R.array.config_ignore_ux_restrictions)));
+        mAllIgnoresUxRestrictions =
+                getContext().getResources().getBoolean(R.bool.config_always_ignore_ux_restrictions);
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        mBuildInfo = view.requireViewById(R.id.build_info);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        mGridAdapter.start();
+        mUserSwitcherBtn.setVisibility(showUserSwitcher() ? View.VISIBLE : View.INVISIBLE);
+        // In non-user builds (that is, user-debug, eng, etc), display some version information.
+        if (!Build.IS_USER) {
+            refreshBuildInfo();
+        }
+    }
+
+    private void refreshBuildInfo() {
+        if (!isAdded()) {
+            // This can happen if the delayed post happens before we're stopped. Just give up
+            // trying to get the right clock.
+            return;
+        }
+
+        long buildTimeDiffDays =
+                TimeUnit.MILLISECONDS.toDays(System.currentTimeMillis() - Build.TIME);
+        if (buildTimeDiffDays < 0) {
+            // If it's in the past, that likely means the current time is wrong (or the build time
+            // could be wrong, but that's less likely). Reschedule this to run in a few seconds to
+            // see whether the clock's been fixed.
+            mBuildInfo.postDelayed(this::refreshBuildInfo, BUILD_INFO_REFRESH_TIME_MS);
+        }
+
+        String str = String.format(getResources().getString(R.string.build_info_fmt),
+                Build.FINGERPRINT, SystemProperties.get("ro.build.date", "<unknown>"),
+                buildTimeDiffDays < 0 ? "--" : Long.toString(buildTimeDiffDays));
+
+        mBuildInfo.setVisibility(View.VISIBLE);
+        mBuildInfo.setText(str);
     }
 
     @Override
@@ -100,49 +193,71 @@
         mGridAdapter.stop();
     }
 
-    private void setupAccountButton() {
-        ImageView userIcon = (ImageView) getActivity().findViewById(R.id.user_icon);
+    private void setupUserButton(Context context) {
+        Button userButton = requireActivity().findViewById(R.id.user_switcher_btn);
         UserInfo currentUserInfo = mCarUserManagerHelper.getCurrentForegroundUserInfo();
-        userIcon.setImageDrawable(mUserIconProvider.getUserIcon(currentUserInfo, getContext()));
-        userIcon.clearColorFilter();
+        Drawable userIcon = mUserIconProvider.getUserIcon(currentUserInfo, context);
+        userButton.setCompoundDrawablesRelativeWithIntrinsicBounds(userIcon, /* top= */
+                null, /* end= */ null, /* bottom= */ null);
+        userButton.setText(currentUserInfo.name);
+    }
 
-        TextView userSwitcherText = (TextView) getActivity().findViewById(R.id.user_switcher_text);
-        userSwitcherText.setText(currentUserInfo.name);
+    private boolean showUserSwitcher() {
+        return !UserManager.isDeviceInDemoMode(getContext())
+                && UserManager.supportsMultipleUsers()
+                && !UserManager.get(getContext()).hasUserRestriction(
+                UserManager.DISALLOW_USER_SWITCH);
     }
 
     /**
      * Quick setting fragment is distraction optimized, so is allowed at all times.
      */
     @Override
-    public boolean canBeShown(CarUxRestrictions carUxRestrictions) {
+    public boolean canBeShown(@NonNull CarUxRestrictions carUxRestrictions) {
         return true;
     }
 
     @Override
-    public void onUxRestrictionChanged(CarUxRestrictions carUxRestrictions) {
+    public void onUxRestrictionsChanged(CarUxRestrictions restrictionInfo) {
         // TODO: update tiles
-        applyRestriction(CarUxRestrictionsHelper.isNoSetup(carUxRestrictions));
+        if (!hasPreferenceIgnoringUxRestrictions(mAllIgnoresUxRestrictions,
+                mPreferencesIgnoringUxRestrictions)) {
+            applyRestriction(CarUxRestrictionsHelper.isNoSetup(restrictionInfo));
+        }
     }
 
     private void applyRestriction(boolean restricted) {
-        mHomeFragmentLauncher.showDOBlockingMessage(restricted);
-        mFullSettingBtn.setAlpha(restricted ? mOpacityDisabled : mOpacityEnabled);
+        mHomeFragmentLauncher.showBlockingMessage(restricted);
+        mFullSettingsBtn.setAlpha(restricted ? mOpacityDisabled : mOpacityEnabled);
     }
 
     private class HomeFragmentLauncher implements OnClickListener {
-        private boolean mShowDOBlockingMessage;
+        private boolean mShowBlockingMessage;
 
-        private void showDOBlockingMessage(boolean show) {
-            mShowDOBlockingMessage = show;
+        private void showBlockingMessage(boolean show) {
+            mShowBlockingMessage = show;
         }
 
         @Override
         public void onClick(View v) {
-            if (mShowDOBlockingMessage) {
-                getFragmentController().showDOBlockingMessage();
+            if (mShowBlockingMessage) {
+                getFragmentController().showBlockingMessage();
             } else {
-                getFragmentController().launchFragment(HomepageFragment.newInstance());
+                getFragmentController().launchFragment(new HomepageFragment());
             }
         }
     }
+
+    private boolean hasPreferenceIgnoringUxRestrictions(boolean allIgnores, Set prefsThatIgnore) {
+        return allIgnores || prefsThatIgnore.size() > 0;
+    }
+
+    private void hideExitIcon() {
+        requireActivity().findViewById(R.id.action_bar_icon_container)
+                .setVisibility(FrameLayout.GONE);
+
+        Guideline guideLine = (Guideline) requireActivity().findViewById(R.id.start_margin);
+        guideLine.setGuidelineBegin(getResources()
+                .getDimensionPixelOffset(R.dimen.action_bar_no_icon_start_margin));
+    }
 }
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java b/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
index 19b380d..412c3bd 100644
--- a/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
+++ b/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License
  */
+
 package com.android.car.settings.quicksettings;
 
 import android.annotation.Nullable;
@@ -21,7 +22,6 @@
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.SeekBar;
@@ -71,7 +71,14 @@
          * A state to indicate how we want to render icon, this is independent of what to show
          * in text.
          */
-        enum State {OFF, ON}
+        enum State {
+            OFF, ON
+        }
+
+        /**
+         * Called when activity owning this tile's onStart() gets called.
+         */
+        void start();
 
         /**
          * Called when activity owning this tile's onStop() gets called.
@@ -91,15 +98,20 @@
         boolean isAvailable();
 
         /**
-         * Returns a listener for launching a setting fragment for advanced configuration for this
-         * tile, A.K.A deep dive, if available. {@code null} if deep dive is not available.
+         * Returns a listener to call when this tile is clicked and held. Returns {@code null} if
+         * no action should be performed.
          */
         @Nullable
-        OnClickListener getDeepDiveListener();
+        View.OnLongClickListener getOnLongClickListener();
     }
 
     interface SeekbarTile extends SeekBar.OnSeekBarChangeListener {
         /**
+         * Called when activity owning this tile's onStart() gets called.
+         */
+        void start();
+
+        /**
          * Called when activity owning this tile's onStop() gets called.
          */
         void stop();
@@ -121,6 +133,15 @@
         return this;
     }
 
+    void start() {
+        for (SeekbarTile tile : mSeekbarTiles) {
+            tile.start();
+        }
+        for (Tile tile : mTiles) {
+            tile.start();
+        }
+    }
+
     void stop() {
         for (SeekbarTile tile : mSeekbarTiles) {
             tile.stop();
@@ -159,15 +180,12 @@
             case TILE_VIEWTYPE:
                 Tile tile = mTiles.get(position - mSeekbarTiles.size());
                 TileViewHolder vh = (TileViewHolder) holder;
-                OnClickListener deepDiveListener = tile.getDeepDiveListener();
                 vh.itemView.setOnClickListener(tile);
-                if (deepDiveListener != null) {
-                    vh.mDeepDiveIcon.setVisibility(View.VISIBLE);
-                    vh.mTextContainer.setOnClickListener(deepDiveListener);
+                View.OnLongClickListener onLongClickListener = tile.getOnLongClickListener();
+                if (onLongClickListener != null) {
+                    vh.itemView.setOnLongClickListener(onLongClickListener);
                 } else {
-                    vh.mDeepDiveIcon.setVisibility(View.GONE);
-                    vh.mTextContainer.setClickable(false);
-                    vh.mTextContainer.setOnClickListener(null);
+                    vh.itemView.setOnLongClickListener(null);
                 }
                 vh.mIcon.setImageDrawable(tile.getIcon());
                 switch (tile.getState()) {
@@ -200,28 +218,22 @@
     }
 
     private class TileViewHolder extends RecyclerView.ViewHolder {
-        private final View mIconContainer;
-        private final View mTextContainer;
         private final View mIconBackground;
         private final ImageView mIcon;
-        private final ImageView mDeepDiveIcon;
         private final TextView mText;
 
         TileViewHolder(View view) {
             super(view);
-            mIconContainer = view.findViewById(R.id.icon_container);
-            mTextContainer = view.findViewById(R.id.text_container);
             mIconBackground = view.findViewById(R.id.icon_background);
-            mIcon = (ImageView) view.findViewById(R.id.tile_icon);
-            mDeepDiveIcon = (ImageView) view.findViewById(R.id.deep_dive_icon);
-            mText = (TextView) view.findViewById(R.id.tile_text);
+            mIcon = view.findViewById(R.id.tile_icon);
+            mText = view.findViewById(R.id.tile_text);
         }
     }
 
     class QsSpanSizeLookup extends GridLayoutManager.SpanSizeLookup {
 
         /**
-         * Each line item takes a full row, and each tile takes only 1 span.
+         * Each list item takes a full row, and each tile takes only 1 span.
          */
         @Override
         public int getSpanSize(int position) {
diff --git a/src/com/android/car/settings/quicksettings/WifiTile.java b/src/com/android/car/settings/quicksettings/WifiTile.java
index 592f255..304f6e9 100644
--- a/src/com/android/car/settings/quicksettings/WifiTile.java
+++ b/src/com/android/car/settings/quicksettings/WifiTile.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -13,18 +13,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License
  */
-package com.android.car.settings.quicksettings;
 
+package com.android.car.settings.quicksettings;
 
 import android.annotation.DrawableRes;
 import android.annotation.Nullable;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.view.View;
-import android.view.View.OnClickListener;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment.FragmentController;
+import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.wifi.CarWifiManager;
 import com.android.car.settings.wifi.WifiSettingsFragment;
 import com.android.car.settings.wifi.WifiUtil;
@@ -37,9 +36,8 @@
     private final StateChangedListener mStateChangedListener;
     private final CarWifiManager mCarWifiManager;
     private final Context mContext;
-    private final FragmentController mFragmentController;
 
-    private final OnClickListener mSwitchSavedWifiListener;
+    private final View.OnLongClickListener mLaunchWifiSettings;
 
     @DrawableRes
     private int mIconRes = R.drawable.ic_settings_wifi;
@@ -48,16 +46,16 @@
 
     private State mState = State.OFF;
 
-    WifiTile(Context context, StateChangedListener stateChangedListener,
+    WifiTile(
+            Context context,
+            StateChangedListener stateChangedListener,
             FragmentController fragmentController) {
         mContext = context;
-        mFragmentController = fragmentController;
-        mSwitchSavedWifiListener = v -> {
-            mFragmentController.launchFragment(
-                    WifiSettingsFragment.newInstance().showSavedApOnly(true));
+        mLaunchWifiSettings = v -> {
+            fragmentController.launchFragment(new WifiSettingsFragment());
+            return true;
         };
-        mCarWifiManager = new CarWifiManager(context, /* listener= */ this);
-        mCarWifiManager.start();
+        mCarWifiManager = new CarWifiManager(context);
         mStateChangedListener = stateChangedListener;
         // init icon and text etc.
         updateAccessPointSsid();
@@ -65,9 +63,8 @@
     }
 
     @Nullable
-    public OnClickListener getDeepDiveListener() {
-        return !mCarWifiManager.getSavedAccessPoints().isEmpty()
-                ? mSwitchSavedWifiListener : null;
+    public View.OnLongClickListener getOnLongClickListener() {
+        return mLaunchWifiSettings;
     }
 
     @Override
@@ -92,7 +89,14 @@
     }
 
     @Override
+    public void start() {
+        mCarWifiManager.addListener(this);
+        mCarWifiManager.start();
+    }
+
+    @Override
     public void stop() {
+        mCarWifiManager.removeListener(this);
         mCarWifiManager.stop();
         mCarWifiManager.destroy();
     }
@@ -130,6 +134,7 @@
 
     /**
      * Updates the text with access point connected, if any
+     *
      * @return {@code true} if the text is updated, {@code false} other wise.
      */
     private boolean updateAccessPointSsid() {
diff --git a/src/com/android/car/settings/security/AddTrustedDeviceActivity.java b/src/com/android/car/settings/security/AddTrustedDeviceActivity.java
new file mode 100644
index 0000000..b00595e
--- /dev/null
+++ b/src/com/android/car/settings/security/AddTrustedDeviceActivity.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import android.bluetooth.BluetoothDevice;
+import android.car.Car;
+import android.car.trust.CarTrustAgentEnrollmentManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.os.Bundle;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.BaseCarSettingsActivity;
+import com.android.car.settings.common.Logger;
+
+/**
+ * Activity which manages the enrollment process and communicates between
+ * CarTrustAgentEnrollmentService and fragments.
+ *
+ * <p>The flow when user want to enroll a trusted device should be as follows:
+ * <ol>
+ * <li> {@link CarTrustAgentEnrollmentManager#setEnrollmentCallback(
+ *CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback)}
+ * <li> {@link CarTrustAgentEnrollmentManager#setBleCallback(
+ *CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback)}
+ * <li> {@link CarTrustAgentEnrollmentManager#startEnrollmentAdvertising()}
+ * <li> wait for {@link CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback#
+ * onBleEnrollmentDeviceDisconnected(BluetoothDevice)}
+ * <li>  {@link CarTrustAgentEnrollmentManager#stopEnrollmentAdvertising()}
+ * <li> wait for
+ * {@link CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback#onAuthStringAvailable(
+ *BluetoothDevice, String)} to show the pairing code dialog to user
+ * <li> {@link CarTrustAgentEnrollmentManager#enrollmentHandshakeAccepted(BluetoothDevice)} after
+ * user confirms the pairing code
+ * <li> wait for
+ * {@link CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback#onEscrowTokenAdded(long)}
+ * <li> {@link #getCheckLockFragment()}, wait user to input the password
+ * <li> After user enter the correct password, wait for
+ * {@link CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback#
+ * onEscrowTokenActiveStateChanged(long, boolean)}
+ * <li> After get the results, finish the activity
+ * </ol>
+ */
+public class AddTrustedDeviceActivity extends BaseCarSettingsActivity implements CheckLockListener {
+    private static final Logger LOG = new Logger(AddTrustedDeviceActivity.class);
+    private static final String BLUETOOTH_DEVICE_KEY = "bluetoothDevice";
+    private static final String CURRENT_HANDLE_KEY = "currentHandle";
+    private Car mCar;
+    private BluetoothDevice mBluetoothDevice;
+    private long mHandle;
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Nullable
+    private CarTrustAgentEnrollmentManager mCarTrustAgentEnrollmentManager;
+
+    private final CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback
+            mCarTrustAgentEnrollmentCallback =
+            new CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback() {
+
+                @Override
+                public void onEnrollmentHandshakeFailure(BluetoothDevice device, int errorCode) {
+                    LOG.e("Trust agent service time out");
+                }
+
+                @Override
+                public void onAuthStringAvailable(BluetoothDevice device, String authString) {
+                    ConfirmPairingCodeDialog dialog = ConfirmPairingCodeDialog.newInstance(
+                            authString);
+                    dialog.setConfirmPairingCodeListener(mConfirmParingCodeListener);
+                    showDialog(dialog, ConfirmPairingCodeDialog.TAG);
+                }
+
+                @Override
+                public void onEscrowTokenAdded(long handle) {
+                    // User need to enter the correct authentication of the car to activate the
+                    // added token.
+                    mHandle = handle;
+                    launchFragment(getCheckLockFragment());
+                }
+
+                @Override
+                public void onEscrowTokenRemoved(long handle) {
+                }
+
+                @Override
+                public void onEscrowTokenActiveStateChanged(long handle, boolean active) {
+                    if (active) {
+                        onDeviceAddedSuccessfully();
+                    } else {
+                        LOG.d(handle + " has not been activated");
+                    }
+                    finish();
+                }
+            };
+
+    private final CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback
+            mCarTrustAgentBleCallback =
+            new CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback() {
+                @Override
+                public void onBleEnrollmentDeviceConnected(BluetoothDevice device) {
+                    mBluetoothDevice = device;
+                    mCarTrustAgentEnrollmentManager.stopEnrollmentAdvertising();
+                }
+
+                @Override
+                public void onBleEnrollmentDeviceDisconnected(BluetoothDevice device) {
+                    Toast.makeText(AddTrustedDeviceActivity.this, getResources().getString(
+                            R.string.trusted_device_disconnected_toast),
+                            Toast.LENGTH_SHORT).show();
+                    mBluetoothDevice = null;
+                    finish();
+                }
+
+                @Override
+                public void onEnrollmentAdvertisingStarted() {
+                }
+
+                @Override
+                public void onEnrollmentAdvertisingFailed() {
+                    finish();
+                }
+            };
+
+    @VisibleForTesting
+    final ConfirmPairingCodeDialog.ConfirmPairingCodeListener mConfirmParingCodeListener =
+            new ConfirmPairingCodeDialog.ConfirmPairingCodeListener() {
+                public void onConfirmPairingCode() {
+                    mCarTrustAgentEnrollmentManager.enrollmentHandshakeAccepted(mBluetoothDevice);
+                }
+
+                public void onDialogCancelled() {
+                    finish();
+                }
+            };
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mCar = Car.createCar(this);
+        mCarTrustAgentEnrollmentManager = (CarTrustAgentEnrollmentManager) mCar.getCarManager(
+                Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE);
+        if (mCarTrustAgentEnrollmentManager == null) {
+            LOG.e("CarTrustAgentEnrollmentManager is null");
+            finish();
+        }
+        mCarUserManagerHelper = new CarUserManagerHelper(this);
+        if (savedInstanceState != null) {
+            mBluetoothDevice = savedInstanceState.getParcelable(BLUETOOTH_DEVICE_KEY);
+            mHandle = savedInstanceState.getLong(CURRENT_HANDLE_KEY);
+        }
+        ConfirmPairingCodeDialog dialog =
+                (ConfirmPairingCodeDialog) findDialogByTag(ConfirmPairingCodeDialog.TAG);
+        if (dialog != null) {
+            dialog.setConfirmPairingCodeListener(mConfirmParingCodeListener);
+        }
+    }
+
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        if (mHandle != 0) {
+            if (mCarTrustAgentEnrollmentManager.isEscrowTokenActive(mHandle,
+                    mCarUserManagerHelper.getCurrentProcessUserId())) {
+                onDeviceAddedSuccessfully();
+                finish();
+            }
+        }
+        if (mBluetoothDevice == null) {
+            mCarTrustAgentEnrollmentManager.startEnrollmentAdvertising();
+        }
+        mCarTrustAgentEnrollmentManager.setEnrollmentCallback(mCarTrustAgentEnrollmentCallback);
+        mCarTrustAgentEnrollmentManager.setBleCallback(mCarTrustAgentBleCallback);
+
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        // When activity is pausing not because of a configuration change
+        if (getChangingConfigurations() == 0) {
+            mCarTrustAgentEnrollmentManager.terminateEnrollmentHandshake();
+        }
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mCarTrustAgentEnrollmentManager.setBleCallback(null);
+        mCarTrustAgentEnrollmentManager.setEnrollmentCallback(null);
+        mCarTrustAgentEnrollmentManager.stopEnrollmentAdvertising();
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle savedInstanceState) {
+        super.onSaveInstanceState(savedInstanceState);
+        savedInstanceState.putParcelable(BLUETOOTH_DEVICE_KEY, mBluetoothDevice);
+        savedInstanceState.putLong(CURRENT_HANDLE_KEY, mHandle);
+    }
+
+
+    @Override
+    @Nullable
+    protected Fragment getInitialFragment() {
+        Fragment currentFragment = getSupportFragmentManager().findFragmentById(
+                R.id.fragment_container);
+        return currentFragment == null ? new AddTrustedDeviceProgressFragment() : currentFragment;
+    }
+
+    private Fragment getCheckLockFragment() {
+        return ConfirmPasswordFragmentFactory.getFragment(/* context= */ this);
+    }
+
+    @Override
+    public void onLockVerified(byte[] lock) {
+        getSupportFragmentManager().popBackStack();
+    }
+
+    @Override
+    public void onBackPressed() {
+        finish();
+    }
+
+    private void onDeviceAddedSuccessfully() {
+        Toast.makeText(this,
+                getResources().getString(R.string.trusted_device_success_enrollment_toast),
+                Toast.LENGTH_LONG).show();
+    }
+}
diff --git a/src/com/android/car/settings/security/AddTrustedDevicePreferenceController.java b/src/com/android/car/settings/security/AddTrustedDevicePreferenceController.java
new file mode 100644
index 0000000..b41764e
--- /dev/null
+++ b/src/com/android/car/settings/security/AddTrustedDevicePreferenceController.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import android.app.admin.DevicePolicyManager;
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.widget.LockPatternUtils;
+
+/**
+ * Business logic which controls whether the preference is clickeble according to the password
+ * quality of current user.
+ */
+public class AddTrustedDevicePreferenceController extends PreferenceController<Preference> {
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private LockPatternUtils mLockPatternUtils;
+
+    public AddTrustedDevicePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mLockPatternUtils = new LockPatternUtils(context);
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        return isUserRestricted() ? DISABLED_FOR_USER : AVAILABLE;
+    }
+
+    private boolean isUserRestricted() {
+        return mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_BLUETOOTH)
+                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(
+                BluetoothAdapter.getDefaultAdapter().isEnabled() ? "" : getContext().getString(
+                        R.string.add_device_summary));
+        preference.setEnabled(hasPassword());
+    }
+
+    private boolean hasPassword() {
+        return mLockPatternUtils.getKeyguardStoredPasswordQuality(
+                mCarUserManagerHelper.getCurrentProcessUserId())
+                != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public boolean handlePreferenceClicked(Preference preference) {
+        // Enable the adapter if it is not on (user is notified via summary message).
+        BluetoothAdapter.getDefaultAdapter().enable();
+        /** Need to start {@link AddTrustedDeviceActivity} after the click. */
+        return false;
+    }
+}
diff --git a/src/com/android/car/settings/security/AddTrustedDeviceProgressFragment.java b/src/com/android/car/settings/security/AddTrustedDeviceProgressFragment.java
new file mode 100644
index 0000000..ae4eaf0
--- /dev/null
+++ b/src/com/android/car/settings/security/AddTrustedDeviceProgressFragment.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.security;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ProgressBar;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Add trusted device fragment which displays the progress and show the companion app information
+ * to user.
+ */
+public class AddTrustedDeviceProgressFragment extends SettingsFragment {
+    private ProgressBar mProgressBar;
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.add_trusted_device_progress_fragment;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mProgressBar = requireActivity().findViewById(R.id.progress_bar);
+        mProgressBar.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mProgressBar.setVisibility(View.VISIBLE);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mProgressBar.setVisibility(View.GONE);
+    }
+}
+
diff --git a/src/com/android/car/settings/security/CheckLockActivity.java b/src/com/android/car/settings/security/CheckLockActivity.java
new file mode 100644
index 0000000..66c3914
--- /dev/null
+++ b/src/com/android/car/settings/security/CheckLockActivity.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.BaseCarSettingsActivity;
+
+/**
+ * Prompts the user to enter their pin, password, or pattern lock (if set) and returns
+ * {@link #RESULT_OK} on a successful entry or immediately if the user has no lock setup.
+ */
+public class CheckLockActivity extends BaseCarSettingsActivity implements CheckLockListener {
+    @Override
+    @Nullable
+    protected Fragment getInitialFragment() {
+        Fragment lockFragment = ConfirmPasswordFragmentFactory.getFragment(/* context= */ this);
+        if (lockFragment == null) {
+            // User has not set a password
+            setResult(RESULT_OK);
+            finish();
+        }
+        return lockFragment;
+    }
+
+    @Override
+    public void onLockVerified(byte[] lock) {
+        setResult(RESULT_OK);
+        finish();
+    }
+}
diff --git a/src/com/android/car/settings/security/CheckLockListener.java b/src/com/android/car/settings/security/CheckLockListener.java
index cde5e35..45289e3 100644
--- a/src/com/android/car/settings/security/CheckLockListener.java
+++ b/src/com/android/car/settings/security/CheckLockListener.java
@@ -25,5 +25,5 @@
      *
      * @param lock The verified credential
      */
-    void onLockVerified(String lock);
+    void onLockVerified(byte[] lock);
 }
diff --git a/src/com/android/car/settings/security/CheckLockWorker.java b/src/com/android/car/settings/security/CheckLockWorker.java
index ce1832d..856218f 100644
--- a/src/com/android/car/settings/security/CheckLockWorker.java
+++ b/src/com/android/car/settings/security/CheckLockWorker.java
@@ -94,7 +94,7 @@
      * Checks lock PIN/password asynchronously.  To receive callback when check is completed,
      * implement {@link Listener} and call {@link #setListener(Listener)}.
      */
-    public final void checkPinPassword(int userId, String password) {
+    public final void checkPinPassword(int userId, byte[] password) {
         if (mCheckInProgress) {
             LOG.w("Check pin/password request issued while one is still running");
             return;
diff --git a/src/com/android/car/settings/security/ChooseDeviceInstructionPreferenceController.java b/src/com/android/car/settings/security/ChooseDeviceInstructionPreferenceController.java
new file mode 100644
index 0000000..62d5b66
--- /dev/null
+++ b/src/com/android/car/settings/security/ChooseDeviceInstructionPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Displays the name of the local Bluetooth adapter.
+ */
+public class ChooseDeviceInstructionPreferenceController extends PreferenceController<Preference> {
+
+    public ChooseDeviceInstructionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setTitle(getContext().getString(R.string.trusted_device_select_device,
+                BluetoothAdapter.getDefaultAdapter().getName()));
+    }
+}
diff --git a/src/com/android/car/settings/security/ChooseLockPatternFragment.java b/src/com/android/car/settings/security/ChooseLockPatternFragment.java
index f837ebd..0e954ac 100644
--- a/src/com/android/car/settings/security/ChooseLockPatternFragment.java
+++ b/src/com/android/car/settings/security/ChooseLockPatternFragment.java
@@ -16,13 +16,15 @@
 
 package com.android.car.settings.security;
 
-import android.annotation.StringRes;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.view.View;
 import android.widget.Button;
+import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 
 import com.android.car.settings.R;
@@ -36,6 +38,7 @@
 import com.google.android.collect.Lists;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -45,178 +48,119 @@
 public class ChooseLockPatternFragment extends BaseFragment {
 
     private static final Logger LOG = new Logger(ChooseLockPatternFragment.class);
-    private static final String LOCK_OPTIONS_DIALOG_TAG = "lock_options_dialog_tag";
     private static final String FRAGMENT_TAG_SAVE_PATTERN_WORKER = "save_pattern_worker";
+    private static final String STATE_UI_STAGE = "state_ui_stage";
+    private static final String STATE_CHOSEN_PATTERN = "state_chosen_pattern";
     private static final int ID_EMPTY_MESSAGE = -1;
-
+    /**
+     * The patten used during the help screen to show how to draw a pattern.
+     */
+    private final List<LockPatternView.Cell> mAnimatePattern =
+            Collections.unmodifiableList(Lists.newArrayList(
+                    LockPatternView.Cell.of(0, 0),
+                    LockPatternView.Cell.of(0, 1),
+                    LockPatternView.Cell.of(1, 1),
+                    LockPatternView.Cell.of(2, 1)
+            ));
     // How long we wait to clear a wrong pattern
     private int mWrongPatternClearTimeOut;
     private int mUserId;
-    private boolean mIsInSetupWizard;
-
     private Stage mUiStage = Stage.Introduction;
     private LockPatternView mLockPatternView;
     private TextView mMessageText;
     private Button mSecondaryButton;
     private Button mPrimaryButton;
+    private ProgressBar mProgressBar;
     private List<LockPatternView.Cell> mChosenPattern;
-    private String mCurrentPattern;
+    // Existing pattern that user previously set
+    private byte[] mCurrentPattern;
     private SavePatternWorker mSavePatternWorker;
+    private Runnable mClearPatternRunnable = () -> mLockPatternView.clearPattern();
+    // The pattern listener that responds according to a user choosing a new
+    // lock pattern.
+    private final LockPatternView.OnPatternListener mChooseNewLockPatternListener =
+            new LockPatternView.OnPatternListener() {
+                @Override
+                public void onPatternStart() {
+                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
+                    updateUIWhenPatternInProgress();
+                }
 
-    /**
-     * Keep track internally of where the user is in choosing a pattern.
-     */
-    enum Stage {
-        /**
-         * Initial stage when first launching choose a lock pattern.
-         * Pattern mEnabled, secondary button allow for Cancel, primary button disabled.
-         */
-        Introduction(
-                R.string.lockpattern_recording_intro_header,
-                SecondaryButtonState.Cancel, PrimaryButtonState.ContinueDisabled,
-                /* patternEnabled= */ true),
-        /**
-         * Help screen to show how a valid pattern looks like.
-         * Pattern disabled, primary button shows Ok. No secondary button.
-         */
-        HelpScreen(
-                R.string.lockpattern_settings_help_how_to_record,
-                SecondaryButtonState.Gone, PrimaryButtonState.Ok,
-                /* patternEnabled= */ false),
-        /**
-         * Invalid pattern is entered, hint message show required number of dots.
-         * Secondary button allows for Retry, primary button disabled.
-         */
-        ChoiceTooShort(
-                R.string.lockpattern_recording_incorrect_too_short,
-                SecondaryButtonState.Retry, PrimaryButtonState.ContinueDisabled,
-                /* patternEnabled= */ true),
-        /**
-         * First drawing on the pattern is valid, primary button shows Continue,
-         * can proceed to next screen.
-         */
-        FirstChoiceValid(
-                R.string.lockpattern_recording_intro_header,
-                SecondaryButtonState.Retry, PrimaryButtonState.Continue,
-                /* patternEnabled= */ false),
-        /**
-         * Need to draw pattern again to confirm.
-         * Secondary button allows for Cancel, primary button disabled.
-         */
-        NeedToConfirm(
-                R.string.lockpattern_need_to_confirm,
-                SecondaryButtonState.Cancel, PrimaryButtonState.ConfirmDisabled,
-                /* patternEnabled= */ true),
-        /**
-         * Confirmation of previous drawn pattern failed, didn't enter the same pattern.
-         * Need to re-draw the pattern to match the fist pattern.
-         */
-        ConfirmWrong(
-                R.string.lockpattern_pattern_wrong,
-                SecondaryButtonState.Cancel, PrimaryButtonState.ConfirmDisabled,
-                /* patternEnabled= */ true),
-        /**
-         * Pattern is confirmed after drawing the same pattern twice.
-         * Pattern disabled.
-         */
-        ChoiceConfirmed(
-                R.string.lockpattern_pattern_confirmed,
-                SecondaryButtonState.Cancel, PrimaryButtonState.Confirm,
-                /* patternEnabled= */ false),
+                @Override
+                public void onPatternCleared() {
+                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
+                }
 
-        /**
-         * Error saving pattern.
-         * Pattern disabled, primary button shows Retry, secondary button allows for cancel
-         */
-        SaveFailure(
-                R.string.error_saving_lockpattern,
-                SecondaryButtonState.Cancel, PrimaryButtonState.Retry,
-                /* patternEnabled= */ false);
+                @Override
+                public void onPatternDetected(List<LockPatternView.Cell> pattern) {
+                    switch (mUiStage) {
+                        case Introduction:
+                        case ChoiceTooShort:
+                            handlePatternEntered(pattern);
+                            break;
+                        case ConfirmWrong:
+                        case NeedToConfirm:
+                            handleConfirmPattern(pattern);
+                            break;
+                        default:
+                            throw new IllegalStateException("Unexpected stage " + mUiStage
+                                    + " when entering the pattern.");
+                    }
+                }
 
-        final int mMessageId;
-        final SecondaryButtonState mSecondaryButtonState;
-        final PrimaryButtonState mPrimaryButtonState;
-        final boolean mPatternEnabled;
+                @Override
+                public void onPatternCellAdded(List<Cell> pattern) {
+                }
 
-        /**
-         * @param message The message displayed as instruction.
-         * @param secondaryButtonState The state of the secondary button.
-         * @param primaryButtonState The state of the primary button.
-         * @param patternEnabled Whether the pattern widget is mEnabled.
-         */
-        Stage(int messageId,
-                SecondaryButtonState secondaryButtonState,
-                PrimaryButtonState primaryButtonState,
-                boolean patternEnabled) {
-            this.mMessageId = messageId;
-            this.mSecondaryButtonState = secondaryButtonState;
-            this.mPrimaryButtonState = primaryButtonState;
-            this.mPatternEnabled = patternEnabled;
-        }
-    }
+                private void handleConfirmPattern(List<LockPatternView.Cell> pattern) {
+                    if (mChosenPattern == null) {
+                        throw new IllegalStateException(
+                                "null chosen pattern in stage 'need to confirm");
+                    }
+                    if (mChosenPattern.equals(pattern)) {
+                        updateStage(Stage.ChoiceConfirmed);
+                    } else {
+                        updateStage(Stage.ConfirmWrong);
+                    }
+                }
 
-    /**
-     * The states of the primary footer button.
-     */
-    enum PrimaryButtonState {
-        Continue(R.string.continue_button_text, true),
-        ContinueDisabled(R.string.continue_button_text, false),
-        Confirm(R.string.lockpattern_confirm_button_text, true),
-        ConfirmDisabled(R.string.lockpattern_confirm_button_text, false),
-        Retry(R.string.lockscreen_retry_button_text, true),
-        Ok(R.string.okay, true);
-
-        /**
-         * @param text The displayed mText for this mode.
-         * @param enabled Whether the button should be mEnabled.
-         */
-        PrimaryButtonState(int text, boolean enabled) {
-            this.mText = text;
-            this.mEnabled = enabled;
-        }
-
-        final int mText;
-        final boolean mEnabled;
-    }
-
-    /**
-     * The states of the secondary footer button.
-     */
-    enum SecondaryButtonState {
-        Cancel(R.string.lockpattern_cancel_button_text, true),
-        CancelDisabled(R.string.lockpattern_cancel_button_text, false),
-        Retry(R.string.lockpattern_retry_button_text, true),
-        RetryDisabled(R.string.lockpattern_retry_button_text, false),
-        Gone(ID_EMPTY_MESSAGE, false);
-
-        /**
-         * @param text The displayed mText for this mode.
-         * @param enabled Whether the button should be mEnabled.
-         */
-        SecondaryButtonState(int textId, boolean enabled) {
-            this.mTextResId = textId;
-            this.mEnabled = enabled;
-        }
-
-        final int mTextResId;
-        final boolean mEnabled;
-    }
+                private void handlePatternEntered(List<LockPatternView.Cell> pattern) {
+                    if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
+                        updateStage(Stage.ChoiceTooShort);
+                    } else {
+                        mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern);
+                        updateStage(Stage.FirstChoiceValid);
+                    }
+                }
+            };
 
     /**
      * Factory method for creating ChooseLockPatternFragment
      */
-    public static ChooseLockPatternFragment newInstance(boolean isInSetupWizard) {
+    public static ChooseLockPatternFragment newInstance() {
         ChooseLockPatternFragment patternFragment = new ChooseLockPatternFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.security_lock_pattern);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, isInSetupWizard
-                ? R.layout.suw_action_bar_with_button : R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.choose_lock_pattern);
-        patternFragment.setArguments(bundle);
         return patternFragment;
     }
 
     @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return R.layout.choose_lock_pattern;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return R.string.security_lock_pattern;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mWrongPatternClearTimeOut = getResources().getInteger(R.integer.clear_content_timeout_ms);
@@ -224,8 +168,13 @@
 
         Bundle args = getArguments();
         if (args != null) {
-            mIsInSetupWizard = args.getBoolean(BaseFragment.EXTRA_RUNNING_IN_SETUP_WIZARD);
-            mCurrentPattern = args.getString(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
+            mCurrentPattern = args.getByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
+        }
+
+        if (savedInstanceState != null) {
+            mUiStage = Stage.values()[savedInstanceState.getInt(STATE_UI_STAGE)];
+            mChosenPattern = LockPatternUtils.byteArrayToPattern(
+                    savedInstanceState.getByteArray(STATE_CHOSEN_PATTERN));
         }
     }
 
@@ -243,14 +192,6 @@
         mLockPatternView.clearPattern();
         mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
 
-        if (mIsInSetupWizard) {
-            View screenLockOptions = view.findViewById(R.id.screen_lock_options);
-            screenLockOptions.setVisibility(View.VISIBLE);
-            screenLockOptions.setOnClickListener(v -> {
-                new LockTypeDialogFragment().show(getFragmentManager(), LOCK_OPTIONS_DIALOG_TAG);
-            });
-        }
-
         // Re-attach to the exiting worker if there is one.
         if (savedInstanceState != null) {
             mSavePatternWorker = (SavePatternWorker) getFragmentManager().findFragmentByTag(
@@ -261,15 +202,11 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        mProgressBar = requireActivity().findViewById(R.id.progress_bar);
 
-        // Don't show toolbar title in Setup Wizard
-        if (mIsInSetupWizard) {
-            ((TextView) getActivity().findViewById(R.id.title)).setText("");
-        }
-
-        mPrimaryButton = getActivity().findViewById(R.id.action_button1);
+        mPrimaryButton = requireActivity().findViewById(R.id.action_button1);
         mPrimaryButton.setOnClickListener(view -> handlePrimaryButtonClick());
-        mSecondaryButton = getActivity().findViewById(R.id.action_button2);
+        mSecondaryButton = requireActivity().findViewById(R.id.action_button2);
         mSecondaryButton.setVisibility(View.VISIBLE);
         mSecondaryButton.setOnClickListener(view -> handleSecondaryButtonClick());
     }
@@ -286,17 +223,27 @@
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt(STATE_UI_STAGE, mUiStage.ordinal());
+        outState.putByteArray(STATE_CHOSEN_PATTERN,
+                LockPatternUtils.patternToByteArray(mChosenPattern));
+    }
+
+    @Override
     public void onStop() {
         super.onStop();
         if (mSavePatternWorker != null) {
             mSavePatternWorker.setListener(null);
         }
+        mProgressBar.setVisibility(View.GONE);
     }
 
     /**
      * Updates the messages and buttons appropriate to what stage the user
      * is at in choosing a pattern. This doesn't handle clearing out the pattern;
      * the pattern is expected to be in the right state.
+     *
      * @param stage The stage UI should be updated to match with.
      */
     protected void updateStage(Stage stage) {
@@ -310,13 +257,7 @@
             setSecondaryButtonVisible(false);
         } else {
             setSecondaryButtonVisible(true);
-            // In Setup Wizard, the Cancel button text is replaced with Skip
-            if (mIsInSetupWizard && stage.mSecondaryButtonState.mTextResId
-                    == R.string.lockpattern_cancel_button_text) {
-                setSecondaryButtonText(R.string.lockscreen_skip_button_text);
-            } else {
-                setSecondaryButtonText(stage.mSecondaryButtonState.mTextResId);
-            }
+            setSecondaryButtonText(stage.mSecondaryButtonState.mTextResId);
             setSecondaryButtonEnabled(stage.mSecondaryButtonState.mEnabled);
         }
 
@@ -361,63 +302,6 @@
         }
     }
 
-    // The pattern listener that responds according to a user choosing a new
-    // lock pattern.
-    private final LockPatternView.OnPatternListener mChooseNewLockPatternListener =
-            new LockPatternView.OnPatternListener() {
-                @Override
-                public void onPatternStart() {
-                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
-                    updateUIWhenPatternInProgress();
-                }
-
-                @Override
-                public void onPatternCleared() {
-                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
-                }
-
-                @Override
-                public void onPatternDetected(List<LockPatternView.Cell> pattern) {
-                    switch(mUiStage) {
-                        case Introduction:
-                        case ChoiceTooShort:
-                            handlePatternEntered(pattern);
-                            break;
-                        case ConfirmWrong:
-                        case NeedToConfirm:
-                            handleConfirmPattern(pattern);
-                            break;
-                        default:
-                            throw new IllegalStateException("Unexpected stage " + mUiStage
-                                    + " when entering the pattern.");
-                    }
-                }
-
-                @Override
-                public void onPatternCellAdded(List<Cell> pattern) {}
-
-                private void handleConfirmPattern(List<LockPatternView.Cell> pattern) {
-                    if (mChosenPattern == null) {
-                        throw new IllegalStateException(
-                                "null chosen pattern in stage 'need to confirm");
-                    }
-                    if (mChosenPattern.equals(pattern)) {
-                        updateStage(Stage.ChoiceConfirmed);
-                    } else {
-                        updateStage(Stage.ConfirmWrong);
-                    }
-                }
-
-                private void handlePatternEntered(List<LockPatternView.Cell> pattern) {
-                    if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
-                        updateStage(Stage.ChoiceTooShort);
-                    } else {
-                        mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern);
-                        updateStage(Stage.FirstChoiceValid);
-                    }
-                }
-            };
-
     private void updateUIWhenPatternInProgress() {
         mMessageText.setText(R.string.lockpattern_recording_inprogress);
         setPrimaryButtonEnabled(false);
@@ -451,23 +335,10 @@
         mSecondaryButton.setText(textId);
     }
 
-    /**
-     * The patten used during the help screen to show how to draw a pattern.
-     */
-    private final List<LockPatternView.Cell> mAnimatePattern =
-            Collections.unmodifiableList(Lists.newArrayList(
-                    LockPatternView.Cell.of(0, 0),
-                    LockPatternView.Cell.of(0, 1),
-                    LockPatternView.Cell.of(1, 1),
-                    LockPatternView.Cell.of(2, 1)
-            ));
-
-    private Runnable mClearPatternRunnable = () -> mLockPatternView.clearPattern();
-
     // Update display message and decide on next step according to the different mText
     // on the primary button
     private void handlePrimaryButtonClick() {
-        switch(mUiStage.mPrimaryButtonState) {
+        switch (mUiStage.mPrimaryButtonState) {
             case Continue:
                 if (mUiStage != Stage.FirstChoiceValid) {
                     throw new IllegalStateException("expected ui stage "
@@ -507,18 +378,14 @@
     // Update display message and proceed to next step according to the different mText on
     // the secondary button.
     private void handleSecondaryButtonClick() {
-        switch(mUiStage.mSecondaryButtonState) {
+        switch (mUiStage.mSecondaryButtonState) {
             case Retry:
                 mChosenPattern = null;
                 mLockPatternView.clearPattern();
                 updateStage(Stage.Introduction);
                 break;
             case Cancel:
-                if (mIsInSetupWizard) {
-                    ((SetupWizardScreenLockActivity) getActivity()).onCancel();
-                } else {
-                    getFragmentController().goBack();
-                }
+                getFragmentController().goBack();
                 break;
             default:
                 throw new IllegalStateException("secondary footer button pressed, but stage of "
@@ -526,8 +393,10 @@
         }
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void onChosenLockSaveFinished(boolean isSaveSuccessful) {
+        mProgressBar.setVisibility(View.GONE);
+
         if (isSaveSuccessful) {
             onComplete();
         } else {
@@ -555,14 +424,162 @@
         }
 
         mSavePatternWorker.start(mUserId, mChosenPattern, mCurrentPattern);
+        mProgressBar.setVisibility(View.VISIBLE);
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void onComplete() {
-        if (mIsInSetupWizard) {
-            ((SetupWizardScreenLockActivity) getActivity()).onComplete();
-        } else {
-            getActivity().finish();
+        if (mCurrentPattern != null) {
+            Arrays.fill(mCurrentPattern, (byte) 0);
+        }
+
+        getActivity().finish();
+    }
+
+    /**
+     * Keep track internally of where the user is in choosing a pattern.
+     */
+    enum Stage {
+        /**
+         * Initial stage when first launching choose a lock pattern.
+         * Pattern mEnabled, secondary button allow for Cancel, primary button disabled.
+         */
+        Introduction(
+                R.string.lockpattern_recording_intro_header,
+                SecondaryButtonState.Cancel,
+                PrimaryButtonState.ContinueDisabled,
+                /* patternEnabled= */ true),
+        /**
+         * Help screen to show how a valid pattern looks like.
+         * Pattern disabled, primary button shows Ok. No secondary button.
+         */
+        HelpScreen(
+                R.string.lockpattern_settings_help_how_to_record,
+                SecondaryButtonState.Gone,
+                PrimaryButtonState.Ok,
+                /* patternEnabled= */ false),
+        /**
+         * Invalid pattern is entered, hint message show required number of dots.
+         * Secondary button allows for Retry, primary button disabled.
+         */
+        ChoiceTooShort(
+                R.string.lockpattern_recording_incorrect_too_short,
+                SecondaryButtonState.Retry,
+                PrimaryButtonState.ContinueDisabled,
+                /* patternEnabled= */ true),
+        /**
+         * First drawing on the pattern is valid, primary button shows Continue,
+         * can proceed to next screen.
+         */
+        FirstChoiceValid(
+                R.string.lockpattern_recording_intro_header,
+                SecondaryButtonState.Retry,
+                PrimaryButtonState.Continue,
+                /* patternEnabled= */ false),
+        /**
+         * Need to draw pattern again to confirm.
+         * Secondary button allows for Cancel, primary button disabled.
+         */
+        NeedToConfirm(
+                R.string.lockpattern_need_to_confirm,
+                SecondaryButtonState.Cancel,
+                PrimaryButtonState.ConfirmDisabled,
+                /* patternEnabled= */ true),
+        /**
+         * Confirmation of previous drawn pattern failed, didn't enter the same pattern.
+         * Need to re-draw the pattern to match the fist pattern.
+         */
+        ConfirmWrong(
+                R.string.lockpattern_pattern_wrong,
+                SecondaryButtonState.Cancel,
+                PrimaryButtonState.ConfirmDisabled,
+                /* patternEnabled= */ true),
+        /**
+         * Pattern is confirmed after drawing the same pattern twice.
+         * Pattern disabled.
+         */
+        ChoiceConfirmed(
+                R.string.lockpattern_pattern_confirmed,
+                SecondaryButtonState.Cancel,
+                PrimaryButtonState.Confirm,
+                /* patternEnabled= */ false),
+
+        /**
+         * Error saving pattern.
+         * Pattern disabled, primary button shows Retry, secondary button allows for cancel
+         */
+        SaveFailure(
+                R.string.error_saving_lockpattern,
+                SecondaryButtonState.Cancel,
+                PrimaryButtonState.Retry,
+                /* patternEnabled= */ false);
+
+        final int mMessageId;
+        final SecondaryButtonState mSecondaryButtonState;
+        final PrimaryButtonState mPrimaryButtonState;
+        final boolean mPatternEnabled;
+
+        /**
+         * @param messageId            The message displayed as instruction.
+         * @param secondaryButtonState The state of the secondary button.
+         * @param primaryButtonState   The state of the primary button.
+         * @param patternEnabled       Whether the pattern widget is mEnabled.
+         */
+        Stage(@StringRes int messageId,
+                SecondaryButtonState secondaryButtonState,
+                PrimaryButtonState primaryButtonState,
+                boolean patternEnabled) {
+            this.mMessageId = messageId;
+            this.mSecondaryButtonState = secondaryButtonState;
+            this.mPrimaryButtonState = primaryButtonState;
+            this.mPatternEnabled = patternEnabled;
+        }
+    }
+
+    /**
+     * The states of the primary footer button.
+     */
+    enum PrimaryButtonState {
+        Continue(R.string.continue_button_text, true),
+        ContinueDisabled(R.string.continue_button_text, false),
+        Confirm(R.string.lockpattern_confirm_button_text, true),
+        ConfirmDisabled(R.string.lockpattern_confirm_button_text, false),
+        Retry(R.string.lockscreen_retry_button_text, true),
+        Ok(R.string.okay, true);
+
+        final int mText;
+        final boolean mEnabled;
+
+        /**
+         * @param text    The displayed mText for this mode.
+         * @param enabled Whether the button should be mEnabled.
+         */
+        PrimaryButtonState(@StringRes int text, boolean enabled) {
+            this.mText = text;
+            this.mEnabled = enabled;
+        }
+    }
+
+    /**
+     * The states of the secondary footer button.
+     */
+    enum SecondaryButtonState {
+        Cancel(R.string.lockpattern_cancel_button_text, true),
+        CancelDisabled(R.string.lockpattern_cancel_button_text, false),
+        Retry(R.string.lockpattern_retry_button_text, true),
+        RetryDisabled(R.string.lockpattern_retry_button_text, false),
+        Gone(ID_EMPTY_MESSAGE, false);
+
+        final int mTextResId;
+        final boolean mEnabled;
+
+        /**
+         * @param textId  The displayed mText for this mode.
+         * @param enabled Whether the button should be mEnabled.
+         */
+        SecondaryButtonState(@StringRes int textId, boolean enabled) {
+            this.mTextResId = textId;
+            this.mEnabled = enabled;
         }
     }
 }
diff --git a/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java b/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java
index e720849..793ea58 100644
--- a/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java
+++ b/src/com/android/car/settings/security/ChooseLockPinPasswordFragment.java
@@ -16,8 +16,6 @@
 
 package com.android.car.settings.security;
 
-import android.annotation.DrawableRes;
-import android.annotation.StringRes;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.os.Bundle;
@@ -33,15 +31,22 @@
 import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.EditText;
+import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
 import com.android.car.settings.common.Logger;
+import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.TextViewInputDisabler;
 
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -51,6 +56,8 @@
 
     private static final String LOCK_OPTIONS_DIALOG_TAG = "lock_options_dialog_tag";
     private static final String FRAGMENT_TAG_SAVE_PASSWORD_WORKER = "save_password_worker";
+    private static final String STATE_UI_STAGE = "state_ui_stage";
+    private static final String STATE_FIRST_ENTRY = "state_first_entry";
     private static final Logger LOG = new Logger(ChooseLockPinPasswordFragment.class);
     private static final String EXTRA_IS_PIN = "extra_is_pin";
 
@@ -59,104 +66,34 @@
     private int mUserId;
     private int mErrorCode = PasswordHelper.NO_ERROR;
 
-    private boolean mIsInSetupWizard;
     private boolean mIsPin;
     private boolean mIsAlphaMode;
 
     // Password currently in the input field
-    private String mCurrentEntry;
+    private byte[] mCurrentEntry;
     // Existing password that user previously set
-    private String mExistingPassword;
+    private byte[] mExistingPassword;
     // Password must be entered twice.  This is what user entered the first time.
-    private String mFirstEntry;
+    private byte[] mFirstEntry;
 
     private PinPadView mPinPad;
     private TextView mHintMessage;
     private Button mSecondaryButton;
     private Button mPrimaryButton;
     private EditText mPasswordField;
+    private ProgressBar mProgressBar;
 
     private TextChangedHandler mTextChangedHandler = new TextChangedHandler();
     private TextViewInputDisabler mPasswordEntryInputDisabler;
     private SavePasswordWorker mSavePasswordWorker;
     private PasswordHelper mPasswordHelper;
 
-    // Keep track internally of where the user is in choosing a password.
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    enum Stage {
-        Introduction(
-                R.string.choose_lock_password_hints,
-                R.string.choose_lock_pin_hints,
-                R.string.continue_button_text,
-                R.string.lockpassword_cancel_label,
-                R.drawable.ic_arrow_forward_on_disc),
-
-        PasswordInvalid(
-                R.string.lockpassword_invalid_password,
-                R.string.lockpin_invalid_pin,
-                R.string.continue_button_text,
-                R.string.lockpassword_clear_label,
-                R.drawable.ic_arrow_forward_on_disc),
-
-        NeedToConfirm(
-                R.string.confirm_your_password_header,
-                R.string.confirm_your_pin_header,
-                R.string.lockpassword_confirm_label,
-                R.string.lockpassword_cancel_label,
-                R.drawable.ic_check_on_disc),
-
-        ConfirmWrong(
-                R.string.confirm_passwords_dont_match,
-                R.string.confirm_pins_dont_match,
-                R.string.continue_button_text,
-                R.string.lockpassword_cancel_label,
-                R.drawable.ic_check_on_disc),
-
-        SaveFailure(
-                R.string.error_saving_password,
-                R.string.error_saving_lockpin,
-                R.string.lockscreen_retry_button_text,
-                R.string.lockpassword_cancel_label,
-                R.drawable.ic_check_on_disc);
-
-        public final int alphaHint;
-        public final int numericHint;
-        public final int primaryButtonText;
-        public final int secondaryButtonText;
-        public final int enterKeyIcon;
-
-        Stage(@StringRes int hintInAlpha,
-                @StringRes int hintInNumeric,
-                @StringRes int primaryButtonText,
-                @StringRes int secondaryButtonText,
-                @DrawableRes int enterKeyIcon) {
-            this.alphaHint = hintInAlpha;
-            this.numericHint = hintInNumeric;
-            this.primaryButtonText = primaryButtonText;
-            this.secondaryButtonText = secondaryButtonText;
-            this.enterKeyIcon = enterKeyIcon;
-        }
-
-        @StringRes
-        public int getHint(boolean isAlpha) {
-            if (isAlpha) {
-                return alphaHint;
-            } else {
-                return numericHint;
-            }
-        }
-    }
-
     /**
      * Factory method for creating fragment in password mode
      */
-    public static ChooseLockPinPasswordFragment newPasswordInstance(boolean isInSetupWizard) {
+    public static ChooseLockPinPasswordFragment newPasswordInstance() {
         ChooseLockPinPasswordFragment passwordFragment = new ChooseLockPinPasswordFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.security_lock_password);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, isInSetupWizard
-                ? R.layout.suw_action_bar_with_button : R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.choose_lock_password);
+        Bundle bundle = new Bundle();
         bundle.putBoolean(EXTRA_IS_PIN, false);
         passwordFragment.setArguments(bundle);
         return passwordFragment;
@@ -165,28 +102,41 @@
     /**
      * Factory method for creating fragment in Pin mode
      */
-    public static ChooseLockPinPasswordFragment newPinInstance(boolean isInSetupWizard) {
+    public static ChooseLockPinPasswordFragment newPinInstance() {
         ChooseLockPinPasswordFragment passwordFragment = new ChooseLockPinPasswordFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.security_lock_pin);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, isInSetupWizard
-                ? R.layout.suw_action_bar_with_button : R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.choose_lock_pin);
+        Bundle bundle = new Bundle();
         bundle.putBoolean(EXTRA_IS_PIN, true);
         passwordFragment.setArguments(bundle);
         return passwordFragment;
     }
 
     @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return mIsPin ? R.layout.choose_lock_pin : R.layout.choose_lock_password;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return mIsPin ? R.string.security_lock_pin : R.string.security_lock_password;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mUserId = UserHandle.myUserId();
 
         Bundle args = getArguments();
         if (args != null) {
-            mIsInSetupWizard = args.getBoolean(BaseFragment.EXTRA_RUNNING_IN_SETUP_WIZARD);
             mIsPin = args.getBoolean(EXTRA_IS_PIN);
-            mExistingPassword = args.getString(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
+            mExistingPassword = args.getByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
         }
 
         mPasswordHelper = new PasswordHelper(mIsPin);
@@ -195,6 +145,11 @@
         mIsAlphaMode = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == passwordQuality
                 || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == passwordQuality
                 || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == passwordQuality;
+
+        if (savedInstanceState != null) {
+            mUiStage = Stage.values()[savedInstanceState.getInt(STATE_UI_STAGE)];
+            mFirstEntry = savedInstanceState.getByteArray(STATE_FIRST_ENTRY);
+        }
     }
 
     @Override
@@ -240,14 +195,6 @@
 
         mHintMessage = view.findViewById(R.id.hint_text);
 
-        if (mIsInSetupWizard) {
-            View screenLockOptions = view.findViewById(R.id.screen_lock_options);
-            screenLockOptions.setVisibility(View.VISIBLE);
-            screenLockOptions.setOnClickListener(v -> {
-                new LockTypeDialogFragment().show(getFragmentManager(), LOCK_OPTIONS_DIALOG_TAG);
-            });
-        }
-
         if (mIsPin) {
             initPinView(view);
         } else {
@@ -269,13 +216,9 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        mProgressBar = requireActivity().findViewById(R.id.progress_bar);
 
-        // Don't show toolbar title in Setup Wizard
-        if (mIsInSetupWizard) {
-            ((TextView) getActivity().findViewById(R.id.title)).setText("");
-        }
-
-        mPrimaryButton = getActivity().findViewById(R.id.action_button1);
+        mPrimaryButton = requireActivity().findViewById(R.id.action_button1);
         mPrimaryButton.setOnClickListener(view -> handlePrimaryButtonClick());
         mSecondaryButton = getActivity().findViewById(R.id.action_button2);
         mSecondaryButton.setVisibility(View.VISIBLE);
@@ -293,11 +236,19 @@
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt(STATE_UI_STAGE, mUiStage.ordinal());
+        outState.putByteArray(STATE_FIRST_ENTRY, mFirstEntry);
+    }
+
+    @Override
     public void onStop() {
         super.onStop();
         if (mSavePasswordWorker != null) {
             mSavePasswordWorker.setListener(null);
         }
+        mProgressBar.setVisibility(View.GONE);
     }
 
     /**
@@ -308,23 +259,15 @@
     }
 
     /**
-     * Populate the password entry field with the argument
-     */
-    private void setPasswordField(String text) {
-        mPasswordField.setText(text);
-    }
-
-    /**
      * Returns the string in the password entry field
      */
-    private String getEnteredPassword() {
-        return mPasswordField.getText().toString();
+    @Nullable
+    private byte[] getEnteredPassword() {
+        return LockPatternUtils.charSequenceToByteArray(mPasswordField.getText());
     }
 
     private void initPinView(View view) {
-        mPinPad = (PinPadView) view.findViewById(R.id.pin_pad);
-        // ChooseLockPin fragment sets the icon dynamically and doesn't use the default tint.
-        mPinPad.setEnterKeyImageTint(null);
+        mPinPad = view.findViewById(R.id.pin_pad);
 
         PinPadView.PinPadClickListener pinPadClickListener = new PinPadView.PinPadClickListener() {
             @Override
@@ -334,9 +277,13 @@
 
             @Override
             public void onBackspaceClick() {
-                String pin = getEnteredPassword();
-                if (pin.length() > 0) {
-                    setPasswordField(pin.substring(0, pin.length() - 1));
+                byte[] pin = getEnteredPassword();
+                if (pin != null && pin.length > 0) {
+                    mPasswordField.getText().delete(mPasswordField.getSelectionEnd() - 1,
+                            mPasswordField.getSelectionEnd());
+                }
+                if (pin != null) {
+                    Arrays.fill(pin, (byte) 0);
                 }
             }
 
@@ -350,7 +297,8 @@
     }
 
     private boolean shouldEnableSubmit() {
-        return getEnteredPassword().length() >= PasswordHelper.MIN_LENGTH
+        return getEnteredPassword() != null
+                && getEnteredPassword().length >= PasswordHelper.MIN_LENGTH
                 && (mSavePasswordWorker == null || mSavePasswordWorker.isFinished());
     }
 
@@ -385,7 +333,7 @@
 
         mCurrentEntry = getEnteredPassword();
 
-        switch(mUiStage) {
+        switch (mUiStage) {
             case Introduction:
                 mErrorCode = mPasswordHelper.validate(mCurrentEntry);
                 if (mErrorCode == PasswordHelper.NO_ERROR) {
@@ -394,13 +342,14 @@
                     updateStage(Stage.NeedToConfirm);
                 } else {
                     updateStage(Stage.PasswordInvalid);
+                    Arrays.fill(mCurrentEntry, (byte) 0);
                 }
                 break;
             case NeedToConfirm:
             case SaveFailure:
                 // Password must be entered twice. mFirstEntry is the one the user entered
                 // the first time.  mCurrentEntry is what's currently in the input field
-                if (mFirstEntry.equals(mCurrentEntry)) {
+                if (Arrays.equals(mFirstEntry, mCurrentEntry)) {
                     startSaveAndFinish();
                 } else {
                     CharSequence tmp = mPasswordField.getText();
@@ -408,6 +357,7 @@
                         Selection.setSelection((Spannable) tmp, 0, tmp.length());
                     }
                     updateStage(Stage.ConfirmWrong);
+                    Arrays.fill(mCurrentEntry, (byte) 0);
                 }
                 break;
             default:
@@ -425,23 +375,15 @@
         if (mUiStage.secondaryButtonText == R.string.lockpassword_clear_label) {
             mPasswordField.setText("");
             mUiStage = Stage.Introduction;
-            if (mIsInSetupWizard && mUiStage.secondaryButtonText
-                    == R.string.lockpassword_cancel_label) {
-                setSecondaryButtonText(R.string.lockscreen_skip_button_text);
-            } else {
-                setSecondaryButtonText(mUiStage.secondaryButtonText);
-            }
+            setSecondaryButtonText(mUiStage.secondaryButtonText);
         } else {
-            if (mIsInSetupWizard) {
-                ((SetupWizardScreenLockActivity) getActivity()).onCancel();
-            } else {
-                getFragmentController().goBack();
-            }
+            getFragmentController().goBack();
         }
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void onChosenLockSaveFinished(boolean isSaveSuccessful) {
+        mProgressBar.setVisibility(View.GONE);
         if (isSaveSuccessful) {
             onComplete();
         } else {
@@ -471,6 +413,7 @@
         mSavePasswordWorker.start(mUserId, mCurrentEntry, mExistingPassword,
                 mPasswordHelper.getPasswordQuality());
 
+        mProgressBar.setVisibility(View.VISIBLE);
         updateSubmitButtonsState();
     }
 
@@ -488,7 +431,7 @@
             mPinPad.setEnterKeyIcon(mUiStage.enterKeyIcon);
         }
 
-        switch(mUiStage) {
+        switch (mUiStage) {
             case Introduction:
             case NeedToConfirm:
                 mPasswordField.setError(null);
@@ -508,12 +451,7 @@
         }
 
         setPrimaryButtonText(mUiStage.primaryButtonText);
-        if (mIsInSetupWizard && mUiStage.secondaryButtonText
-                == R.string.lockpassword_cancel_label) {
-            setSecondaryButtonText(R.string.lockscreen_skip_button_text);
-        } else {
-            setSecondaryButtonText(mUiStage.secondaryButtonText);
-        }
+        setSecondaryButtonText(mUiStage.secondaryButtonText);
         mPasswordEntryInputDisabler.setInputEnabled(inputAllowed);
     }
 
@@ -526,18 +464,94 @@
         mHintMessage.setText(message);
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void updateStage(Stage stage) {
         mUiStage = stage;
         updateUi();
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void onComplete() {
-        if (mIsInSetupWizard) {
-            ((SetupWizardScreenLockActivity) getActivity()).onComplete();
-        } else {
-            getActivity().finish();
+        if (mCurrentEntry != null) {
+            Arrays.fill(mCurrentEntry, (byte) 0);
+        }
+
+        if (mExistingPassword != null) {
+            Arrays.fill(mExistingPassword, (byte) 0);
+        }
+
+        if (mFirstEntry != null) {
+            Arrays.fill(mFirstEntry, (byte) 0);
+        }
+
+        mPasswordField.setText("");
+
+        getActivity().finish();
+    }
+
+    // Keep track internally of where the user is in choosing a password.
+    @VisibleForTesting
+    enum Stage {
+        Introduction(
+                R.string.choose_lock_password_hints,
+                R.string.choose_lock_pin_hints,
+                R.string.continue_button_text,
+                R.string.lockpassword_cancel_label,
+                R.drawable.ic_arrow_forward),
+
+        PasswordInvalid(
+                R.string.lockpassword_invalid_password,
+                R.string.lockpin_invalid_pin,
+                R.string.continue_button_text,
+                R.string.lockpassword_clear_label,
+                R.drawable.ic_arrow_forward),
+
+        NeedToConfirm(
+                R.string.confirm_your_password_header,
+                R.string.confirm_your_pin_header,
+                R.string.lockpassword_confirm_label,
+                R.string.lockpassword_cancel_label,
+                R.drawable.ic_check),
+
+        ConfirmWrong(
+                R.string.confirm_passwords_dont_match,
+                R.string.confirm_pins_dont_match,
+                R.string.continue_button_text,
+                R.string.lockpassword_cancel_label,
+                R.drawable.ic_check),
+
+        SaveFailure(
+                R.string.error_saving_password,
+                R.string.error_saving_lockpin,
+                R.string.lockscreen_retry_button_text,
+                R.string.lockpassword_cancel_label,
+                R.drawable.ic_check);
+
+        public final int alphaHint;
+        public final int numericHint;
+        public final int primaryButtonText;
+        public final int secondaryButtonText;
+        public final int enterKeyIcon;
+
+        Stage(@StringRes int hintInAlpha,
+                @StringRes int hintInNumeric,
+                @StringRes int primaryButtonText,
+                @StringRes int secondaryButtonText,
+                @DrawableRes int enterKeyIcon) {
+            this.alphaHint = hintInAlpha;
+            this.numericHint = hintInNumeric;
+            this.primaryButtonText = primaryButtonText;
+            this.secondaryButtonText = secondaryButtonText;
+            this.enterKeyIcon = enterKeyIcon;
+        }
+
+        @StringRes
+        public int getHint(boolean isAlpha) {
+            if (isAlpha) {
+                return alphaHint;
+            } else {
+                return numericHint;
+            }
         }
     }
 
diff --git a/src/com/android/car/settings/security/ChooseLockTypeFragment.java b/src/com/android/car/settings/security/ChooseLockTypeFragment.java
index 91793fa..b9959a1 100644
--- a/src/com/android/car/settings/security/ChooseLockTypeFragment.java
+++ b/src/com/android/car/settings/security/ChooseLockTypeFragment.java
@@ -16,19 +16,13 @@
 
 package com.android.car.settings.security;
 
-import android.app.admin.DevicePolicyManager;
+import android.content.Context;
 import android.os.Bundle;
-import android.os.UserHandle;
-import android.text.TextUtils;
 
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.internal.widget.LockPatternUtils;
+import com.android.car.settings.common.SettingsFragment;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -36,126 +30,37 @@
 /**
  * Give user choices of lock screen type: Pin/Pattern/Password or None.
  */
-public class ChooseLockTypeFragment extends ListItemSettingsFragment {
+public class ChooseLockTypeFragment extends SettingsFragment {
 
     public static final String EXTRA_CURRENT_PASSWORD_QUALITY = "extra_current_password_quality";
-    private static final String DIALOG_TAG = "ConfirmRemoveScreenLockDialog";
 
-    private ListItemProvider mItemProvider;
-    private String mCurrPassword;
+    private byte[] mCurrPassword;
     private int mPasswordQuality;
 
-    private final ConfirmRemoveScreenLockDialog.ConfirmRemoveLockListener mConfirmListener = () -> {
-        int userId = UserHandle.myUserId();
-        new LockPatternUtils(getContext()).clearLock(mCurrPassword, userId);
-        getFragmentController().goBack();
-    };
-
-    public static ChooseLockTypeFragment newInstance() {
-        ChooseLockTypeFragment chooseLockTypeFragment = new ChooseLockTypeFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.lock_settings_picker_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        chooseLockTypeFragment.setArguments(bundle);
-        return chooseLockTypeFragment;
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.choose_lock_type_fragment;
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
+    public void onAttach(Context context) {
+        super.onAttach(context);
         Bundle args = getArguments();
         if (args != null) {
-            mCurrPassword = args.getString(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
+            mCurrPassword = args.getByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK);
             mPasswordQuality = args.getInt(EXTRA_CURRENT_PASSWORD_QUALITY);
         }
 
-        if (savedInstanceState != null) {
-            ConfirmRemoveScreenLockDialog dialog = (ConfirmRemoveScreenLockDialog)
-                    getFragmentManager().findFragmentByTag(DIALOG_TAG);
-            if (dialog != null) {
-                dialog.setConfirmRemoveLockListener(mConfirmListener);
-            }
+        List<LockTypeBasePreferenceController> controllers = new ArrayList<>();
+        controllers.add(use(NoLockPreferenceController.class, R.string.pk_no_lock));
+        controllers.add(use(PatternLockPreferenceController.class, R.string.pk_pattern_lock));
+        controllers.add(use(PasswordLockPreferenceController.class, R.string.pk_password_lock));
+        controllers.add(use(PinLockPreferenceController.class, R.string.pk_pin_lock));
+
+        for (LockTypeBasePreferenceController controller : controllers) {
+            controller.setCurrentPassword(mCurrPassword);
+            controller.setCurrentPasswordQuality(mPasswordQuality);
         }
     }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        if (mItemProvider == null) {
-            mItemProvider = new ListItemProvider.ListProvider(getListItems());
-        }
-        return mItemProvider;
-    }
-
-    private List<ListItem> getListItems() {
-        List<ListItem> items = new ArrayList<>();
-        items.add(createNoneLineItem());
-        items.add(createLockPatternLineItem());
-        items.add(createLockPasswordLineItem());
-        items.add(createLockPinLineItem());
-        return items;
-    }
-
-    private ListItem createNoneLineItem() {
-        TextListItem item = new TextListItem(getContext());
-        item.setTitle(getString(R.string.security_lock_none));
-        if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
-            item.setBody(getString(R.string.current_screen_lock));
-            // TODO set item disabled after b/78784323 is fixed
-        } else {
-            item.setOnClickListener(view -> {
-                ConfirmRemoveScreenLockDialog dialog = new ConfirmRemoveScreenLockDialog();
-                dialog.setConfirmRemoveLockListener(mConfirmListener);
-                dialog.show(getFragmentManager(), DIALOG_TAG);
-            });
-        }
-        return item;
-    }
-
-    private ListItem createLockPatternLineItem() {
-        TextListItem item = new TextListItem(getContext());
-        item.setTitle(getString(R.string.security_lock_pattern));
-        if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
-            item.setBody(getString(R.string.current_screen_lock));
-        }
-        item.setOnClickListener(view -> launchFragment(
-                ChooseLockPatternFragment.newInstance(/* isInSetupWizard= */ false)));
-        return item;
-    }
-
-    private ListItem createLockPasswordLineItem() {
-        TextListItem item = new TextListItem(getContext());
-        item.setTitle(getString(R.string.security_lock_password));
-        if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
-                || mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC) {
-            item.setBody(getString(R.string.current_screen_lock));
-        }
-        item.setOnClickListener(view -> launchFragment(
-                ChooseLockPinPasswordFragment.newPasswordInstance(/* isInSetupWizard= */ false)));
-        return item;
-    }
-
-    private ListItem createLockPinLineItem() {
-        TextListItem item = new TextListItem(getContext());
-        item.setTitle(getString(R.string.security_lock_pin));
-        if (mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
-                || mPasswordQuality == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX) {
-            item.setBody(getString(R.string.current_screen_lock));
-        }
-        item.setOnClickListener(view -> launchFragment(
-                ChooseLockPinPasswordFragment.newPinInstance(/* isInSetupWizard= */ false)));
-        return item;
-    }
-
-    private void launchFragment(BaseFragment fragment) {
-        if (!TextUtils.isEmpty(mCurrPassword)) {
-            Bundle args = fragment.getArguments();
-            if (args == null) {
-                args = new Bundle();
-            }
-            args.putString(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, mCurrPassword);
-            fragment.setArguments(args);
-        }
-
-        getFragmentController().launchFragment(fragment);
-    }
 }
diff --git a/src/com/android/car/settings/security/ChooseTrustedDeviceFragment.java b/src/com/android/car/settings/security/ChooseTrustedDeviceFragment.java
new file mode 100644
index 0000000..f5f976e
--- /dev/null
+++ b/src/com/android/car/settings/security/ChooseTrustedDeviceFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.security;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Fragment which contains trusted device list and add trusted device button.
+ */
+public class ChooseTrustedDeviceFragment extends SettingsFragment {
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.choose_trusted_device_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/security/ConfirmLockPatternFragment.java b/src/com/android/car/settings/security/ConfirmLockPatternFragment.java
index 58d5e4f..afe3d97 100644
--- a/src/com/android/car/settings/security/ConfirmLockPatternFragment.java
+++ b/src/com/android/car/settings/security/ConfirmLockPatternFragment.java
@@ -20,9 +20,11 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.view.View;
-import android.widget.Button;
 import android.widget.TextView;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
 import com.android.internal.widget.LockPatternUtils;
@@ -47,21 +49,24 @@
     private CheckLockListener mCheckLockListener;
 
     private int mUserId;
-    private boolean mIsInSetupWizard;
     private List<LockPatternView.Cell> mPattern;
 
-    /**
-     * Factory method for creating ConfirmLockPatternFragment
-     */
-    public static ConfirmLockPatternFragment newInstance(boolean isInSetupWizard) {
-        ConfirmLockPatternFragment patternFragment = new ConfirmLockPatternFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.security_settings_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, isInSetupWizard
-                ? R.layout.suw_action_bar_with_button : R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.confirm_lock_pattern_fragment);
-        patternFragment.setArguments(bundle);
-        return patternFragment;
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return R.layout.confirm_lock_pattern;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return R.string.security_settings_title;
     }
 
     @Override
@@ -79,11 +84,6 @@
         super.onCreate(savedInstanceState);
         mLockPatternUtils = new LockPatternUtils(getContext());
         mUserId = UserHandle.myUserId();
-
-        Bundle args = getArguments();
-        if (args != null) {
-            mIsInSetupWizard = args.getBoolean(BaseFragment.EXTRA_RUNNING_IN_SETUP_WIZARD);
-        }
     }
 
     @Override
@@ -103,25 +103,6 @@
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        if (!mIsInSetupWizard) {
-            return;
-        }
-
-        // Don't show toolbar title in Setup Wizard.
-        ((TextView) getActivity().findViewById(R.id.title)).setText("");
-
-        Button mPrimaryButton = (Button) getActivity().findViewById(R.id.action_button1);
-        mPrimaryButton.setText(R.string.lockscreen_skip_button_text);
-        mPrimaryButton.setOnClickListener(v -> {
-            SetupWizardScreenLockActivity activity = (SetupWizardScreenLockActivity) getActivity();
-            activity.onCancel();
-        });
-    }
-
-    @Override
     public void onStart() {
         super.onStart();
         if (mCheckLockWorker != null) {
@@ -137,7 +118,7 @@
         }
     }
 
-    private Runnable mClearErrorRunnable = () ->  {
+    private Runnable mClearErrorRunnable = () -> {
         mLockPatternView.clearPattern();
         mMsgView.setText("");
     };
@@ -145,38 +126,40 @@
     private LockPatternView.OnPatternListener mLockPatternListener =
             new LockPatternView.OnPatternListener() {
 
-        public void onPatternStart() {
-            mLockPatternView.removeCallbacks(mClearErrorRunnable);
-            mMsgView.setText("");
-        }
+                public void onPatternStart() {
+                    mLockPatternView.removeCallbacks(mClearErrorRunnable);
+                    mMsgView.setText("");
+                }
 
-        public void onPatternCleared() {
-            mLockPatternView.removeCallbacks(mClearErrorRunnable);
-        }
+                public void onPatternCleared() {
+                    mLockPatternView.removeCallbacks(mClearErrorRunnable);
+                }
 
-        public void onPatternCellAdded(List<LockPatternView.Cell> pattern) {}
+                public void onPatternCellAdded(List<LockPatternView.Cell> pattern) {
+                }
 
-        public void onPatternDetected(List<LockPatternView.Cell> pattern) {
-            mLockPatternView.setEnabled(false);
+                public void onPatternDetected(List<LockPatternView.Cell> pattern) {
+                    mLockPatternView.setEnabled(false);
 
-            if (mCheckLockWorker == null) {
-                mCheckLockWorker = new CheckLockWorker();
-                mCheckLockWorker.setListener(ConfirmLockPatternFragment.this::onCheckCompleted);
+                    if (mCheckLockWorker == null) {
+                        mCheckLockWorker = new CheckLockWorker();
+                        mCheckLockWorker.setListener(
+                                ConfirmLockPatternFragment.this::onCheckCompleted);
 
-                getFragmentManager()
-                        .beginTransaction()
-                        .add(mCheckLockWorker, FRAGMENT_TAG_CHECK_LOCK_WORKER)
-                        .commitNow();
-            }
+                        getFragmentManager()
+                                .beginTransaction()
+                                .add(mCheckLockWorker, FRAGMENT_TAG_CHECK_LOCK_WORKER)
+                                .commitNow();
+                    }
 
-            mPattern = pattern;
-            mCheckLockWorker.checkPattern(mUserId, pattern);
-        }
-    };
+                    mPattern = pattern;
+                    mCheckLockWorker.checkPattern(mUserId, pattern);
+                }
+            };
 
     private void onCheckCompleted(boolean lockMatched) {
         if (lockMatched) {
-            mCheckLockListener.onLockVerified(LockPatternUtils.patternToString(mPattern));
+            mCheckLockListener.onLockVerified(LockPatternUtils.patternToByteArray(mPattern));
         } else {
             mLockPatternView.setEnabled(true);
             mMsgView.setText(R.string.lockpattern_pattern_wrong);
diff --git a/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java b/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java
index d6d603d..4b35912 100644
--- a/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java
+++ b/src/com/android/car/settings/security/ConfirmLockPinPasswordFragment.java
@@ -25,14 +25,18 @@
 import android.view.View;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
+import com.android.internal.widget.LockPatternUtils;
+
+import java.util.Arrays;
 
 /**
  * Fragment for confirming existing lock PIN or password.  The containing activity must implement
@@ -52,19 +56,14 @@
 
     private int mUserId;
     private boolean mIsPin;
-    private boolean mIsInSetupWizard;
-    private String mEnteredPassword;
+    private byte[] mEnteredPassword;
 
     /**
      * Factory method for creating fragment in PIN mode.
      */
-    public static ConfirmLockPinPasswordFragment newPinInstance(boolean isInSetupWizard) {
+    public static ConfirmLockPinPasswordFragment newPinInstance() {
         ConfirmLockPinPasswordFragment patternFragment = new ConfirmLockPinPasswordFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.security_settings_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, isInSetupWizard
-                ? R.layout.suw_action_bar_with_button : R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.confirm_lock_pin_fragment);
+        Bundle bundle = new Bundle();
         bundle.putBoolean(EXTRA_IS_PIN, true);
         patternFragment.setArguments(bundle);
         return patternFragment;
@@ -73,19 +72,33 @@
     /**
      * Factory method for creating fragment in password mode.
      */
-    public static ConfirmLockPinPasswordFragment newPasswordInstance(boolean isInSetupWizard) {
+    public static ConfirmLockPinPasswordFragment newPasswordInstance() {
         ConfirmLockPinPasswordFragment patternFragment = new ConfirmLockPinPasswordFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.security_settings_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, isInSetupWizard
-                ? R.layout.suw_action_bar_with_button : R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.confirm_lock_password_fragment);
+        Bundle bundle = new Bundle();
         bundle.putBoolean(EXTRA_IS_PIN, false);
         patternFragment.setArguments(bundle);
         return patternFragment;
     }
 
     @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return mIsPin ? R.layout.confirm_lock_pin : R.layout.confirm_lock_password;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return R.string.security_settings_title;
+    }
+
+    @Override
     public void onAttach(Context context) {
         super.onAttach(context);
         if ((getActivity() instanceof CheckLockListener)) {
@@ -101,7 +114,6 @@
         mUserId = UserHandle.myUserId();
         Bundle args = getArguments();
         if (args != null) {
-            mIsInSetupWizard = args.getBoolean(BaseFragment.EXTRA_RUNNING_IN_SETUP_WIZARD);
             mIsPin = args.getBoolean(EXTRA_IS_PIN);
         }
     }
@@ -110,8 +122,8 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        mPasswordField = (EditText) view.findViewById(R.id.password_entry);
-        mMsgView = (TextView) view.findViewById(R.id.message);
+        mPasswordField = view.findViewById(R.id.password_entry);
+        mMsgView = view.findViewById(R.id.message);
 
         if (mIsPin) {
             initPinView(view);
@@ -126,25 +138,6 @@
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        if (!mIsInSetupWizard) {
-            return;
-        }
-
-        // Don't show toolbar title in Setup Wizard.
-        ((TextView) getActivity().findViewById(R.id.title)).setText("");
-
-        Button mPrimaryButton = (Button) getActivity().findViewById(R.id.action_button1);
-        mPrimaryButton.setText(R.string.lockscreen_skip_button_text);
-        mPrimaryButton.setOnClickListener(v -> {
-            SetupWizardScreenLockActivity activity = (SetupWizardScreenLockActivity) getActivity();
-            activity.onCancel();
-        });
-    }
-
-    @Override
     public void onStart() {
         super.onStart();
         if (mCheckLockWorker != null) {
@@ -173,7 +166,7 @@
     }
 
     private void initPinView(View view) {
-        mPinPad = (PinPadView) view.findViewById(R.id.pin_pad);
+        mPinPad = view.findViewById(R.id.pin_pad);
 
         PinPadView.PinPadClickListener pinPadClickListener = new PinPadView.PinPadClickListener() {
             @Override
@@ -185,16 +178,21 @@
             @Override
             public void onBackspaceClick() {
                 clearError();
-                String pin = mPasswordField.getText().toString();
-                if (pin.length() > 0) {
-                    mPasswordField.setText(pin.substring(0, pin.length() - 1));
+                byte[] pin = LockPatternUtils.charSequenceToByteArray(mPasswordField.getText());
+                if (pin != null && pin.length > 0) {
+                    mPasswordField.getText().delete(mPasswordField.getSelectionEnd() - 1,
+                            mPasswordField.getSelectionEnd());
+                }
+                if (pin != null) {
+                    Arrays.fill(pin, (byte) 0);
                 }
             }
 
             @Override
             public void onEnterKeyClick() {
-                mEnteredPassword = mPasswordField.getText().toString();
-                if (!TextUtils.isEmpty(mEnteredPassword)) {
+                mEnteredPassword = LockPatternUtils.charSequenceToByteArray(
+                        mPasswordField.getText());
+                if (mEnteredPassword != null) {
                     initCheckLockWorker();
                     mPinPad.setEnabled(false);
                     mCheckLockWorker.checkPinPassword(mUserId, mEnteredPassword);
@@ -214,7 +212,8 @@
 
                 initCheckLockWorker();
                 if (!mCheckLockWorker.isCheckInProgress()) {
-                    mEnteredPassword = mPasswordField.getText().toString();
+                    mEnteredPassword = LockPatternUtils.charSequenceToByteArray(
+                            mPasswordField.getText());
                     mCheckLockWorker.checkPinPassword(mUserId, mEnteredPassword);
                 }
                 return true;
@@ -224,10 +223,12 @@
 
         mPasswordField.addTextChangedListener(new TextWatcher() {
             @Override
-            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            }
 
             @Override
-            public void onTextChanged(CharSequence s, int start, int before, int count) {}
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+            }
 
             @Override
             public void afterTextChanged(Editable s) {
@@ -257,7 +258,7 @@
         }
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     void onCheckCompleted(boolean lockMatched) {
         if (lockMatched) {
             mCheckLockListener.onLockVerified(mEnteredPassword);
diff --git a/src/com/android/car/settings/security/ConfirmPairingCodeDialog.java b/src/com/android/car/settings/security/ConfirmPairingCodeDialog.java
new file mode 100644
index 0000000..902caf2
--- /dev/null
+++ b/src/com/android/car/settings/security/ConfirmPairingCodeDialog.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.os.Bundle;
+
+import androidx.fragment.app.DialogFragment;
+
+import com.android.car.settings.R;
+
+/**
+ * Dialog to confirm pairing code.
+ */
+public class ConfirmPairingCodeDialog extends DialogFragment {
+    /** Identifier for the dialog which confirms the pairing code. */
+    public static final String TAG = "confirm_pairing_code_dialog";
+    private static final String PAIRING_CODE_KEY = "pairingCode";
+    private ConfirmPairingCodeListener mConfirmPairingCodeListener;
+
+    /**
+     * Factory method for creating a ConfirmPairingCodeFragment
+     *
+     * @param pairingCode the pairing code sent by the connected device
+     */
+    public static ConfirmPairingCodeDialog newInstance(String pairingCode) {
+        Bundle args = new Bundle();
+        args.putString(PAIRING_CODE_KEY, pairingCode);
+
+        ConfirmPairingCodeDialog dialog = new ConfirmPairingCodeDialog();
+        dialog.setArguments(args);
+        return dialog;
+    }
+
+    /** Sets a listener to act when a user confirms pairing code. */
+    public void setConfirmPairingCodeListener(ConfirmPairingCodeListener listener) {
+        mConfirmPairingCodeListener = listener;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        Bundle args = getArguments();
+        String pairingCode = args.getString(PAIRING_CODE_KEY);
+        return new AlertDialog.Builder(getContext())
+                .setTitle(getContext().getString(R.string.trusted_device_pairing_code_dialog_title))
+                .setMessage(pairingCode)
+                .setPositiveButton(R.string.trusted_device_confirm_button, (dialog, which) -> {
+                    if (mConfirmPairingCodeListener != null) {
+                        mConfirmPairingCodeListener.onConfirmPairingCode();
+                    }
+                })
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> {
+                    if (mConfirmPairingCodeListener != null) {
+                        mConfirmPairingCodeListener.onDialogCancelled();
+                    }
+                })
+                .create();
+    }
+
+    /** A listener for when user interacts with this dialog. */
+    public interface ConfirmPairingCodeListener {
+        /** Defines the actions to take when a user confirms the pairing code. */
+        void onConfirmPairingCode();
+
+        /** Defines the actions to take when a user cancel confirming the pairing code. */
+        void onDialogCancelled();
+    }
+
+}
diff --git a/src/com/android/car/settings/security/ConfirmPasswordFragmentFactory.java b/src/com/android/car/settings/security/ConfirmPasswordFragmentFactory.java
new file mode 100644
index 0000000..7cba62e
--- /dev/null
+++ b/src/com/android/car/settings/security/ConfirmPasswordFragmentFactory.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.Logger;
+import com.android.internal.widget.LockPatternUtils;
+
+/**
+ * Factory class which generate password fragment for current user.
+ */
+public class ConfirmPasswordFragmentFactory {
+
+    private static final Logger LOG = new Logger(ConfirmPasswordFragmentFactory.class);
+
+    /**
+     * Gets the correct password fragment of current user, returns the corresponding password
+     * fragment of current user
+     *
+     * @return {@code null} if no password is set for the current user.
+     */
+    @Nullable
+    public static Fragment getFragment(Context context) {
+        Fragment fragment;
+        int passwordQuality = new LockPatternUtils(context).getKeyguardStoredPasswordQuality(
+                new CarUserManagerHelper(context).getCurrentProcessUserId());
+        switch (passwordQuality) {
+            case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
+                // User has not set a password.
+                return null;
+            case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+                fragment = new ConfirmLockPatternFragment();
+                break;
+            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+                fragment = ConfirmLockPinPasswordFragment.newPinInstance();
+                break;
+            case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+            case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+                fragment = ConfirmLockPinPasswordFragment.newPasswordInstance();
+                break;
+            default:
+                LOG.e("Unexpected password quality: " + passwordQuality);
+                fragment = ConfirmLockPinPasswordFragment.newPasswordInstance();
+        }
+
+        Bundle bundle = fragment.getArguments();
+        if (bundle == null) {
+            bundle = new Bundle();
+        }
+        bundle.putInt(ChooseLockTypeFragment.EXTRA_CURRENT_PASSWORD_QUALITY, passwordQuality);
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+}
diff --git a/src/com/android/car/settings/security/ConfirmRemoveDeviceDialog.java b/src/com/android/car/settings/security/ConfirmRemoveDeviceDialog.java
new file mode 100644
index 0000000..38e60bb
--- /dev/null
+++ b/src/com/android/car/settings/security/ConfirmRemoveDeviceDialog.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.os.Bundle;
+
+import androidx.fragment.app.DialogFragment;
+
+import com.android.car.settings.R;
+
+/**
+ * Dialog to confirm removing a trusted device.
+ */
+public class ConfirmRemoveDeviceDialog extends DialogFragment {
+
+    /** Identifier for the dialog which confirms removing a trusted device. */
+    public static final String TAG = "confirm_remove_device_dialog";
+    private static final String DEVICE_NAME_KEY = "deviceName";
+    private static final String HANDLE_KEY = "handle";
+    private ConfirmRemoveDeviceListener mConfirmRemoveDeviceListener;
+
+    /**
+     * Factory method for creating a {@link ConfirmRemoveDeviceDialog}
+     *
+     * @param deviceName the name of current clicked device
+     * @param handle the handle of current clicked device and is used to identify the device
+     */
+    public static ConfirmRemoveDeviceDialog newInstance(String deviceName, long handle) {
+        Bundle args = new Bundle();
+        args.putString(DEVICE_NAME_KEY, deviceName);
+        args.putLong(HANDLE_KEY, handle);
+
+        ConfirmRemoveDeviceDialog dialog = new ConfirmRemoveDeviceDialog();
+        dialog.setArguments(args);
+        return dialog;
+    }
+
+    /** Sets a listener to act when a user confirms removing the trusted device. */
+    public void setConfirmRemoveDeviceListener(ConfirmRemoveDeviceListener listener) {
+        mConfirmRemoveDeviceListener = listener;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        Bundle args = getArguments();
+        String name = args.getString(DEVICE_NAME_KEY);
+        long handle = args.getLong(HANDLE_KEY);
+        return new AlertDialog.Builder(getContext())
+                .setTitle(name)
+                .setMessage(getContext().getString(R.string.remove_device_message, name, name))
+                .setPositiveButton(R.string.trusted_device_remove_button, (dialog, which) -> {
+                    if (mConfirmRemoveDeviceListener != null) {
+                        mConfirmRemoveDeviceListener.onConfirmRemoveDevice(handle);
+                    }
+                })
+                .setNegativeButton(R.string.trusted_device_done_button, /* listener= */ null)
+                .create();
+    }
+
+    /** A listener for when user confirms removing a trusted device. */
+    public interface ConfirmRemoveDeviceListener {
+        /** Defines the actions to take when a user confirms removing the trusted device. */
+        void onConfirmRemoveDevice(long handle);
+    }
+
+}
diff --git a/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialog.java b/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialog.java
index 79b97c2..cd64872 100644
--- a/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialog.java
+++ b/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialog.java
@@ -16,11 +16,10 @@
 
 package com.android.car.settings.security;
 
+import android.app.AlertDialog;
 import android.app.Dialog;
-import android.content.DialogInterface;
 import android.os.Bundle;
 
-import androidx.car.app.CarAlertDialog;
 import androidx.fragment.app.DialogFragment;
 
 import com.android.car.settings.R;
@@ -28,45 +27,35 @@
 /**
  * Dialog to confirm screen lock removal.
  */
-public class ConfirmRemoveScreenLockDialog extends DialogFragment implements
-        DialogInterface.OnClickListener {
+public class ConfirmRemoveScreenLockDialog extends DialogFragment {
 
-    private ConfirmRemoveLockListener mListener;
+    /** Identifier for the dialog which confirms the removal of a screen lock. */
+    public static final String TAG = "confirm_remove_lock_dialog";
+    private ConfirmRemoveScreenLockListener mConfirmRemoveScreenLockListener;
 
-    /**
-     * Sets a listener for OnRemoveLockConfirmed that will get called if user confirms the dialog.
-     *
-     * @param listener Instance of {@link ConfirmRemoveLockListener} to call when confirmed.
-     */
-    public void setConfirmRemoveLockListener(ConfirmRemoveLockListener listener) {
-        mListener = listener;
+    /** Sets a listener to act when a user confirms delete. */
+    public void setConfirmRemoveScreenLockListener(ConfirmRemoveScreenLockListener listener) {
+        mConfirmRemoveScreenLockListener = listener;
     }
 
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new CarAlertDialog.Builder(getContext())
+        return new AlertDialog.Builder(getContext())
                 .setTitle(R.string.remove_screen_lock_title)
-                .setBody(R.string.remove_screen_lock_message)
-                .setPositiveButton(R.string.remove_button, this)
+                .setMessage(R.string.remove_screen_lock_message)
+                .setPositiveButton(R.string.remove_button, (dialog, which) -> {
+                    if (mConfirmRemoveScreenLockListener != null) {
+                        mConfirmRemoveScreenLockListener.onConfirmRemoveScreenLock();
+                    }
+                    dialog.dismiss();
+                })
                 .setNegativeButton(android.R.string.cancel, null)
                 .create();
     }
 
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (mListener != null) {
-            mListener.onRemoveLockConfirmed();
-        }
-    }
-
-    /**
-     * Interface for listeners that want to receive a callback when user confirms lock removal in
-     * the dialog.
-     */
-    public interface ConfirmRemoveLockListener {
-        /**
-         * Callback when user confirms locks removal.
-         */
-        void onRemoveLockConfirmed();
+    /** A listener for when user confirms lock removal for the current user. */
+    public interface ConfirmRemoveScreenLockListener {
+        /** Defines the actions to take when a user confirms the removal of a lock. */
+        void onConfirmRemoveScreenLock();
     }
 }
diff --git a/src/com/android/car/settings/security/LockTypeBasePreferenceController.java b/src/com/android/car/settings/security/LockTypeBasePreferenceController.java
new file mode 100644
index 0000000..d4be237
--- /dev/null
+++ b/src/com/android/car/settings/security/LockTypeBasePreferenceController.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Business Logic for security lock preferences. It can be extended to change which fragment should
+ * be opened when clicked.
+ */
+public abstract class LockTypeBasePreferenceController extends PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private byte[] mCurrentPassword;
+    private int mCurrentPasswordQuality;
+
+    public LockTypeBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /**
+     * Fragment specified here will be opened when the Preference is clicked. Return null to prevent
+     * navigation.
+     */
+    protected abstract Fragment fragmentToOpen();
+
+    /**
+     * If the current password quality is one of the values returned by this function, the
+     * controller will identify as having the current lock.
+     */
+    protected abstract int[] allowedPasswordQualities();
+
+
+    /** Sets the quality of the current password. */
+    public void setCurrentPasswordQuality(int currentPasswordQuality) {
+        mCurrentPasswordQuality = currentPasswordQuality;
+    }
+
+    /** Gets whether the preference related to this controller is the current lock type. */
+    protected boolean isCurrentLock() {
+        for (int allowedQuality : allowedPasswordQualities()) {
+            if (mCurrentPasswordQuality == allowedQuality) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Sets the current password so it can be provided in the bundle in the fragment. */
+    public void setCurrentPassword(byte[] currentPassword) {
+        mCurrentPassword = currentPassword;
+    }
+
+    /** Gets the current password. */
+    protected byte[] getCurrentPassword() {
+        return mCurrentPassword;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(getSummary());
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        Fragment fragment = fragmentToOpen();
+        if (fragment != null) {
+            if (mCurrentPassword != null) {
+                Bundle args = fragment.getArguments();
+                if (args == null) {
+                    args = new Bundle();
+                }
+                args.putByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, mCurrentPassword);
+                fragment.setArguments(args);
+            }
+            getFragmentController().launchFragment(fragment);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return mCarUserManagerHelper.isCurrentProcessGuestUser() ? DISABLED_FOR_USER : AVAILABLE;
+    }
+
+    private CharSequence getSummary() {
+        return isCurrentLock() ? getContext().getString(R.string.current_screen_lock) : "";
+    }
+}
diff --git a/src/com/android/car/settings/security/LockTypeDialogFragment.java b/src/com/android/car/settings/security/LockTypeDialogFragment.java
deleted file mode 100644
index 5d664b0..0000000
--- a/src/com/android/car/settings/security/LockTypeDialogFragment.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.security;
-
-import android.app.Dialog;
-import android.content.Context;
-import android.os.Bundle;
-
-import androidx.car.app.CarListDialog;
-import androidx.fragment.app.DialogFragment;
-
-import com.android.car.settings.R;
-
-/**
- * Dialog that allows user to switch lock type.  The containing Activity must implement the
- * OnLockSelectListener interface
- */
-public class LockTypeDialogFragment extends DialogFragment {
-    // Please make sure the order is sync with LOCK_TYPES array
-    public static final int POSITION_NONE = 0;
-    public static final int POSITION_PIN = 1;
-    public static final int POSITION_PATTERN = 2;
-    public static final int POSITION_PASSWORD = 3;
-
-    private static final int[] LOCK_TYPES = {
-            R.string.security_lock_none,
-            R.string.security_lock_pin,
-            R.string.security_lock_pattern,
-            R.string.security_lock_password };
-
-    private OnLockSelectListener mOnLockSelectListener;
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-
-        if (!(getActivity() instanceof OnLockSelectListener)) {
-            throw new RuntimeException("Parent must implement OnLockSelectListener");
-        }
-
-        mOnLockSelectListener = (OnLockSelectListener) getActivity();
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        String[] items = new String[LOCK_TYPES.length];
-        for (int i = 0; i < LOCK_TYPES.length; ++i) {
-            items[i] = getResources().getString(LOCK_TYPES[i]);
-        }
-
-        return new CarListDialog.Builder(getContext())
-                .setItems(items, (dialog, pos) -> mOnLockSelectListener.onLockTypeSelected(pos))
-                .create();
-    }
-
-    /**
-     * Handles when a lock type is selected
-     */
-    interface OnLockSelectListener {
-        void onLockTypeSelected(int position);
-    }
-}
diff --git a/src/com/android/car/settings/security/NoLockPreferenceController.java b/src/com/android/car/settings/security/NoLockPreferenceController.java
new file mode 100644
index 0000000..316d43c
--- /dev/null
+++ b/src/com/android/car/settings/security/NoLockPreferenceController.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.internal.widget.LockPatternUtils;
+
+/** Business logic for the no lock preference. */
+public class NoLockPreferenceController extends LockTypeBasePreferenceController {
+
+    private static final int[] ALLOWED_PASSWORD_QUALITIES =
+            new int[]{DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED};
+
+    @VisibleForTesting
+    final ConfirmRemoveScreenLockDialog.ConfirmRemoveScreenLockListener mRemoveLockListener =
+            () -> {
+                int userId = new CarUserManagerHelper(getContext()).getCurrentProcessUserId();
+                new LockPatternUtils(getContext()).clearLock(getCurrentPassword(), userId);
+                getFragmentController().goBack();
+            };
+
+    public NoLockPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+
+    /**
+     * If the dialog to confirm removal of lock was open previously, make sure the listener is
+     * restored.
+     */
+    @Override
+    protected void onCreateInternal() {
+        ConfirmRemoveScreenLockDialog dialog =
+                (ConfirmRemoveScreenLockDialog) getFragmentController().findDialogByTag(
+                        ConfirmRemoveScreenLockDialog.TAG);
+        if (dialog != null) {
+            dialog.setConfirmRemoveScreenLockListener(mRemoveLockListener);
+        }
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        ConfirmRemoveScreenLockDialog dialog = new ConfirmRemoveScreenLockDialog();
+        dialog.setConfirmRemoveScreenLockListener(mRemoveLockListener);
+        getFragmentController().showDialog(dialog,
+                ConfirmRemoveScreenLockDialog.TAG);
+        return true;
+    }
+
+    @Override
+    protected Fragment fragmentToOpen() {
+        // Selecting this preference does not open a new fragment. Instead it opens a dialog to
+        // confirm the removal of the existing lock screen.
+        return null;
+    }
+
+    @Override
+    protected int[] allowedPasswordQualities() {
+        return ALLOWED_PASSWORD_QUALITIES;
+    }
+}
diff --git a/src/com/android/car/settings/security/PasswordHelper.java b/src/com/android/car/settings/security/PasswordHelper.java
index 1182bcc..daefc84 100644
--- a/src/com/android/car/settings/security/PasswordHelper.java
+++ b/src/com/android/car/settings/security/PasswordHelper.java
@@ -21,6 +21,8 @@
 import android.content.Context;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.ValidateLockFlags;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -30,27 +32,20 @@
  */
 public class PasswordHelper {
     public static final String EXTRA_CURRENT_SCREEN_LOCK = "extra_current_screen_lock";
-
-    /**
-     * Allow non-control Latin-1 characters only.
-     */
-    private static final String VALID_CHAR_PATTERN = "^[\\x20-\\x7F ]*$";
-
     /**
      * Required minimum length of PIN or password.
      */
-    static final int MIN_LENGTH = 4;
-
+    public static final int MIN_LENGTH = 4;
     // Error code returned from validate(String).
     static final int NO_ERROR = 0;
     static final int CONTAINS_INVALID_CHARACTERS = 1;
     static final int TOO_SHORT = 1 << 1;
     static final int CONTAINS_NON_DIGITS = 1 << 2;
     static final int CONTAINS_SEQUENTIAL_DIGITS = 1 << 3;
-
+    private static final Logger LOG = new Logger(PasswordHelper.class);
     private final boolean mIsPin;
 
-    PasswordHelper(boolean isPin) {
+    public PasswordHelper(boolean isPin) {
         mIsPin = isPin;
     }
 
@@ -66,42 +61,79 @@
     /**
      * Validates PIN/Password and returns the validation result.
      *
-     * @param password the raw password the user typed in
+     * @param password the raw bytes for the password the user typed in
      * @return the error code which should be non-zero where there is error. Otherwise
      * {@link #NO_ERROR} should be returned.
      */
-    public int validate(String password) {
+    public int validate(byte[] password) {
         return mIsPin ? validatePin(password) : validatePassword(password);
     }
 
     /**
+     * Validates PIN/Password using the setup wizard {@link ValidateLockFlags}.
+     *
+     * @param password The password to validate.
+     * @return The error code where 0 is no error.
+     */
+    public int validateSetupWizard(byte[] password) {
+        return mIsPin ? translateSettingsToSuwError(validatePin(password))
+                : translateSettingsToSuwError(validatePassword(password));
+    }
+
+    /**
      * Converts error code from validatePassword to an array of messages describing the errors with
      * important message comes first.  The messages are concatenated with a space in between.
      * Please make sure each message ends with a period.
-     * @param errorCode the code returned by {@link #validatePassword(String) validatePassword}
+     *
+     * @param errorCode the code returned by {@link #validatePassword(byte[]) validatePassword}
      */
     public List<String> convertErrorCodeToMessages(Context context, int errorCode) {
         return mIsPin ? convertPinErrorCodeToMessages(context, errorCode) :
                 convertPasswordErrorCodeToMessages(context, errorCode);
     }
 
-    private int validatePassword(String password) {
+    private int validatePassword(byte[] password) {
         int errorCode = NO_ERROR;
 
-        if (password.length() < MIN_LENGTH) {
+        if (password.length < MIN_LENGTH) {
             errorCode |= TOO_SHORT;
         }
 
-        if (!password.matches(VALID_CHAR_PATTERN)) {
-            errorCode |= CONTAINS_INVALID_CHARACTERS;
+        // Allow non-control Latin-1 characters only.
+        for (int i = 0; i < password.length; i++) {
+            char c = (char) password[i];
+            if (c < 32 || c > 127) {
+                errorCode |= CONTAINS_INVALID_CHARACTERS;
+                break;
+            }
         }
 
         return errorCode;
     }
 
-    private int validatePin(String pin) {
-        int errorCode = NO_ERROR;
+    private int translateSettingsToSuwError(int error) {
+        int output = 0;
+        if ((error & CONTAINS_NON_DIGITS) > 0) {
+            LOG.v("CONTAINS_NON_DIGITS");
+            output |= ValidateLockFlags.INVALID_BAD_SYMBOLS;
+        }
+        if ((error & CONTAINS_INVALID_CHARACTERS) > 0) {
+            LOG.v("INVALID_CHAR");
+            output |= ValidateLockFlags.INVALID_BAD_SYMBOLS;
+        }
+        if ((error & TOO_SHORT) > 0) {
+            LOG.v("TOO_SHORT");
+            output |= ValidateLockFlags.INVALID_LENGTH;
+        }
+        if ((error & CONTAINS_SEQUENTIAL_DIGITS) > 0) {
+            LOG.v("SEQUENTIAL_DIGITS");
+            output |= ValidateLockFlags.INVALID_LACKS_COMPLEXITY;
+        }
+        return output;
+    }
 
+    private int validatePin(byte[] pin) {
+        int errorCode = NO_ERROR;
         PasswordMetrics metrics = PasswordMetrics.computeForPassword(pin);
         int passwordQuality = getPasswordQuality();
 
diff --git a/src/com/android/car/settings/security/PasswordLockPreferenceController.java b/src/com/android/car/settings/security/PasswordLockPreferenceController.java
new file mode 100644
index 0000000..77d105c
--- /dev/null
+++ b/src/com/android/car/settings/security/PasswordLockPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Business logic for the lock password picker preference. */
+public class PasswordLockPreferenceController extends LockTypeBasePreferenceController {
+
+    private static final int[] ALLOWED_PASSWORD_QUALITIES = new int[]{
+            DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,
+            DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
+    };
+
+    public PasswordLockPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Fragment fragmentToOpen() {
+        return ChooseLockPinPasswordFragment.newPasswordInstance();
+    }
+
+    @Override
+    protected int[] allowedPasswordQualities() {
+        return ALLOWED_PASSWORD_QUALITIES;
+    }
+}
diff --git a/src/com/android/car/settings/security/PatternLockPreferenceController.java b/src/com/android/car/settings/security/PatternLockPreferenceController.java
new file mode 100644
index 0000000..1266bd7
--- /dev/null
+++ b/src/com/android/car/settings/security/PatternLockPreferenceController.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Business logic for the lock pattern picker preference. */
+public class PatternLockPreferenceController extends LockTypeBasePreferenceController {
+
+    private static final int[] ALLOWED_PASSWORD_QUALITIES =
+            new int[]{DevicePolicyManager.PASSWORD_QUALITY_SOMETHING};
+
+    public PatternLockPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Fragment fragmentToOpen() {
+        return ChooseLockPatternFragment.newInstance();
+    }
+
+    @Override
+    protected int[] allowedPasswordQualities() {
+        return ALLOWED_PASSWORD_QUALITIES;
+    }
+}
diff --git a/src/com/android/car/settings/security/PinLockPreferenceController.java b/src/com/android/car/settings/security/PinLockPreferenceController.java
new file mode 100644
index 0000000..d8169c0
--- /dev/null
+++ b/src/com/android/car/settings/security/PinLockPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Business logic for the lock pin picker preference. */
+public class PinLockPreferenceController extends LockTypeBasePreferenceController {
+
+    private static final int[] ALLOWED_PASSWORD_QUALITIES = new int[]{
+            DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
+            DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX
+    };
+
+    public PinLockPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Fragment fragmentToOpen() {
+        return ChooseLockPinPasswordFragment.newPinInstance();
+    }
+
+    @Override
+    protected int[] allowedPasswordQualities() {
+        return ALLOWED_PASSWORD_QUALITIES;
+    }
+}
diff --git a/src/com/android/car/settings/security/PinPadView.java b/src/com/android/car/settings/security/PinPadView.java
index 96eb438..ee7b5b1 100644
--- a/src/com/android/car/settings/security/PinPadView.java
+++ b/src/com/android/car/settings/security/PinPadView.java
@@ -16,12 +16,9 @@
 
 package com.android.car.settings.security;
 
-import android.annotation.DrawableRes;
-import android.annotation.Nullable;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -30,6 +27,8 @@
 import android.widget.ImageButton;
 import android.widget.TextView;
 
+import androidx.annotation.DrawableRes;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import com.android.car.settings.R;
@@ -42,12 +41,12 @@
  */
 public class PinPadView extends GridLayout {
     // Number of keys in the pin pad, 0-9 plus backspace and enter keys.
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     static final int NUM_KEYS = 12;
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    static final int[] PIN_PAD_DIGIT_KEYS = { R.id.key0, R.id.key1, R.id.key2, R.id.key3,
-            R.id.key4, R.id.key5, R.id.key6, R.id.key7, R.id.key8, R.id.key9 };
+    @VisibleForTesting
+    static final int[] PIN_PAD_DIGIT_KEYS = {R.id.key0, R.id.key1, R.id.key2, R.id.key3,
+            R.id.key4, R.id.key5, R.id.key6, R.id.key7, R.id.key8, R.id.key9};
 
     /**
      * The delay in milliseconds between character deletion when the user continuously holds the
@@ -56,15 +55,18 @@
     private static final int LONG_CLICK_DELAY_MILLS = 100;
 
     private final List<View> mPinKeys = new ArrayList<>(NUM_KEYS);
-    private PinPadClickListener mOnClickListener;
-    private ImageButton mEnterKey;
-    private Runnable mOnBackspaceLongClick = new Runnable() {
+    private final Runnable mOnBackspaceLongClick = new Runnable() {
         public void run() {
-            mOnClickListener.onBackspaceClick();
-            getHandler().postDelayed(this, LONG_CLICK_DELAY_MILLS);
+            if (mOnClickListener != null) {
+                mOnClickListener.onBackspaceClick();
+                getHandler().postDelayed(this, LONG_CLICK_DELAY_MILLS);
+            }
         }
     };
 
+    private PinPadClickListener mOnClickListener;
+    private ImageButton mEnterKey;
+
     public PinPadView(Context context) {
         super(context);
         init(null, 0, 0);
@@ -98,7 +100,7 @@
     @Override
     public void setEnabled(boolean enabled) {
         super.setEnabled(enabled);
-        for (View key: mPinKeys) {
+        for (View key : mPinKeys) {
             key.setEnabled(enabled);
         }
     }
@@ -106,7 +108,7 @@
     /**
      * Set the resource Id of the enter key icon.
      *
-     * @param drawableId  The resource Id of the drawable.
+     * @param drawableId The resource Id of the drawable.
      */
     public void setEnterKeyIcon(@DrawableRes int drawableId) {
         mEnterKey.setImageResource(drawableId);
@@ -130,42 +132,40 @@
 
     private void init(AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         LayoutInflater inflater = LayoutInflater.from(getContext());
-        inflater.inflate(R.layout.pin_pad_view, this, true);
+        TypedArray typedArray = getContext().obtainStyledAttributes(
+                attrs, R.styleable.PinPadView, defStyleAttr, defStyleRes);
+        inflater.inflate(
+                typedArray.getResourceId(R.styleable.PinPadView_layout, R.layout.pin_pad_view),
+                this, true);
+        typedArray.recycle();
 
         for (int keyId : PIN_PAD_DIGIT_KEYS) {
-            TextView key = (TextView) findViewById(keyId);
+            TextView key = findViewById(keyId);
             String digit = key.getTag().toString();
             key.setOnClickListener(v -> mOnClickListener.onDigitKeyClick(digit));
             mPinKeys.add(key);
         }
 
-        View backspace = findViewById(R.id.key_backspace);
+        ImageButton backspace = findViewById(R.id.key_backspace);
         backspace.setOnTouchListener((v, event) -> {
             switch (event.getAction()) {
                 case MotionEvent.ACTION_DOWN:
                     getHandler().post(mOnBackspaceLongClick);
-                    return true;
+                    // Must return false so that ripple can show
+                    return false;
                 case MotionEvent.ACTION_UP:
                     getHandler().removeCallbacks(mOnBackspaceLongClick);
-                    return true;
+                    // Must return false so that ripple can show
+                    return false;
                 default:
                     return false;
             }
         });
         mPinKeys.add(backspace);
 
-        mEnterKey = (ImageButton) findViewById(R.id.key_enter);
-
-        TypedArray typedArray = getContext().obtainStyledAttributes(
-                attrs, R.styleable.PinPadView, defStyleAttr, defStyleRes);
-        Drawable enterKeyDrawable = typedArray.getDrawable(R.styleable.PinPadView_enterKeyDrawable);
-        typedArray.recycle();
-
-        if (enterKeyDrawable != null) {
-            mEnterKey.setImageDrawable(enterKeyDrawable);
-        }
-
+        mEnterKey = findViewById(R.id.key_enter);
         mEnterKey.setOnClickListener(v -> mOnClickListener.onEnterKeyClick());
+
         mPinKeys.add(mEnterKey);
     }
 
diff --git a/src/com/android/car/settings/security/SaveLockWorkerBase.java b/src/com/android/car/settings/security/SaveLockWorkerBase.java
index 1d9db8b..da267ea 100644
--- a/src/com/android/car/settings/security/SaveLockWorkerBase.java
+++ b/src/com/android/car/settings/security/SaveLockWorkerBase.java
@@ -89,7 +89,7 @@
         }
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    @VisibleForTesting
     boolean saveAndVerifyInBackground(Void... params) {
         boolean isSaveSuccessful = true;
 
diff --git a/src/com/android/car/settings/security/SavePasswordWorker.java b/src/com/android/car/settings/security/SavePasswordWorker.java
index 06886fa..61862fd 100644
--- a/src/com/android/car/settings/security/SavePasswordWorker.java
+++ b/src/com/android/car/settings/security/SavePasswordWorker.java
@@ -23,11 +23,11 @@
 
 public class SavePasswordWorker extends SaveLockWorkerBase {
 
-    private String mEnteredPassword;
-    private String mCurrentPassword;
+    private byte[] mEnteredPassword;
+    private byte[] mCurrentPassword;
     private int mRequestedQuality;
 
-    void start(int userId, String enteredPassword, String currentPassword, int requestedQuality) {
+    void start(int userId, byte[] enteredPassword, byte[] currentPassword, int requestedQuality) {
         init(userId);
         mEnteredPassword = enteredPassword;
         mCurrentPassword = currentPassword;
diff --git a/src/com/android/car/settings/security/SavePatternWorker.java b/src/com/android/car/settings/security/SavePatternWorker.java
index 6904702..bfd7b27 100644
--- a/src/com/android/car/settings/security/SavePatternWorker.java
+++ b/src/com/android/car/settings/security/SavePatternWorker.java
@@ -26,9 +26,9 @@
 public class SavePatternWorker extends SaveLockWorkerBase {
 
     private List<LockPatternView.Cell> mChosenPattern;
-    private String mCurrentPattern;
+    private byte[] mCurrentPattern;
 
-    void start(int userId, List<LockPatternView.Cell> chosenPattern, String currentPattern) {
+    void start(int userId, List<LockPatternView.Cell> chosenPattern, byte[] currentPattern) {
         init(userId);
         mCurrentPattern = currentPattern;
         mChosenPattern = chosenPattern;
diff --git a/src/com/android/car/settings/security/SecurityEntryPreferenceController.java b/src/com/android/car/settings/security/SecurityEntryPreferenceController.java
new file mode 100644
index 0000000..b39c1f7
--- /dev/null
+++ b/src/com/android/car/settings/security/SecurityEntryPreferenceController.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller which determines if the top level entry into Security settings should be displayed
+ * based on the user status.
+ */
+public class SecurityEntryPreferenceController extends PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public SecurityEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return mCarUserManagerHelper.isCurrentProcessGuestUser() ? DISABLED_FOR_USER : AVAILABLE;
+    }
+}
diff --git a/src/com/android/car/settings/security/SecuritySettingsFragment.java b/src/com/android/car/settings/security/SecuritySettingsFragment.java
new file mode 100644
index 0000000..ddb314e
--- /dev/null
+++ b/src/com/android/car/settings/security/SecuritySettingsFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Security home page which includes "choose lock type" and "trusted device"
+ */
+public class SecuritySettingsFragment extends SettingsFragment {
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.security_settings_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/security/SettingsScreenLockActivity.java b/src/com/android/car/settings/security/SettingsScreenLockActivity.java
index a608545..d995ed3 100644
--- a/src/com/android/car/settings/security/SettingsScreenLockActivity.java
+++ b/src/com/android/car/settings/security/SettingsScreenLockActivity.java
@@ -20,80 +20,72 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.CarSettingActivity;
+import com.android.car.settings.common.BaseCarSettingsActivity;
 import com.android.car.settings.common.Logger;
 import com.android.internal.widget.LockPatternUtils;
 
 /**
  * Activity for setting screen locks
  */
-public class SettingsScreenLockActivity extends CarSettingActivity implements CheckLockListener {
+public class SettingsScreenLockActivity extends BaseCarSettingsActivity implements
+        CheckLockListener {
 
     private static final Logger LOG = new Logger(SettingsScreenLockActivity.class);
 
     private int mPasswordQuality;
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
+    @Nullable
+    protected Fragment getInitialFragment() {
         mPasswordQuality = new LockPatternUtils(this).getKeyguardStoredPasswordQuality(
                 UserHandle.myUserId());
 
-        if (savedInstanceState == null) {
-            BaseFragment fragment;
-            switch (mPasswordQuality) {
-                case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
-                    fragment = ChooseLockTypeFragment.newInstance();
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
-                    fragment = ConfirmLockPatternFragment.newInstance(
-                            /* isInSetupWizard= */ false);
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
-                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
-                    fragment = ConfirmLockPinPasswordFragment.newPinInstance(
-                            /* isInSetupWizard= */ false);
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
-                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
-                    fragment = ConfirmLockPinPasswordFragment.newPasswordInstance(
-                            /* isInSetupWizard= */ false);
-                    break;
-                default:
-                    LOG.e("Unexpected password quality: " + String.valueOf(mPasswordQuality));
-                    fragment = ConfirmLockPinPasswordFragment.newPasswordInstance(
-                            /* isInSetupWizard= */ false);
-            }
-
-            Bundle bundle = fragment.getArguments();
-            if (bundle == null) {
-                bundle = new Bundle();
-            }
-            bundle.putInt(ChooseLockTypeFragment.EXTRA_CURRENT_PASSWORD_QUALITY, mPasswordQuality);
-            fragment.setArguments(bundle);
-
-            getSupportFragmentManager()
-                    .beginTransaction()
-                    .add(R.id.fragment_container, fragment)
-                    .addToBackStack(null)
-                    .commit();
+        Fragment fragment;
+        switch (mPasswordQuality) {
+            case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
+                fragment = new ChooseLockTypeFragment();
+                break;
+            case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+                fragment = new ConfirmLockPatternFragment();
+                break;
+            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+                fragment = ConfirmLockPinPasswordFragment.newPinInstance();
+                break;
+            case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+            case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+                fragment = ConfirmLockPinPasswordFragment.newPasswordInstance();
+                break;
+            default:
+                LOG.e("Unexpected password quality: " + String.valueOf(mPasswordQuality));
+                fragment = ConfirmLockPinPasswordFragment.newPasswordInstance();
         }
-    }
 
-    @Override
-    public void onLockVerified(String lock) {
-        BaseFragment fragment = ChooseLockTypeFragment.newInstance();
         Bundle bundle = fragment.getArguments();
         if (bundle == null) {
             bundle = new Bundle();
         }
-        bundle.putString(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, lock);
+        bundle.putInt(ChooseLockTypeFragment.EXTRA_CURRENT_PASSWORD_QUALITY, mPasswordQuality);
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+
+    @Override
+    public void onLockVerified(byte[] lock) {
+        Fragment fragment = new ChooseLockTypeFragment();
+        Bundle bundle = fragment.getArguments();
+        if (bundle == null) {
+            bundle = new Bundle();
+        }
+        bundle.putByteArray(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, lock);
         bundle.putInt(ChooseLockTypeFragment.EXTRA_CURRENT_PASSWORD_QUALITY, mPasswordQuality);
         fragment.setArguments(bundle);
 
+        // Intentionally not using launchFragment(), since we do not want to add to the back stack.
         getSupportFragmentManager()
                 .beginTransaction()
                 .replace(R.id.fragment_container, fragment)
diff --git a/src/com/android/car/settings/security/SetupWizardScreenLockActivity.java b/src/com/android/car/settings/security/SetupWizardScreenLockActivity.java
deleted file mode 100644
index 7f41158..0000000
--- a/src/com/android/car/settings/security/SetupWizardScreenLockActivity.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.security;
-
-import android.app.admin.DevicePolicyManager;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.text.TextUtils;
-
-import androidx.appcompat.widget.Toolbar;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.CarSettingActivity;
-import com.android.car.settings.common.Logger;
-import com.android.car.settingslib.util.ResultCodes;
-import com.android.internal.widget.LockPatternUtils;
-
-/**
- * Entry point Activity for Setup Wizard to set screen lock.
- */
-public class SetupWizardScreenLockActivity extends CarSettingActivity implements
-        CheckLockListener,
-        LockTypeDialogFragment.OnLockSelectListener {
-
-    private static final Logger LOG = new Logger(SetupWizardScreenLockActivity.class);
-
-    private String mCurrLock;
-    private int mPasswordQuality;
-
-    @Override
-    public void launchFragment(BaseFragment fragment) {
-        Bundle args = fragment.getArguments();
-        if (args == null) {
-            args = new Bundle();
-        }
-        args.putBoolean(BaseFragment.EXTRA_RUNNING_IN_SETUP_WIZARD, true);
-        if (!TextUtils.isEmpty(mCurrLock)) {
-            args.putString(PasswordHelper.EXTRA_CURRENT_SCREEN_LOCK, mCurrLock);
-        }
-        fragment.setArguments(args);
-
-        getSupportFragmentManager()
-                .beginTransaction()
-                .replace(R.id.fragment_container, fragment)
-                .commit();
-    }
-
-    @Override
-    public void goBack() {
-        setResult(RESULT_CANCELED);
-        finish();
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.suw_activity);
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
-
-        mPasswordQuality = new LockPatternUtils(this).getKeyguardStoredPasswordQuality(
-                UserHandle.myUserId());
-
-        if (savedInstanceState == null) {
-            BaseFragment fragment;
-            switch (mPasswordQuality) {
-                case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
-                    // In Setup Wizard, the landing page is always the Pin screen
-                    fragment = ChooseLockPinPasswordFragment.newPinInstance(
-                            /* isInSetupWizard= */ true);
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
-                    fragment = ConfirmLockPatternFragment.newInstance(
-                            /* isInSetupWizard= */ true);
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC: // Fall through
-                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
-                    fragment = ConfirmLockPinPasswordFragment.newPinInstance(
-                            /* isInSetupWizard= */ true);
-                    break;
-                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC: // Fall through
-                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
-                    fragment = ConfirmLockPinPasswordFragment.newPasswordInstance(
-                            /* isInSetupWizard= */ true);
-                    break;
-                default:
-                    LOG.e("Unexpected password quality: " + String.valueOf(mPasswordQuality));
-                    fragment = ConfirmLockPinPasswordFragment.newPasswordInstance(
-                            /* isInSetupWizard= */ true);
-            }
-
-            launchFragment(fragment);
-        }
-    }
-
-    /**
-     * Handler that will be invoked when Cancel button is clicked in the fragment.
-     */
-    public void onCancel() {
-        setResult(ResultCodes.RESULT_SKIP);
-        finish();
-    }
-
-    /**
-     * Handler that will be invoked when lock save is completed.
-     */
-    public void onComplete() {
-        setResult(RESULT_OK);
-        finish();
-    }
-
-    @Override
-    public void onLockVerified(String lock) {
-        mCurrLock = lock;
-        // In Setup Wizard, the landing page is always the Pin screen
-        BaseFragment fragment = ChooseLockPinPasswordFragment.newPinInstance(
-                /* isInSetupWizard= */ true);
-        launchFragment(fragment);
-    }
-
-    @Override
-    public void onLockTypeSelected(int position) {
-        BaseFragment fragment = null;
-
-        switch(position) {
-            case LockTypeDialogFragment.POSITION_NONE:
-                if (mPasswordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
-                    new LockPatternUtils(this).clearLock(mCurrLock, UserHandle.myUserId());
-                }
-                setResult(ResultCodes.RESULT_NONE);
-                finish();
-                break;
-            case LockTypeDialogFragment.POSITION_PIN:
-                fragment = ChooseLockPinPasswordFragment.newPinInstance(
-                        /* isInSetupWizard= */ true);
-                break;
-            case LockTypeDialogFragment.POSITION_PATTERN:
-                fragment = ChooseLockPatternFragment.newInstance(/* isInSetupWizard= */ true);
-                break;
-            case LockTypeDialogFragment.POSITION_PASSWORD:
-                fragment = ChooseLockPinPasswordFragment.newPasswordInstance(
-                        /* isInSetupWizard= */ true);
-                break;
-            default:
-                LOG.e("Lock type position out of bounds");
-        }
-        if (fragment != null) {
-            launchFragment(fragment);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceController.java b/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceController.java
new file mode 100644
index 0000000..7efd671
--- /dev/null
+++ b/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceController.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+
+import android.annotation.Nullable;
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.trust.CarTrustAgentEnrollmentManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Business logic for trusted device preference.
+ */
+public class TrustedDeviceEntryPreferenceController extends PreferenceController<Preference> {
+
+    private static final Logger LOG = new Logger(TrustedDeviceEntryPreferenceController.class);
+    private final Car mCar;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    @Nullable
+    private CarTrustAgentEnrollmentManager mCarTrustAgentEnrollmentManager;
+
+    public TrustedDeviceEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCar = Car.createCar(context);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        try {
+            mCarTrustAgentEnrollmentManager = (CarTrustAgentEnrollmentManager) mCar.getCarManager(
+                    Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE);
+        } catch (CarNotConnectedException e) {
+            LOG.e(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        int listSize = 0;
+        try {
+            listSize = mCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                    mCarUserManagerHelper.getCurrentProcessUserId()).size();
+        } catch (CarNotConnectedException e) {
+            LOG.e(e.getMessage(), e);
+        }
+        preference.setSummary(
+                getContext().getResources().getQuantityString(R.plurals.trusted_device_subtitle,
+                        listSize, listSize));
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        getFragmentController().launchFragment(new ChooseTrustedDeviceFragment());
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/security/TrustedDeviceListPreferenceController.java b/src/com/android/car/settings/security/TrustedDeviceListPreferenceController.java
new file mode 100644
index 0000000..bab47ed
--- /dev/null
+++ b/src/com/android/car/settings/security/TrustedDeviceListPreferenceController.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import android.annotation.Nullable;
+import android.app.admin.DevicePolicyManager;
+import android.bluetooth.BluetoothDevice;
+import android.car.Car;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.trust.CarTrustAgentEnrollmentManager;
+import android.car.trust.TrustedDeviceInfo;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.widget.LockPatternUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Business logic of trusted device list page
+ */
+public class TrustedDeviceListPreferenceController extends PreferenceController<PreferenceGroup> {
+    private static final Logger LOG = new Logger(TrustedDeviceListPreferenceController.class);
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final LockPatternUtils mLockPatternUtils;
+    private final Car mCar;
+    @Nullable
+    private CarTrustAgentEnrollmentManager mCarTrustAgentEnrollmentManager;
+    private final CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback
+            mCarTrustAgentEnrollmentCallback =
+            new CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback() {
+
+                @Override
+                public void onEnrollmentHandshakeFailure(BluetoothDevice device, int errorCode) {
+                }
+
+                @Override
+                public void onAuthStringAvailable(BluetoothDevice device, String authString) {
+                }
+
+                @Override
+                public void onEscrowTokenAdded(long handle) {
+                }
+
+                @Override
+                public void onEscrowTokenRemoved(long handle) {
+                    refreshUi();
+                }
+
+                @Override
+                public void onEscrowTokenActiveStateChanged(long handle, boolean active) {
+                    if (active) {
+                        refreshUi();
+                    }
+                }
+            };
+
+    @VisibleForTesting
+    final ConfirmRemoveDeviceDialog.ConfirmRemoveDeviceListener mConfirmRemoveDeviceListener =
+            new ConfirmRemoveDeviceDialog.ConfirmRemoveDeviceListener() {
+                public void onConfirmRemoveDevice(long handle) {
+                    mCarTrustAgentEnrollmentManager.removeEscrowToken(handle,
+                            mCarUserManagerHelper.getCurrentProcessUserId());
+                }
+            };
+
+    public TrustedDeviceListPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mLockPatternUtils = new LockPatternUtils(context);
+        mCar = Car.createCar(context);
+        mCarTrustAgentEnrollmentManager = (CarTrustAgentEnrollmentManager) mCar.getCarManager(
+                Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE);
+
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mCarTrustAgentEnrollmentManager == null) {
+            throw new IllegalStateException("mCarTrustAgentEnrollmentManager is null.");
+        }
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        if (!hasPassword()) {
+            preferenceGroup.removeAll();
+            preferenceGroup.addPreference(createAuthenticationReminderPreference());
+            return;
+        }
+        List<Preference> updatedList = createTrustDevicePreferenceList();
+        if (!isEqual(preferenceGroup, updatedList)) {
+            preferenceGroup.removeAll();
+            for (Preference trustedDevice : updatedList) {
+                preferenceGroup.addPreference(trustedDevice);
+            }
+        }
+        preferenceGroup.setVisible(preferenceGroup.getPreferenceCount() > 0);
+    }
+
+    private boolean hasPassword() {
+        return mLockPatternUtils.getKeyguardStoredPasswordQuality(
+                mCarUserManagerHelper.getCurrentProcessUserId())
+                != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mCarTrustAgentEnrollmentManager.setEnrollmentCallback(mCarTrustAgentEnrollmentCallback);
+
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mCarTrustAgentEnrollmentManager.setEnrollmentCallback(null);
+    }
+
+    /**
+     * Method to compare two lists of preferences, used only by updateState method.
+     *
+     * @param preferenceGroup   current preference group
+     * @param trustedDeviceList updated preference list
+     * @return {@code true} when two lists are the same
+     */
+    private boolean isEqual(PreferenceGroup preferenceGroup, List<Preference> trustedDeviceList) {
+        if (preferenceGroup.getPreferenceCount() != trustedDeviceList.size()) {
+            return false;
+        }
+        for (Preference p : trustedDeviceList) {
+            if (preferenceGroup.findPreference(p.getKey()) == null) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private List<Preference> createTrustDevicePreferenceList() {
+        List<Preference> trustedDevicesList = new ArrayList<>();
+        List<TrustedDeviceInfo> devices =
+                mCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                        mCarUserManagerHelper.getCurrentProcessUserId());
+        for (TrustedDeviceInfo deviceInfo : devices) {
+            trustedDevicesList.add(
+                    createTrustedDevicePreference(deviceInfo.getName(), deviceInfo.getHandle()));
+        }
+        return trustedDevicesList;
+    }
+
+    private Preference createTrustedDevicePreference(String deviceName, long handle) {
+        Preference preference = new Preference(getContext());
+        preference.setIcon(R.drawable.ic_settings_bluetooth);
+        preference.setTitle(deviceName);
+        preference.setKey(String.valueOf(handle));
+        preference.setOnPreferenceClickListener((Preference pref) -> {
+            ConfirmRemoveDeviceDialog dialog = ConfirmRemoveDeviceDialog.newInstance(deviceName,
+                    handle);
+            dialog.setConfirmRemoveDeviceListener(mConfirmRemoveDeviceListener);
+            getFragmentController().showDialog(dialog, ConfirmRemoveDeviceDialog.TAG);
+            return true;
+        });
+        return preference;
+    }
+
+    private Preference createAuthenticationReminderPreference() {
+        Preference preference = new Preference(getContext());
+        preference.setSummary(R.string.trusted_device_set_authentication_reminder);
+        return preference;
+    }
+}
diff --git a/src/com/android/car/settings/setupservice/InitialLockSetupService.java b/src/com/android/car/settings/setupservice/InitialLockSetupService.java
new file mode 100644
index 0000000..292fbd3
--- /dev/null
+++ b/src/com/android/car/settings/setupservice/InitialLockSetupService.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.setupservice;
+
+
+import android.app.Service;
+import android.app.admin.DevicePolicyManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.IBinder;
+
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.security.PasswordHelper;
+import com.android.car.setupwizardlib.IInitialLockSetupService;
+import com.android.car.setupwizardlib.InitialLockSetupConstants;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.LockTypes;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.SetLockCodes;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.ValidateLockFlags;
+import com.android.car.setupwizardlib.InitialLockSetupHelper;
+import com.android.car.setupwizardlib.LockConfig;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockPatternView;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Service that is used by Setup Wizard (exclusively) to set the initial lock screen.
+ *
+ * <p>This service provides functionality to get the lock config state, check if a password is
+ * valid based on the Settings defined password criteria, and save a lock if there is not one
+ * already saved. The interface for these operations is found in the {@link
+ * IInitialLockSetupService}.
+ */
+public class InitialLockSetupService extends Service {
+
+    private static final Logger LOG = new Logger(InitialLockSetupService.class);
+    private static final String SET_LOCK_PERMISSION = "com.android.car.settings.SET_INITIAL_LOCK";
+
+    private final InitialLockSetupServiceImpl mIInitialLockSetupService =
+            new InitialLockSetupServiceImpl();
+
+    /**
+     * Will return an {@link IBinder} for the service unless either the caller does not have the
+     * appropriate permissions or a lock has already been set on the device. In this case, the
+     * service will return {@code null}.
+     */
+    @Override
+    public IBinder onBind(Intent intent) {
+        LOG.v("onBind");
+        if (checkCallingOrSelfPermission(SET_LOCK_PERMISSION)
+                != PackageManager.PERMISSION_GRANTED) {
+            // Check permission as a failsafe.
+            return null;
+        }
+        int userId = new CarUserManagerHelper(getApplicationContext()).getCurrentProcessUserId();
+        LockPatternUtils lockPatternUtils = new LockPatternUtils(getApplicationContext());
+        // Deny binding if there is an existing lock.
+        if (lockPatternUtils.getKeyguardStoredPasswordQuality(userId)
+                != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
+            LOG.v("Rejecting binding, lock exists");
+            return null;
+        }
+        return mIInitialLockSetupService;
+    }
+
+    // Translates the byte[] pattern received into the List<LockPatternView.Cell> that is
+    // recognized by LockPatternUtils.
+    private List<LockPatternView.Cell> toSettingsPattern(byte[] pattern) {
+        List<LockPatternView.Cell> outputList = new ArrayList<>();
+        for (int i = 0; i < pattern.length; i++) {
+            outputList.add(LockPatternView.Cell.of(
+                    InitialLockSetupHelper.getPatternCellRowFromByte(pattern[i]),
+                    InitialLockSetupHelper.getPatternCellColumnFromByte(pattern[i])));
+        }
+        return outputList;
+    }
+
+    // Implementation of the service binder interface.
+    private class InitialLockSetupServiceImpl extends IInitialLockSetupService.Stub {
+
+        @Override
+        public int getServiceVersion() {
+            return InitialLockSetupConstants.LIBRARY_VERSION;
+        }
+
+        @Override
+        public LockConfig getLockConfig(@LockTypes int lockType) {
+            // All lock types currently are configured the same.
+            switch (lockType) {
+                case LockTypes.PASSWORD:
+                    // fall through
+                case LockTypes.PIN:
+                    // fall through
+                case LockTypes.PATTERN:
+                    return new LockConfig(/* enabled= */true, PasswordHelper.MIN_LENGTH);
+            }
+            return null;
+        }
+
+        @Override
+        @ValidateLockFlags
+        public int checkValidLock(@LockTypes int lockType, byte[] password) {
+            PasswordHelper passwordHelper;
+            switch (lockType) {
+                case LockTypes.PASSWORD:
+                    passwordHelper = new PasswordHelper(/* isPin= */ false);
+                    return passwordHelper.validateSetupWizard(password);
+                case LockTypes.PIN:
+                    passwordHelper = new PasswordHelper(/* isPin= */ true);
+                    return passwordHelper.validateSetupWizard(password);
+                case LockTypes.PATTERN:
+                    return password.length >= LockPatternUtils.MIN_LOCK_PATTERN_SIZE
+                            ? 0 : ValidateLockFlags.INVALID_LENGTH;
+                default:
+                    LOG.e("other lock type, returning generic error");
+                    return ValidateLockFlags.INVALID_GENERIC;
+            }
+        }
+
+        @Override
+        @SetLockCodes
+        public int setLock(@LockTypes int lockType, byte[] password) {
+            int userId = new CarUserManagerHelper(
+                    InitialLockSetupService.this.getApplicationContext())
+                    .getCurrentProcessUserId();
+            LockPatternUtils lockPatternUtils = new LockPatternUtils(
+                    InitialLockSetupService.this.getApplicationContext());
+            int currentPassword = lockPatternUtils.getKeyguardStoredPasswordQuality(userId);
+            if (currentPassword != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
+                LOG.v("Password already set, rejecting call to setLock");
+                return SetLockCodes.FAIL_LOCK_EXISTS;
+            }
+            if (!InitialLockSetupHelper.isValidLockResultCode(checkValidLock(lockType, password))) {
+                LOG.v("Password is not valid, rejecting call to setLock");
+                return SetLockCodes.FAIL_LOCK_INVALID;
+            }
+
+            boolean success = false;
+            try {
+                switch (lockType) {
+                    case LockTypes.PASSWORD:
+                        // Need to remove setup wizard lib byte array encoding and use the
+                        // LockPatternUtils encoding.
+                        byte[] encodedPassword = LockPatternUtils.charSequenceToByteArray(
+                                InitialLockSetupHelper.byteArrayToCharSequence(password));
+                        lockPatternUtils.saveLockPassword(encodedPassword,
+                                /* savedPassword= */ null,
+                                DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, userId);
+                        success = true;
+                        break;
+                    case LockTypes.PIN:
+                        // Need to remove setup wizard lib byte array encoding and use the
+                        // LockPatternUtils encoding.
+                        byte[] encodedPin = LockPatternUtils.charSequenceToByteArray(
+                                InitialLockSetupHelper.byteArrayToCharSequence(password));
+                        lockPatternUtils.saveLockPassword(encodedPin, /* savedPassword= */ null,
+                                DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, userId);
+                        success = true;
+                        break;
+                    case LockTypes.PATTERN:
+                        // Need to remove the setup wizard lib pattern encoding and use the
+                        // LockPatternUtils pattern format.
+                        List<LockPatternView.Cell> pattern = toSettingsPattern(password);
+                        lockPatternUtils.saveLockPattern(pattern, /* savedPattern =*/ null,
+                                userId, /* allowUntrustedChange =*/ false);
+                        pattern.clear();
+                        success = true;
+                        break;
+                    default:
+                        LOG.e("Unknown lock type, returning a failure");
+                }
+            } catch (Exception e) {
+                LOG.e("Save lock exception", e);
+                success = false;
+            }
+            Arrays.fill(password, (byte) 0);
+            return success ? SetLockCodes.SUCCESS : SetLockCodes.FAIL_LOCK_GENERIC;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/sound/RingtonePreference.java b/src/com/android/car/settings/sound/RingtonePreference.java
new file mode 100644
index 0000000..e021174
--- /dev/null
+++ b/src/com/android/car/settings/sound/RingtonePreference.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.TypedArray;
+import android.media.RingtoneManager;
+import android.util.AttributeSet;
+
+import androidx.preference.Preference;
+
+/**
+ * A {@link Preference} which extracts relevant ringtone attributes from XML. When used in
+ * conjunction with {@link RingtonePreferenceController}, it can be used to select a default
+ * ringtone for a given ringtone type.
+ *
+ * @attr ref android.R.styleable#RingtonePreference_ringtoneType
+ * @attr ref android.R.styleable#RingtonePreference_showSilent
+ */
+public class RingtonePreference extends Preference {
+
+    private boolean mShowSilent;
+    private int mRingtoneType;
+
+    public RingtonePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        TypedArray a = context.obtainStyledAttributes(attrs,
+                com.android.internal.R.styleable.RingtonePreference, 0, 0);
+        mRingtoneType = a.getInt(com.android.internal.R.styleable.RingtonePreference_ringtoneType,
+                RingtoneManager.TYPE_RINGTONE);
+        mShowSilent = a.getBoolean(com.android.internal.R.styleable.RingtonePreference_showSilent,
+                true);
+        setIntent(new Intent(RingtoneManager.ACTION_RINGTONE_PICKER));
+        a.recycle();
+    }
+
+    /**
+     * Returns the sound type(s) that are shown in the picker.
+     *
+     * @see #setRingtoneType(int)
+     */
+    public int getRingtoneType() {
+        return mRingtoneType;
+    }
+
+    /**
+     * Sets the sound type(s) that are shown in the picker.
+     *
+     * @param type The sound type(s) that are shown in the picker.
+     * @see RingtoneManager#EXTRA_RINGTONE_TYPE
+     */
+    public void setRingtoneType(int type) {
+        mRingtoneType = type;
+    }
+
+    /**
+     * Returns whether to a show an item for 'Silent'.
+     */
+    public boolean getShowSilent() {
+        return mShowSilent;
+    }
+
+    /**
+     * Sets whether to show an item for 'Silent'.
+     *
+     * @param showSilent Whether to show 'Silent'.
+     * @see RingtoneManager#EXTRA_RINGTONE_SHOW_SILENT
+     */
+    public void setShowSilent(boolean showSilent) {
+        mShowSilent = showSilent;
+    }
+}
diff --git a/src/com/android/car/settings/sound/RingtonePreferenceController.java b/src/com/android/car/settings/sound/RingtonePreferenceController.java
new file mode 100644
index 0000000..7a90b26
--- /dev/null
+++ b/src/com/android/car/settings/sound/RingtonePreferenceController.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import android.app.Activity;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.media.AudioAttributes;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.UserHandle;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic for changing the default ringtone. */
+public class RingtonePreferenceController extends
+        PreferenceController<RingtonePreference> implements ActivityResultCallback {
+
+    private static final Logger LOG = new Logger(RingtonePreferenceController.class);
+    @VisibleForTesting
+    static final int REQUEST_CODE = 16;
+
+    // We use a user context so that default ringtones can differ per user.
+    private final Context mUserContext;
+
+    public RingtonePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mUserContext = createPackageContextAsUser(getContext(), UserHandle.myUserId());
+    }
+
+    @Override
+    protected Class<RingtonePreference> getPreferenceType() {
+        return RingtonePreference.class;
+    }
+
+    @Override
+    protected void updateState(RingtonePreference preference) {
+        Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(getContext(),
+                getPreference().getRingtoneType());
+        preference.setSummary(Ringtone.getTitle(getContext(), ringtoneUri, /* followSettingsUri= */
+                false, /* allowRemote= */ true));
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(RingtonePreference preference) {
+        onPrepareRingtonePickerIntent(preference, preference.getIntent());
+        getFragmentController().startActivityForResult(preference.getIntent(), REQUEST_CODE, this);
+        return true;
+    }
+
+    @Override
+    public void processActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        if (requestCode == REQUEST_CODE) {
+            if (resultCode != Activity.RESULT_OK || data == null) {
+                return;
+            }
+
+            Uri ringtoneUri = data.getParcelableExtra(
+                    RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
+            RingtoneManager.setActualDefaultRingtoneUri(mUserContext,
+                    getPreference().getRingtoneType(), ringtoneUri);
+            refreshUi();
+        }
+    }
+
+    /**
+     * Prepares the intent to launch the ringtone picker. This can be modified
+     * to adjust the parameters of the ringtone picker.
+     */
+    private void onPrepareRingtonePickerIntent(RingtonePreference ringtonePreference,
+            Intent ringtonePickerIntent) {
+        Uri currentRingtone = RingtoneManager.getActualDefaultRingtoneUri(mUserContext,
+                ringtonePreference.getRingtoneType());
+        ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI,
+                currentRingtone);
+
+        ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,
+                ringtonePreference.getTitle());
+        ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,
+                ringtonePreference.getRingtoneType());
+        ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT,
+                ringtonePreference.getShowSilent());
+
+        // Since we are picking the default ringtone, no need to show system default.
+        ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
+        // Allow playback in external activity.
+        ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_AUDIO_ATTRIBUTES_FLAGS,
+                AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY);
+    }
+
+    /**
+     * Returns a context created from the given context for the given user, or null if it fails.
+     */
+    private Context createPackageContextAsUser(Context context, int userId) {
+        try {
+            return context.createPackageContextAsUser(
+                    context.getPackageName(), 0 /* flags */, UserHandle.of(userId));
+        } catch (PackageManager.NameNotFoundException e) {
+            LOG.e("Failed to create user context", e);
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/sound/SoundSettingsFragment.java b/src/com/android/car/settings/sound/SoundSettingsFragment.java
index b1bf654..e04968c 100644
--- a/src/com/android/car/settings/sound/SoundSettingsFragment.java
+++ b/src/com/android/car/settings/sound/SoundSettingsFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -11,242 +11,22 @@
  * 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
+ * limitations under the License.
  */
+
 package com.android.car.settings.sound;
 
-import android.annotation.DrawableRes;
-import android.annotation.StringRes;
-import android.car.Car;
-import android.car.CarNotConnectedException;
-import android.car.media.CarAudioManager;
-import android.car.media.ICarVolumeCallback;
-import android.content.ComponentName;
-import android.content.ServiceConnection;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.media.AudioAttributes;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.util.AttributeSet;
-import android.util.SparseArray;
-import android.util.Xml;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemAdapter;
-import androidx.car.widget.ListItemProvider.ListProvider;
-import androidx.car.widget.PagedListView;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
 
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Activity hosts sound related settings.
- */
-public class SoundSettingsFragment extends BaseFragment {
-    private static final Logger LOG = new Logger(SoundSettingsFragment.class);
-
-    private static final String XML_TAG_VOLUME_ITEMS = "carVolumeItems";
-    private static final String XML_TAG_VOLUME_ITEM = "item";
-
-    private final SparseArray<VolumeItem> mVolumeItems = new SparseArray<>();
-
-    private final List<ListItem> mVolumeLineItems = new ArrayList<>();
-
-    private final ServiceConnection mServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            try {
-                mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
-                int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
-                cleanUpVolumeLineItems();
-                // Populates volume slider items from volume groups to UI.
-                for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
-                    final VolumeItem volumeItem = getVolumeItemForUsages(
-                            mCarAudioManager.getUsagesForVolumeGroupId(groupId));
-                    mVolumeLineItems.add(new VolumeLineItem(
-                            getContext(),
-                            mCarAudioManager,
-                            groupId,
-                            volumeItem.usage,
-                            volumeItem.icon,
-                            volumeItem.title));
-                }
-                updateList();
-                mCarAudioManager.registerVolumeCallback(mVolumeChangeCallback.asBinder());
-            } catch (CarNotConnectedException e) {
-                LOG.e("Car is not connected!", e);
-            }
-        }
-
-        /**
-         * This does not gets called when service is properly disconnected.
-         * So we need to also handle cleanups in onStop().
-         */
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            cleanupAudioManager();
-        }
-    };
-
-    private final ICarVolumeCallback mVolumeChangeCallback = new ICarVolumeCallback.Stub() {
-        @Override
-        public void onGroupVolumeChanged(int groupId, int flags) {
-            for (ListItem lineItem : mVolumeLineItems) {
-                VolumeLineItem volumeLineItem = (VolumeLineItem) lineItem;
-                if (volumeLineItem.getVolumeGroupId() == groupId) {
-                    volumeLineItem.updateProgress();
-                }
-            }
-            updateList();
-        }
-
-        @Override
-        public void onMasterMuteChanged(int flags) {
-            // ignored
-        }
-    };
-
-    private Car mCar;
-    private CarAudioManager mCarAudioManager;
-    private PagedListView mListView;
-    private ListItemAdapter mPagedListAdapter;
-
-    /**
-     * Creates a new instance of this fragment.
-     */
-    public static SoundSettingsFragment newInstance() {
-        SoundSettingsFragment soundSettingsFragment = new SoundSettingsFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.sound_settings);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.list);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar);
-        soundSettingsFragment.setArguments(bundle);
-        return soundSettingsFragment;
-    }
-
-    private void cleanupAudioManager() {
-        try {
-            mCarAudioManager.unregisterVolumeCallback(mVolumeChangeCallback.asBinder());
-        } catch (CarNotConnectedException e) {
-            LOG.e("Car is not connected!", e);
-        }
-        cleanUpVolumeLineItems();
-        mCarAudioManager = null;
-    }
-
-    private void updateList() {
-        if (getActivity() != null && mPagedListAdapter != null) {
-            getActivity().runOnUiThread(() -> mPagedListAdapter.notifyDataSetChanged());
-        }
-    }
+/** Fragment which shows the settings for sounds. */
+public class SoundSettingsFragment extends SettingsFragment {
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        loadAudioUsageItems();
-        mCar = Car.createCar(getContext(), mServiceConnection);
-        mListView = getView().findViewById(R.id.list);
-        mPagedListAdapter = new ListItemAdapter(getContext(), new ListProvider(mVolumeLineItems));
-        mListView.setAdapter(mPagedListAdapter);
-        mListView.setMaxPages(PagedListView.UNLIMITED_PAGES);
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        mCar.connect();
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        cleanUpVolumeLineItems();
-        cleanupAudioManager();
-        mCar.disconnect();
-    }
-
-    private void cleanUpVolumeLineItems() {
-        for (ListItem item : mVolumeLineItems) {
-            ((VolumeLineItem) item).stop();
-        }
-        mVolumeLineItems.clear();
-    }
-
-    private void loadAudioUsageItems() {
-        try (XmlResourceParser parser = getResources().getXml(R.xml.car_volume_items)) {
-            AttributeSet attrs = Xml.asAttributeSet(parser);
-            int type;
-            // Traverse to the first start tag
-            while ((type=parser.next()) != XmlResourceParser.END_DOCUMENT
-                    && type != XmlResourceParser.START_TAG) {
-            }
-
-            if (!XML_TAG_VOLUME_ITEMS.equals(parser.getName())) {
-                throw new RuntimeException("Meta-data does not start with carVolumeItems tag");
-            }
-            int outerDepth = parser.getDepth();
-            int rank = 0;
-            while ((type=parser.next()) != XmlResourceParser.END_DOCUMENT
-                    && (type != XmlResourceParser.END_TAG || parser.getDepth() > outerDepth)) {
-                if (type == XmlResourceParser.END_TAG) {
-                    continue;
-                }
-                if (XML_TAG_VOLUME_ITEM.equals(parser.getName())) {
-                    TypedArray item = getResources().obtainAttributes(
-                            attrs, R.styleable.carVolumeItems_item);
-                    int usage = item.getInt(R.styleable.carVolumeItems_item_usage, -1);
-                    if (usage >= 0) {
-                        mVolumeItems.put(usage, new VolumeItem(
-                                usage, rank,
-                                item.getResourceId(R.styleable.carVolumeItems_item_title, 0),
-                                item.getResourceId(R.styleable.carVolumeItems_item_icon, 0)));
-                        rank++;
-                    }
-                    item.recycle();
-                }
-            }
-        } catch (XmlPullParserException | IOException e) {
-            LOG.e("Error parsing volume groups configuration", e);
-        }
-    }
-
-    private VolumeItem getVolumeItemForUsages(int[] usages) {
-        int rank = Integer.MAX_VALUE;
-        VolumeItem result = null;
-        for (int usage : usages) {
-            VolumeItem volumeItem = mVolumeItems.get(usage);
-            if (volumeItem.rank < rank) {
-                rank = volumeItem.rank;
-                result = volumeItem;
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Wrapper class which contains information to render volume item on UI.
-     */
-    private static class VolumeItem {
-        private final @AudioAttributes.AttributeUsage int usage;
-        private final int rank;
-        private final @StringRes int title;
-        private final @DrawableRes int icon;
-
-        private VolumeItem(@AudioAttributes.AttributeUsage int usage, int rank,
-                @StringRes int title, @DrawableRes int icon) {
-            this.usage = usage;
-            this.rank = rank;
-            this.title = title;
-            this.icon = icon;
-        }
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.sound_settings_fragment;
     }
 }
diff --git a/src/com/android/car/settings/sound/VolumeItemParser.java b/src/com/android/car/settings/sound/VolumeItemParser.java
new file mode 100644
index 0000000..562d200
--- /dev/null
+++ b/src/com/android/car/settings/sound/VolumeItemParser.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.media.AudioAttributes;
+import android.util.AttributeSet;
+import android.util.SparseArray;
+import android.util.Xml;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.StringRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * Parses the xml file which specifies which Audio usages should be considered by sound settings.
+ */
+public class VolumeItemParser {
+    private static final Logger LOG = new Logger(VolumeItemParser.class);
+
+    private static final String XML_TAG_VOLUME_ITEMS = "carVolumeItems";
+    private static final String XML_TAG_VOLUME_ITEM = "item";
+
+    /**
+     * Parses the volume items listed in the xml resource provided. This is returned as a sparse
+     * array which is keyed by the rank (the order in which the volume item appears in the xml
+     * resrouce).
+     */
+    public static SparseArray<VolumeItem> loadAudioUsageItems(Context context,
+            @XmlRes int volumeItemsXml) {
+        SparseArray<VolumeItem> volumeItems = new SparseArray<>();
+        try (XmlResourceParser parser = context.getResources().getXml(volumeItemsXml)) {
+            AttributeSet attrs = Xml.asAttributeSet(parser);
+            int type;
+            // Traverse to the first start tag.
+            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+                    && type != XmlResourceParser.START_TAG) {
+                continue;
+            }
+
+            if (!XML_TAG_VOLUME_ITEMS.equals(parser.getName())) {
+                throw new RuntimeException("Meta-data does not start with carVolumeItems tag");
+            }
+            int outerDepth = parser.getDepth();
+            int rank = 0;
+            while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+                    && (type != XmlResourceParser.END_TAG || parser.getDepth() > outerDepth)) {
+                if (type == XmlResourceParser.END_TAG) {
+                    continue;
+                }
+                if (XML_TAG_VOLUME_ITEM.equals(parser.getName())) {
+                    TypedArray item = context.getResources().obtainAttributes(
+                            attrs, R.styleable.carVolumeItems_item);
+                    int usage = item.getInt(R.styleable.carVolumeItems_item_usage, -1);
+                    if (usage >= 0) {
+                        volumeItems.put(usage, new VolumeItemParser.VolumeItem(
+                                usage, rank,
+                                item.getResourceId(R.styleable.carVolumeItems_item_titleText, 0),
+                                item.getResourceId(R.styleable.carVolumeItems_item_icon, 0)));
+                        rank++;
+                    }
+                    item.recycle();
+                }
+            }
+        } catch (XmlPullParserException | IOException e) {
+            LOG.e("Error parsing volume groups configuration", e);
+        }
+        return volumeItems;
+    }
+
+    /**
+     * Wrapper class which contains information to render volume item on UI.
+     */
+    public static class VolumeItem {
+        @AudioAttributes.AttributeUsage
+        private final int mUsage;
+        private final int mRank;
+        @StringRes
+        private final int mTitle;
+        @DrawableRes
+        private final int mIcon;
+
+        /** Constructs the VolumeItem container with the given values. */
+        public VolumeItem(@AudioAttributes.AttributeUsage int usage, int rank,
+                @StringRes int title, @DrawableRes int icon) {
+            mUsage = usage;
+            mRank = rank;
+            mTitle = title;
+            mIcon = icon;
+        }
+
+        /**
+         * Usage is used to represent what purpose the sound is used for. The values should be
+         * defined within AudioAttributes.USAGE_*.
+         */
+        public int getUsage() {
+            return mUsage;
+        }
+
+        /**
+         * Rank represents the order in which the usage appears in
+         * {@link R.xml#car_volume_items}. This order is used to determine which title and icon
+         * should be used for each audio group. The lowest rank has the highest precedence.
+         */
+        public int getRank() {
+            return mRank;
+        }
+
+        /** Title which should be used for the seek bar preference. */
+        public int getTitle() {
+            return mTitle;
+        }
+
+        /** Icon which should be used for the seek bar preference. */
+        public int getIcon() {
+            return mIcon;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/sound/VolumeLineItem.java b/src/com/android/car/settings/sound/VolumeLineItem.java
deleted file mode 100644
index a628ad5..0000000
--- a/src/com/android/car/settings/sound/VolumeLineItem.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.sound;
-
-import android.annotation.DrawableRes;
-import android.annotation.StringRes;
-import android.car.CarNotConnectedException;
-import android.car.media.CarAudioManager;
-import android.content.Context;
-import android.media.AudioAttributes;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Looper;
-import android.provider.Settings;
-import android.widget.SeekBar;
-
-import androidx.car.widget.SeekbarListItem;
-
-import com.android.car.settings.common.Logger;
-
-/**
- * Contains logic about volume controller UI.
- */
-public class VolumeLineItem extends SeekbarListItem implements SeekBar.OnSeekBarChangeListener {
-    private static final Logger LOG = new Logger(VolumeLineItem.class);
-    private static final int AUDIO_FEEDBACK_DURATION_MS = 1000;
-
-    private final Handler mUiHandler;
-    private final Ringtone mRingtone;
-    private final int mVolumeGroupId;
-    private final CarAudioManager mCarAudioManager;
-
-    public VolumeLineItem(
-            Context context,
-            CarAudioManager carAudioManager,
-            int volumeGroupId,
-            @AudioAttributes.AttributeUsage int usage,
-            @DrawableRes int iconResId,
-            @StringRes int titleId) throws CarNotConnectedException {
-        super(context);
-        mCarAudioManager = carAudioManager;
-        mUiHandler = new Handler(Looper.getMainLooper());
-        mRingtone = RingtoneManager.getRingtone(context, getRingtoneUri(usage));
-        mRingtone.setAudioAttributes(new AudioAttributes.Builder().setUsage(usage).build());
-        mVolumeGroupId = volumeGroupId;
-        setMax(getMaxSeekbarValue());
-        updateProgress();
-        setOnSeekBarChangeListener(this);
-        setText(context.getString(titleId));
-        setPrimaryActionIcon(iconResId);
-    }
-
-    @Override
-    public void onStartTrackingTouch(SeekBar seekBar) {
-        // no-op
-    }
-
-    @Override
-    public void onStopTrackingTouch(SeekBar seekBar) {
-        // no-op
-    }
-
-    @Override
-    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-        if (!fromUser) {
-            // For instance, if this event is originated from AudioService,
-            // we can ignore it as it has already been handled and doesn't need to be
-            // sent back down again.
-            return;
-        }
-        try {
-            if (mCarAudioManager == null) {
-                LOG.w("Ignoring volume change event because the car isn't connected");
-                return;
-            }
-            // AudioManager.FLAG_PLAY_SOUND does not guarantee play sound, use our own
-            // playback here instead.
-            mCarAudioManager.setGroupVolume(mVolumeGroupId, progress, 0);
-            playAudioFeedback();
-        } catch (CarNotConnectedException e) {
-            LOG.e("Car is not connected!", e);
-        }
-    }
-
-    /**
-     * Clean ups
-     */
-    public void stop() {
-        mUiHandler.removeCallbacksAndMessages(null);
-        mRingtone.stop();
-    }
-
-    public int getVolumeGroupId() {
-        return mVolumeGroupId;
-    }
-
-    /**
-     * Gets the latest progress.
-     */
-    public void updateProgress() {
-        setProgress(getSeekbarValue());
-    }
-
-    private void playAudioFeedback() {
-        mUiHandler.removeCallbacksAndMessages(null);
-        mRingtone.play();
-        mUiHandler.postDelayed(() -> {
-            if (mRingtone.isPlaying()) {
-                mRingtone.stop();
-            }
-        }, AUDIO_FEEDBACK_DURATION_MS);
-    }
-
-    // TODO: bundle car-specific audio sample assets in res/raw by usage
-    private Uri getRingtoneUri(@AudioAttributes.AttributeUsage int usage) {
-        switch (usage) {
-            case AudioAttributes.USAGE_NOTIFICATION:
-                return Settings.System.DEFAULT_NOTIFICATION_URI;
-            case AudioAttributes.USAGE_ALARM:
-                return Settings.System.DEFAULT_ALARM_ALERT_URI;
-            default:
-                return Settings.System.DEFAULT_RINGTONE_URI;
-        }
-    }
-
-    private int getSeekbarValue() {
-        try {
-            return mCarAudioManager.getGroupVolume(mVolumeGroupId);
-        } catch (CarNotConnectedException e) {
-            LOG.e("Car is not connected!", e);
-        }
-        return 0;
-    }
-
-    private int getMaxSeekbarValue() {
-        try {
-            return mCarAudioManager.getGroupMaxVolume(mVolumeGroupId);
-        } catch (CarNotConnectedException e) {
-            LOG.e("Car is not connected!", e);
-        }
-        return 0;
-    }
-}
diff --git a/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java b/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
new file mode 100644
index 0000000..fae748e
--- /dev/null
+++ b/src/com/android/car/settings/sound/VolumeSettingsPreferenceController.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import static com.android.car.settings.sound.VolumeItemParser.VolumeItem;
+
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.media.CarAudioManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.SparseArray;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.apps.common.util.Themes;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.SeekBarPreference;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Business logic which parses car volume items into groups, creates a seek bar preference for each
+ * group, and interfaces with the ringtone manager and audio manager.
+ *
+ * @see VolumeSettingsRingtoneManager
+ * @see android.car.media.CarAudioManager
+ */
+public class VolumeSettingsPreferenceController extends PreferenceController<PreferenceGroup> {
+    private static final Logger LOG = new Logger(VolumeSettingsPreferenceController.class);
+    private static final String VOLUME_GROUP_KEY = "volume_group_key";
+    private static final String VOLUME_USAGE_KEY = "volume_usage_key";
+
+    private final SparseArray<VolumeItem> mVolumeItems;
+    private final List<SeekBarPreference> mVolumePreferences = new ArrayList<>();
+    private final VolumeSettingsRingtoneManager mRingtoneManager;
+
+    private final ServiceConnection mServiceConnection = new ServiceConnection() {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            try {
+                mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
+                int volumeGroupCount = mCarAudioManager.getVolumeGroupCount();
+                cleanUpVolumePreferences();
+                // Populates volume slider items from volume groups to UI.
+                for (int groupId = 0; groupId < volumeGroupCount; groupId++) {
+                    VolumeItem volumeItem = getVolumeItemForUsages(
+                            mCarAudioManager.getUsagesForVolumeGroupId(groupId));
+                    SeekBarPreference volumePreference = createVolumeSeekBarPreference(
+                            groupId, volumeItem.getUsage(), volumeItem.getIcon(),
+                            volumeItem.getTitle());
+                    mVolumePreferences.add(volumePreference);
+                }
+
+                refreshUi();
+            } catch (CarNotConnectedException e) {
+                LOG.e("Car is not connected!", e);
+            }
+        }
+
+        /** Cleanup audio related fields when car is disconnected. */
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            cleanupAudioManager();
+        }
+    };
+
+    private Car mCar;
+    private CarAudioManager mCarAudioManager;
+
+    public VolumeSettingsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCar = Car.createCar(getContext(), mServiceConnection);
+        mVolumeItems = VolumeItemParser.loadAudioUsageItems(context, carVolumeItemsXml());
+        mRingtoneManager = new VolumeSettingsRingtoneManager(getContext());
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /** Connect to car on create. */
+    @Override
+    protected void onCreateInternal() {
+        mCar.connect();
+    }
+
+    /** Disconnect from car on destroy. */
+    @Override
+    protected void onDestroyInternal() {
+        mCar.disconnect();
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        for (SeekBarPreference preference : mVolumePreferences) {
+            preferenceGroup.addPreference(preference);
+        }
+    }
+
+    /**
+     * The resource which lists the car volume resources associated with the various usage enums.
+     */
+    @XmlRes
+    @VisibleForTesting
+    int carVolumeItemsXml() {
+        return R.xml.car_volume_items;
+    }
+
+    private SeekBarPreference createVolumeSeekBarPreference(
+            int volumeGroupId, int usage, @DrawableRes int iconResId,
+            @StringRes int titleId) {
+        SeekBarPreference preference = new SeekBarPreference(getContext());
+        preference.setTitle(getContext().getString(titleId));
+        preference.setIcon(getContext().getDrawable(iconResId));
+        preference.getIcon().setTintList(
+                Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
+        try {
+            preference.setValue(mCarAudioManager.getGroupVolume(volumeGroupId));
+            preference.setMin(mCarAudioManager.getGroupMinVolume(volumeGroupId));
+            preference.setMax(mCarAudioManager.getGroupMaxVolume(volumeGroupId));
+        } catch (CarNotConnectedException e) {
+            LOG.e("Car is not connected!", e);
+        }
+        preference.setContinuousUpdate(true);
+        preference.setShowSeekBarValue(false);
+        Bundle bundle = preference.getExtras();
+        bundle.putInt(VOLUME_GROUP_KEY, volumeGroupId);
+        bundle.putInt(VOLUME_USAGE_KEY, usage);
+        preference.setOnPreferenceChangeListener((pref, newValue) -> {
+            int prefGroup = pref.getExtras().getInt(VOLUME_GROUP_KEY);
+            int prefUsage = pref.getExtras().getInt(VOLUME_USAGE_KEY);
+            int newVolume = (Integer) newValue;
+            setGroupVolume(prefGroup, newVolume);
+            mRingtoneManager.playAudioFeedback(prefGroup, prefUsage);
+            return true;
+        });
+        return preference;
+    }
+
+    private void setGroupVolume(int volumeGroupId, int newVolume) {
+        try {
+            mCarAudioManager.setGroupVolume(volumeGroupId, newVolume, /* flags= */ 0);
+        } catch (CarNotConnectedException e) {
+            LOG.w("Ignoring volume change event because the car isn't connected", e);
+        }
+    }
+
+    private void cleanupAudioManager() {
+        cleanUpVolumePreferences();
+        mCarAudioManager = null;
+    }
+
+    private void cleanUpVolumePreferences() {
+        mRingtoneManager.stopCurrentRingtone();
+        mVolumePreferences.clear();
+    }
+
+    private VolumeItem getVolumeItemForUsages(int[] usages) {
+        int rank = Integer.MAX_VALUE;
+        VolumeItem result = null;
+        for (int usage : usages) {
+            VolumeItem volumeItem = mVolumeItems.get(usage);
+            if (volumeItem.getRank() < rank) {
+                rank = volumeItem.getRank();
+                result = volumeItem;
+            }
+        }
+        return result;
+    }
+}
diff --git a/src/com/android/car/settings/sound/VolumeSettingsRingtoneManager.java b/src/com/android/car/settings/sound/VolumeSettingsRingtoneManager.java
new file mode 100644
index 0000000..51f8bd8
--- /dev/null
+++ b/src/com/android/car/settings/sound/VolumeSettingsRingtoneManager.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import android.content.Context;
+import android.media.AudioAttributes;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+
+import androidx.annotation.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/** Manges the audio played by the {@link VolumeSettingsPreferenceController}. */
+public class VolumeSettingsRingtoneManager {
+
+    private static final int AUDIO_FEEDBACK_DURATION_MS = 1000;
+
+    private final Context mContext;
+    private final Handler mUiHandler;
+    private final Map<Integer, Ringtone> mGroupToRingtoneMap = new HashMap<>();
+
+    @Nullable
+    private Ringtone mCurrentRingtone;
+
+    public VolumeSettingsRingtoneManager(Context context) {
+        mContext = context;
+        mUiHandler = new Handler(Looper.getMainLooper());
+    }
+
+    /**
+     * Play the audio defined by the current group and usage. Stop the current ringtone if it is a
+     * different ringtone than what is currently playing.
+     */
+    public void playAudioFeedback(int group, int usage) {
+        Ringtone nextRingtone = lazyLoadRingtone(group, usage);
+        if (mCurrentRingtone != null && mCurrentRingtone != nextRingtone
+                && mCurrentRingtone.isPlaying()) {
+            mCurrentRingtone.stop();
+        }
+
+        mUiHandler.removeCallbacksAndMessages(null);
+        mCurrentRingtone = nextRingtone;
+        mCurrentRingtone.play();
+        mUiHandler.postDelayed(() -> {
+            if (mCurrentRingtone.isPlaying()) {
+                mCurrentRingtone.stop();
+                mCurrentRingtone = null;
+            }
+        }, AUDIO_FEEDBACK_DURATION_MS);
+    }
+
+    /** Stop playing the current ringtone. */
+    public void stopCurrentRingtone() {
+        if (mCurrentRingtone != null) {
+            mCurrentRingtone.stop();
+        }
+    }
+
+    /** If we have already seen this ringtone, use it. Otherwise load when requested. */
+    private Ringtone lazyLoadRingtone(int group, int usage) {
+        if (!mGroupToRingtoneMap.containsKey(group)) {
+            Ringtone ringtone = RingtoneManager.getRingtone(mContext, getRingtoneUri(usage));
+            ringtone.setAudioAttributes(new AudioAttributes.Builder().setUsage(usage).build());
+            mGroupToRingtoneMap.put(group, ringtone);
+        }
+        return mGroupToRingtoneMap.get(group);
+    }
+
+    // TODO: bundle car-specific audio sample assets in res/raw by usage
+    private Uri getRingtoneUri(@AudioAttributes.AttributeUsage int usage) {
+        switch (usage) {
+            case AudioAttributes.USAGE_NOTIFICATION:
+                return Settings.System.DEFAULT_NOTIFICATION_URI;
+            case AudioAttributes.USAGE_ALARM:
+                return Settings.System.DEFAULT_ALARM_ALERT_URI;
+            default:
+                return Settings.System.DEFAULT_RINGTONE_URI;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragment.java b/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragment.java
new file mode 100644
index 0000000..5e29aa1
--- /dev/null
+++ b/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragment.java
@@ -0,0 +1,398 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.app.ActivityManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageDataObserver;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+import androidx.loader.app.LoaderManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Fragment to display the applications storage information. Also provide buttons to clear the
+ * applications cache data and user data.
+ */
+public class AppStorageSettingsDetailsFragment extends SettingsFragment implements
+        AppsStorageStatsManager.Callback {
+    private static final Logger LOG = new Logger(AppStorageSettingsDetailsFragment.class);
+
+    @VisibleForTesting
+    static final String CONFIRM_CLEAR_STORAGE_DIALOG_TAG =
+            "com.android.car.settings.storage.ConfirmClearStorageDialog";
+
+    @VisibleForTesting
+    static final String CONFIRM_CANNOT_CLEAR_STORAGE_DIALOG_TAG =
+            "com.android.car.settings.storage.ConfirmCannotClearStorageDialog";
+
+    public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
+    // Result code identifiers
+    public static final int REQUEST_MANAGE_SPACE = 2;
+
+    // Internal constants used in Handler
+    private static final int OP_SUCCESSFUL = 1;
+    private static final int OP_FAILED = 2;
+
+    // Constant used in handler to determine when the user data is cleared.
+    private static final int MSG_CLEAR_USER_DATA = 1;
+    // Constant used in handler to determine when the cache is cleared.
+    private static final int MSG_CLEAR_CACHE = 2;
+
+    // Keys to save the instance values.
+    private static final String KEY_CACHE_CLEARED = "cache_cleared";
+    private static final String KEY_DATA_CLEARED = "data_cleared";
+
+    // Package information
+    protected PackageManager mPackageManager;
+    private String mPackageName;
+
+    // Application state info
+    private ApplicationsState.AppEntry mAppEntry;
+    private ApplicationsState mAppState;
+    private ApplicationInfo mInfo;
+    private AppsStorageStatsManager mAppsStorageStatsManager;
+
+    // User info
+    private int mUserId;
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    //  An observer callback to get notified when the cache file deletion is complete.
+    private ClearCacheObserver mClearCacheObserver;
+    //  An observer callback to get notified when the user data deletion is complete.
+    private ClearUserDataObserver mClearDataObserver;
+
+    // The restriction enforced by admin.
+    private RestrictedLockUtils.EnforcedAdmin mAppsControlDisallowedAdmin;
+    private boolean mAppsControlDisallowedBySystem;
+
+    // Clear user data and cache buttons and state.
+    private Button mClearStorageButton;
+    private Button mClearCacheButton;
+    private boolean mCanClearData = true;
+    private boolean mCacheCleared;
+    private boolean mDataCleared;
+
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmClearStorageDialog =
+            arguments -> initiateClearUserData();
+
+
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmCannotClearStorageDialog =
+            arguments -> mClearStorageButton.setEnabled(false);
+
+    /** Creates an instance of this fragment, passing packageName as an argument. */
+    public static AppStorageSettingsDetailsFragment getInstance(String packageName) {
+        AppStorageSettingsDetailsFragment applicationDetailFragment =
+                new AppStorageSettingsDetailsFragment();
+        Bundle bundle = new Bundle();
+        bundle.putString(EXTRA_PACKAGE_NAME, packageName);
+        applicationDetailFragment.setArguments(bundle);
+        return applicationDetailFragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.app_storage_settings_details_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mUserId = mCarUserManagerHelper.getCurrentProcessUserId();
+        mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
+        mAppState = ApplicationsState.getInstance(requireActivity().getApplication());
+        mAppEntry = mAppState.getEntry(mPackageName, mUserId);
+        StorageStatsSource storageStatsSource = new StorageStatsSource(context);
+        StorageStatsSource.AppStorageStats stats = null;
+        mPackageManager = context.getPackageManager();
+        try {
+            stats = storageStatsSource.getStatsForPackage(/* volumeUuid= */ null, mPackageName,
+                    UserHandle.of(mUserId));
+        } catch (Exception e) {
+            // This may happen if the package was removed during our calculation.
+            LOG.w("App unexpectedly not found", e);
+        }
+        mAppsStorageStatsManager = new AppsStorageStatsManager(context);
+        mAppsStorageStatsManager.registerListener(this);
+        use(StorageApplicationPreferenceController.class,
+                R.string.pk_storage_application_details)
+                .setAppEntry(mAppEntry)
+                .setAppState(mAppState);
+
+        List<StorageSizeBasePreferenceController> preferenceControllers = Arrays.asList(
+                use(StorageApplicationSizePreferenceController.class,
+                        R.string.pk_storage_application_size),
+                use(StorageApplicationTotalSizePreferenceController.class,
+                        R.string.pk_storage_application_total_size),
+                use(StorageApplicationUserDataPreferenceController.class,
+                        R.string.pk_storage_application_data_size),
+                use(StorageApplicationCacheSizePreferenceController.class,
+                        R.string.pk_storage_application_cache_size)
+        );
+
+        for (StorageSizeBasePreferenceController pc : preferenceControllers) {
+            pc.setAppsStorageStatsManager(mAppsStorageStatsManager);
+            pc.setAppStorageStats(stats);
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBoolean(KEY_CACHE_CLEARED, mCacheCleared);
+        outState.putBoolean(KEY_DATA_CLEARED, mDataCleared);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState != null) {
+            mCacheCleared = savedInstanceState.getBoolean(KEY_CACHE_CLEARED, false);
+            mDataCleared = savedInstanceState.getBoolean(KEY_DATA_CLEARED, false);
+            mCacheCleared = mCacheCleared || mDataCleared;
+        }
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) findDialogByTag(CONFIRM_CLEAR_STORAGE_DIALOG_TAG),
+                mConfirmClearStorageDialog, /* rejectListener= */ null);
+        ConfirmationDialogFragment.resetListeners(
+                (ConfirmationDialogFragment) findDialogByTag(
+                        CONFIRM_CANNOT_CLEAR_STORAGE_DIALOG_TAG),
+                mConfirmCannotClearStorageDialog, /* rejectListener= */ null);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        mClearStorageButton = requireActivity().findViewById(R.id.action_button1);
+        mClearStorageButton.setVisibility(View.VISIBLE);
+        mClearStorageButton.setEnabled(false);
+        mClearStorageButton.setText(R.string.storage_clear_user_data_text);
+
+        mClearCacheButton = requireActivity().findViewById(R.id.action_button2);
+        mClearCacheButton.setVisibility(View.VISIBLE);
+        mClearCacheButton.setEnabled(false);
+        mClearCacheButton.setText(R.string.storage_clear_cache_btn_text);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        mAppsControlDisallowedAdmin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+                getActivity(), UserManager.DISALLOW_APPS_CONTROL, mUserId);
+        mAppsControlDisallowedBySystem = RestrictedLockUtilsInternal.hasBaseUserRestriction(
+                getActivity(), UserManager.DISALLOW_APPS_CONTROL, mUserId);
+        updateSize();
+    }
+
+    @Override
+    public void onDataLoaded(StorageStatsSource.AppStorageStats data, boolean cacheCleared,
+            boolean dataCleared) {
+        if (data == null) {
+            mClearStorageButton.setEnabled(false);
+            mClearCacheButton.setEnabled(false);
+        } else {
+            long cacheSize = data.getCacheBytes();
+            long dataSize = data.getDataBytes() - cacheSize;
+
+            if (dataSize <= 0 || !mCanClearData || mDataCleared) {
+                mClearStorageButton.setEnabled(false);
+            } else {
+                mClearStorageButton.setEnabled(true);
+                mClearStorageButton.setOnClickListener(v -> handleClearDataClick());
+            }
+            if (cacheSize <= 0 || mCacheCleared) {
+                mClearCacheButton.setEnabled(false);
+            } else {
+                mClearCacheButton.setEnabled(true);
+                mClearCacheButton.setOnClickListener(v -> handleClearCacheClick());
+            }
+        }
+        if (mAppsControlDisallowedBySystem) {
+            mClearStorageButton.setEnabled(false);
+            mClearCacheButton.setEnabled(false);
+        }
+    }
+
+    private void handleClearCacheClick() {
+        if (mAppsControlDisallowedAdmin != null && !mAppsControlDisallowedBySystem) {
+            RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
+                    getActivity(), mAppsControlDisallowedAdmin);
+            return;
+        }
+        // Lazy initialization of observer.
+        if (mClearCacheObserver == null) {
+            mClearCacheObserver = new ClearCacheObserver();
+        }
+        mPackageManager.deleteApplicationCacheFiles(mPackageName, mClearCacheObserver);
+    }
+
+    private void handleClearDataClick() {
+        if (mAppsControlDisallowedAdmin != null && !mAppsControlDisallowedBySystem) {
+            RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
+                    getActivity(), mAppsControlDisallowedAdmin);
+        } else if (mAppEntry.info.manageSpaceActivityName != null) {
+            Intent intent = new Intent(Intent.ACTION_DEFAULT);
+            intent.setClassName(mAppEntry.info.packageName,
+                    mAppEntry.info.manageSpaceActivityName);
+            startActivityForResult(intent, REQUEST_MANAGE_SPACE);
+        } else {
+            showClearDataDialog();
+        }
+    }
+
+    /*
+     * Private method to initiate clearing user data when the user clicks the clear data
+     * button for a system package
+     */
+    private void initiateClearUserData() {
+        mClearStorageButton.setEnabled(false);
+        // Invoke uninstall or clear user data based on sysPackage
+        String packageName = mAppEntry.info.packageName;
+        LOG.i("Clearing user data for package : " + packageName);
+        if (mClearDataObserver == null) {
+            mClearDataObserver = new ClearUserDataObserver();
+        }
+        ActivityManager am = (ActivityManager)
+                getActivity().getSystemService(Context.ACTIVITY_SERVICE);
+        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
+        if (!res) {
+            // Clearing data failed for some obscure reason. Just log error for now
+            LOG.i("Couldn't clear application user data for package:" + packageName);
+            showCannotClearDataDialog();
+        }
+    }
+
+    /*
+     * Private method to handle clear message notification from observer when
+     * the async operation from PackageManager is complete
+     */
+    private void processClearMsg(Message msg) {
+        int result = msg.arg1;
+        String packageName = mAppEntry.info.packageName;
+        if (result == OP_SUCCESSFUL) {
+            LOG.i("Cleared user data for package : " + packageName);
+            updateSize();
+        } else {
+            mClearStorageButton.setEnabled(true);
+        }
+    }
+
+    private void updateSize() {
+        PackageManager packageManager = getActivity().getPackageManager();
+        try {
+            mInfo = packageManager.getApplicationInfo(mPackageName, 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            LOG.e("Could not find package", e);
+        }
+        if (mInfo == null) {
+            return;
+        }
+        LoaderManager loaderManager = LoaderManager.getInstance(this);
+        mAppsStorageStatsManager.startLoading(loaderManager, mInfo, mUserId, mCacheCleared,
+                mDataCleared);
+    }
+
+    private void showClearDataDialog() {
+        ConfirmationDialogFragment confirmClearStorageDialog =
+                new ConfirmationDialogFragment.Builder(getContext())
+                        .setTitle(R.string.storage_clear_user_data_text)
+                        .setMessage(getString(R.string.storage_clear_data_dlg_text))
+                        .setPositiveButton(R.string.okay, mConfirmClearStorageDialog)
+                        .setNegativeButton(android.R.string.cancel, /* rejectListener= */ null)
+                        .build();
+        showDialog(confirmClearStorageDialog, CONFIRM_CLEAR_STORAGE_DIALOG_TAG);
+    }
+
+    private void showCannotClearDataDialog() {
+        ConfirmationDialogFragment dialogFragment =
+                new ConfirmationDialogFragment.Builder(getContext())
+                        .setTitle(R.string.storage_clear_data_dlg_title)
+                        .setMessage(getString(R.string.storage_clear_failed_dlg_text))
+                        .setPositiveButton(R.string.okay, mConfirmCannotClearStorageDialog)
+                        .build();
+        showDialog(dialogFragment, CONFIRM_CANNOT_CLEAR_STORAGE_DIALOG_TAG);
+    }
+
+    private final Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            if (getView() == null) {
+                return;
+            }
+            switch (msg.what) {
+                case MSG_CLEAR_USER_DATA:
+                    mDataCleared = true;
+                    mCacheCleared = true;
+                    processClearMsg(msg);
+                    break;
+                case MSG_CLEAR_CACHE:
+                    mCacheCleared = true;
+                    // Refresh size info
+                    updateSize();
+                    break;
+            }
+        }
+    };
+
+    class ClearCacheObserver extends IPackageDataObserver.Stub {
+        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
+            Message msg = mHandler.obtainMessage(MSG_CLEAR_CACHE);
+            msg.arg1 = succeeded ? OP_SUCCESSFUL : OP_FAILED;
+            mHandler.sendMessage(msg);
+        }
+    }
+
+    class ClearUserDataObserver extends IPackageDataObserver.Stub {
+        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
+            Message msg = mHandler.obtainMessage(MSG_CLEAR_USER_DATA);
+            msg.arg1 = succeeded ? OP_SUCCESSFUL : OP_FAILED;
+            mHandler.sendMessage(msg);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/storage/AppsStorageStatsManager.java b/src/com/android/car/settings/storage/AppsStorageStatsManager.java
new file mode 100644
index 0000000..8b78e4e
--- /dev/null
+++ b/src/com/android/car/settings/storage/AppsStorageStatsManager.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+import com.android.settingslib.applications.StorageStatsSource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to manage the callbacks needed to calculate storage stats for an application.
+ */
+public class AppsStorageStatsManager {
+
+    /**
+     * Callback that is called once the AppsStorageStats is loaded.
+     */
+    public interface Callback {
+        /**
+         * Called when the data is successfully loaded from {@link AppsStorageStatsResult}. The
+         * result can be {@link null} if the package is removed during loading. Also notifies if
+         * this callback was initiated when cache or data is cleared or not.
+         */
+        void onDataLoaded(StorageStatsSource.AppStorageStats data, boolean cacheCleared,
+                boolean dataCleared);
+    }
+
+    private final Context mContext;
+    private ApplicationInfo mInfo;
+    private int mUserId;
+    private boolean mCacheCleared;
+    private boolean mDataCleared;
+    private List<Callback> mAppsStorageStatsListeners = new ArrayList<>();
+
+    AppsStorageStatsManager(Context context) {
+        mContext = context;
+    }
+
+    /**
+     * Registers a listener that will be notified once the data is loaded.
+     */
+    public void registerListener(Callback appsStorageStatsListener) {
+        if (!mAppsStorageStatsListeners.contains(appsStorageStatsListener)) {
+            mAppsStorageStatsListeners.add(appsStorageStatsListener);
+        }
+    }
+
+    /**
+     * Unregisters the listener.
+     */
+    public void unregisterListener(Callback appsStorageStatsListener) {
+        mAppsStorageStatsListeners.remove(appsStorageStatsListener);
+    }
+
+    /**
+     * Start calculating the storage stats.
+     */
+    public void startLoading(LoaderManager loaderManager, ApplicationInfo info, int userId,
+            boolean cacheCleared, boolean dataCleared) {
+        mInfo = info;
+        mUserId = userId;
+        mCacheCleared = cacheCleared;
+        mDataCleared = dataCleared;
+        loaderManager.restartLoader(/* id= */ 1, Bundle.EMPTY, new AppsStorageStatsResult());
+    }
+
+    private void onAppsStorageStatsLoaded(StorageStatsSource.AppStorageStats data) {
+        for (Callback listener : mAppsStorageStatsListeners) {
+            listener.onDataLoaded(data, mCacheCleared, mDataCleared);
+        }
+    }
+
+    /**
+     * Callback to calculate applications storage stats.
+     */
+    private class AppsStorageStatsResult implements
+            LoaderManager.LoaderCallbacks<StorageStatsSource.AppStorageStats> {
+
+        @NonNull
+        @Override
+        public Loader<StorageStatsSource.AppStorageStats> onCreateLoader(int id,
+                @Nullable Bundle args) {
+            return new FetchPackageStorageAsyncLoader(
+                    mContext, new StorageStatsSource(mContext), mInfo, UserHandle.of(mUserId));
+        }
+
+        @Override
+        public void onLoadFinished(
+                @NonNull Loader<StorageStatsSource.AppStorageStats> loader,
+                StorageStatsSource.AppStorageStats data) {
+            onAppsStorageStatsLoaded(data);
+        }
+
+        @Override
+        public void onLoaderReset(
+                @NonNull Loader<StorageStatsSource.AppStorageStats> loader) {
+        }
+    }
+}
diff --git a/src/com/android/car/settings/storage/FetchPackageStorageAsyncLoader.java b/src/com/android/car/settings/storage/FetchPackageStorageAsyncLoader.java
new file mode 100644
index 0000000..1c942b3
--- /dev/null
+++ b/src/com/android/car/settings/storage/FetchPackageStorageAsyncLoader.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.UserHandle;
+import android.util.Log;
+
+import com.android.car.settingslib.loader.AsyncLoader;
+import com.android.internal.util.Preconditions;
+import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
+
+import java.io.IOException;
+
+/**
+ * Fetches the storage stats using the {@link StorageStatsSource} for a given package and user
+ * tuple.
+ *
+ * <p>Class is taken from {@link com.android.settings.applications.FetchPackageStorageAsyncLoader}
+ */
+public class FetchPackageStorageAsyncLoader extends AsyncLoader<AppStorageStats> {
+    private static final String TAG = "FetchPackageStorage";
+    private final StorageStatsSource mSource;
+    private final ApplicationInfo mInfo;
+    private final UserHandle mUser;
+
+    public FetchPackageStorageAsyncLoader(Context context, @NonNull StorageStatsSource source,
+            @NonNull ApplicationInfo info, @NonNull UserHandle user) {
+        super(context);
+        mSource = Preconditions.checkNotNull(source);
+        mInfo = info;
+        mUser = user;
+    }
+
+    @Override
+    public AppStorageStats loadInBackground() {
+        AppStorageStats result = null;
+        try {
+            result = mSource.getStatsForPackage(mInfo.volumeUuid, mInfo.packageName, mUser);
+        } catch (NameNotFoundException | IOException e) {
+            Log.w(TAG, "Package may have been removed during query, failing gracefully", e);
+        }
+        return result;
+    }
+}
diff --git a/src/com/android/car/settings/storage/FileSizeFormatter.java b/src/com/android/car/settings/storage/FileSizeFormatter.java
new file mode 100644
index 0000000..789c4a3
--- /dev/null
+++ b/src/com/android/car/settings/storage/FileSizeFormatter.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.text.BidiFormatter;
+import android.text.format.Formatter;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Utility class to aid in formatting file sizes always with the same unit. This is modified from
+ * android.text.format.Formatter to fit this purpose.
+ *
+ * <p>Class is taken from {@link com.android.settings.utils.FileSizeFormatter}
+ */
+public final class FileSizeFormatter {
+    public static final long KILOBYTE_IN_BYTES = 1000;
+    public static final long MEGABYTE_IN_BYTES = KILOBYTE_IN_BYTES * 1000;
+    public static final long GIGABYTE_IN_BYTES = MEGABYTE_IN_BYTES * 1000;
+
+    private FileSizeFormatter() {
+    }
+
+    /**
+     * Formats a content size to be in the form of bytes, kilobytes, megabytes, etc.
+     *
+     * <p>The prefixes are used in their standard meanings in the SI system, so kB = 1000
+     * bytes, MB = 1,000,000 bytes, etc.
+     *
+     * <p>If the context has a right-to-left locale, the returned string is wrapped in bidi
+     * formatting characters to make sure it's displayed correctly if inserted inside a
+     * right-to-left string. (This is useful in cases where the unit strings, like "MB", are
+     * left-to-right, but the locale is right-to-left.)
+     *
+     * @param context Context to use to load the localized units
+     * @param sizeBytes size value to be formatted, in bytes
+     * @param suffix String id for the unit suffix.
+     * @param mult Amount of bytes in the unit. * @return formatted string with the number
+     */
+    public static String formatFileSize(
+            @NonNull Context context, long sizeBytes, int suffix, long mult) {
+        Formatter.BytesResult res =
+                formatBytes(context.getResources(), sizeBytes, suffix, mult);
+        return BidiFormatter.getInstance()
+                .unicodeWrap(context.getString(getFileSizeSuffix(context), res.value, res.units));
+    }
+
+    private static int getFileSizeSuffix(Context context) {
+        Resources res = context.getResources();
+        return res.getIdentifier("fileSizeSuffix", "string", "android");
+    }
+
+    /**
+     * A simplified version of the SettingsLib file size formatter. The primary difference is that
+     * this version always assumes it is doing a "short file size" and allows for a suffix to be
+     * provided.
+     *
+     * @param res Resources to fetch strings with.
+     * @param sizeBytes File size in bytes to format.
+     * @param suffix String id for the unit suffix.
+     * @param mult Amount of bytes in the unit.
+     */
+    private static Formatter.BytesResult formatBytes(
+            Resources res, long sizeBytes, int suffix, long mult) {
+        boolean isNegative = (sizeBytes < 0);
+        float result = isNegative ? -sizeBytes : sizeBytes;
+        result = result / mult;
+        // Note we calculate the rounded long by ourselves, but still let String.format()
+        // compute the rounded value. String.format("%f", 0.1) might not return "0.1" due to
+        // floating point errors.
+        int roundFactor;
+        String roundFormat;
+        if (mult == 1) {
+            roundFactor = 1;
+            roundFormat = "%.0f";
+        } else if (result < 1) {
+            roundFactor = 100;
+            roundFormat = "%.2f";
+        } else if (result < 10) {
+            roundFactor = 10;
+            roundFormat = "%.1f";
+        } else { // 10 <= result < 100
+            roundFactor = 1;
+            roundFormat = "%.0f";
+        }
+
+        if (isNegative) {
+            result = -result;
+        }
+        String roundedString = String.format(roundFormat, result);
+
+        // Note this might overflow if abs(result) >= Long.MAX_VALUE / 100, but that's like 80PB so
+        // it's okay (for now)...
+        long roundedBytes = (((long) Math.round(result * roundFactor)) * mult / roundFactor);
+
+        String units = res.getString(suffix);
+
+        return new Formatter.BytesResult(roundedString, units, roundedBytes);
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageAppDetailPreference.java b/src/com/android/car/settings/storage/StorageAppDetailPreference.java
new file mode 100644
index 0000000..8621e11
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageAppDetailPreference.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+
+/**
+ * A Preference to be used on the storage size application details page where the summary is
+ * displayed towards the right.
+ */
+public class StorageAppDetailPreference extends Preference {
+    private String mDetailText;
+
+    public StorageAppDetailPreference(Context context, AttributeSet attributeSet) {
+        super(context, attributeSet);
+        setWidgetLayoutResource(R.layout.summary_preference_widget);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+        TextView textView = ((TextView) view.findViewById(R.id.widget_summary));
+        textView.setText(mDetailText);
+    }
+
+    @VisibleForTesting
+    StorageAppDetailPreference(Context context) {
+        super(context);
+    }
+
+    /**
+     * Sets the detail text.
+     */
+    public void setDetailText(String text) {
+        if (TextUtils.equals(mDetailText, text)) {
+            return;
+        }
+        mDetailText = text;
+        notifyChanged();
+    }
+
+    /**
+     * Gets the detail text.
+     */
+    public String getDetailText() {
+        return mDetailText;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageApplicationCacheSizePreferenceController.java b/src/com/android/car/settings/storage/StorageApplicationCacheSizePreferenceController.java
new file mode 100644
index 0000000..dd7d5aa
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageApplicationCacheSizePreferenceController.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Class to calculate the cache size for a particular application.
+ */
+public class StorageApplicationCacheSizePreferenceController extends
+        StorageSizeBasePreferenceController {
+
+    public StorageApplicationCacheSizePreferenceController(Context context,
+            String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected long getSize() {
+        return (isCachedCleared() || isDataCleared()) ? 0 : getAppStorageStats().getCacheBytes();
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageApplicationListPreferenceController.java b/src/com/android/car/settings/storage/StorageApplicationListPreferenceController.java
new file mode 100644
index 0000000..e403998
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageApplicationListPreferenceController.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.applications.ApplicationListItemManager;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.ArrayList;
+
+/**
+ * Controller that adds all the applications provided to it into the UI as preference. Each
+ * application is a new preference.
+ */
+public class StorageApplicationListPreferenceController extends
+        PreferenceController<PreferenceGroup> implements
+        ApplicationListItemManager.AppListItemListener {
+
+    public StorageApplicationListPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    public void onDataLoaded(ArrayList<ApplicationsState.AppEntry> apps) {
+        getPreference().removeAll();
+        for (ApplicationsState.AppEntry appEntry : apps) {
+            getPreference().addPreference(
+                    createPreference(appEntry.label, appEntry.sizeStr, appEntry.icon,
+                            appEntry.info.packageName));
+        }
+    }
+
+    protected Preference createPreference(String title, String summary, Drawable icon,
+            String key) {
+        Preference preference = new Preference(getContext());
+        preference.setTitle(title);
+        preference.setSummary(summary);
+        preference.setIcon(icon);
+        preference.setKey(key);
+        preference.setOnPreferenceClickListener(p -> {
+            getFragmentController().launchFragment(
+                    AppStorageSettingsDetailsFragment.getInstance(key));
+            return true;
+        });
+        return preference;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageApplicationPreferenceController.java b/src/com/android/car/settings/storage/StorageApplicationPreferenceController.java
new file mode 100644
index 0000000..ed55031
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageApplicationPreferenceController.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.applications.ApplicationPreferenceController;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Preference showing the application icon, title and version on the storage size application
+ * details page.
+ */
+public class StorageApplicationPreferenceController extends ApplicationPreferenceController {
+
+    public StorageApplicationPreferenceController(Context context,
+            String preferenceKey, FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setTitle(getAppName());
+        preference.setIcon(getAppIcon());
+        preference.setSummary(getAppVersion());
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageApplicationSizePreferenceController.java b/src/com/android/car/settings/storage/StorageApplicationSizePreferenceController.java
new file mode 100644
index 0000000..27df177
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageApplicationSizePreferenceController.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Class to calculate the app size for a particular application.
+ */
+public class StorageApplicationSizePreferenceController extends
+        StorageSizeBasePreferenceController {
+
+    public StorageApplicationSizePreferenceController(Context context,
+            String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected long getSize() {
+        return getAppStorageStats().getCodeBytes();
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageApplicationTotalSizePreferenceController.java b/src/com/android/car/settings/storage/StorageApplicationTotalSizePreferenceController.java
new file mode 100644
index 0000000..4f42c6b
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageApplicationTotalSizePreferenceController.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Class to calculate the total size for a particular application.
+ */
+public class StorageApplicationTotalSizePreferenceController extends
+        StorageSizeBasePreferenceController {
+
+    public StorageApplicationTotalSizePreferenceController(Context context,
+            String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected long getSize() {
+        long appSize = getAppStorageStats().getCodeBytes();
+        long userData = isDataCleared() ? 0
+                : getAppStorageStats().getDataBytes() - getAppStorageStats().getCacheBytes();
+        long cacheData =
+                (isCachedCleared() || isDataCleared()) ? 0 : getAppStorageStats().getCacheBytes();
+        return appSize + userData + cacheData;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageApplicationUserDataPreferenceController.java b/src/com/android/car/settings/storage/StorageApplicationUserDataPreferenceController.java
new file mode 100644
index 0000000..33d470f
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageApplicationUserDataPreferenceController.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Class to calculate the user data size for a particular application.
+ */
+public class StorageApplicationUserDataPreferenceController extends
+        StorageSizeBasePreferenceController {
+
+    public StorageApplicationUserDataPreferenceController(Context context,
+            String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected long getSize() {
+        return isDataCleared() ? 0
+                : getAppStorageStats().getDataBytes() - getAppStorageStats().getCacheBytes();
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageAsyncLoader.java b/src/com/android/car/settings/storage/StorageAsyncLoader.java
new file mode 100644
index 0000000..204695f
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageAsyncLoader.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static android.content.pm.ApplicationInfo.CATEGORY_AUDIO;
+import static android.content.pm.ApplicationInfo.CATEGORY_GAME;
+import static android.content.pm.ApplicationInfo.CATEGORY_IMAGE;
+import static android.content.pm.ApplicationInfo.CATEGORY_VIDEO;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.util.ArraySet;
+import android.util.SparseArray;
+
+import com.android.car.settings.common.Logger;
+import com.android.car.settingslib.loader.AsyncLoader;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * {@link StorageAsyncLoader} is a Loader which loads categorized app information and external stats
+ * for all users.
+ *
+ * <p>Class is taken from {@link com.android.settings.deviceinfo.storage.StorageAsyncLoader}
+ */
+public class StorageAsyncLoader
+        extends AsyncLoader<SparseArray<StorageAsyncLoader.AppsStorageResult>> {
+    private static final Logger LOG = new Logger(StorageAsyncLoader.class);
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final StorageStatsSource mStatsManager;
+    private final PackageManager mPackageManager;
+
+    public StorageAsyncLoader(Context context, CarUserManagerHelper carUserManagerHelper,
+            StorageStatsSource source) {
+        super(context);
+        mCarUserManagerHelper = carUserManagerHelper;
+        mStatsManager = source;
+        mPackageManager = context.getPackageManager();
+    }
+
+    @Override
+    public SparseArray<AppsStorageResult> loadInBackground() {
+        ArraySet<String> seenPackages = new ArraySet<>();
+        SparseArray<AppsStorageResult> result = new SparseArray<>();
+        List<UserInfo> infos = mCarUserManagerHelper.getAllUsers();
+        for (int i = 0, userCount = infos.size(); i < userCount; i++) {
+            UserInfo info = infos.get(i);
+            result.put(info.id, getStorageResultForUser(info.id, seenPackages));
+        }
+        return result;
+    }
+
+    private AppsStorageResult getStorageResultForUser(int userId, ArraySet<String> seenPackages) {
+        LOG.d("Loading apps");
+        List<ApplicationInfo> applicationInfos =
+                mPackageManager.getInstalledApplicationsAsUser(/* getAllInstalledApplications= */ 0,
+                        userId);
+        UserHandle myUser = UserHandle.of(userId);
+        long gameAppSize = 0;
+        long musicAppsSize = 0;
+        long videoAppsSize = 0;
+        long photosAppsSize = 0;
+        long otherAppsSize = 0;
+        for (int i = 0, size = applicationInfos.size(); i < size; i++) {
+            ApplicationInfo app = applicationInfos.get(i);
+            StorageStatsSource.AppStorageStats stats;
+            try {
+                stats = mStatsManager.getStatsForPackage(/* volumeUuid= */ null, app.packageName,
+                        myUser);
+            } catch (NameNotFoundException | IOException e) {
+                // This may happen if the package was removed during our calculation.
+                LOG.w("App unexpectedly not found", e);
+                continue;
+            }
+
+            long dataSize = stats.getDataBytes();
+            long cacheQuota = mStatsManager.getCacheQuotaBytes(/* volumeUuid= */null, app.uid);
+            long cacheBytes = stats.getCacheBytes();
+            long blamedSize = dataSize;
+            // Technically, we could show overages as freeable on the storage settings screen.
+            // If the app is using more cache than its quota, we would accidentally subtract the
+            // overage from the system size (because it shows up as unused) during our attribution.
+            // Thus, we cap the attribution at the quota size.
+            if (cacheQuota < cacheBytes) {
+                blamedSize = blamedSize - cacheBytes + cacheQuota;
+            }
+
+            // This isn't quite right because it slams the first user by user id with the whole code
+            // size, but this ensures that we count all apps seen once.
+            if (!seenPackages.contains(app.packageName)) {
+                blamedSize += stats.getCodeBytes();
+                seenPackages.add(app.packageName);
+            }
+
+            switch (app.category) {
+                case CATEGORY_GAME:
+                    gameAppSize += blamedSize;
+                    break;
+                case CATEGORY_AUDIO:
+                    musicAppsSize += blamedSize;
+                    break;
+                case CATEGORY_VIDEO:
+                    videoAppsSize += blamedSize;
+                    break;
+                case CATEGORY_IMAGE:
+                    photosAppsSize += blamedSize;
+                    break;
+                default:
+                    // The deprecated game flag does not set the category.
+                    if ((app.flags & ApplicationInfo.FLAG_IS_GAME) != 0) {
+                        gameAppSize += blamedSize;
+                        break;
+                    }
+                    otherAppsSize += blamedSize;
+                    break;
+            }
+        }
+
+        AppsStorageResult result = new AppsStorageResult(gameAppSize, musicAppsSize, photosAppsSize,
+                videoAppsSize, otherAppsSize);
+
+        LOG.d("Loading external stats");
+        try {
+            result.mStorageStats = mStatsManager.getExternalStorageStats(null,
+                    UserHandle.of(userId));
+        } catch (IOException e) {
+            LOG.w("External stats not loaded" + e);
+        }
+        LOG.d("Obtaining result completed");
+        return result;
+    }
+
+    /**
+     * Class to hold the result for different categories for storage.
+     */
+    public static class AppsStorageResult {
+        private final long mGamesSize;
+        private final long mMusicAppsSize;
+        private final long mPhotosAppsSize;
+        private final long mVideoAppsSize;
+        private final long mOtherAppsSize;
+        private long mCacheSize;
+        private StorageStatsSource.ExternalStorageStats mStorageStats;
+
+        AppsStorageResult(long gamesSize, long musicAppsSize, long photosAppsSize,
+                long videoAppsSize, long otherAppsSize) {
+            mGamesSize = gamesSize;
+            mMusicAppsSize = musicAppsSize;
+            mPhotosAppsSize = photosAppsSize;
+            mVideoAppsSize = videoAppsSize;
+            mOtherAppsSize = otherAppsSize;
+        }
+
+        /**
+         * Returns the size in bytes used by the applications of category {@link CATEGORY_GAME}.
+         */
+        public long getGamesSize() {
+            return mGamesSize;
+        }
+
+        /**
+         * Returns the size in bytes used by the applications of category {@link CATEGORY_AUDIO}.
+         */
+        public long getMusicAppsSize() {
+            return mMusicAppsSize;
+        }
+
+        /**
+         * Returns the size in bytes used by the applications of category {@link CATEGORY_IMAGE}.
+         */
+        public long getPhotosAppsSize() {
+            return mPhotosAppsSize;
+        }
+
+        /**
+         * Returns the size in bytes used by the applications of category {@link CATEGORY_VIDEO}.
+         */
+        public long getVideoAppsSize() {
+            return mVideoAppsSize;
+        }
+
+        /**
+         * Returns the size in bytes used by the applications not assigned to one of the other
+         * categories.
+         */
+        public long getOtherAppsSize() {
+            return mOtherAppsSize;
+        }
+
+        /**
+         * Returns the cached size in bytes.
+         */
+        public long getCacheSize() {
+            return mCacheSize;
+        }
+
+        /**
+         * Sets the storage cached size.
+         */
+        public void setCacheSize(long cacheSize) {
+            this.mCacheSize = cacheSize;
+        }
+
+        /**
+         * Returns the size in bytes for external storage of mounted device.
+         */
+        public StorageStatsSource.ExternalStorageStats getExternalStats() {
+            return mStorageStats;
+        }
+
+        /**
+         * Sets the size in bytes for the external storage.
+         */
+        public void setExternalStats(
+                StorageStatsSource.ExternalStorageStats externalStats) {
+            this.mStorageStats = externalStats;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
new file mode 100644
index 0000000..16e0c3c
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageFileCategoryPreferenceController.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.os.storage.StorageManager;
+import android.util.SparseArray;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+import com.android.settingslib.deviceinfo.StorageVolumeProvider;
+
+/**
+ * Controller which determines the storage for file category in the storage preference screen.
+ */
+public class StorageFileCategoryPreferenceController extends StorageUsageBasePreferenceController {
+
+    private StorageVolumeProvider mStorageVolumeProvider;
+
+    public StorageFileCategoryPreferenceController(Context context,
+            String preferenceKey, FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        StorageManager sm = context.getSystemService(StorageManager.class);
+        mStorageVolumeProvider = new StorageManagerVolumeProvider(sm);
+    }
+
+    @Override
+    protected long calculateCategoryUsage(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
+            long usedSizeBytes) {
+        StorageAsyncLoader.AppsStorageResult data = result.get(
+                getCarUserManagerHelper().getCurrentProcessUserId());
+        return data.getExternalStats().totalBytes - data.getExternalStats().audioBytes
+                - data.getExternalStats().videoBytes - data.getExternalStats().imageBytes
+                - data.getExternalStats().appBytes;
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(ProgressBarPreference preference) {
+        Intent intent = getFilesIntent();
+        intent.putExtra(Intent.EXTRA_USER_ID, getCarUserManagerHelper().getCurrentProcessUserId());
+        getContext().startActivityAsUser(intent,
+                new UserHandle(getCarUserManagerHelper().getCurrentProcessUserId()));
+        return true;
+    }
+
+    private Intent getFilesIntent() {
+        return mStorageVolumeProvider.findEmulatedForPrivate(getVolumeInfo()).buildBrowseIntent();
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageMediaCategoryDetailFragment.java b/src/com/android/car/settings/storage/StorageMediaCategoryDetailFragment.java
new file mode 100644
index 0000000..f7af597
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageMediaCategoryDetailFragment.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.storage;
+
+
+import static com.android.car.settings.storage.StorageMediaCategoryPreferenceController.EXTRA_AUDIO_BYTES;
+import static com.android.car.settings.storage.StorageUtils.maybeInitializeVolume;
+
+import android.app.Application;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.AppListFragment;
+import com.android.car.settings.applications.ApplicationListItemManager;
+import com.android.settingslib.applications.ApplicationsState;
+
+/**
+ * Lists all installed applications with category audio and their summary.
+ */
+public class StorageMediaCategoryDetailFragment extends AppListFragment {
+
+    private ApplicationListItemManager mAppListItemManager;
+
+    /**
+     * Gets the instance of this class.
+     */
+    public static StorageMediaCategoryDetailFragment getInstance() {
+        StorageMediaCategoryDetailFragment storageMedia = new StorageMediaCategoryDetailFragment();
+        return storageMedia;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.storage_media_category_detail_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        Bundle bundle = getArguments();
+        long externalAudioBytes = bundle.getLong(EXTRA_AUDIO_BYTES);
+        StorageManager sm = context.getSystemService(StorageManager.class);
+        VolumeInfo volume = maybeInitializeVolume(sm, getArguments());
+        Application application = requireActivity().getApplication();
+        mAppListItemManager = new ApplicationListItemManager(volume, getLifecycle(),
+                ApplicationsState.getInstance(application));
+        StorageMediaCategoryDetailPreferenceController pc = use(
+                StorageMediaCategoryDetailPreferenceController.class,
+                R.string.pk_storage_music_audio_details);
+        mAppListItemManager.registerListener(pc);
+        pc.setExternalAudioBytes(externalAudioBytes);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mAppListItemManager.startLoading(getAppFilter(), ApplicationsState.SIZE_COMPARATOR);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mAppListItemManager.onFragmentStart();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mAppListItemManager.onFragmentStop();
+    }
+
+    @Override
+    protected void onToggleShowSystemApps(boolean showSystem) {
+        mAppListItemManager.rebuildWithFilter(getAppFilter());
+    }
+
+    private ApplicationsState.AppFilter getAppFilter() {
+        ApplicationsState.AppFilter filter = ApplicationsState.FILTER_AUDIO;
+        if (!shouldShowSystemApps()) {
+            filter = new ApplicationsState.CompoundFilter(filter,
+                    ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER_AND_INSTANT);
+        }
+        return filter;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceController.java b/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceController.java
new file mode 100644
index 0000000..7c81ff7
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceController.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.util.ArrayList;
+
+/**
+ * Controller extends the {@link StorageApplicationListPreferenceController} which adds all the
+ * application in the parent controller and in addition one more application specific for listing
+ * audio files.
+ */
+public class StorageMediaCategoryDetailPreferenceController extends
+        StorageApplicationListPreferenceController {
+
+    private long mExternalAudioBytes;
+
+    public StorageMediaCategoryDetailPreferenceController(Context context,
+            String preferenceKey, FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    public void onDataLoaded(ArrayList<ApplicationsState.AppEntry> apps) {
+        super.onDataLoaded(apps);
+        Preference preference = createPreference(
+                getContext().getString(R.string.storage_audio_files_title),
+                Long.toString(mExternalAudioBytes),
+                getContext().getDrawable(R.drawable.ic_headset),
+                getContext().getString(R.string.pk_storage_music_audio_files));
+        // remove the onClickListener which was set above with null key. This preference should
+        // do nothing on click.
+        preference.setOnPreferenceClickListener(null);
+        getPreference().addPreference(preference);
+    }
+
+    /**
+     * Sets the external audio bytes
+     */
+    public void setExternalAudioBytes(long externalAudioBytes) {
+        mExternalAudioBytes = externalAudioBytes;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceController.java
new file mode 100644
index 0000000..1766be3
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceController.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.SparseArray;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.ProgressBarPreference;
+
+/**
+ * Controller which determines the storage for media category in the storage preference screen.
+ */
+public class StorageMediaCategoryPreferenceController extends StorageUsageBasePreferenceController {
+
+    public static final String EXTRA_AUDIO_BYTES = "extra_audio_bytes";
+
+    private long mExternalAudioBytes;
+
+    public StorageMediaCategoryPreferenceController(Context context,
+            String preferenceKey, FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected long calculateCategoryUsage(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
+            long usedSizeBytes) {
+        StorageAsyncLoader.AppsStorageResult data = result.get(
+                getCarUserManagerHelper().getCurrentProcessUserId());
+        mExternalAudioBytes = data.getExternalStats().audioBytes;
+        return data.getMusicAppsSize() + mExternalAudioBytes;
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(ProgressBarPreference preference) {
+        Bundle bundle = new Bundle();
+        bundle.putLong(EXTRA_AUDIO_BYTES, mExternalAudioBytes);
+        StorageMediaCategoryDetailFragment storageMediaCategoryDetailFragment =
+                StorageMediaCategoryDetailFragment.getInstance();
+        storageMediaCategoryDetailFragment.setArguments(bundle);
+        getFragmentController().launchFragment(storageMediaCategoryDetailFragment);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageOtherCategoryDetailFragment.java b/src/com/android/car/settings/storage/StorageOtherCategoryDetailFragment.java
new file mode 100644
index 0000000..6aec796
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageOtherCategoryDetailFragment.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.storage;
+
+import static com.android.car.settings.storage.StorageUtils.maybeInitializeVolume;
+
+import android.app.Application;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+
+import com.android.car.settings.R;
+import com.android.car.settings.applications.AppListFragment;
+import com.android.car.settings.applications.ApplicationListItemManager;
+import com.android.settingslib.applications.ApplicationsState;
+
+/**
+ * Lists all installed applications with no category defined and their summary.
+ */
+public class StorageOtherCategoryDetailFragment extends AppListFragment {
+
+    private ApplicationListItemManager mAppListItemManager;
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.storage_other_category_detail_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        Application application = requireActivity().getApplication();
+        StorageManager sm = context.getSystemService(StorageManager.class);
+        VolumeInfo volume = maybeInitializeVolume(sm, getArguments());
+        mAppListItemManager = new ApplicationListItemManager(volume, getLifecycle(),
+                ApplicationsState.getInstance(application));
+        mAppListItemManager.registerListener(
+                use(StorageApplicationListPreferenceController.class,
+                        R.string.pk_storage_other_apps_details));
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mAppListItemManager.startLoading(getAppFilter(), ApplicationsState.SIZE_COMPARATOR);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mAppListItemManager.onFragmentStart();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mAppListItemManager.onFragmentStop();
+    }
+
+    @Override
+    protected void onToggleShowSystemApps(boolean showSystem) {
+        mAppListItemManager.rebuildWithFilter(getAppFilter());
+    }
+
+    private ApplicationsState.AppFilter getAppFilter() {
+        ApplicationsState.AppFilter filter = ApplicationsState.FILTER_OTHER_APPS;
+        if (!shouldShowSystemApps()) {
+            filter = new ApplicationsState.CompoundFilter(filter,
+                    ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER_AND_INSTANT);
+        }
+        return filter;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageOtherCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageOtherCategoryPreferenceController.java
new file mode 100644
index 0000000..09e8814
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageOtherCategoryPreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.util.SparseArray;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Controller which determines the storage for the applications not assigned to one of the other
+ * categories in the storage preference screen.
+ */
+public class StorageOtherCategoryPreferenceController extends StorageUsageBasePreferenceController {
+
+    public StorageOtherCategoryPreferenceController(Context context,
+            String preferenceKey, FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected long calculateCategoryUsage(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
+            long usedSizeBytes) {
+        StorageAsyncLoader.AppsStorageResult data = result.get(
+                getCarUserManagerHelper().getCurrentProcessUserId());
+        return data.getOtherAppsSize();
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageSettingsFragment.java b/src/com/android/car/settings/storage/StorageSettingsFragment.java
new file mode 100644
index 0000000..efdc487
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageSettingsFragment.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.android.car.settings.storage.StorageUtils.maybeInitializeVolume;
+
+import android.annotation.XmlRes;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+
+import androidx.loader.app.LoaderManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+import java.util.Arrays;
+import java.util.List;
+
+/** Fragment which shows the settings for storage. */
+public class StorageSettingsFragment extends SettingsFragment {
+
+    private StorageSettingsManager mStorageSettingsManager;
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.storage_settings_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        StorageManager sm = context.getSystemService(StorageManager.class);
+        VolumeInfo volume = maybeInitializeVolume(sm, getArguments());
+        mStorageSettingsManager = new StorageSettingsManager(getContext(), volume);
+        List<StorageUsageBasePreferenceController> usagePreferenceControllers =
+                Arrays.asList(
+                        use(StorageMediaCategoryPreferenceController.class,
+                                R.string.pk_storage_music_audio),
+                        use(StorageOtherCategoryPreferenceController.class,
+                                R.string.pk_storage_other_apps),
+                        use(StorageFileCategoryPreferenceController.class,
+                                R.string.pk_storage_files),
+                        use(StorageSystemCategoryPreferenceController.class,
+                                R.string.pk_storage_system));
+
+        for (StorageUsageBasePreferenceController pc : usagePreferenceControllers) {
+            mStorageSettingsManager.registerListener(pc);
+            pc.setVolumeInfo(volume);
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        LoaderManager loaderManager = LoaderManager.getInstance(this);
+        mStorageSettingsManager.startLoading(loaderManager);
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageSettingsManager.java b/src/com/android/car/settings/storage/StorageSettingsManager.java
new file mode 100644
index 0000000..d058a01
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageSettingsManager.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.usage.StorageStatsManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.util.SparseArray;
+
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.deviceinfo.PrivateStorageInfo;
+import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to manage all the callbacks needed to calculate the total volume, storage used by each app
+ * category and notifying the listeners when the data is loaded.
+ */
+public class StorageSettingsManager {
+
+    /**
+     * Callback that is called once the volume of data is loaded for the mounted device.
+     */
+    public interface VolumeListener {
+        /**
+         * Called when the data is successfully loaded from {@link VolumeSizeCallback} and the
+         * total and used size for the mounted device is calculated from {@link AppsStorageResult}
+         */
+        void onDataLoaded(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
+                long usedSizeBytes, long totalSizeBytes);
+    }
+
+    private static final int STORAGE_JOB_ID = 0;
+    private static final int VOLUME_SIZE_JOB_ID = 1;
+
+    private final Context mContext;
+    private final VolumeInfo mVolumeInfo;
+
+    private List<VolumeListener> mVolumeListeners = new ArrayList<>();
+    private PrivateStorageInfo mPrivateStorageInfo;
+    private SparseArray<StorageAsyncLoader.AppsStorageResult> mAppsStorageResultSparseArray;
+
+    StorageSettingsManager(Context context, VolumeInfo volume) {
+        mContext = context;
+        mVolumeInfo = volume;
+    }
+
+    /**
+     * Registers a listener that will be notified once the data is loaded.
+     */
+    public void registerListener(VolumeListener volumeListener) {
+        if (!mVolumeListeners.contains(volumeListener)) {
+            mVolumeListeners.add(volumeListener);
+        }
+    }
+
+    /**
+     * Unregisters the listener.
+     */
+    public void unregisterlistener(VolumeListener volumeListener) {
+        mVolumeListeners.remove(volumeListener);
+    }
+
+    /**
+     * Start calculating the storage and volume.
+     */
+    public void startLoading(LoaderManager loaderManager) {
+        loaderManager.restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, new AppsStorageResult());
+        loaderManager.restartLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallback());
+    }
+
+    private void onReceivedSizes() {
+        if (mAppsStorageResultSparseArray != null && mPrivateStorageInfo != null) {
+            long privateUsedBytes = mPrivateStorageInfo.totalBytes - mPrivateStorageInfo.freeBytes;
+            for (VolumeListener listener : mVolumeListeners) {
+                listener.onDataLoaded(mAppsStorageResultSparseArray, privateUsedBytes,
+                        mPrivateStorageInfo.totalBytes);
+            }
+        }
+    }
+
+    /**
+     * Callback to get the storage volume information for the device that is mounted.
+     */
+    private class VolumeSizeCallback
+            implements LoaderManager.LoaderCallbacks<PrivateStorageInfo> {
+
+        @Override
+        public Loader<PrivateStorageInfo> onCreateLoader(int id, Bundle args) {
+            StorageManager sm = mContext.getSystemService(StorageManager.class);
+            StorageManagerVolumeProvider smvp = new StorageManagerVolumeProvider(sm);
+            StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class);
+            return new VolumeSizesLoader(mContext, smvp, stats, mVolumeInfo);
+        }
+
+        @Override
+        public void onLoadFinished(
+                Loader<PrivateStorageInfo> loader, PrivateStorageInfo privateStorageInfo) {
+            if (privateStorageInfo == null) {
+                return;
+            }
+            mPrivateStorageInfo = privateStorageInfo;
+            onReceivedSizes();
+        }
+
+        @Override
+        public void onLoaderReset(Loader<PrivateStorageInfo> loader) {
+        }
+    }
+
+    /**
+     * Callback to calculate how much space each category of applications is using.
+     */
+    private class AppsStorageResult implements
+            LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>> {
+
+        @NonNull
+        @Override
+        public Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> onCreateLoader(int id,
+                @Nullable Bundle args) {
+            return new StorageAsyncLoader(mContext, new CarUserManagerHelper(mContext),
+                    new StorageStatsSource(mContext));
+        }
+
+        @Override
+        public void onLoadFinished(
+                @NonNull Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader,
+                SparseArray<StorageAsyncLoader.AppsStorageResult> data) {
+            mAppsStorageResultSparseArray = data;
+            onReceivedSizes();
+        }
+
+        @Override
+        public void onLoaderReset(
+                @NonNull Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader) {
+        }
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageSizeBasePreferenceController.java b/src/com/android/car/settings/storage/StorageSizeBasePreferenceController.java
new file mode 100644
index 0000000..77ecbb4
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageSizeBasePreferenceController.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.text.format.Formatter;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.applications.StorageStatsSource;
+
+/**
+ * Controller which have the basic logic to determines the storage size details for a particular
+ * application.
+ */
+public abstract class StorageSizeBasePreferenceController extends
+        PreferenceController<StorageAppDetailPreference> implements
+        AppsStorageStatsManager.Callback {
+
+    private StorageStatsSource.AppStorageStats mAppStorageStats;
+    private AppsStorageStatsManager mAppsStorageStatsManager;
+    private Context mContext;
+    private boolean mDataCleared = false;
+    private boolean mCachedCleared = false;
+
+    public StorageSizeBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mContext = context;
+    }
+
+    @Override
+    protected Class<StorageAppDetailPreference> getPreferenceType() {
+        return StorageAppDetailPreference.class;
+    }
+
+    /**
+     * Calculates the storage size for a application.
+     *
+     * @return size value in bytes.
+     */
+    protected abstract long getSize();
+
+    @Override
+    protected void onCreateInternal() {
+        if (mAppsStorageStatsManager == null) {
+            return;
+        }
+        mAppsStorageStatsManager.registerListener(this);
+    }
+
+    /**
+     * Sets the {@link AppsStorageStatsManager} which will be used to register the controller to the
+     * Listener {@link AppsStorageStatsManager.Callback}.
+     */
+    public void setAppsStorageStatsManager(AppsStorageStatsManager appsStorageStatsManager) {
+        mAppsStorageStatsManager = appsStorageStatsManager;
+    }
+
+    @Override
+    protected void updateState(StorageAppDetailPreference preference) {
+        if (mAppStorageStats == null) {
+            return;
+        }
+        preference.setDetailText(getSizeStr(getSize()));
+    }
+
+    /**
+     * Sets the {@link StorageStatsSource.AppStorageStats} for a particular application.
+     */
+    public void setAppStorageStats(StorageStatsSource.AppStorageStats appStorageStats) {
+        mAppStorageStats = appStorageStats;
+    }
+
+    /**
+     * Gets the {@link StorageStatsSource.AppStorageStats} for a particular application.
+     */
+    public StorageStatsSource.AppStorageStats getAppStorageStats() {
+        return mAppStorageStats;
+    }
+
+    boolean isCachedCleared() {
+        return mCachedCleared;
+    }
+
+    boolean isDataCleared() {
+        return mDataCleared;
+    }
+
+    private String getSizeStr(long size) {
+        return Formatter.formatFileSize(mContext, size);
+    }
+
+    @Override
+    public void onDataLoaded(StorageStatsSource.AppStorageStats data, boolean cacheCleared,
+            boolean dataCleared) {
+        //  Sets if user have cleared the cache and should zero the cache bytes.
+        //  When the cache is cleared, the cache directories are recreated. These directories have
+        //  some size, but are empty. We zero this out to best match user expectations.
+        mCachedCleared = cacheCleared;
+
+        //  Sets if user have cleared data and should zero the data bytes.
+        //  When the data is cleared, the directory are recreated. Directories have some size,
+        //  but are empty. We zero this out to best match user expectations.
+        mDataCleared = dataCleared;
+        refreshUi();
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceController.java b/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceController.java
new file mode 100644
index 0000000..2f0d23f
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceController.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.app.AlertDialog;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.TrafficStats;
+import android.os.Build;
+import android.util.SparseArray;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.ProgressBarPreference;
+
+/**
+ * Controller which determines the storage for system category in the storage preference screen.
+ */
+public class StorageSystemCategoryPreferenceController extends
+        StorageUsageBasePreferenceController {
+
+    public StorageSystemCategoryPreferenceController(Context context,
+            String preferenceKey, FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected long calculateCategoryUsage(
+            SparseArray<StorageAsyncLoader.AppsStorageResult> result, long usedSizeBytes) {
+        long attributedSize = 0;
+        for (int i = 0; i < result.size(); i++) {
+            StorageAsyncLoader.AppsStorageResult otherData = result.valueAt(i);
+
+            attributedSize += otherData.getGamesSize()
+                    + otherData.getMusicAppsSize()
+                    + otherData.getVideoAppsSize()
+                    + otherData.getPhotosAppsSize()
+                    + otherData.getOtherAppsSize();
+
+            attributedSize += otherData.getExternalStats().totalBytes
+                    - otherData.getExternalStats().appBytes;
+        }
+        return Math.max(TrafficStats.GB_IN_BYTES, usedSizeBytes - attributedSize);
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(ProgressBarPreference preference) {
+        AlertDialog alertDialog = new AlertDialog.Builder(getContext())
+                .setMessage(getContext().getString(R.string.storage_detail_dialog_system,
+                        Build.VERSION.RELEASE))
+                .setPositiveButton(android.R.string.ok, null)
+                .create();
+        alertDialog.show();
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageUsageBasePreferenceController.java b/src/com/android/car/settings/storage/StorageUsageBasePreferenceController.java
new file mode 100644
index 0000000..93fcb74
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageUsageBasePreferenceController.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.storage.VolumeInfo;
+import android.util.SparseArray;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.ProgressBarPreference;
+
+/**
+ * Controller which have the basic logic to determines the storage for different categories visible
+ * in the storage preference screen.
+ */
+public abstract class StorageUsageBasePreferenceController extends
+        PreferenceController<ProgressBarPreference> implements
+        StorageSettingsManager.VolumeListener {
+
+    private static final int PROGRESS_MAX = 100;
+
+    private VolumeInfo mVolumeInfo;
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    public StorageUsageBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController,
+            CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<ProgressBarPreference> getPreferenceType() {
+        return ProgressBarPreference.class;
+    }
+
+    /**
+     * Calculates the storage used by the category.
+     *
+     * @return usage value in bytes.
+     */
+    protected abstract long calculateCategoryUsage(
+            SparseArray<StorageAsyncLoader.AppsStorageResult> result, long usedSizeBytes);
+
+    @Override
+    protected void onCreateInternal() {
+        getPreference().setSummary(R.string.memory_calculating_size);
+        getPreference().setMax(PROGRESS_MAX);
+    }
+
+    @Override
+    public void onDataLoaded(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
+            long usedSizeBytes, long totalSizeBytes) {
+        setStorageSize(calculateCategoryUsage(result, usedSizeBytes), totalSizeBytes);
+    }
+
+    CarUserManagerHelper getCarUserManagerHelper() {
+        return mCarUserManagerHelper;
+    }
+
+    public VolumeInfo getVolumeInfo() {
+        return mVolumeInfo;
+    }
+
+    public void setVolumeInfo(VolumeInfo volumeInfo) {
+        mVolumeInfo = volumeInfo;
+    }
+
+    /**
+     * Sets the storage size for this preference that will be displayed as a summary. It will also
+     * update the progress bar accordingly.
+     */
+    private void setStorageSize(long size, long total) {
+        getPreference().setSummary(
+                FileSizeFormatter.formatFileSize(
+                        getContext(),
+                        size,
+                        getGigabyteSuffix(getContext().getResources()),
+                        FileSizeFormatter.GIGABYTE_IN_BYTES));
+        int progressPercent;
+        if (total == 0) {
+            progressPercent = 0;
+        } else {
+            progressPercent = (int) (size * PROGRESS_MAX / total);
+        }
+        getPreference().setProgress(progressPercent);
+    }
+
+    private static int getGigabyteSuffix(Resources res) {
+        return res.getIdentifier("gigabyteShort", "string", "android");
+    }
+}
diff --git a/src/com/android/car/settings/storage/StorageUtils.java b/src/com/android/car/settings/storage/StorageUtils.java
new file mode 100644
index 0000000..f393dbc
--- /dev/null
+++ b/src/com/android/car/settings/storage/StorageUtils.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.annotation.Nullable;
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+
+/** Utility functions for use in storage settings. */
+public class StorageUtils {
+
+    private StorageUtils() { }
+
+    /**
+     * Tries to initialize a volume with the given bundle. If it is a valid, private, and readable
+     * {@link VolumeInfo}, it is returned. If it is not valid, {@code null} is returned.
+     */
+    @Nullable
+    public static VolumeInfo maybeInitializeVolume(StorageManager sm, @Nullable Bundle bundle) {
+        String volumeId = VolumeInfo.ID_PRIVATE_INTERNAL;
+        if (bundle != null) {
+            volumeId = bundle.getString(VolumeInfo.EXTRA_VOLUME_ID,
+                    VolumeInfo.ID_PRIVATE_INTERNAL);
+        }
+
+        VolumeInfo volume = sm.findVolumeById(volumeId);
+        return isVolumeValid(volume) ? volume : null;
+    }
+
+    private static boolean isVolumeValid(VolumeInfo volume) {
+        return (volume != null) && (volume.getType() == VolumeInfo.TYPE_PRIVATE)
+                && volume.isMountedReadable();
+    }
+}
diff --git a/src/com/android/car/settings/storage/VolumeSizesLoader.java b/src/com/android/car/settings/storage/VolumeSizesLoader.java
new file mode 100644
index 0000000..f207cbc
--- /dev/null
+++ b/src/com/android/car/settings/storage/VolumeSizesLoader.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import android.app.usage.StorageStatsManager;
+import android.content.Context;
+import android.os.storage.VolumeInfo;
+
+import com.android.car.settingslib.loader.AsyncLoader;
+import com.android.settingslib.deviceinfo.PrivateStorageInfo;
+import com.android.settingslib.deviceinfo.StorageVolumeProvider;
+
+import java.io.IOException;
+
+/**
+ * Loads the storage volume information for the device mounted.
+ */
+public class VolumeSizesLoader extends AsyncLoader<PrivateStorageInfo> {
+    private final StorageVolumeProvider mVolumeProvider;
+    private final StorageStatsManager mStats;
+    private final VolumeInfo mVolume;
+
+    public VolumeSizesLoader(Context context, StorageVolumeProvider volumeProvider,
+            StorageStatsManager stats, VolumeInfo volume) {
+        super(context);
+        mVolumeProvider = volumeProvider;
+        mStats = stats;
+        mVolume = volume;
+    }
+
+    @Override
+    public PrivateStorageInfo loadInBackground() {
+        PrivateStorageInfo volumeSizes;
+        try {
+            volumeSizes = getVolumeSize();
+        } catch (IOException e) {
+            return null;
+        }
+        return volumeSizes;
+    }
+
+    private PrivateStorageInfo getVolumeSize() throws IOException {
+        long privateTotalBytes = mVolumeProvider.getTotalBytes(mStats, mVolume);
+        long privateFreeBytes = mVolumeProvider.getFreeBytes(mStats, mVolume);
+        return new PrivateStorageInfo(privateFreeBytes, privateTotalBytes);
+    }
+}
diff --git a/src/com/android/car/settings/suggestions/SettingsSuggestionsController.java b/src/com/android/car/settings/suggestions/SettingsSuggestionsController.java
deleted file mode 100644
index ad103f3..0000000
--- a/src/com/android/car/settings/suggestions/SettingsSuggestionsController.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.suggestions;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.service.settings.suggestions.Suggestion;
-
-import androidx.annotation.StringRes;
-import androidx.loader.app.LoaderManager;
-import androidx.loader.content.Loader;
-
-import com.android.car.list.TypedPagedListAdapter;
-import com.android.car.settings.R;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.suggestions.SuggestionController;
-import com.android.settingslib.suggestions.SuggestionControllerMixin;
-import com.android.settingslib.suggestions.SuggestionLoader;
-import com.android.settingslib.utils.IconCache;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * Retrieves suggestions and prepares them for rendering.
- * Modeled after {@link SuggestionControllerMixin}, differs by implementing support library version
- * of LoaderManager and Loader. Does not implement use of LifeCycle.
- */
-public class SettingsSuggestionsController implements
-        SuggestionController.ServiceConnectionListener,
-        LoaderManager.LoaderCallbacks<List<Suggestion>> {
-    private static final Logger LOG = new Logger(SettingsSuggestionsController.class);
-    private static final ComponentName mComponentName = new ComponentName(
-            "com.android.settings.intelligence",
-            "com.android.settings.intelligence.suggestions.SuggestionService");
-    // These values are hard coded until we receive the OK to plumb them through
-    // SettingsIntelligence. This is ok as right now only SUW uses this framework.
-    @StringRes
-    private static final int PRIMARY_ACTION_ID = R.string.suggestion_primary_button;
-    @StringRes
-    private static final int SECONDARY_ACTION_ID = R.string.suggestion_secondary_button;
-
-    private final Context mContext;
-    private final LoaderManager mLoaderManager;
-    private final Listener mListener;
-    private final SuggestionController mSuggestionController;
-    private final IconCache mIconCache;
-
-    public SettingsSuggestionsController(
-            Context context,
-            LoaderManager loaderManager,
-            @NonNull Listener listener) {
-        mContext = context;
-        mLoaderManager = loaderManager;
-        mListener = listener;
-        mIconCache = new IconCache(context);
-        mSuggestionController = new SuggestionController(
-                mContext,
-                mComponentName,
-                /* listener= */ this);
-    }
-
-    @Override
-    public void onServiceConnected() {
-        LOG.v("onServiceConnected");
-        mLoaderManager.restartLoader(
-                SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS,
-                /* args= */ null,
-                /* callback= */ this);
-    }
-
-    @Override
-    public void onServiceDisconnected() {
-        LOG.v("onServiceDisconnected");
-        cleanupLoader();
-    }
-
-    @NonNull
-    @Override
-    public Loader<List<Suggestion>> onCreateLoader(int id, @Nullable Bundle args) {
-        LOG.v("onCreateLoader: " + id);
-        if (id == SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS) {
-            return new SettingsSuggestionsLoader(mContext, mSuggestionController);
-        }
-        throw new IllegalArgumentException("This loader id is not supported " + id);
-    }
-
-    @Override
-    public void onLoadFinished(
-            @NonNull Loader<List<Suggestion>> loader,
-            List<Suggestion> suggestionList) {
-        LOG.v("onLoadFinished");
-        if (suggestionList == null) {
-            return;
-        }
-        ArrayList<TypedPagedListAdapter.LineItem> items = new ArrayList<>();
-        for (final Suggestion suggestion : suggestionList) {
-            LOG.v("Suggestion ID: " + suggestion.getId());
-            Drawable itemIcon = mIconCache.getIcon(suggestion.getIcon());
-            SuggestionLineItem suggestionLineItem =
-                    new SuggestionLineItem(
-                            suggestion.getTitle(),
-                            suggestion.getSummary(),
-                            itemIcon,
-                            mContext.getString(PRIMARY_ACTION_ID),
-                            mContext.getString(SECONDARY_ACTION_ID),
-                            v -> {
-                                try {
-                                    suggestion.getPendingIntent().send();
-                                    launchSuggestion(suggestion);
-                                } catch (PendingIntent.CanceledException e) {
-                                    LOG.w("Failed to start suggestion " + suggestion.getTitle());
-                                }
-                            },
-                            adapterPosition -> {
-                                dismissSuggestion(suggestion);
-                                mListener.onSuggestionDismissed(adapterPosition);
-
-                            });
-            items.add(suggestionLineItem);
-        }
-        mListener.onSuggestionsLoaded(items);
-    }
-
-    @Override
-    public void onLoaderReset(@NonNull Loader<List<Suggestion>> loader) {
-        LOG.v("onLoaderReset");
-    }
-
-    /**
-     * Start the suggestions controller.
-     */
-    public void start() {
-        LOG.v("Start");
-        mSuggestionController.start();
-    }
-
-    /**
-     * Stop the suggestions controller.
-     */
-    public void stop() {
-        LOG.v("Stop");
-        mSuggestionController.stop();
-        cleanupLoader();
-
-    }
-
-    private void cleanupLoader() {
-        LOG.v("cleanupLoader");
-        mLoaderManager.destroyLoader(SuggestionLoader.LOADER_ID_SUGGESTIONS);
-    }
-
-    private void dismissSuggestion(Suggestion suggestion) {
-        LOG.v("dismissSuggestion");
-        mSuggestionController.dismissSuggestions(suggestion);
-    }
-
-    private void launchSuggestion(Suggestion suggestion) {
-        LOG.v("launchSuggestion");
-        mSuggestionController.launchSuggestion(suggestion);
-    }
-
-    /**
-     * Listener interface to notify of data state changes and actions.
-     */
-    public interface Listener {
-        /**
-         * Invoked when deferred setup items have been loaded.
-         *
-         * @param suggestions List of deferred setup suggestions.
-         */
-        void onSuggestionsLoaded(@NonNull ArrayList<TypedPagedListAdapter.LineItem> suggestions);
-
-        /***
-         * Invoked when a suggestion is dismissed.
-         *
-         * @param adapterPosition the position of the suggestion item in it's adapter.
-         */
-        void onSuggestionDismissed(int adapterPosition);
-    }
-}
diff --git a/src/com/android/car/settings/suggestions/SuggestionLineItem.java b/src/com/android/car/settings/suggestions/SuggestionLineItem.java
deleted file mode 100644
index 6ad9cce..0000000
--- a/src/com/android/car/settings/suggestions/SuggestionLineItem.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.suggestions;
-
-import android.graphics.drawable.Drawable;
-import android.view.View;
-
-import com.android.car.list.ActionIconButtonLineItem;
-
-/**
- * Represents suggestion list item.
- */
-public class SuggestionLineItem extends ActionIconButtonLineItem {
-
-    private final CharSequence mSummary;
-    private final View.OnClickListener mOnClickListener;
-    private final ActionListener mActionListener;
-
-    /**
-     * Creates a {@link SuggestionLineItem} with title, summary, icons, and click handlers.
-     */
-    public SuggestionLineItem(
-            CharSequence title,
-            CharSequence summary,
-            Drawable iconDrawable,
-            CharSequence primaryAction,
-            CharSequence secondaryAction,
-            View.OnClickListener onClickListener,
-            ActionListener actionListener) {
-        super(title, primaryAction, secondaryAction, iconDrawable);
-        mSummary = summary;
-        mOnClickListener = onClickListener;
-        mActionListener = actionListener;
-    }
-
-    @Override
-    public CharSequence getDesc() {
-        return mSummary;
-    }
-
-    @Override
-    public boolean isExpandable() {
-        return true;
-    }
-
-    @Override
-    public void onClick(View view) {
-        mOnClickListener.onClick(view);
-    }
-
-    @Override
-    public void onSecondaryActionButtonClick(int adapterPosition) {
-        mActionListener.onSuggestionItemDismissed(adapterPosition);
-    }
-
-    @Override
-    public void onPrimaryActionButtonClick(View view) {
-        onClick(view);
-    }
-
-    /**
-     * Interface that surfaces events on the suggestion.
-     */
-    public interface ActionListener {
-
-        /**
-         * Invoked when a suggestions item is dismissed.
-         *
-         * @param adapterPosition the position of the suggestion item in it's adapter.
-         */
-        void onSuggestionItemDismissed(int adapterPosition);
-    }
-}
diff --git a/src/com/android/car/settings/suggestions/SuggestionPreference.java b/src/com/android/car/settings/suggestions/SuggestionPreference.java
new file mode 100644
index 0000000..c299902
--- /dev/null
+++ b/src/com/android/car/settings/suggestions/SuggestionPreference.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2018 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.car.settings.suggestions;
+
+import android.content.Context;
+import android.service.settings.suggestions.Suggestion;
+import android.view.View;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+
+import java.util.Objects;
+
+/**
+ * Custom preference for Suggestions.
+ */
+public class SuggestionPreference extends Preference {
+
+    public static final String SUGGESTION_PREFERENCE_KEY = "suggestion_pref_key";
+
+    /**
+     * Callback for actions performed on a suggestion preference.
+     */
+    public interface Callback {
+        /** Called when the suggestion should be launched. */
+        void launchSuggestion(SuggestionPreference preference);
+
+        /** Called when the suggestion should be dismissed. */
+        void dismissSuggestion(SuggestionPreference preference);
+    }
+
+    private final Callback mCallback;
+    private Suggestion mSuggestion;
+
+    public SuggestionPreference(Context context, Suggestion suggestion, Callback callback) {
+        super(context);
+        setLayoutResource(R.layout.suggestion_preference);
+        mCallback = callback;
+        setKey(SUGGESTION_PREFERENCE_KEY + suggestion.getId());
+        updateSuggestion(suggestion);
+    }
+
+    /**
+     * Returns the {@link Suggestion} represented by this preference.
+     */
+    public Suggestion getSuggestion() {
+        return mSuggestion;
+    }
+
+    /**
+     * Updates the icon, title, and summary of the preference with those of the given
+     * {@link Suggestion}.
+     *
+     * @param suggestion the updated suggestion to represent
+     * @throws IllegalArgumentException if the given suggestion has a different id than the
+     *         suggestion passed to the constructor
+     */
+    public void updateSuggestion(Suggestion suggestion) {
+        if (mSuggestion != null && !Objects.equals(mSuggestion.getId(), suggestion.getId())) {
+            throw new IllegalArgumentException(
+                    "Suggestion preference update must have a matching id");
+        }
+        mSuggestion = suggestion;
+        setIcon((suggestion.getIcon() != null) ? suggestion.getIcon().loadDrawable(getContext())
+                : null);
+        setTitle(suggestion.getTitle());
+        setSummary(suggestion.getSummary());
+    }
+
+    @Override
+    public void onBindViewHolder(final PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        holder.setDividerAllowedAbove(false);
+        holder.setDividerAllowedBelow(false);
+
+        holder.itemView.setOnClickListener(v -> mCallback.launchSuggestion(this));
+
+        View dismissButton = holder.findViewById(R.id.dismiss_button);
+        dismissButton.setOnClickListener(v -> mCallback.dismissSuggestion(this));
+    }
+}
diff --git a/src/com/android/car/settings/suggestions/SuggestionsPreferenceController.java b/src/com/android/car/settings/suggestions/SuggestionsPreferenceController.java
new file mode 100644
index 0000000..1a86590
--- /dev/null
+++ b/src/com/android/car/settings/suggestions/SuggestionsPreferenceController.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2018 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.car.settings.suggestions;
+
+import android.app.PendingIntent;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Bundle;
+import android.service.settings.suggestions.Suggestion;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.suggestions.SuggestionController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Injects {@link SuggestionPreference} instances loaded from the SuggestionService at the
+ * location in the hierarchy of the controller's placeholder preference. The placeholder should
+ * be a {@link PreferenceGroup} which sets the controller attribute to the fully qualified name
+ * of this class.
+ *
+ * <p>For example:
+ * <pre>{@code
+ * <PreferenceCategory
+ *     android:key="@string/pk_suggestions"
+ *     android:title="@string/suggestions_title"
+ *     settings:controller="com.android.settings.suggestions.SuggestionsPreferenceController"/>
+ * }</pre>
+ */
+public class SuggestionsPreferenceController extends
+        PreferenceController<PreferenceGroup> implements
+        SuggestionController.ServiceConnectionListener,
+        LoaderManager.LoaderCallbacks<List<Suggestion>>, SuggestionPreference.Callback {
+
+    private static final Logger LOG = new Logger(SuggestionsPreferenceController.class);
+
+    // These values are hard coded until we receive the OK to plumb them through
+    // SettingsIntelligence. This is ok as right now only SUW uses this framework.
+    private static final ComponentName COMPONENT_NAME = new ComponentName(
+            "com.android.settings.intelligence",
+            "com.android.settings.intelligence.suggestions.SuggestionService");
+
+    private final SuggestionController mSuggestionController;
+    private List<Suggestion> mSuggestionsList = new ArrayList<>();
+    private LoaderManager mLoaderManager;
+
+    public SuggestionsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSuggestionController = new SuggestionController(context,
+                COMPONENT_NAME, /* serviceConnectionListener= */ this);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /**
+     * Sets the {@link LoaderManager} used to load suggestions.
+     */
+    public void setLoaderManager(LoaderManager loaderManager) {
+        mLoaderManager = loaderManager;
+    }
+
+    /**
+     * Verifies that the controller was properly initialized with
+     * {@link #setLoaderManager(LoaderManager)}.
+     *
+     * @throws IllegalStateException if the loader manager is {@code null}
+     */
+    @Override
+    protected void checkInitialized() {
+        LOG.v("checkInitialized");
+        if (mLoaderManager == null) {
+            throw new IllegalStateException(
+                    "SuggestionPreferenceController must be initialized by calling "
+                            + "setLoaderManager(LoaderManager)");
+        }
+    }
+
+    /** Starts the suggestions controller. */
+    @Override
+    protected void onStartInternal() {
+        LOG.v("onStartInternal");
+        mSuggestionController.start();
+    }
+
+    /** Stops the suggestions controller. */
+    @Override
+    protected void onStopInternal() {
+        LOG.v("onStopInternal");
+        mSuggestionController.stop();
+        cleanupLoader();
+    }
+
+    @Override
+    public void onServiceConnected() {
+        LOG.v("onServiceConnected");
+        mLoaderManager.restartLoader(SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS, /* args= */
+                null, /* callback= */ this);
+    }
+
+    @Override
+    public void onServiceDisconnected() {
+        LOG.v("onServiceDisconnected");
+        cleanupLoader();
+    }
+
+    @NonNull
+    @Override
+    public Loader<List<Suggestion>> onCreateLoader(int id, @Nullable Bundle args) {
+        LOG.v("onCreateLoader: " + id);
+        if (id == SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS) {
+            return new SettingsSuggestionsLoader(getContext(), mSuggestionController);
+        }
+        throw new IllegalArgumentException("This loader id is not supported " + id);
+    }
+
+
+    @Override
+    public void onLoadFinished(@NonNull Loader<List<Suggestion>> loader,
+            List<Suggestion> suggestions) {
+        LOG.v("onLoadFinished");
+        if (suggestions == null) {
+            // Load started before the service was ready.
+            return;
+        }
+
+        updateSuggestionPreferences(suggestions);
+        mSuggestionsList = new ArrayList<>(suggestions);
+    }
+
+    private void updateSuggestionPreferences(List<Suggestion> suggestions) {
+        // Remove suggestions that are not in the new list.
+        for (Suggestion oldSuggestion : mSuggestionsList) {
+            boolean isInNewSuggestionList = false;
+            for (Suggestion suggestion : suggestions) {
+                if (oldSuggestion.getId().equals(suggestion.getId())) {
+                    isInNewSuggestionList = true;
+                    break;
+                }
+            }
+            if (!isInNewSuggestionList) {
+                getPreference().removePreference(
+                        getPreference().findPreference(getSuggestionPreferenceKey(oldSuggestion)));
+            }
+        }
+
+        // Add suggestions that are not in the old list and update the existing suggestions.
+        for (Suggestion suggestion : suggestions) {
+            Preference curPref = getPreference().findPreference(
+                    getSuggestionPreferenceKey(suggestion));
+            if (curPref == null) {
+                SuggestionPreference newSuggPref = new SuggestionPreference(getContext(),
+                        suggestion, /* callback= */ this);
+                getPreference().addPreference(newSuggPref);
+            } else {
+                ((SuggestionPreference) curPref).updateSuggestion(suggestion);
+            }
+        }
+
+        refreshUi();
+    }
+
+    @Override
+    public void onLoaderReset(@NonNull Loader<List<Suggestion>> loader) {
+        LOG.v("onLoaderReset");
+    }
+
+    @Override
+    public void launchSuggestion(SuggestionPreference preference) {
+        LOG.v("launchSuggestion");
+        Suggestion suggestion = preference.getSuggestion();
+        try {
+            if (suggestion.getPendingIntent() != null) {
+                suggestion.getPendingIntent().send();
+                mSuggestionController.launchSuggestion(suggestion);
+            } else {
+                LOG.w("Suggestion with null pending intent " + suggestion.getId());
+            }
+        } catch (PendingIntent.CanceledException e) {
+            LOG.w("Failed to start suggestion " + suggestion.getId());
+        }
+    }
+
+    @Override
+    public void dismissSuggestion(SuggestionPreference preference) {
+        LOG.v("dismissSuggestion");
+        Suggestion suggestion = preference.getSuggestion();
+        mSuggestionController.dismissSuggestions(suggestion);
+        mSuggestionsList.remove(suggestion);
+        getPreference().removePreference(preference);
+        refreshUi();
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        preference.setVisible(preference.getPreferenceCount() > 0);
+    }
+
+    private void cleanupLoader() {
+        LOG.v("cleanupLoader");
+        mLoaderManager.destroyLoader(SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS);
+    }
+
+    private String getSuggestionPreferenceKey(Suggestion suggestion) {
+        return SuggestionPreference.SUGGESTION_PREFERENCE_KEY + suggestion.getId();
+    }
+}
diff --git a/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java b/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
new file mode 100644
index 0000000..8f13d9f
--- /dev/null
+++ b/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Build;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Updates the about settings entry summary with the build version. */
+public class AboutSettingsEntryPreferenceController extends PreferenceController<Preference> {
+
+    public AboutSettingsEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(
+                getContext().getString(R.string.about_summary, Build.VERSION.RELEASE));
+    }
+}
diff --git a/src/com/android/car/settings/system/AboutSettingsFragment.java b/src/com/android/car/settings/system/AboutSettingsFragment.java
index c4fe8d9..4171542 100644
--- a/src/com/android/car/settings/system/AboutSettingsFragment.java
+++ b/src/com/android/car/settings/system/AboutSettingsFragment.java
@@ -16,74 +16,19 @@
 
 package com.android.car.settings.system;
 
-import android.os.Build;
-import android.os.Bundle;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.settingslib.DeviceInfoUtils;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Shows basic info about the system and provide some actions like update, reset etc.
  */
-public class AboutSettingsFragment extends ListItemSettingsFragment {
-
-    private ListItemProvider mItemProvider;
-
-    public static AboutSettingsFragment getInstance() {
-        AboutSettingsFragment aboutSettingsFragment = new AboutSettingsFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.about_settings);
-        aboutSettingsFragment.setArguments(bundle);
-        return aboutSettingsFragment;
-    }
+public class AboutSettingsFragment extends SettingsFragment {
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mItemProvider = new ListItemProvider.ListProvider(getListItems());
-        // super.onActivityCreated() will need itemProvider, so call it after the provider
-        // is initialized.
-        super.onActivityCreated(savedInstanceState);
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-
-    private List<ListItem> getListItems() {
-        List<ListItem> listItems = new ArrayList<>();
-        TextListItem modelItem = new TextListItem(getContext());
-        modelItem.setTitle(getString(R.string.model_info));
-        modelItem.setBody(Build.MODEL + DeviceInfoUtils.getMsvSuffix());
-        listItems.add(modelItem);
-
-        TextListItem androidVersionItem = new TextListItem(getContext());
-        androidVersionItem.setTitle(getString(R.string.firmware_version));
-        androidVersionItem.setBody(getString(R.string.about_summary, Build.VERSION.RELEASE));
-        listItems.add(androidVersionItem);
-
-        TextListItem securityLevelItem = new TextListItem(getContext());
-        securityLevelItem.setTitle(getString(R.string.security_patch));
-        securityLevelItem.setBody(DeviceInfoUtils.getSecurityPatch());
-        listItems.add(securityLevelItem);
-
-        TextListItem kernelVersionItem = new TextListItem(getContext());
-        kernelVersionItem.setTitle(getString(R.string.kernel_version));
-        kernelVersionItem.setBody(DeviceInfoUtils.getFormattedKernelVersion(getContext()));
-        listItems.add(kernelVersionItem);
-
-        TextListItem buildNumberItem = new TextListItem(getContext());
-        buildNumberItem.setTitle(getString(R.string.build_number));
-        buildNumberItem.setBody(Build.DISPLAY);
-        listItems.add(buildNumberItem);
-        return listItems;
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.about_settings_fragment;
     }
 }
diff --git a/src/com/android/car/settings/system/BluetoothMacAddressPreferenceController.java b/src/com/android/car/settings/system/BluetoothMacAddressPreferenceController.java
new file mode 100644
index 0000000..05f9c60
--- /dev/null
+++ b/src/com/android/car/settings/system/BluetoothMacAddressPreferenceController.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Updates the vehicle bluetooth mac address summary. */
+public class BluetoothMacAddressPreferenceController extends
+        PreferenceController<Preference> {
+
+    private BluetoothAdapter mBluetoothAdapter;
+
+    public BluetoothMacAddressPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        return super.getAvailabilityStatus();
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(mBluetoothAdapter.getAddress());
+    }
+}
diff --git a/src/com/android/car/settings/system/BuildNumberPreferenceController.java b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
new file mode 100644
index 0000000..c2b7718
--- /dev/null
+++ b/src/com/android/car/settings/system/BuildNumberPreferenceController.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.Build;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.development.DevelopmentSettingsUtil;
+
+/** Updates the build number entry summary with the build number. */
+public class BuildNumberPreferenceController extends PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private Toast mDevHitToast;
+    private int mDevHitCountdown;
+
+    public BuildNumberPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    /**
+     * Reset the toast and counter which tracks how many more clicks until development settings is
+     * enabled.
+     */
+    @Override
+    protected void onResumeInternal() {
+        mDevHitToast = null;
+        mDevHitCountdown = DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
+                mCarUserManagerHelper) ? -1 : getTapsToBecomeDeveloper();
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(Build.DISPLAY);
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        if (!mCarUserManagerHelper.isCurrentProcessAdminUser()
+                && !mCarUserManagerHelper.isCurrentProcessDemoUser()) {
+            return false;
+        }
+
+        if (!DevelopmentSettingsUtil.isDeviceProvisioned(getContext())) {
+            return false;
+        }
+
+        if (mDevHitCountdown > 0) {
+            mDevHitCountdown--;
+            if (mDevHitCountdown == 0) {
+                DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true);
+                showToast(getContext().getString(R.string.show_dev_on), Toast.LENGTH_LONG);
+            } else if (mDevHitCountdown <= getTapsToBecomeDeveloper() - getTapsToShowToast()) {
+                showToast(getContext().getResources().getQuantityString(
+                        R.plurals.show_dev_countdown, mDevHitCountdown, mDevHitCountdown),
+                        Toast.LENGTH_SHORT);
+            }
+        } else if (mDevHitCountdown < 0) {
+            showToast(getContext().getString(R.string.show_dev_already), Toast.LENGTH_LONG);
+        }
+        return true;
+    }
+
+    private void showToast(String text, @Toast.Duration int duration) {
+        if (mDevHitToast != null) {
+            mDevHitToast.cancel();
+        }
+        mDevHitToast = Toast.makeText(getContext(), text, duration);
+        mDevHitToast.show();
+    }
+
+    private int getTapsToBecomeDeveloper() {
+        return getContext().getResources().getInteger(
+                R.integer.enable_developer_settings_click_count);
+    }
+
+    private int getTapsToShowToast() {
+        return getContext().getResources().getInteger(
+                R.integer.enable_developer_settings_clicks_to_show_toast_count);
+    }
+}
diff --git a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
new file mode 100644
index 0000000..9b2b22b
--- /dev/null
+++ b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.development.DevelopmentSettingsUtil;
+
+/** Controls the visibility of the developer options setting. */
+public class DeveloperOptionsEntryPreferenceController extends PreferenceController<Preference> {
+
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    public DeveloperOptionsEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
+                mCarUserManagerHelper) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+}
diff --git a/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
new file mode 100644
index 0000000..0d24dec
--- /dev/null
+++ b/src/com/android/car/settings/system/FirmwareVersionPreferenceController.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Build;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Updates the firmware version entry summary with the firmware version. */
+public class FirmwareVersionPreferenceController extends PreferenceController<Preference> {
+
+    public FirmwareVersionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(
+                getContext().getString(R.string.about_summary, Build.VERSION.RELEASE));
+    }
+}
diff --git a/src/com/android/car/settings/system/KernelVersionPreferenceController.java b/src/com/android/car/settings/system/KernelVersionPreferenceController.java
new file mode 100644
index 0000000..1d18523
--- /dev/null
+++ b/src/com/android/car/settings/system/KernelVersionPreferenceController.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.DeviceInfoUtils;
+
+/** Updates the kernel version entry summary with the kernel version. */
+public class KernelVersionPreferenceController extends PreferenceController<Preference> {
+
+    public KernelVersionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(DeviceInfoUtils.getFormattedKernelVersion(getContext()));
+    }
+}
diff --git a/src/com/android/car/settings/system/LanguagePickerFragment.java b/src/com/android/car/settings/system/LanguagePickerFragment.java
deleted file mode 100644
index af78320..0000000
--- a/src/com/android/car/settings/system/LanguagePickerFragment.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.system;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Bundle;
-
-import androidx.car.widget.ListItemProvider;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.ViewModel;
-import androidx.lifecycle.ViewModelProviders;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.car.settingslib.language.LanguagePickerUtils;
-import com.android.car.settingslib.language.LocaleListItemProvider;
-import com.android.car.settingslib.language.LocaleSelectionListener;
-import com.android.internal.app.LocalePicker;
-import com.android.internal.app.LocaleStore;
-
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-/**
- * Fragment for showing the list of languages.
- */
-public class LanguagePickerFragment extends ListItemSettingsFragment implements
-        LocaleSelectionListener {
-
-    private LocaleListItemProvider mLocaleListItemProvider;
-    private final HashSet<String> mLangTagsToIgnore = new HashSet<>();
-
-    /**
-     * Factory method for creating LanguagePickerFragment.
-     */
-    public static LanguagePickerFragment newInstance() {
-        LanguagePickerFragment LanguagePickerFragment = new LanguagePickerFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.language_settings);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar);
-        LanguagePickerFragment.setArguments(bundle);
-        return LanguagePickerFragment;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        LocaleViewModel viewModel = getLocaleViewModel();
-        viewModel.getLocaleInfos(getContext(), mLangTagsToIgnore).observe(this,
-                localeInfos -> resetLocaleList(localeInfos));
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        if (mLocaleListItemProvider == null) {
-            mLocaleListItemProvider = new LocaleListItemProvider(
-                    getContext(),
-                    new HashSet<LocaleStore.LocaleInfo>(),
-                    /* localeSelectionListener= */ this,
-                    mLangTagsToIgnore);
-        }
-        return mLocaleListItemProvider;
-    }
-
-    @Override
-    public void onLocaleSelected(LocaleStore.LocaleInfo localeInfo) {
-        if (localeInfo == null || localeInfo.getLocale() == null) {
-            return;
-        }
-
-        Locale locale = localeInfo.getLocale();
-
-        Resources res = getResources();
-        Configuration baseConfig = res.getConfiguration();
-        Configuration config = new Configuration(baseConfig);
-        config.setLocale(locale);
-        res.updateConfiguration(config, null);
-
-        // Apply locale to system.
-        LocalePicker.updateLocale(locale);
-        getFragmentController().goBack();
-    }
-
-    @Override
-    public void onParentWithChildrenLocaleSelected(LocaleStore.LocaleInfo localeInfo) {
-        if (localeInfo != null) {
-            setTitle(localeInfo.getFullNameNative());
-            refreshList();
-        }
-    }
-
-    @Override
-    protected void onBackPressed() {
-        if (isChildLocaleDisplayed()) {
-            setTitle(getString(R.string.language_settings));
-            getLocaleViewModel().reloadLocales(getContext(), mLangTagsToIgnore);
-        } else {
-            super.onBackPressed();
-        }
-    }
-
-    private LocaleViewModel getLocaleViewModel() {
-        return ViewModelProviders.of(this).get(LocaleViewModel.class);
-    }
-
-    private boolean isChildLocaleDisplayed() {
-        return mLocaleListItemProvider != null && mLocaleListItemProvider.isChildLocale();
-    }
-
-    /**
-     * Add a pseudo locale in debug build for testing RTL.
-     *
-     * @param localeInfos the set of {@link LocaleStore.LocaleInfo} to which the locale is added.
-     */
-    private void maybeAddPseudoLocale(Set<LocaleStore.LocaleInfo> localeInfos) {
-        if (Build.IS_USERDEBUG) {
-            // The ar-XB pseudo-locale is RTL.
-            localeInfos.add(LocaleStore.getLocaleInfo(new Locale("ar", "XB")));
-        }
-    }
-
-    private void resetLocaleList(Set<LocaleStore.LocaleInfo> localeInfos) {
-        if (mLocaleListItemProvider != null) {
-            maybeAddPseudoLocale(localeInfos);
-            mLocaleListItemProvider.updateSuggestedLocaleAdapter(
-                    LanguagePickerUtils.createSuggestedLocaleAdapter(
-                            getContext(), localeInfos, /* parent= */ null),
-                    /* isChildLocale= */ false);
-            refreshList();
-        }
-    }
-
-    /**
-     * ViewModel for holding the LocaleInfos.
-     */
-    public static class LocaleViewModel extends ViewModel {
-
-        private MutableLiveData<Set<LocaleStore.LocaleInfo>> mLocaleInfos;
-
-        /**
-         * Returns LiveData holding a set of LocaleInfo.
-         */
-        public LiveData<Set<LocaleStore.LocaleInfo>> getLocaleInfos(Context context,
-                Set<String> ignorables) {
-
-            if (mLocaleInfos == null) {
-                mLocaleInfos = new MutableLiveData<Set<LocaleStore.LocaleInfo>>();
-                reloadLocales(context, ignorables);
-            }
-            return mLocaleInfos;
-        }
-
-        /**
-         * Reload the locales based on the current context.
-         */
-        public void reloadLocales(Context context, Set<String> ignorables) {
-            new AsyncTask<Context, Void, Set<LocaleStore.LocaleInfo>>() {
-                @Override
-                protected Set<LocaleStore.LocaleInfo> doInBackground(Context... contexts) {
-                    return LocaleStore.getLevelLocales(
-                            contexts[0],
-                            ignorables,
-                            /* parent= */ null,
-                            /* translatedOnly= */ true);
-                }
-
-                @Override
-                protected void onPostExecute(Set<LocaleStore.LocaleInfo> localeInfos) {
-                    LocaleViewModel.this.mLocaleInfos.setValue(localeInfos);
-                }
-            }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, context);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/system/LegalInformationFragment.java b/src/com/android/car/settings/system/LegalInformationFragment.java
new file mode 100644
index 0000000..69b9bc6
--- /dev/null
+++ b/src/com/android/car/settings/system/LegalInformationFragment.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Fragment showing legal information.
+ */
+public class LegalInformationFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.legal_information_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/system/LicenseHtmlGeneratorFromXml.java b/src/com/android/car/settings/system/LicenseHtmlGeneratorFromXml.java
new file mode 100644
index 0000000..8002ac1
--- /dev/null
+++ b/src/com/android/car/settings/system/LicenseHtmlGeneratorFromXml.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.text.TextUtils;
+import android.util.Xml;
+
+import com.android.car.settings.common.Logger;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.GZIPInputStream;
+
+/**
+ * The utility class that generate a license html file from xml files.
+ * All the HTML snippets and logic are copied from build/make/tools/generate-notice-files.py.
+ */
+class LicenseHtmlGeneratorFromXml {
+    private static final Logger LOG = new Logger(LicenseHtmlGeneratorFromXml.class);
+
+    private static final String TAG_ROOT = "licenses";
+    private static final String TAG_FILE_NAME = "file-name";
+    private static final String TAG_FILE_CONTENT = "file-content";
+    private static final String ATTR_CONTENT_ID = "contentId";
+    private static final String HTML_HEAD_STRING =
+            "<html><head>\n"
+                    + "<style type=\"text/css\">\n"
+                    + "body { padding: 0; font-family: sans-serif; }\n"
+                    + ".same-license { background-color: #eeeeee;\n"
+                    + "                border-top: 20px solid white;\n"
+                    + "                padding: 10px; }\n"
+                    + ".label { font-weight: bold; }\n"
+                    + ".file-list { margin-left: 1em; color: blue; }\n"
+                    + "</style>\n"
+                    + "</head>"
+                    + "<body topmargin=\"0\" leftmargin=\"0\" rightmargin=\"0\" bottommargin=\"0\">"
+                    + "\n"
+                    + "<div class=\"toc\">\n"
+                    + "<ul>";
+
+    private static final String HTML_MIDDLE_STRING =
+            "</ul>\n"
+                    + "</div><!-- table of contents -->\n"
+                    + "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
+
+    private static final String HTML_REAR_STRING =
+            "</table></body></html>";
+
+    private final List<File> mXmlFiles;
+
+    /*
+     * A map from a file name to a content id (MD5 sum of file content) for its license.
+     * For example, "/system/priv-app/TeleService/TeleService.apk" maps to
+     * "9645f39e9db895a4aa6e02cb57294595". Here "9645f39e9db895a4aa6e02cb57294595" is a MD5 sum
+     * of the content of packages/services/Telephony/MODULE_LICENSE_APACHE2.
+     */
+    private final Map<String, String> mFileNameToContentIdMap = new HashMap();
+
+    /*
+     * A map from a content id (MD5 sum of file content) to a license file content.
+     * For example, "9645f39e9db895a4aa6e02cb57294595" maps to the content string of
+     * packages/services/Telephony/MODULE_LICENSE_APACHE2. Here "9645f39e9db895a4aa6e02cb57294595"
+     * is a MD5 sum of the file content.
+     */
+    private final Map<String, String> mContentIdToFileContentMap = new HashMap();
+
+    static class ContentIdAndFileNames {
+        final String mContentId;
+        final List<String> mFileNameList = new ArrayList();
+
+        ContentIdAndFileNames(String contentId) {
+            mContentId = contentId;
+        }
+    }
+
+    private LicenseHtmlGeneratorFromXml(List<File> xmlFiles) {
+        mXmlFiles = xmlFiles;
+    }
+
+    public static boolean generateHtml(List<File> xmlFiles, File outputFile) {
+        LicenseHtmlGeneratorFromXml genertor = new LicenseHtmlGeneratorFromXml(xmlFiles);
+        return genertor.generateHtml(outputFile);
+    }
+
+    private boolean generateHtml(File outputFile) {
+        for (File xmlFile : mXmlFiles) {
+            parse(xmlFile);
+        }
+
+        if (mFileNameToContentIdMap.isEmpty() || mContentIdToFileContentMap.isEmpty()) {
+            return false;
+        }
+
+        PrintWriter writer = null;
+        try {
+            writer = new PrintWriter(outputFile);
+
+            generateHtml(mFileNameToContentIdMap, mContentIdToFileContentMap, writer);
+
+            writer.flush();
+            writer.close();
+            return true;
+        } catch (FileNotFoundException | SecurityException e) {
+            LOG.e("Failed to generate " + outputFile, e);
+
+            if (writer != null) {
+                writer.close();
+            }
+            return false;
+        }
+    }
+
+    private void parse(File xmlFile) {
+        if (xmlFile == null || !xmlFile.exists() || xmlFile.length() == 0) {
+            return;
+        }
+
+        InputStreamReader in = null;
+        try {
+            if (xmlFile.getName().endsWith(".gz")) {
+                in = new InputStreamReader(new GZIPInputStream(new FileInputStream(xmlFile)));
+            } else {
+                in = new FileReader(xmlFile);
+            }
+
+            parse(in, mFileNameToContentIdMap, mContentIdToFileContentMap);
+
+            in.close();
+        } catch (XmlPullParserException | IOException e) {
+            LOG.e("Failed to parse " + xmlFile, e);
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException ie) {
+                    LOG.w("Failed to close " + xmlFile);
+                }
+            }
+        }
+    }
+
+    /*
+     * Parses an input stream and fills a map from a file name to a content id for its license
+     * and a map from a content id to a license file content.
+     *
+     * Following xml format is expected from the input stream.
+     *
+     *     <licenses>
+     *     <file-name contentId="content_id_of_license1">file1</file-name>
+     *     <file-name contentId="content_id_of_license2">file2</file-name>
+     *     ...
+     *     <file-content contentId="content_id_of_license1">license1 file contents</file-content>
+     *     <file-content contentId="content_id_of_license2">license2 file contents</file-content>
+     *     ...
+     *     </licenses>
+     */
+    private static void parse(InputStreamReader in, Map<String, String> outFileNameToContentIdMap,
+            Map<String, String> outContentIdToFileContentMap)
+            throws XmlPullParserException, IOException {
+        Map<String, String> fileNameToContentIdMap = new HashMap<String, String>();
+        Map<String, String> contentIdToFileContentMap = new HashMap<String, String>();
+
+        XmlPullParser parser = Xml.newPullParser();
+        parser.setInput(in);
+        parser.nextTag();
+
+        parser.require(XmlPullParser.START_TAG, "", TAG_ROOT);
+
+        int state = parser.getEventType();
+        while (state != XmlPullParser.END_DOCUMENT) {
+            if (state == XmlPullParser.START_TAG) {
+                if (TAG_FILE_NAME.equals(parser.getName())) {
+                    String contentId = parser.getAttributeValue("", ATTR_CONTENT_ID);
+                    if (!TextUtils.isEmpty(contentId)) {
+                        String fileName = readText(parser).trim();
+                        if (!TextUtils.isEmpty(fileName)) {
+                            fileNameToContentIdMap.put(fileName, contentId);
+                        }
+                    }
+                } else if (TAG_FILE_CONTENT.equals(parser.getName())) {
+                    String contentId = parser.getAttributeValue("", ATTR_CONTENT_ID);
+                    if (!TextUtils.isEmpty(contentId)
+                            && !outContentIdToFileContentMap.containsKey(contentId)
+                            && !contentIdToFileContentMap.containsKey(contentId)) {
+                        String fileContent = readText(parser);
+                        if (!TextUtils.isEmpty(fileContent)) {
+                            contentIdToFileContentMap.put(contentId, fileContent);
+                        }
+                    }
+                }
+            }
+
+            state = parser.next();
+        }
+        outFileNameToContentIdMap.putAll(fileNameToContentIdMap);
+        outContentIdToFileContentMap.putAll(contentIdToFileContentMap);
+    }
+
+    private static String readText(XmlPullParser parser)
+            throws IOException, XmlPullParserException {
+        StringBuffer result = new StringBuffer();
+        int state = parser.next();
+        while (state == XmlPullParser.TEXT) {
+            result.append(parser.getText());
+            state = parser.next();
+        }
+        return result.toString();
+    }
+
+    private static void generateHtml(Map<String, String> fileNameToContentIdMap,
+            Map<String, String> contentIdToFileContentMap, PrintWriter writer) {
+        List<String> fileNameList = new ArrayList();
+        fileNameList.addAll(fileNameToContentIdMap.keySet());
+        Collections.sort(fileNameList);
+
+        writer.println(HTML_HEAD_STRING);
+
+        int count = 0;
+        Map<String, Integer> contentIdToOrderMap = new HashMap();
+        List<ContentIdAndFileNames> contentIdAndFileNamesList = new ArrayList();
+
+        // Prints all the file list with a link to its license file content.
+        for (String fileName : fileNameList) {
+            String contentId = fileNameToContentIdMap.get(fileName);
+            // Assigns an id to a newly referred license file content.
+            if (!contentIdToOrderMap.containsKey(contentId)) {
+                contentIdToOrderMap.put(contentId, count);
+
+                // An index in contentIdAndFileNamesList is the order of each element.
+                contentIdAndFileNamesList.add(new ContentIdAndFileNames(contentId));
+                count++;
+            }
+
+            int id = contentIdToOrderMap.get(contentId);
+            contentIdAndFileNamesList.get(id).mFileNameList.add(fileName);
+            writer.format("<li><a href=\"#id%d\">%s</a></li>\n", id, fileName);
+        }
+
+        writer.println(HTML_MIDDLE_STRING);
+
+        count = 0;
+        // Prints all contents of the license files in order of id.
+        for (ContentIdAndFileNames contentIdAndFileNames : contentIdAndFileNamesList) {
+            writer.format("<tr id=\"id%d\"><td class=\"same-license\">\n", count);
+            writer.println("<div class=\"label\">Notices for file(s):</div>");
+            writer.println("<div class=\"file-list\">");
+            for (String fileName : contentIdAndFileNames.mFileNameList) {
+                writer.format("%s <br/>\n", fileName);
+            }
+            writer.println("</div><!-- file-list -->");
+            writer.println("<pre class=\"license-text\">");
+            writer.println(contentIdToFileContentMap.get(
+                    contentIdAndFileNames.mContentId));
+            writer.println("</pre><!-- license-text -->");
+            writer.println("</td></tr><!-- same-license -->");
+
+            count++;
+        }
+
+        writer.println(HTML_REAR_STRING);
+    }
+}
diff --git a/src/com/android/car/settings/system/LicenseHtmlLoader.java b/src/com/android/car/settings/system/LicenseHtmlLoader.java
new file mode 100644
index 0000000..8bdf9f7
--- /dev/null
+++ b/src/com/android/car/settings/system/LicenseHtmlLoader.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.content.Context;
+
+import com.android.car.settings.common.Logger;
+import com.android.car.settingslib.loader.AsyncLoader;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * LicenseHtmlLoader is a loader which loads a license html file from default license xml files.
+ */
+public class LicenseHtmlLoader extends AsyncLoader<File> {
+    private static final Logger LOG = new Logger(LicenseHtmlLoader.class);
+
+    private static final String[] DEFAULT_LICENSE_XML_PATHS = {
+            "/system/etc/NOTICE.xml.gz",
+            "/vendor/etc/NOTICE.xml.gz",
+            "/odm/etc/NOTICE.xml.gz",
+            "/oem/etc/NOTICE.xml.gz"};
+    private static final String NOTICE_HTML_FILE_NAME = "NOTICE.html";
+
+    private final Context mContext;
+
+    public LicenseHtmlLoader(Context context) {
+        super(context);
+        mContext = context;
+    }
+
+    @Override
+    public File loadInBackground() {
+        return generateHtmlFromDefaultXmlFiles();
+    }
+
+    private File generateHtmlFromDefaultXmlFiles() {
+        final List<File> xmlFiles = getVaildXmlFiles();
+        if (xmlFiles.isEmpty()) {
+            LOG.e("No notice file exists.");
+            return null;
+        }
+
+        File cachedHtmlFile = getCachedHtmlFile();
+        if (!isCachedHtmlFileOutdated(xmlFiles, cachedHtmlFile)
+                || generateHtmlFile(xmlFiles, cachedHtmlFile)) {
+            return cachedHtmlFile;
+        }
+
+        return null;
+    }
+
+    private List<File> getVaildXmlFiles() {
+        final List<File> xmlFiles = new ArrayList();
+        for (final String xmlPath : DEFAULT_LICENSE_XML_PATHS) {
+            File file = new File(xmlPath);
+            if (file.exists() && file.length() != 0) {
+                xmlFiles.add(file);
+            }
+        }
+        return xmlFiles;
+    }
+
+    private File getCachedHtmlFile() {
+        return new File(mContext.getCacheDir(), NOTICE_HTML_FILE_NAME);
+    }
+
+    private boolean isCachedHtmlFileOutdated(List<File> xmlFiles, File cachedHtmlFile) {
+        boolean outdated = true;
+        if (cachedHtmlFile.exists() && cachedHtmlFile.length() != 0) {
+            outdated = false;
+            for (File file : xmlFiles) {
+                if (cachedHtmlFile.lastModified() < file.lastModified()) {
+                    outdated = true;
+                    break;
+                }
+            }
+        }
+        return outdated;
+    }
+
+    private boolean generateHtmlFile(List<File> xmlFiles, File htmlFile) {
+        return LicenseHtmlGeneratorFromXml.generateHtml(xmlFiles, htmlFile);
+    }
+}
+
+
diff --git a/src/com/android/car/settings/system/MasterClearAccountsPreferenceController.java b/src/com/android/car/settings/system/MasterClearAccountsPreferenceController.java
new file mode 100644
index 0000000..eda3161
--- /dev/null
+++ b/src/com/android/car/settings/system/MasterClearAccountsPreferenceController.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.ArrayMap;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Displays the currently signed in accounts on the vehicle to inform the user that they will be
+ * removed during a factory reset.
+ */
+public class MasterClearAccountsPreferenceController extends PreferenceController<PreferenceGroup> {
+
+    private static final Logger LOG = new Logger(MasterClearAccountsPreferenceController.class);
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final Map<Account, Preference> mAccountPreferenceMap = new ArrayMap<>();
+
+    public MasterClearAccountsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        getPreference().addPreference(
+                createPreference(getContext().getString(R.string.master_clear_accounts), /* icon= */
+                        null));
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        // Refresh the accounts in the off chance an account was added or removed while stopped.
+        Set<Account> accountsToRemove = new HashSet<>(mAccountPreferenceMap.keySet());
+        List<UserInfo> profiles = UserManager.get(getContext()).getProfiles(
+                mCarUserManagerHelper.getCurrentProcessUserId());
+        for (UserInfo profile : profiles) {
+            UserHandle userHandle = new UserHandle(profile.id);
+            AuthenticatorDescription[] descriptions = AccountManager.get(
+                    getContext()).getAuthenticatorTypesAsUser(profile.id);
+            Account[] accounts = AccountManager.get(getContext()).getAccountsAsUser(profile.id);
+            for (Account account : accounts) {
+                AuthenticatorDescription description = null;
+                for (AuthenticatorDescription desc : descriptions) {
+                    if (account.type.equals(desc.type)) {
+                        description = desc;
+                        break;
+                    }
+                }
+                if (description == null) {
+                    LOG.w("No descriptor for account name=" + account.name + " type="
+                            + account.type);
+                    continue;
+                }
+
+                accountsToRemove.remove(account);
+                if (!mAccountPreferenceMap.containsKey(account)) {
+                    Preference accountPref = createPreference(account.name,
+                            getAccountIcon(description, userHandle));
+                    mAccountPreferenceMap.put(account, accountPref);
+                    preferenceGroup.addPreference(accountPref);
+                }
+            }
+        }
+
+        for (Account accountToRemove : accountsToRemove) {
+            preferenceGroup.removePreference(mAccountPreferenceMap.get(accountToRemove));
+        }
+
+        // If the only preference is the title, hide the group.
+        preferenceGroup.setVisible(preferenceGroup.getPreferenceCount() > 1);
+    }
+
+    private Drawable getAccountIcon(AuthenticatorDescription description, UserHandle userHandle) {
+        Drawable icon = null;
+        try {
+            if (description.iconId != 0) {
+                Context authContext = getContext().createPackageContextAsUser(
+                        description.packageName, /* flags= */ 0, userHandle);
+                icon = getContext().getPackageManager().getUserBadgedIcon(
+                        authContext.getDrawable(description.iconId), userHandle);
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+            LOG.w("Bad package name for account type " + description.type, e);
+        } catch (Resources.NotFoundException e) {
+            LOG.w("Invalid icon id for account type " + description.type, e);
+        }
+        if (icon == null) {
+            icon = getContext().getPackageManager().getDefaultActivityIcon();
+        }
+        return icon;
+    }
+
+    private Preference createPreference(String title, @Nullable Drawable icon) {
+        Preference preference = new Preference(getContext());
+        preference.setTitle(title);
+        preference.setIcon(icon);
+        preference.setSelectable(false);
+        return preference;
+    }
+}
diff --git a/src/com/android/car/settings/system/MasterClearConfirmFragment.java b/src/com/android/car/settings/system/MasterClearConfirmFragment.java
new file mode 100644
index 0000000..df8b88b
--- /dev/null
+++ b/src/com/android/car/settings/system/MasterClearConfirmFragment.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import android.app.ActivityManager;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.service.oemlock.OemLockManager;
+import android.service.persistentdata.PersistentDataBlockManager;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.preference.PreferenceManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Presents the user with a final warning before issuing the request to reset the head unit to its
+ * default "factory" state.
+ */
+public class MasterClearConfirmFragment extends SettingsFragment {
+
+    private Button.OnClickListener mFinalClickListener = v -> {
+        if (ActivityManager.isUserAMonkey()) {
+            return;
+        }
+
+        PersistentDataBlockManager pdbManager =
+                (PersistentDataBlockManager) requireContext().getSystemService(
+                        Context.PERSISTENT_DATA_BLOCK_SERVICE);
+        OemLockManager oemLockManager = (OemLockManager) requireContext().getSystemService(
+                Context.OEM_LOCK_SERVICE);
+        if (pdbManager != null && !oemLockManager.isOemUnlockAllowed()
+                && isDeviceProvisioned()) {
+            // If OEM unlock is allowed, the persistent data block will be wiped during the factory
+            // reset process. If disabled, it will be wiped here, unless the device is still being
+            // provisioned, in which case the persistent data block will be preserved.
+            new AsyncTask<Void, Void, Void>() {
+                private ProgressDialog mProgressDialog;
+
+                @Override
+                protected Void doInBackground(Void... params) {
+                    pdbManager.wipe();
+                    return null;
+                }
+
+                @Override
+                protected void onPostExecute(Void aVoid) {
+                    mProgressDialog.hide();
+                    if (getActivity() != null) {
+                        resetEverything();
+                    }
+                }
+
+                @Override
+                protected void onPreExecute() {
+                    mProgressDialog = getProgressDialog();
+                    mProgressDialog.show();
+                }
+            }.execute();
+        } else {
+            resetEverything();
+        }
+    };
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.master_clear_confirm_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        Button masterClearConfirmButton = requireActivity().findViewById(R.id.action_button1);
+        masterClearConfirmButton.setText(
+                requireContext().getString(R.string.master_clear_confirm_button_text));
+        masterClearConfirmButton.setOnClickListener(mFinalClickListener);
+    }
+
+    private boolean isDeviceProvisioned() {
+        return Settings.Global.getInt(requireContext().getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+    }
+
+    private ProgressDialog getProgressDialog() {
+        ProgressDialog progressDialog = new ProgressDialog(requireContext());
+        progressDialog.setIndeterminate(true);
+        progressDialog.setCancelable(false);
+        progressDialog.setTitle(requireContext().getString(R.string.master_clear_progress_title));
+        progressDialog.setMessage(requireContext().getString(R.string.master_clear_progress_text));
+        return progressDialog;
+    }
+
+    private void resetEverything() {
+        Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);
+        intent.setPackage("android");
+        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+        intent.putExtra(Intent.EXTRA_REASON, "MasterClearConfirm");
+        intent.putExtra(Intent.EXTRA_WIPE_ESIMS, shouldResetEsim());
+        requireActivity().sendBroadcast(intent);
+    }
+
+    private boolean shouldResetEsim() {
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(
+                requireContext());
+        return sharedPreferences.getBoolean(
+                requireContext().getString(R.string.pk_master_clear_reset_esim), false);
+    }
+}
diff --git a/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java b/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
new file mode 100644
index 0000000..28b8444
--- /dev/null
+++ b/src/com/android/car/settings/system/MasterClearEntryPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static android.os.UserManager.DISALLOW_FACTORY_RESET;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.UserManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller which determines if master clear (aka "factory reset") should be displayed based on
+ * user status.
+ */
+public class MasterClearEntryPreferenceController extends PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public MasterClearEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return isUserRestricted() ? DISABLED_FOR_USER : AVAILABLE;
+    }
+
+    private boolean isUserRestricted() {
+        return !(mCarUserManagerHelper.isCurrentProcessAdminUser() || isDemoUser())
+                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_FACTORY_RESET);
+    }
+
+    private boolean isDemoUser() {
+        return UserManager.isDeviceInDemoMode(getContext())
+                && mCarUserManagerHelper.isCurrentProcessDemoUser();
+    }
+}
diff --git a/src/com/android/car/settings/system/MasterClearFragment.java b/src/com/android/car/settings/system/MasterClearFragment.java
new file mode 100644
index 0000000..2cc9f6d
--- /dev/null
+++ b/src/com/android/car/settings/system/MasterClearFragment.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static android.app.Activity.RESULT_OK;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.car.apps.common.widget.PagedRecyclerView;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.security.CheckLockActivity;
+
+/**
+ * Presents the user with the option to reset the head unit to its default "factory" state. If a
+ * user confirms, the user is first required to authenticate and then presented with a secondary
+ * confirmation: {@link MasterClearConfirmFragment}. The user must scroll to the bottom of the page
+ * before proceeding.
+ */
+public class MasterClearFragment extends SettingsFragment implements ActivityResultCallback {
+
+    // Arbitrary request code for starting CheckLockActivity when the reset button is clicked.
+    @VisibleForTesting
+    static final int CHECK_LOCK_REQUEST_CODE = 88;
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.master_clear_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        Button masterClearButton = requireActivity().findViewById(R.id.action_button1);
+        masterClearButton.setText(requireContext().getString(R.string.master_clear_button_text));
+        masterClearButton.setOnClickListener(
+                v -> startActivityForResult(new Intent(getContext(), CheckLockActivity.class),
+                        CHECK_LOCK_REQUEST_CODE, /* callback= */ this));
+        masterClearButton.setEnabled(false);
+
+        RecyclerView recyclerView = getListView();
+        recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        if (recyclerView instanceof PagedRecyclerView) {
+                            PagedRecyclerView pagedRecyclerView = (PagedRecyclerView) recyclerView;
+                            if (!pagedRecyclerView.fullyInitialized()) {
+                                return;
+                            }
+                        }
+                        masterClearButton.setEnabled(isAtEnd());
+                        recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                    }
+                });
+        recyclerView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
+            if (isAtEnd()) {
+                masterClearButton.setEnabled(true);
+            }
+        });
+    }
+
+    @Override
+    public void processActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        if (requestCode == CHECK_LOCK_REQUEST_CODE && resultCode == RESULT_OK) {
+            launchFragment(new MasterClearConfirmFragment());
+        }
+    }
+
+    /** Returns {@code true} if the RecyclerView is completely displaying the last item. */
+    private boolean isAtEnd() {
+        RecyclerView recyclerView = getListView();
+        RecyclerView.LayoutManager layoutManager = (recyclerView instanceof PagedRecyclerView)
+                ? ((PagedRecyclerView) recyclerView).getEffectiveLayoutManager()
+                : recyclerView.getLayoutManager();
+        if (layoutManager == null || layoutManager.getChildCount() == 0) {
+            return true;
+        }
+
+        int childCount = layoutManager.getChildCount();
+        View lastVisibleChild = layoutManager.getChildAt(childCount - 1);
+
+        // The list has reached the bottom if the last child that is visible is the last item
+        // in the list and it's fully shown.
+        return layoutManager.getPosition(lastVisibleChild) == (layoutManager.getItemCount() - 1)
+                && layoutManager.getDecoratedBottom(lastVisibleChild) <= layoutManager.getHeight();
+    }
+}
diff --git a/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceController.java b/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceController.java
new file mode 100644
index 0000000..86f12cf
--- /dev/null
+++ b/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceController.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Displays a warning message on the factory reset screen when multiple switchable users are present
+ * on the vehicle.
+ */
+public class MasterClearOtherUsersPresentPreferenceController extends
+        PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public MasterClearOtherUsersPresentPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setVisible(!mCarUserManagerHelper.getAllSwitchableUsers().isEmpty());
+    }
+}
diff --git a/src/com/android/car/settings/system/MasterClearResetEsimPreferenceController.java b/src/com/android/car/settings/system/MasterClearResetEsimPreferenceController.java
new file mode 100644
index 0000000..7a695d0
--- /dev/null
+++ b/src/com/android/car/settings/system/MasterClearResetEsimPreferenceController.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Factory reset specific version of {@link ResetEsimPreferenceController} that is only available if
+ * the system property {@code masterclear.allow_retain_esim_profiles_after_fdr} is also true.
+ */
+public class MasterClearResetEsimPreferenceController extends ResetEsimPreferenceController {
+
+    @VisibleForTesting
+    static final String KEY_SHOW_ESIM_RESET_CHECKBOX =
+            "masterclear.allow_retain_esim_profiles_after_fdr";
+
+    public MasterClearResetEsimPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        int status = super.getAvailabilityStatus();
+        if (status == AVAILABLE) {
+            return SystemProperties.get(KEY_SHOW_ESIM_RESET_CHECKBOX,
+                    Boolean.FALSE.toString()).equals(Boolean.TRUE.toString()) ? AVAILABLE
+                    : UNSUPPORTED_ON_DEVICE;
+        }
+        return status;
+    }
+}
diff --git a/src/com/android/car/settings/system/ModelInfoPreferenceController.java b/src/com/android/car/settings/system/ModelInfoPreferenceController.java
new file mode 100644
index 0000000..4fd8b53
--- /dev/null
+++ b/src/com/android/car/settings/system/ModelInfoPreferenceController.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.os.Build;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.DeviceInfoUtils;
+
+/** Updates the model info entry summary with the model info. */
+public class ModelInfoPreferenceController extends PreferenceController<Preference> {
+
+    public ModelInfoPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(Build.MODEL + DeviceInfoUtils.getMsvSuffix());
+    }
+}
diff --git a/src/com/android/car/settings/system/RegulatoryInfoDisplayActivity.java b/src/com/android/car/settings/system/RegulatoryInfoDisplayActivity.java
new file mode 100644
index 0000000..a7deb12
--- /dev/null
+++ b/src/com/android/car/settings/system/RegulatoryInfoDisplayActivity.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.R;
+
+import java.util.Locale;
+
+/**
+ * Code drop from {@link com.android.settings.RegulatoryInfoDisplayActivity}.
+ *
+ * {@link Activity} that displays regulatory information for the "Regulatory information"
+ * preference item, and when "*#07#" is dialed on the Phone keypad. To enable this feature,
+ * set the "config_show_regulatory_info" boolean to true in a device overlay resource, and in the
+ * same overlay, either add a drawable named "regulatory_info.png" containing a graphical version
+ * of the required regulatory info (If ro.bootloader.hardware.sku property is set use
+ * "regulatory_info_<sku>.png where sku is ro.bootloader.hardware.sku property value in lowercase"),
+ * or add a string resource named "regulatory_info_text" with an HTML version of the required
+ * information (text will be centered in the dialog).
+ */
+public class RegulatoryInfoDisplayActivity extends Activity implements
+        DialogInterface.OnDismissListener {
+
+    private static final String DEFAULT_REGULATORY_INFO_FILEPATH =
+            "/data/misc/elabel/regulatory_info.png";
+    private static final String REGULATORY_INFO_FILEPATH_TEMPLATE =
+            "/data/misc/elabel/regulatory_info_%s.png";
+
+    private final String mRegulatoryInfoResource = "regulatory_info";
+
+    /**
+     * Display the regulatory info graphic in a dialog window.
+     */
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Resources resources = getResources();
+
+        if (!resources.getBoolean(R.bool.config_show_regulatory_info)) {
+            finish();   // No regulatory info to display for this device.
+        }
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(this)
+                .setTitle(R.string.regulatory_labels)
+                .setOnDismissListener(this);
+
+        boolean regulatoryInfoDrawableExists = false;
+
+        String regulatoryInfoFile = getRegulatoryInfoImageFileName();
+        Bitmap regulatoryInfoBitmap = BitmapFactory.decodeFile(regulatoryInfoFile);
+
+        if (regulatoryInfoBitmap != null) {
+            regulatoryInfoDrawableExists = true;
+        }
+
+        int resId = 0;
+        if (!regulatoryInfoDrawableExists) {
+            resId = getImageResourceId();
+        }
+        if (resId != 0) {
+            try {
+                Drawable d = getDrawable(resId);
+                // Set to false if the width or height is <= 2.
+                // (missing PNG can return an empty 2x2 pixel Drawable)
+                regulatoryInfoDrawableExists = (d.getIntrinsicWidth() > 2
+                        && d.getIntrinsicHeight() > 2);
+            } catch (Resources.NotFoundException ignored) {
+                regulatoryInfoDrawableExists = false;
+            }
+        }
+
+        CharSequence regulatoryText = resources.getText(R.string.regulatory_info_text);
+
+        if (regulatoryInfoDrawableExists) {
+            View view = getLayoutInflater().inflate(R.layout.regulatory_info, null);
+            ImageView image = view.findViewById(R.id.regulatory_info);
+            if (regulatoryInfoBitmap != null) {
+                image.setImageBitmap(regulatoryInfoBitmap);
+            } else {
+                image.setImageResource(resId);
+            }
+            builder.setView(view);
+            builder.show();
+        } else if (regulatoryText.length() > 0) {
+            builder.setMessage(regulatoryText);
+            AlertDialog dialog = builder.show();
+            // We have to show the dialog first, or the setGravity() call will throw a NPE.
+            TextView messageText = (TextView) dialog.findViewById(android.R.id.message);
+            messageText.setGravity(Gravity.CENTER);
+        } else {
+            // Neither drawable nor text resource exists, finish activity.
+            finish();
+        }
+    }
+
+    private int getImageResourceId() {
+        // Use regulatory_info by default.
+        int resId = getResources().getIdentifier(
+                mRegulatoryInfoResource, "drawable", getPackageName());
+
+        // When hardware sku property exists, use regulatory_info_<sku> resource if valid.
+        String sku = getSku();
+        if (!TextUtils.isEmpty(sku)) {
+            String regulatory_info_res = mRegulatoryInfoResource + "_" + sku.toLowerCase();
+            int id = getResources().getIdentifier(
+                    regulatory_info_res, "drawable", getPackageName());
+            if (id != 0) {
+                resId = id;
+            }
+        }
+        return resId;
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        finish();
+    }
+
+    @VisibleForTesting
+    static String getSku() {
+        return SystemProperties.get("ro.boot.hardware.sku", "");
+    }
+
+    @VisibleForTesting
+    static String getRegulatoryInfoImageFileName() {
+        String sku = getSku();
+        if (TextUtils.isEmpty(sku)) {
+            return DEFAULT_REGULATORY_INFO_FILEPATH;
+        } else {
+            return String.format(Locale.US, REGULATORY_INFO_FILEPATH_TEMPLATE, sku.toLowerCase());
+        }
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetAppPrefFragment.java b/src/com/android/car/settings/system/ResetAppPrefFragment.java
new file mode 100644
index 0000000..74a4760
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetAppPrefFragment.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.app.AppOpsManager;
+import android.app.INotificationManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.widget.Button;
+import android.widget.Toast;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+/**
+ * Presents the user with information about resetting app preferences.
+ */
+public class ResetAppPrefFragment extends SettingsFragment {
+
+    private static final Logger LOG = new Logger(ResetAppPrefFragment.class);
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.reset_app_pref_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        Button resetAppsButton = requireActivity().findViewById(R.id.action_button1);
+        resetAppsButton.setText(requireContext().getString(R.string.reset_app_pref_button_text));
+        resetAppsButton.setOnClickListener(v -> resetAppPreferences());
+    }
+
+    private void resetAppPreferences() {
+        new ResetTask(requireContext().getApplicationContext()).execute();
+    }
+
+    private static class ResetTask extends AsyncTask<Void, Void, Void> {
+
+        private final WeakReference<Context> mContext;
+
+        ResetTask(Context context) {
+            mContext = new WeakReference<>(context);
+        }
+
+        @Override
+        protected Void doInBackground(Void... unused) {
+            Context context = mContext.get();
+            if (context == null) {
+                LOG.w("Unable to reset app preferences. Null context");
+                return null;
+            }
+            PackageManager packageManager = context.getPackageManager();
+            IBinder notificationManagerServiceBinder = ServiceManager.getService(
+                    Context.NOTIFICATION_SERVICE);
+            if (notificationManagerServiceBinder == null) {
+                LOG.w("Unable to reset app preferences. Null notification manager service");
+                return null;
+            }
+            INotificationManager notificationManagerService =
+                    INotificationManager.Stub.asInterface(notificationManagerServiceBinder);
+
+            // Reset app notifications.
+            // Reset disabled apps.
+            List<ApplicationInfo> apps = packageManager.getInstalledApplications(
+                    PackageManager.MATCH_DISABLED_COMPONENTS);
+            for (ApplicationInfo app : apps) {
+                try {
+                    notificationManagerService.setNotificationsEnabledForPackage(
+                            app.packageName,
+                            app.uid, true);
+                } catch (RemoteException e) {
+                    LOG.w("Unable to reset notification preferences for app: " + app.name, e);
+                }
+                if (!app.enabled) {
+                    if (packageManager.getApplicationEnabledSetting(app.packageName)
+                            == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+                        packageManager.setApplicationEnabledSetting(app.packageName,
+                                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+                                PackageManager.DONT_KILL_APP);
+                    }
+                }
+            }
+
+            // Reset default applications for actions.
+            // Reset background data restrictions for apps.
+            // Reset permission restrictions.
+            try {
+                IBinder packageManagerServiceBinder = ServiceManager.getService("package");
+                if (packageManagerServiceBinder == null) {
+                    LOG.w("Unable to reset app preferences. Null package manager service");
+                    return null;
+                }
+                IPackageManager.Stub.asInterface(
+                        packageManagerServiceBinder).resetApplicationPreferences(
+                        new CarUserManagerHelper(context).getCurrentForegroundUserId());
+            } catch (RemoteException e) {
+                LOG.w("Unable to reset app preferences", e);
+            }
+
+            // Cleanup.
+            ((AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE)).resetAllModes();
+
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void unused) {
+            super.onPostExecute(unused);
+            Context context = mContext.get();
+            if (context != null) {
+                Toast.makeText(context, R.string.reset_app_pref_complete_toast,
+                        Toast.LENGTH_SHORT).show();
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetEsimPreferenceController.java b/src/com/android/car/settings/system/ResetEsimPreferenceController.java
new file mode 100644
index 0000000..928340c
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetEsimPreferenceController.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.telephony.euicc.EuiccManager;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller which determines if a checkbox to reset the device's eSIMs is shown. Not all
+ * devices support eSIMs.
+ */
+public class ResetEsimPreferenceController extends PreferenceController<TwoStatePreference> {
+
+    public ResetEsimPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return showEuiccSettings() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    private boolean showEuiccSettings() {
+        EuiccManager euiccManager = (EuiccManager) getContext().getSystemService(
+                Context.EUICC_SERVICE);
+        if (!euiccManager.isEnabled()) {
+            return false;
+        }
+        ContentResolver resolver = getContext().getContentResolver();
+        return Settings.Global.getInt(resolver, Settings.Global.EUICC_PROVISIONED, 0) != 0
+                || Settings.Global.getInt(resolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0)
+                != 0;
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetNetworkConfirmFragment.java b/src/com/android/car/settings/system/ResetNetworkConfirmFragment.java
new file mode 100644
index 0000000..11d2240
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetNetworkConfirmFragment.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.app.ActivityManager;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.net.ConnectivityManager;
+import android.net.NetworkPolicyManager;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.RecoverySystem;
+import android.provider.Telephony;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.widget.Button;
+import android.widget.Toast;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.annotation.XmlRes;
+import androidx.fragment.app.Fragment;
+import androidx.preference.PreferenceManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ErrorDialog;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Final warning presented to user to confirm restoring network settings to the factory default.
+ * If a user confirms, all settings are reset for connectivity, Wi-Fi, and Bluetooth.
+ */
+public class ResetNetworkConfirmFragment extends SettingsFragment {
+
+    // Copied from com.android.settings.network.ApnSettings.
+    @VisibleForTesting
+    static final String RESTORE_CARRIERS_URI = "content://telephony/carriers/restore";
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.reset_network_confirm_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        Button resetSettingsButton = requireActivity().findViewById(R.id.action_button1);
+        resetSettingsButton.setText(
+                requireContext().getString(R.string.reset_network_confirm_button_text));
+        resetSettingsButton.setOnClickListener(v -> resetNetwork());
+    }
+
+    private void resetNetwork() {
+        if (ActivityManager.isUserAMonkey()) {
+            return;
+        }
+
+        Context context = requireActivity().getApplicationContext();
+
+        ConnectivityManager connectivityManager = (ConnectivityManager)
+                context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        if (connectivityManager != null) {
+            connectivityManager.factoryReset();
+        }
+
+        WifiManager wifiManager = (WifiManager)
+                context.getSystemService(Context.WIFI_SERVICE);
+        if (wifiManager != null) {
+            wifiManager.factoryReset();
+        }
+
+        BluetoothManager btManager = (BluetoothManager)
+                context.getSystemService(Context.BLUETOOTH_SERVICE);
+        if (btManager != null) {
+            BluetoothAdapter btAdapter = btManager.getAdapter();
+            if (btAdapter != null) {
+                btAdapter.factoryReset();
+            }
+        }
+
+        int networkSubscriptionId = getNetworkSubscriptionId();
+        TelephonyManager telephonyManager = (TelephonyManager)
+                context.getSystemService(Context.TELEPHONY_SERVICE);
+        if (telephonyManager != null) {
+            telephonyManager.factoryReset(networkSubscriptionId);
+        }
+
+        NetworkPolicyManager policyManager = (NetworkPolicyManager)
+                context.getSystemService(Context.NETWORK_POLICY_SERVICE);
+        if (policyManager != null) {
+            String subscriberId = telephonyManager.getSubscriberId(networkSubscriptionId);
+            policyManager.factoryReset(subscriberId);
+        }
+
+        restoreDefaultApn(context, networkSubscriptionId);
+
+        // There has been issues when Sms raw table somehow stores orphan
+        // fragments. They lead to garbled message when new fragments come
+        // in and combined with those stale ones. In case this happens again,
+        // user can reset all network settings which will clean up this table.
+        cleanUpSmsRawTable(context);
+
+        if (shouldResetEsim()) {
+            new EraseEsimAsyncTask(getContext(), context.getPackageName(), this).execute();
+        } else {
+            showCompletionToast(getContext());
+        }
+    }
+
+    private boolean shouldResetEsim() {
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(
+                requireContext());
+        return sharedPreferences.getBoolean(requireContext().getString(R.string.pk_reset_esim),
+                false);
+    }
+
+    private int getNetworkSubscriptionId() {
+        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(
+                requireContext());
+        String stringId = sharedPreferences.getString(
+                requireContext().getString(R.string.pk_reset_network_subscription), null);
+        if (TextUtils.isEmpty(stringId)) {
+            return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        }
+        return Integer.parseInt(stringId);
+    }
+
+    private void restoreDefaultApn(Context context, int subscriptionId) {
+        Uri uri = Uri.parse(RESTORE_CARRIERS_URI);
+
+        if (SubscriptionManager.isUsableSubIdValue(subscriptionId)) {
+            uri = Uri.withAppendedPath(uri, "subId/" + subscriptionId);
+        }
+
+        ContentResolver resolver = context.getContentResolver();
+        resolver.delete(uri, null, null);
+    }
+
+    private void cleanUpSmsRawTable(Context context) {
+        ContentResolver resolver = context.getContentResolver();
+        Uri uri = Uri.withAppendedPath(Telephony.Sms.CONTENT_URI, "raw/permanentDelete");
+        resolver.delete(uri, null, null);
+    }
+
+    private static void showCompletionToast(Context context) {
+        Toast.makeText(context, R.string.reset_network_complete_toast,
+                Toast.LENGTH_SHORT).show();
+    }
+
+    private static class EraseEsimAsyncTask extends AsyncTask<Void, Void, Boolean> {
+
+        private final Context mContext;
+        private final String mPackageName;
+        private final Fragment mFragment;
+
+        EraseEsimAsyncTask(Context context, String packageName, Fragment parent) {
+            mContext = context;
+            mPackageName = packageName;
+            mFragment = parent;
+        }
+
+        @Override
+        protected Boolean doInBackground(Void... voids) {
+            return RecoverySystem.wipeEuiccData(mContext, mPackageName);
+        }
+
+        @Override
+        protected void onPostExecute(Boolean succeeded) {
+            if (succeeded) {
+                showCompletionToast(mContext);
+            } else {
+                ErrorDialog.show(mFragment, R.string.reset_esim_error_title);
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
new file mode 100644
index 0000000..b8ca854
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetNetworkEntryPreferenceController.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static android.os.UserManager.DISALLOW_NETWORK_RESET;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Controller which determines if network reset should be displayed based on user status. */
+public class ResetNetworkEntryPreferenceController extends PreferenceController<Preference> {
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public ResetNetworkEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return isUserRestricted() ? DISABLED_FOR_USER : AVAILABLE;
+    }
+
+    private boolean isUserRestricted() {
+        return !mCarUserManagerHelper.isCurrentProcessAdminUser()
+                || mCarUserManagerHelper.isCurrentProcessUserHasRestriction(DISALLOW_NETWORK_RESET);
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetNetworkFragment.java b/src/com/android/car/settings/system/ResetNetworkFragment.java
new file mode 100644
index 0000000..c4b574f
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetNetworkFragment.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static android.app.Activity.RESULT_OK;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.security.CheckLockActivity;
+
+/**
+ * Presents the user with information about restoring network settings to the factory default
+ * values. If a user confirms, they will first be required to authenticate then presented with a
+ * secondary confirmation: {@link ResetNetworkConfirmFragment}.
+ */
+public class ResetNetworkFragment extends SettingsFragment {
+
+    // Arbitrary request code for starting CheckLockActivity when the reset button is clicked.
+    private static final int REQUEST_CODE = 123;
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.reset_network_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        Button resetSettingsButton = requireActivity().findViewById(R.id.action_button1);
+        resetSettingsButton.setText(requireContext().getString(R.string.reset_network_button_text));
+        resetSettingsButton.setOnClickListener(v -> startActivityForResult(new Intent(
+                getContext(), CheckLockActivity.class), REQUEST_CODE));
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
+            launchFragment(new ResetNetworkConfirmFragment());
+        }
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetNetworkItemsPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkItemsPreferenceController.java
new file mode 100644
index 0000000..b24d5f7
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetNetworkItemsPreferenceController.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
+import android.text.style.BulletSpan;
+
+import androidx.annotation.StringRes;
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Controller to determine which items appear as resetable within the reset network description. */
+public class ResetNetworkItemsPreferenceController extends PreferenceController<Preference> {
+
+    public ResetNetworkItemsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        SpannableStringBuilder sb = new SpannableStringBuilder();
+        sb.append(getContext().getString(R.string.reset_network_desc));
+        sb.append(System.lineSeparator());
+        if (hasFeature(PackageManager.FEATURE_WIFI)) {
+            addBulletedValue(sb, R.string.reset_network_item_wifi);
+        }
+        if (hasFeature(PackageManager.FEATURE_TELEPHONY)) {
+            addBulletedValue(sb, R.string.reset_network_item_mobile);
+        }
+        if (hasFeature(PackageManager.FEATURE_BLUETOOTH)) {
+            addBulletedValue(sb, R.string.reset_network_item_bluetooth);
+        }
+        preference.setTitle(sb);
+    }
+
+    private boolean hasFeature(String feature) {
+        return getContext().getPackageManager().hasSystemFeature(feature);
+    }
+
+    private void addBulletedValue(SpannableStringBuilder sb, @StringRes int resId) {
+        sb.append(System.lineSeparator());
+        SpannableString value = new SpannableString(getContext().getString(resId));
+        // Match android.content.res.StringBlock which applies a 10 gapWidth BulletSpan as the <li>
+        // style. This is a workaround for translation specific behavior in StringBlock which led
+        // to multiple indents when building the list using getText(resId).
+        value.setSpan(new BulletSpan(/* gapWidth= */ 10), /* start= */ 0,
+                value.length(), /* flags= */ 0);
+        sb.append(value);
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceController.java b/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceController.java
new file mode 100644
index 0000000..fab9b03
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceController.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.text.TextUtils;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Controller which determines if a network selection option is visible. On devices with multiple
+ * network subscriptions, a user may select the network to reset.
+ */
+public class ResetNetworkSubscriptionPreferenceController extends
+        PreferenceController<ListPreference> {
+
+    private final SubscriptionManager mSubscriptionManager;
+
+    public ResetNetworkSubscriptionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSubscriptionManager = (SubscriptionManager) context.getSystemService(
+                Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    protected void updateState(ListPreference preference) {
+        List<SubscriptionInfo> subscriptions = mSubscriptionManager.getActiveSubscriptionInfoList();
+        if (subscriptions == null || subscriptions.isEmpty()) {
+            // No subscriptions to reset.
+            preference.setValue(String.valueOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
+            preference.setVisible(false);
+            return;
+        }
+        if (subscriptions.size() == 1) {
+            // Only one subscription, so nothing else to select. Use it and hide the preference.
+            preference.setValue(String.valueOf(subscriptions.get(0).getSubscriptionId()));
+            preference.setVisible(false);
+            return;
+        }
+
+        int defaultSubscriptionId = getDefaultSubscriptionId();
+        int selectedIndex = 0;
+        int size = subscriptions.size();
+        List<String> subscriptionNames = new ArrayList<>(size);
+        List<String> subscriptionIds = new ArrayList<>(size);
+        for (int i = 0; i < size; i++) {
+            SubscriptionInfo subscription = subscriptions.get(i);
+            int subscriptionId = subscription.getSubscriptionId();
+            if (subscriptionId == defaultSubscriptionId) {
+                // Set the default as the first selected value.
+                selectedIndex = i;
+            }
+            subscriptionNames.add(getSubscriptionName(subscription));
+            subscriptionIds.add(String.valueOf(subscriptionId));
+        }
+
+        preference.setEntries(toCharSequenceArray(subscriptionNames));
+        preference.setEntryValues(toCharSequenceArray(subscriptionIds));
+        preference.setTitle(subscriptionNames.get(selectedIndex));
+        preference.setValueIndex(selectedIndex);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+        String subscriptionIdStr = (String) newValue;
+        int index = preference.findIndexOfValue(subscriptionIdStr);
+        CharSequence subscriptionName = preference.getEntries()[index];
+        preference.setTitle(subscriptionName);
+        return true;
+    }
+
+    /**
+     * Returns the default subscription id in the order of data, voice, sms, system subscription.
+     */
+    private int getDefaultSubscriptionId() {
+        int defaultSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
+        if (!SubscriptionManager.isUsableSubIdValue(defaultSubscriptionId)) {
+            defaultSubscriptionId = SubscriptionManager.getDefaultVoiceSubscriptionId();
+        }
+        if (!SubscriptionManager.isUsableSubIdValue(defaultSubscriptionId)) {
+            defaultSubscriptionId = SubscriptionManager.getDefaultSmsSubscriptionId();
+        }
+        if (!SubscriptionManager.isUsableSubIdValue(defaultSubscriptionId)) {
+            defaultSubscriptionId = SubscriptionManager.getDefaultSubscriptionId();
+        }
+        return defaultSubscriptionId;
+    }
+
+    /**
+     * Returns the subscription display name falling back to the number, the carrier, and then
+     * network id codes.
+     */
+    private String getSubscriptionName(SubscriptionInfo subscription) {
+        String name = subscription.getDisplayName().toString();
+        if (TextUtils.isEmpty(name)) {
+            name = subscription.getNumber();
+        }
+        if (TextUtils.isEmpty(name)) {
+            name = subscription.getCarrierName().toString();
+        }
+        if (TextUtils.isEmpty(name)) {
+            name = getContext().getString(R.string.reset_network_fallback_subscription_name,
+                    subscription.getMcc(), subscription.getMnc(), subscription.getSimSlotIndex(),
+                    subscription.getSubscriptionId());
+        }
+        return name;
+    }
+
+    private CharSequence[] toCharSequenceArray(List<String> list) {
+        CharSequence[] array = new CharSequence[list.size()];
+        list.toArray(array);
+        return array;
+    }
+}
diff --git a/src/com/android/car/settings/system/ResetOptionsFragment.java b/src/com/android/car/settings/system/ResetOptionsFragment.java
new file mode 100644
index 0000000..a0643cf
--- /dev/null
+++ b/src/com/android/car/settings/system/ResetOptionsFragment.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Shows options to reset network settings, reset app preferences, and factory reset the device.
+ */
+public class ResetOptionsFragment extends SettingsFragment {
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.reset_options_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/system/SecurityPatchPreferenceController.java b/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
new file mode 100644
index 0000000..f48357c
--- /dev/null
+++ b/src/com/android/car/settings/system/SecurityPatchPreferenceController.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.DeviceInfoUtils;
+
+/** Updates the security patch entry summary with the security patch. */
+public class SecurityPatchPreferenceController extends PreferenceController<Preference> {
+
+    public SecurityPatchPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setSummary(DeviceInfoUtils.getSecurityPatch());
+    }
+}
diff --git a/src/com/android/car/settings/system/SystemSettingsFragment.java b/src/com/android/car/settings/system/SystemSettingsFragment.java
index 4f39e32..5b5efc2 100644
--- a/src/com/android/car/settings/system/SystemSettingsFragment.java
+++ b/src/com/android/car/settings/system/SystemSettingsFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -11,135 +11,21 @@
  * 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
+ * limitations under the License.
  */
 
-
 package com.android.car.settings.system;
 
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.os.Bundle;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
-
 import com.android.car.settings.R;
-import com.android.car.settings.common.ExtraSettingsLoader;
-import com.android.car.settings.common.ListItemSettingsFragment;
-import com.android.car.settingslib.language.LanguagePickerUtils;
-import com.android.internal.app.LocaleHelper;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Locale;
-import java.util.Map;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Shows basic info about the system and provide some actions like update, reset etc.
  */
-public class SystemSettingsFragment extends ListItemSettingsFragment {
-
-    // Copied from hidden version in android.provider.Settings
-    private static final String ACTION_SYSTEM_UPDATE_SETTINGS =
-            "android.settings.SYSTEM_UPDATE_SETTINGS";
-
-    private static final String ACTION_SETTING_VIEW_LICENSE =
-            "android.settings.WEBVIEW_LICENSE";
-
-    private ListItemProvider mItemProvider;
-
-    public static SystemSettingsFragment getInstance() {
-        SystemSettingsFragment systemSettingsFragment = new SystemSettingsFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.system_setting_title);
-        systemSettingsFragment.setArguments(bundle);
-        return systemSettingsFragment;
-    }
+public class SystemSettingsFragment extends SettingsFragment {
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mItemProvider = new ListItemProvider.ListProvider(getListItems());
-        // super.onActivityCreated() will need itemProvider, so call it after the provider
-        // is initialized.
-        super.onActivityCreated(savedInstanceState);
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-
-    private ArrayList<ListItem> getListItems() {
-        ArrayList<ListItem> lineItems = new ArrayList<>();
-
-        lineItems.add(createLanguageListItem());
-        lineItems.addAll(createSystemUpdateListItems());
-        lineItems.add(createAboutSystemListItem());
-        lineItems.add(createLegalInfoListItem());
-
-        return lineItems;
-    }
-
-    private TextListItem createLanguageListItem() {
-        Context context = getContext();
-        TextListItem languageItem = new TextListItem(context);
-        languageItem.setTitle(context.getString(R.string.language_settings));
-        Locale locale = LanguagePickerUtils.getConfiguredLocale();
-        languageItem.setBody(LocaleHelper.getDisplayName(locale, locale, /* sentenceCase= */ true));
-        languageItem.setPrimaryActionIcon(
-                R.drawable.ic_language, /* useLargeIcon= */ false);
-        languageItem.setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-        languageItem.setOnClickListener(
-                v -> getFragmentController().launchFragment(LanguagePickerFragment.newInstance()));
-        return languageItem;
-    }
-
-    private Collection<ListItem> createSystemUpdateListItems() {
-        Collection<ListItem> collection = new ArrayList<>();
-        Context context = getContext();
-
-        Intent settingsIntent = new Intent(ACTION_SYSTEM_UPDATE_SETTINGS);
-        PackageManager packageManager = context.getPackageManager();
-        if (settingsIntent.resolveActivity(packageManager) != null) {
-            collection.add(new SystemUpdatesListItem(context, settingsIntent));
-        }
-
-        ExtraSettingsLoader extraSettingLoader = new ExtraSettingsLoader(context);
-        Map<String, Collection<ListItem>> extraSettings = extraSettingLoader.load();
-        collection.addAll(extraSettings.get(ExtraSettingsLoader.SYSTEM_CATEGORY));
-        return collection;
-    }
-
-    private TextListItem createAboutSystemListItem() {
-        Context context = getContext();
-        TextListItem aboutSystemItem = new TextListItem(context);
-        aboutSystemItem.setTitle(context.getString(R.string.about_settings));
-        aboutSystemItem.setBody(
-                context.getString(R.string.about_summary, Build.VERSION.RELEASE));
-        aboutSystemItem.setPrimaryActionIcon(
-                R.drawable.ic_settings_about, /* useLargeIcon= */ false);
-        aboutSystemItem.setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-        aboutSystemItem.setOnClickListener(
-                v -> getFragmentController().launchFragment(AboutSettingsFragment.getInstance()));
-        return aboutSystemItem;
-    }
-
-    private TextListItem createLegalInfoListItem() {
-        Context context = getContext();
-        TextListItem legalInfoItem = new TextListItem(context);
-        legalInfoItem.setTitle(context.getString(R.string.legal_information));
-        legalInfoItem.setPrimaryActionIcon(
-                R.drawable.ic_settings_about, /* useLargeIcon= */ false);
-        legalInfoItem.setSupplementalIcon(R.drawable.ic_chevron_right, /* showDivider= */ false);
-        legalInfoItem.setOnClickListener(v -> {
-            Intent intent = new Intent();
-            intent.setAction(ACTION_SETTING_VIEW_LICENSE);
-            context.startActivity(intent);
-        });
-        return legalInfoItem;
+    protected int getPreferenceScreenResId() {
+        return R.xml.system_settings_fragment;
     }
 }
diff --git a/src/com/android/car/settings/system/SystemUpdatePreferenceController.java b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
new file mode 100644
index 0000000..a3389c3
--- /dev/null
+++ b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static android.content.Context.CARRIER_CONFIG_SERVICE;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.text.TextUtils;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.List;
+
+/**
+ * Controller which determines if the system update preference should be displayed based on
+ * device and user status. When the preference is clicked, this controller broadcasts a client
+ * initiated action if an intent is available in carrier-specific telephony configuration.
+ *
+ * @see CarrierConfigManager#KEY_CI_ACTION_ON_SYS_UPDATE_BOOL
+ */
+public class SystemUpdatePreferenceController extends PreferenceController<Preference> {
+
+    private static final Logger LOG = new Logger(SystemUpdatePreferenceController.class);
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private boolean mActivityFound;
+
+    public SystemUpdatePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!getContext().getResources().getBoolean(R.bool.config_show_system_update_settings)) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        return mCarUserManagerHelper.isCurrentProcessAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        Preference preference = getPreference();
+        Intent intent = preference.getIntent();
+        if (intent != null) {
+            // Find the activity that is in the system image.
+            PackageManager pm = getContext().getPackageManager();
+            List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
+            int listSize = list.size();
+            for (int i = 0; i < listSize; i++) {
+                ResolveInfo resolveInfo = list.get(i);
+                if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
+                        != 0) {
+                    // Replace the intent with this specific activity.
+                    preference.setIntent(
+                            new Intent().setClassName(resolveInfo.activityInfo.packageName,
+                                    resolveInfo.activityInfo.name));
+                    // Set the preference title to the activity's label.
+                    preference.setTitle(resolveInfo.loadLabel(pm));
+                    mActivityFound = true;
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        preference.setVisible(mActivityFound);
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        CarrierConfigManager configManager = (CarrierConfigManager) getContext().getSystemService(
+                CARRIER_CONFIG_SERVICE);
+        PersistableBundle b = configManager.getConfig();
+        if (b != null && b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
+            ciActionOnSysUpdate(b);
+        }
+        // Don't handle so that preference framework will launch the preference intent.
+        return false;
+    }
+
+    /** Trigger client initiated action (send intent) on system update. */
+    private void ciActionOnSysUpdate(PersistableBundle b) {
+        String intentStr = b.getString(
+                CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING);
+        if (!TextUtils.isEmpty(intentStr)) {
+            String extra = b.getString(
+                    CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING);
+            String extraVal = b.getString(
+                    CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING);
+
+            Intent intent = new Intent(intentStr);
+            if (!TextUtils.isEmpty(extra)) {
+                intent.putExtra(extra, extraVal);
+            }
+            LOG.d("ciActionOnSysUpdate: broadcasting intent " + intentStr + " with extra " + extra
+                    + ", " + extraVal);
+            getContext().getApplicationContext().sendBroadcast(intent);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/system/SystemUpdatesListItem.java b/src/com/android/car/settings/system/SystemUpdatesListItem.java
deleted file mode 100644
index 16e30df..0000000
--- a/src/com/android/car/settings/system/SystemUpdatesListItem.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.system;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.text.TextUtils;
-import android.view.View;
-
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-
-
-/**
- * A LineItem that links to system update.
- */
-class SystemUpdatesListItem extends TextListItem {
-    private final Context mContext;
-    private final Intent mSettingsIntent;
-
-    SystemUpdatesListItem(Context context, Intent settingsIntent) {
-        super(context);
-        mContext = context;
-        mSettingsIntent = settingsIntent;
-        setTitle(context.getString(R.string.system_update_settings_list_item_title));
-        setPrimaryActionIcon(R.drawable.ic_system_update, /*useLargeIcon=*/ false);
-        setSupplementalIcon(R.drawable.ic_chevron_right, /*showDivider=*/ false);
-        setOnClickListener(this::onClick);
-    }
-
-    private void onClick(View view) {
-        mContext.startActivity(mSettingsIntent);
-
-        // copy what the phone setting is doing, sending out a carrier defined intent
-        CarrierConfigManager configManager =
-                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
-        PersistableBundle b = configManager.getConfig();
-        if (b == null || !b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
-            return;
-        }
-        String intentStr = b.getString(CarrierConfigManager
-                .KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING);
-        if (!TextUtils.isEmpty(intentStr)) {
-            String extra = b.getString(CarrierConfigManager
-                    .KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING);
-            Intent intent = new Intent(intentStr);
-            if (!TextUtils.isEmpty(extra)) {
-                String extraVal = b.getString(CarrierConfigManager
-                        .KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING);
-                intent.putExtra(extra, extraVal);
-            }
-            mContext.getApplicationContext().sendBroadcast(intent);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/system/ThirdPartyLicensesActivity.java b/src/com/android/car/settings/system/ThirdPartyLicensesActivity.java
new file mode 100644
index 0000000..571e7b7
--- /dev/null
+++ b/src/com/android/car/settings/system/ThirdPartyLicensesActivity.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import android.content.ActivityNotFoundException;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import androidx.core.content.FileProvider;
+import androidx.fragment.app.FragmentActivity;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+
+import java.io.File;
+
+/**
+ * The activity that displays third-party licenses.
+ */
+public class ThirdPartyLicensesActivity extends FragmentActivity implements
+        LoaderManager.LoaderCallbacks<File> {
+    private static final Logger LOG = new Logger(ThirdPartyLicensesActivity.class);
+    private static final int LOADER_ID_LICENSE_HTML_LOADER = 0;
+    private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html.gz";
+    private static final String PROPERTY_LICENSE_PATH = "ro.config.license_path";
+    private static final String FILE_PROVIDER_AUTHORITY = "com.android.settings.files";
+    private static final String HTML_VIEWER_PACKAGE = "com.android.htmlviewer";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final String licenseHtmlPath =
+                SystemProperties.get(PROPERTY_LICENSE_PATH, DEFAULT_LICENSE_PATH);
+        if (isFilePathValid(licenseHtmlPath)) {
+            showSelectedFile(licenseHtmlPath);
+        } else {
+            showHtmlFromDefaultXmlFiles();
+        }
+    }
+
+    @Override
+    public Loader<File> onCreateLoader(int id, Bundle args) {
+        return new LicenseHtmlLoader(this);
+    }
+
+    @Override
+    public void onLoadFinished(Loader<File> loader, File generatedHtmlFile) {
+        showGeneratedHtmlFile(generatedHtmlFile);
+    }
+
+    @Override
+    public void onLoaderReset(Loader<File> loader) {
+    }
+
+    private void showSelectedFile(final String path) {
+        if (TextUtils.isEmpty(path)) {
+            LOG.e("The system property for the license file is empty");
+            showErrorAndFinish();
+            return;
+        }
+
+        final File file = new File(path);
+        if (!isFileValid(file)) {
+            LOG.e("License file " + path + " does not exist");
+            showErrorAndFinish();
+            return;
+        }
+        showHtmlFromUri(Uri.fromFile(file));
+    }
+
+    private void showErrorAndFinish() {
+        Toast.makeText(this, R.string.settings_license_activity_unavailable, Toast.LENGTH_LONG)
+                .show();
+        finish();
+    }
+
+    private void showHtmlFromUri(Uri uri) {
+        // Kick off external viewer due to WebView security restrictions; we
+        // carefully point it at HTMLViewer, since it offers to decompress
+        // before viewing.
+        final Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setDataAndType(uri, "text/html");
+        intent.putExtra(Intent.EXTRA_TITLE, getString(R.string.settings_license_activity_title));
+        if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        }
+        intent.addCategory(Intent.CATEGORY_DEFAULT);
+        intent.setPackage(HTML_VIEWER_PACKAGE);
+
+        try {
+            startActivity(intent);
+            finish();
+        } catch (ActivityNotFoundException e) {
+            LOG.e("Failed to find viewer", e);
+            showErrorAndFinish();
+        }
+    }
+
+    private void showHtmlFromDefaultXmlFiles() {
+        LoaderManager.getInstance(this).initLoader(LOADER_ID_LICENSE_HTML_LOADER, Bundle.EMPTY,
+                this);
+    }
+
+    private void showGeneratedHtmlFile(File generatedHtmlFile) {
+        if (generatedHtmlFile != null) {
+            LOG.i("File size: " + generatedHtmlFile.length());
+            showHtmlFromUri(getUriFromGeneratedHtmlFile(generatedHtmlFile));
+        } else {
+            LOG.e("Failed to generate.");
+            showErrorAndFinish();
+        }
+    }
+
+    private Uri getUriFromGeneratedHtmlFile(File generatedHtmlFile) {
+        return FileProvider.getUriForFile(this, FILE_PROVIDER_AUTHORITY, generatedHtmlFile);
+    }
+
+    private boolean isFilePathValid(final String path) {
+        return !TextUtils.isEmpty(path) && isFileValid(new File(path));
+    }
+
+    private boolean isFileValid(final File file) {
+        return file.exists() && file.length() != 0;
+    }
+}
diff --git a/src/com/android/car/settings/system/legal/LegalPreferenceController.java b/src/com/android/car/settings/system/legal/LegalPreferenceController.java
new file mode 100644
index 0000000..d05c852
--- /dev/null
+++ b/src/com/android/car/settings/system/legal/LegalPreferenceController.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system.legal;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.List;
+
+/**
+ *  Base class for legal preferences. Locates an activity coupled with the given intent and updates
+ *  the preference accordingly.
+ */
+public abstract class LegalPreferenceController extends PreferenceController<Preference> {
+    private final PackageManager mPackageManager;
+    private ResolveInfo mResolveInfo;
+
+    public LegalPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mPackageManager = context.getPackageManager();
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        mResolveInfo = findMatchingSpecificActivity();
+        return mResolveInfo != null ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        if (mResolveInfo == null) {
+            return;
+        }
+
+        // Replace the intent with this specific activity.
+        preference.setIntent(new Intent().setClassName(
+                mResolveInfo.activityInfo.packageName,
+                mResolveInfo.activityInfo.name));
+
+        preference.setTitle(mResolveInfo.loadLabel(mPackageManager));
+    }
+
+    /** Intent with a matching system activity to display legal disclaimers or licenses. */
+    protected abstract Intent getIntent();
+
+    private ResolveInfo findMatchingSpecificActivity() {
+        Intent intent = getIntent();
+        if (intent == null) {
+            return null;
+        }
+
+        // Find the activity that is in the system image.
+        List<ResolveInfo> list = mPackageManager.queryIntentActivities(intent, /* flags= */ 0);
+        if (list == null) {
+            return null;
+        }
+
+        for (ResolveInfo resolveInfo : list) {
+            if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
+                    != 0) {
+                return resolveInfo;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/system/legal/TermsPreferenceController.java b/src/com/android/car/settings/system/legal/TermsPreferenceController.java
new file mode 100644
index 0000000..5381a64
--- /dev/null
+++ b/src/com/android/car/settings/system/legal/TermsPreferenceController.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system.legal;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Links to a system activity that displays Terms and Conditions. */
+public class TermsPreferenceController extends LegalPreferenceController {
+    private static final Intent INTENT = new Intent("android.settings.TERMS");
+
+    public TermsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Intent getIntent() {
+        return INTENT;
+    }
+}
diff --git a/src/com/android/car/settings/system/legal/ThirdPartyLicensePreferenceController.java b/src/com/android/car/settings/system/legal/ThirdPartyLicensePreferenceController.java
new file mode 100644
index 0000000..c239bc9
--- /dev/null
+++ b/src/com/android/car/settings/system/legal/ThirdPartyLicensePreferenceController.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system.legal;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Links to a system activity that displays a list of third party licenses. */
+public class ThirdPartyLicensePreferenceController extends LegalPreferenceController {
+    private static final Intent INTENT = new Intent("android.settings.THIRD_PARTY_LICENSE");
+
+    public ThirdPartyLicensePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Intent getIntent() {
+        return INTENT;
+    }
+}
diff --git a/src/com/android/car/settings/system/legal/WebViewLicensePreferenceController.java b/src/com/android/car/settings/system/legal/WebViewLicensePreferenceController.java
new file mode 100644
index 0000000..e25f7c2
--- /dev/null
+++ b/src/com/android/car/settings/system/legal/WebViewLicensePreferenceController.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system.legal;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Links to a system activity that displays System Webview Licenses. */
+public class WebViewLicensePreferenceController extends LegalPreferenceController {
+    private static final Intent INTENT = new Intent("android.settings.WEBVIEW_LICENSE");
+
+    public WebViewLicensePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Intent getIntent() {
+        return INTENT;
+    }
+}
diff --git a/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceController.java b/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceController.java
new file mode 100644
index 0000000..2e1919a
--- /dev/null
+++ b/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceController.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic to set the summary for the preferred engine entry setting. */
+public class PreferredEngineEntryPreferenceController extends
+        PreferenceController<ButtonPreference> {
+
+    private static final Logger LOG = new Logger(PreferredEngineEntryPreferenceController.class);
+    private TtsEngines mEnginesHelper;
+
+    public PreferredEngineEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mEnginesHelper = new TtsEngines(context);
+    }
+
+    @Override
+    protected Class<ButtonPreference> getPreferenceType() {
+        return ButtonPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        getPreference().setOnButtonClickListener(preference -> {
+            TextToSpeech.EngineInfo info = mEnginesHelper.getEngineInfo(
+                    mEnginesHelper.getDefaultEngine());
+            Intent subSettingsIntent = mEnginesHelper.getSettingsIntent(info.name);
+            if (subSettingsIntent != null) {
+                getContext().startActivity(subSettingsIntent);
+            } else {
+                LOG.e("subSettingsIntent is null");
+            }
+        });
+    }
+
+    @Override
+    protected void updateState(ButtonPreference preference) {
+        TextToSpeech.EngineInfo info = mEnginesHelper.getEngineInfo(
+                mEnginesHelper.getDefaultEngine());
+        preference.setSummary(info.label);
+    }
+}
diff --git a/src/com/android/car/settings/tts/PreferredEngineFragment.java b/src/com/android/car/settings/tts/PreferredEngineFragment.java
new file mode 100644
index 0000000..4c71f75
--- /dev/null
+++ b/src/com/android/car/settings/tts/PreferredEngineFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Displays the fragment which gives the user an option to change the preferred TTS engine. */
+public class PreferredEngineFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.preferred_engine_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceController.java b/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceController.java
new file mode 100644
index 0000000..e0bbbbc
--- /dev/null
+++ b/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceController.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+import android.text.TextUtils;
+
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/** Populates the possible tts engines to set as the preferred engine. */
+public class PreferredEngineOptionsPreferenceController extends
+        PreferenceController<PreferenceGroup> {
+
+    private static final Logger LOG = new Logger(PreferredEngineOptionsPreferenceController.class);
+
+    private final TtsEngines mEnginesHelper;
+    private String mPreviousEngine;
+    private boolean mIsStarted;
+    private TextToSpeech mTts;
+
+    public PreferredEngineOptionsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mEnginesHelper = new TtsEngines(getContext());
+        mIsStarted = false;
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /**
+     * Creates the initial TTS object and constructs the related preferences when underlying
+     * fragment is created.
+     */
+    @Override
+    protected void onCreateInternal() {
+        mTts = new TextToSpeech(getContext(), /* listener= */ null);
+
+        for (TextToSpeech.EngineInfo engine : mEnginesHelper.getEngines()) {
+            TtsPreference preference = new TtsPreference(getContext(), engine);
+            preference.setKey(engine.name);
+            preference.setTitle(engine.label);
+            preference.setOnPreferenceClickListener(pref -> {
+                TextToSpeech.EngineInfo engineInfo = ((TtsPreference) pref).getEngineInfo();
+                TextToSpeech.EngineInfo current = mEnginesHelper.getEngineInfo(
+                        mTts.getCurrentEngine());
+                if (TextUtils.equals(engineInfo.label, current.label)) {
+                    return false;
+                }
+                updateDefaultEngine(engineInfo.name);
+                return true;
+            });
+            getPreference().addPreference(preference);
+        }
+    }
+
+    /** Note that the preference controller was started. */
+    @Override
+    protected void onStartInternal() {
+        mIsStarted = true;
+    }
+
+    /** Note that the preference controller was stopped. */
+    @Override
+    protected void onStopInternal() {
+        mIsStarted = false;
+    }
+
+    /** Cleans up the TTS object and clears the preferences representing the TTS engines. */
+    @Override
+    protected void onDestroyInternal() {
+        if (mTts != null) {
+            mTts.shutdown();
+            mTts = null;
+        }
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        TextToSpeech.EngineInfo current = mEnginesHelper.getEngineInfo(mTts.getCurrentEngine());
+        for (int i = 0; i < preference.getPreferenceCount(); i++) {
+            TtsPreference pref = (TtsPreference) preference.getPreference(i);
+            if (pref.getTitle().equals(current.label)) {
+                pref.setSummary(R.string.text_to_speech_current_engine);
+            } else {
+                pref.setSummary("");
+            }
+        }
+    }
+
+    private void updateDefaultEngine(String engineName) {
+        LOG.d("Updating default synth to : " + engineName);
+
+        // Keep track of the previous engine that was being used. So that
+        // we can reuse the previous engine.
+        //
+        // Note that if TextToSpeech#getCurrentEngine is not null, it means at
+        // the very least that we successfully bound to the engine service.
+        mPreviousEngine = mTts.getCurrentEngine();
+
+        // Step 1: Shut down the existing TTS engine.
+        LOG.i("Shutting down current tts engine");
+        if (mTts != null) {
+            mTts.shutdown();
+        }
+
+        // Step 2: Connect to the new TTS engine.
+        // Step 3 is continued on #onUpdateEngine (below) which is called when
+        // the app binds successfully to the engine.
+        LOG.i("Updating engine : Attempting to connect to engine: " + engineName);
+        mTts = new TextToSpeech(getContext(), status -> {
+            if (mIsStarted) {
+                onUpdateEngine(status);
+                refreshUi();
+            }
+        }, engineName);
+        LOG.i("Success");
+    }
+
+    /**
+     * We have now bound to the TTS engine the user requested. We will attempt to check voice data
+     * for the engine if we successfully bound to it, or revert to the previous engine if we
+     * didn't.
+     */
+    private void onUpdateEngine(int status) {
+        if (status == TextToSpeech.SUCCESS) {
+            LOG.d("Updating engine: Successfully bound to the engine: "
+                    + mTts.getCurrentEngine());
+            Settings.Secure.putString(getContext().getContentResolver(), TTS_DEFAULT_SYNTH,
+                    mTts.getCurrentEngine());
+        } else {
+            LOG.d("Updating engine: Failed to bind to engine, reverting.");
+            if (mPreviousEngine != null) {
+                // This is guaranteed to at least bind, since mPreviousEngine would be
+                // null if the previous bind to this engine failed.
+                mTts = new TextToSpeech(getContext(), /* listener= */ null, mPreviousEngine);
+            }
+            mPreviousEngine = null;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/tts/TextToSpeechOutputFragment.java b/src/com/android/car/settings/tts/TextToSpeechOutputFragment.java
new file mode 100644
index 0000000..bada2bd
--- /dev/null
+++ b/src/com/android/car/settings/tts/TextToSpeechOutputFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Fragment to show the TTS settings. */
+public class TextToSpeechOutputFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.text_to_speech_output_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/tts/TtsPlaybackPreferenceController.java b/src/com/android/car/settings/tts/TtsPlaybackPreferenceController.java
new file mode 100644
index 0000000..00c8ca8
--- /dev/null
+++ b/src/com/android/car/settings/tts/TtsPlaybackPreferenceController.java
@@ -0,0 +1,429 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.SeekBarPreference;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Objects;
+
+/**
+ * Business logic for configuring and listening to the current TTS voice. This preference contorller
+ * handles the following:
+ *
+ * <ol>
+ * <li>Changing the TTS language
+ * <li>Changing the TTS speech rate
+ * <li>Changing the TTS voice pitch
+ * <li>Resetting the TTS configuration
+ * </ol>
+ */
+public class TtsPlaybackPreferenceController extends
+        PreferenceController<PreferenceGroup> implements ActivityResultCallback {
+
+    private static final Logger LOG = new Logger(TtsPlaybackPreferenceController.class);
+
+    @VisibleForTesting
+    static final int VOICE_DATA_CHECK = 1;
+    @VisibleForTesting
+    static final int GET_SAMPLE_TEXT = 2;
+
+    private final TtsEngines mEnginesHelper;
+    private TtsPlaybackSettingsManager mTtsPlaybackManager;
+    private TextToSpeech mTts;
+    private int mSelectedLocaleIndex;
+
+    private ListPreference mDefaultLanguagePreference;
+    private SeekBarPreference mSpeechRatePreference;
+    private SeekBarPreference mVoicePitchPreference;
+    private Preference mResetPreference;
+
+    private String mSampleText;
+    private Locale mSampleTextLocale;
+
+    /** True if initialized with no errors. */
+    private boolean mTtsInitialized = false;
+
+    private final TextToSpeech.OnInitListener mOnInitListener = status -> {
+        if (status == TextToSpeech.SUCCESS) {
+            mTtsInitialized = true;
+            refreshUi();
+        }
+    };
+
+    public TtsPlaybackPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mEnginesHelper = new TtsEngines(context);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mDefaultLanguagePreference = initDefaultLanguagePreference();
+        mSpeechRatePreference = initSpeechRatePreference();
+        mVoicePitchPreference = initVoicePitchPreference();
+        mResetPreference = initResetTtsPlaybackPreference();
+
+        mTts = new TextToSpeech(getContext(), mOnInitListener);
+        mTtsPlaybackManager = new TtsPlaybackSettingsManager(getContext(), mTts, mEnginesHelper);
+        mTts.setSpeechRate(mTtsPlaybackManager.getCurrentSpeechRate()
+                / TtsPlaybackSettingsManager.SCALING_FACTOR);
+        mTts.setPitch(mTtsPlaybackManager.getCurrentVoicePitch()
+                / TtsPlaybackSettingsManager.SCALING_FACTOR);
+        startEngineVoiceDataCheck(mTts.getCurrentEngine());
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        if (mTts != null) {
+            mTts.shutdown();
+            mTts = null;
+            mTtsPlaybackManager = null;
+        }
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preference) {
+        boolean isValid = isDefaultLocaleValid();
+        mDefaultLanguagePreference.setEnabled(isValid);
+        mSpeechRatePreference.setEnabled(isValid);
+        mVoicePitchPreference.setEnabled(isValid);
+        mResetPreference.setEnabled(isValid);
+        if (!isValid && mDefaultLanguagePreference.getEntries() != null) {
+            mDefaultLanguagePreference.setEnabled(true);
+        }
+
+        if (mDefaultLanguagePreference.getEntries() != null) {
+            mDefaultLanguagePreference.setValueIndex(mSelectedLocaleIndex);
+            mDefaultLanguagePreference.setSummary(
+                    mDefaultLanguagePreference.getEntries()[mSelectedLocaleIndex]);
+        }
+
+        mSpeechRatePreference.setValue(mTtsPlaybackManager.getCurrentSpeechRate());
+        mVoicePitchPreference.setValue(mTtsPlaybackManager.getCurrentVoicePitch());
+        checkOrUpdateSampleText();
+    }
+
+    @Override
+    public void processActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        switch (requestCode) {
+            case VOICE_DATA_CHECK:
+                onVoiceDataIntegrityCheckDone(resultCode, data);
+                break;
+            case GET_SAMPLE_TEXT:
+                onSampleTextReceived(resultCode, data);
+                break;
+            default:
+                LOG.e("Got unknown activity result");
+        }
+    }
+
+    private void startEngineVoiceDataCheck(String engine) {
+        Intent intent = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
+        intent.setPackage(engine);
+        try {
+            LOG.d("Updating engine: Checking voice data: " + intent.toUri(0));
+            getFragmentController().startActivityForResult(intent, VOICE_DATA_CHECK,
+                    this);
+        } catch (ActivityNotFoundException ex) {
+            LOG.e("Failed to check TTS data, no activity found for " + intent);
+        }
+    }
+
+    /**
+     * Ask the current default engine to return a string of sample text to be
+     * spoken to the user.
+     */
+    private void startGetSampleText() {
+        String currentEngine = mTts.getCurrentEngine();
+        if (TextUtils.isEmpty(currentEngine)) {
+            currentEngine = mTts.getDefaultEngine();
+        }
+
+        Intent intent = new Intent(TextToSpeech.Engine.ACTION_GET_SAMPLE_TEXT);
+        mSampleTextLocale = mTtsPlaybackManager.getEffectiveTtsLocale();
+        if (mSampleTextLocale == null) {
+            return;
+        }
+        intent.putExtra(TextToSpeech.Engine.KEY_PARAM_LANGUAGE, mSampleTextLocale.getLanguage());
+        intent.putExtra(TextToSpeech.Engine.KEY_PARAM_COUNTRY, mSampleTextLocale.getCountry());
+        intent.putExtra(TextToSpeech.Engine.KEY_PARAM_VARIANT, mSampleTextLocale.getVariant());
+        intent.setPackage(currentEngine);
+
+        try {
+            LOG.d("Getting sample text: " + intent.toUri(0));
+            getFragmentController().startActivityForResult(intent, GET_SAMPLE_TEXT, this);
+        } catch (ActivityNotFoundException ex) {
+            LOG.e("Failed to get sample text, no activity found for " + intent + ")");
+        }
+    }
+
+    /** The voice data check is complete. */
+    private void onVoiceDataIntegrityCheckDone(int resultCode, Intent data) {
+        String engine = mTts.getCurrentEngine();
+        if (engine == null) {
+            LOG.e("Voice data check complete, but no engine bound");
+            return;
+        }
+
+        if (data == null || resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL) {
+            LOG.e("Engine failed voice data integrity check (null return or invalid result code)"
+                    + mTts.getCurrentEngine());
+            return;
+        }
+
+        Settings.Secure.putString(getContext().getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_SYNTH, engine);
+
+        ArrayList<String> availableLangs =
+                data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
+        if (availableLangs == null || availableLangs.size() == 0) {
+            refreshUi();
+            return;
+        }
+
+        updateDefaultLanguagePreference(availableLangs);
+
+        mSelectedLocaleIndex = findLocaleIndex(mTtsPlaybackManager.getStoredTtsLocale());
+        if (mSelectedLocaleIndex < 0) {
+            mSelectedLocaleIndex = 0;
+        }
+        startGetSampleText();
+        refreshUi();
+    }
+
+    private void onSampleTextReceived(int resultCode, Intent data) {
+        String sample = getContext().getString(R.string.tts_default_sample_string);
+
+        if (resultCode == TextToSpeech.LANG_AVAILABLE && data != null) {
+            String tmp = data.getStringExtra(TextToSpeech.Engine.EXTRA_SAMPLE_TEXT);
+            if (!TextUtils.isEmpty(tmp)) {
+                sample = tmp;
+            }
+            LOG.d("Got sample text: " + sample);
+        } else {
+            LOG.d("Using default sample text :" + sample);
+        }
+
+        mSampleText = sample;
+    }
+
+    private void updateLanguageTo(Locale locale) {
+        int selectedLocaleIndex = findLocaleIndex(locale);
+        if (selectedLocaleIndex == -1) {
+            LOG.w("updateLanguageTo called with unknown locale argument");
+            return;
+        }
+
+        if (mTtsPlaybackManager.updateTtsLocale(locale)) {
+            mSelectedLocaleIndex = selectedLocaleIndex;
+            refreshUi();
+        } else {
+            LOG.e("updateLanguageTo failed to update tts language");
+        }
+    }
+
+    private int findLocaleIndex(Locale locale) {
+        String localeString = (locale != null) ? locale.toString() : "";
+        return mDefaultLanguagePreference.findIndexOfValue(localeString);
+    }
+
+    private boolean isDefaultLocaleValid() {
+        if (!mTtsInitialized) {
+            return false;
+        }
+
+        Locale defaultLocale = mTtsPlaybackManager.getEffectiveTtsLocale();
+        if (defaultLocale == null) {
+            LOG.e("Failed to get default language from engine " + mTts.getCurrentEngine());
+            return false;
+        }
+
+        if (mDefaultLanguagePreference.getEntries() == null) {
+            return false;
+        }
+
+        int index = mDefaultLanguagePreference.findIndexOfValue(defaultLocale.toString());
+        if (index < 0) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void checkOrUpdateSampleText() {
+        if (!mTtsInitialized) {
+            return;
+        }
+        Locale defaultLocale = mTtsPlaybackManager.getEffectiveTtsLocale();
+        if (defaultLocale == null) {
+            LOG.e("Failed to get default language from engine " + mTts.getCurrentEngine());
+            return;
+        }
+
+        if (!Objects.equals(defaultLocale, mSampleTextLocale)) {
+            mSampleText = null;
+            mSampleTextLocale = null;
+        }
+
+        if (mSampleText == null) {
+            startGetSampleText();
+        }
+    }
+
+    @VisibleForTesting
+    String getSampleText() {
+        return mSampleText;
+    }
+
+    /* ***************************************************************************************** *
+     * Preference initialization/update code.                                                    *
+     * ***************************************************************************************** */
+
+    private ListPreference initDefaultLanguagePreference() {
+        ListPreference defaultLanguagePreference = (ListPreference) getPreference().findPreference(
+                getContext().getString(R.string.pk_tts_default_language));
+        defaultLanguagePreference.setOnPreferenceChangeListener((preference, newValue) -> {
+            String localeString = (String) newValue;
+            updateLanguageTo(!TextUtils.isEmpty(localeString) ? mEnginesHelper.parseLocaleString(
+                    localeString) : null);
+            checkOrUpdateSampleText();
+            return true;
+        });
+        return defaultLanguagePreference;
+    }
+
+    private void updateDefaultLanguagePreference(@NonNull ArrayList<String> availableLangs) {
+        // Sort locales by display name.
+        ArrayList<Locale> locales = new ArrayList<>();
+        for (int i = 0; i < availableLangs.size(); i++) {
+            Locale locale = mEnginesHelper.parseLocaleString(availableLangs.get(i));
+            if (locale != null) {
+                locales.add(locale);
+            }
+        }
+        Collections.sort(locales,
+                (lhs, rhs) -> lhs.getDisplayName().compareToIgnoreCase(rhs.getDisplayName()));
+
+        // Separate pairs into two separate arrays.
+        CharSequence[] entries = new CharSequence[availableLangs.size() + 1];
+        CharSequence[] entryValues = new CharSequence[availableLangs.size() + 1];
+
+        entries[0] = getContext().getString(R.string.tts_lang_use_system);
+        entryValues[0] = "";
+
+        int i = 1;
+        for (Locale locale : locales) {
+            entries[i] = locale.getDisplayName();
+            entryValues[i++] = locale.toString();
+        }
+
+        mDefaultLanguagePreference.setEntries(entries);
+        mDefaultLanguagePreference.setEntryValues(entryValues);
+    }
+
+    private SeekBarPreference initSpeechRatePreference() {
+        SeekBarPreference speechRatePreference = (SeekBarPreference) getPreference().findPreference(
+                getContext().getString(R.string.pk_tts_speech_rate));
+        speechRatePreference.setMin(TtsPlaybackSettingsManager.MIN_SPEECH_RATE);
+        speechRatePreference.setMax(TtsPlaybackSettingsManager.MAX_SPEECH_RATE);
+        speechRatePreference.setShowSeekBarValue(false);
+        speechRatePreference.setContinuousUpdate(false);
+        speechRatePreference.setOnPreferenceChangeListener((preference, newValue) -> {
+            if (mTtsPlaybackManager != null) {
+                mTtsPlaybackManager.updateSpeechRate((Integer) newValue);
+                mTtsPlaybackManager.speakSampleText(mSampleText);
+                return true;
+            }
+            LOG.e("speech rate preference enabled before it is allowed");
+            return false;
+        });
+
+        // Initially disable.
+        speechRatePreference.setEnabled(false);
+        return speechRatePreference;
+    }
+
+    private SeekBarPreference initVoicePitchPreference() {
+        SeekBarPreference pitchPreference = (SeekBarPreference) getPreference().findPreference(
+                getContext().getString(R.string.pk_tts_pitch));
+        pitchPreference.setMin(TtsPlaybackSettingsManager.MIN_VOICE_PITCH);
+        pitchPreference.setMax(TtsPlaybackSettingsManager.MAX_VOICE_PITCH);
+        pitchPreference.setShowSeekBarValue(false);
+        pitchPreference.setContinuousUpdate(false);
+        pitchPreference.setOnPreferenceChangeListener((preference, newValue) -> {
+            if (mTtsPlaybackManager != null) {
+                mTtsPlaybackManager.updateVoicePitch((Integer) newValue);
+                mTtsPlaybackManager.speakSampleText(mSampleText);
+                return true;
+            }
+            LOG.e("speech pitch preference enabled before it is allowed");
+            return false;
+        });
+
+        // Initially disable.
+        pitchPreference.setEnabled(false);
+        return pitchPreference;
+    }
+
+    private Preference initResetTtsPlaybackPreference() {
+        Preference resetPreference = getPreference().findPreference(
+                getContext().getString(R.string.pk_tts_reset));
+        resetPreference.setOnPreferenceClickListener(preference -> {
+            if (mTtsPlaybackManager != null) {
+                mTtsPlaybackManager.resetVoicePitch();
+                mTtsPlaybackManager.resetSpeechRate();
+                refreshUi();
+                return true;
+            }
+            LOG.e("reset preference enabled before it is allowed");
+            return false;
+        });
+
+        // Initially disable.
+        resetPreference.setEnabled(false);
+        return resetPreference;
+    }
+}
diff --git a/src/com/android/car/settings/tts/TtsPlaybackSettingsManager.java b/src/com/android/car/settings/tts/TtsPlaybackSettingsManager.java
new file mode 100644
index 0000000..01021bb
--- /dev/null
+++ b/src/com/android/car/settings/tts/TtsPlaybackSettingsManager.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.provider.Settings;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+
+import java.util.Locale;
+
+/** Handles interactions with TTS playback settings. */
+class TtsPlaybackSettingsManager {
+
+    private static final Logger LOG = new Logger(TtsPlaybackSettingsManager.class);
+
+    /**
+     * Maximum speech rate value.
+     */
+    public static final int MAX_SPEECH_RATE = 600;
+
+    /**
+     * Minimum speech rate value.
+     */
+    public static final int MIN_SPEECH_RATE = 10;
+
+    /**
+     * Maximum voice pitch value.
+     */
+    public static final int MAX_VOICE_PITCH = 400;
+
+    /**
+     * Minimum voice pitch value.
+     */
+    public static final int MIN_VOICE_PITCH = 25;
+
+    /**
+     * Scaling factor used to convert speech rate and pitch values between {@link Settings.Secure}
+     * and {@link TextToSpeech}.
+     */
+    public static final float SCALING_FACTOR = 100.0f;
+    private static final String UTTERANCE_ID = "Sample";
+
+    private final Context mContext;
+    private final TextToSpeech mTts;
+    private final TtsEngines mEnginesHelper;
+
+    TtsPlaybackSettingsManager(Context context, @NonNull TextToSpeech tts,
+            @NonNull TtsEngines enginesHelper) {
+        mContext = context;
+        mTts = tts;
+        mEnginesHelper = enginesHelper;
+    }
+
+    void updateSpeechRate(int speechRate) {
+        Settings.Secure.putInt(
+                mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_RATE, speechRate);
+        mTts.setSpeechRate(speechRate / SCALING_FACTOR);
+        LOG.d("TTS default rate changed, now " + speechRate);
+    }
+
+    int getCurrentSpeechRate() {
+        return Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_RATE, TextToSpeech.Engine.DEFAULT_RATE);
+    }
+
+    void resetSpeechRate() {
+        updateSpeechRate(TextToSpeech.Engine.DEFAULT_RATE);
+    }
+
+    void updateVoicePitch(int pitch) {
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_PITCH,
+                pitch);
+        mTts.setPitch(pitch / SCALING_FACTOR);
+        LOG.d("TTS default pitch changed, now " + pitch);
+    }
+
+    int getCurrentVoicePitch() {
+        return Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_PITCH, TextToSpeech.Engine.DEFAULT_PITCH);
+    }
+
+    void resetVoicePitch() {
+        updateVoicePitch(TextToSpeech.Engine.DEFAULT_PITCH);
+    }
+
+    /**
+     * Returns the currently stored locale for the given tts engine. It can return {@code null}, if
+     * it is configured to use the system default locale.
+     */
+    @Nullable
+    Locale getStoredTtsLocale() {
+        Locale currentLocale = null;
+        if (!mEnginesHelper.isLocaleSetToDefaultForEngine(mTts.getCurrentEngine())) {
+            currentLocale = mEnginesHelper.getLocalePrefForEngine(mTts.getCurrentEngine());
+        }
+        return currentLocale;
+    }
+
+    /**
+     * Similar to {@link #getStoredTtsLocale()}, but returns the language of the voice registered
+     * to the actual TTS object. It is possible for the TTS voice to be {@code null} if TTS is not
+     * yet initialized.
+     */
+    @Nullable
+    Locale getEffectiveTtsLocale() {
+        if (mTts.getVoice() == null) {
+            return null;
+        }
+        return mEnginesHelper.parseLocaleString(mTts.getVoice().getLocale().toString());
+    }
+
+    /**
+     * Attempts to update the default tts locale. Returns {@code true} if successful, false
+     * otherwise.
+     */
+    boolean updateTtsLocale(Locale newLocale) {
+        int resultCode = mTts.setLanguage((newLocale != null) ? newLocale : Locale.getDefault());
+        boolean success = resultCode != TextToSpeech.LANG_NOT_SUPPORTED
+                && resultCode != TextToSpeech.LANG_MISSING_DATA;
+        if (success) {
+            mEnginesHelper.updateLocalePrefForEngine(mTts.getCurrentEngine(), newLocale);
+        }
+
+        return success;
+    }
+
+    void speakSampleText(String text) {
+        boolean networkRequired = mTts.getVoice().isNetworkConnectionRequired();
+        Locale defaultLocale = getEffectiveTtsLocale();
+        if (!networkRequired || networkRequired && mTts.isLanguageAvailable(defaultLocale)
+                >= TextToSpeech.LANG_AVAILABLE) {
+            mTts.speak(text, TextToSpeech.QUEUE_FLUSH, /* params= */ null, UTTERANCE_ID);
+        } else {
+            displayNetworkAlert();
+        }
+    }
+
+    private void displayNetworkAlert() {
+        AlertDialog dialog = new AlertDialog.Builder(mContext)
+                .setTitle(android.R.string.dialog_alert_title)
+                .setMessage(R.string.tts_engine_network_required)
+                .setCancelable(false)
+                .setPositiveButton(android.R.string.ok, null).create();
+        dialog.show();
+    }
+}
diff --git a/src/com/android/car/settings/tts/TtsPreference.java b/src/com/android/car/settings/tts/TtsPreference.java
new file mode 100644
index 0000000..7c2f8db
--- /dev/null
+++ b/src/com/android/car/settings/tts/TtsPreference.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import android.content.Context;
+import android.speech.tts.TextToSpeech;
+
+import androidx.preference.Preference;
+
+/** Preference which also encapsulates the associated Text-to-speech engine. */
+public class TtsPreference extends Preference {
+
+    private TextToSpeech.EngineInfo mEngineInfo;
+
+    public TtsPreference(Context context, TextToSpeech.EngineInfo engineInfo) {
+        super(context);
+        mEngineInfo = engineInfo;
+    }
+
+    /** Gets the engine info associated with this preference. */
+    public TextToSpeech.EngineInfo getEngineInfo() {
+        return mEngineInfo;
+    }
+}
diff --git a/src/com/android/car/settings/units/CarUnitsManager.java b/src/com/android/car/settings/units/CarUnitsManager.java
new file mode 100644
index 0000000..112faf3
--- /dev/null
+++ b/src/com/android/car/settings/units/CarUnitsManager.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.VehiclePropertyIds;
+import android.car.VehicleUnit;
+import android.car.hardware.CarPropertyConfig;
+import android.car.hardware.property.CarPropertyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.util.ArraySet;
+
+import com.android.car.settings.common.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Utility to read and write {@link Unit}-related properties in {@link CarPropertyManager}. */
+public class CarUnitsManager {
+    private static final Logger LOG = new Logger(CarUnitsManager.class);
+    private static final int AREA_ID = 0;
+
+    private final ServiceConnection mServiceConnection = new ServiceConnection() {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            try {
+                mCarPropertyManager =
+                        (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
+                mCarServiceListener.handleServiceConnected(mCarPropertyManager);
+            } catch (CarNotConnectedException e) {
+                LOG.e("Car is not connected!", e);
+            }
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            mCarServiceListener.handleServiceDisconnected();
+        }
+    };
+
+    private Context mContext;
+    private Car mCar;
+    private CarPropertyManager mCarPropertyManager;
+    private OnCarServiceListener mCarServiceListener;
+
+    public CarUnitsManager(Context context) {
+        mContext = context;
+        mCar = Car.createCar(mContext, mServiceConnection);
+    }
+
+    /**
+     * Registers {@link OnCarServiceListener} as a Callback for when connection to {@link Car} has
+     * been established.
+     */
+    public void registerCarServiceListener(OnCarServiceListener listener) {
+        mCarServiceListener = listener;
+    }
+
+    /**
+     * Unregisters {@link OnCarServiceListener} as a Callback for when connection to {@link Car} has
+     * been terminated.
+     */
+    public void unregisterCarServiceListener() {
+        mCarServiceListener = null;
+    }
+
+    protected void connect() {
+        mCar.connect();
+    }
+
+    protected void disconnect() {
+        mCar.disconnect();
+    }
+
+    protected boolean isPropertyAvailable(int propertyId) {
+        Integer intProperty = null;
+
+        try {
+            intProperty = mCarPropertyManager.getIntProperty(propertyId, AREA_ID);
+        } catch (CarNotConnectedException e) {
+            LOG.e("Property is unavailable because Car is not connected.");
+        }
+
+        return intProperty != null && intProperty != VehicleUnit.SHOULD_NOT_USE;
+    }
+
+    protected Unit[] getUnitsSupportedByProperty(int propertyId) {
+        ArraySet<Integer> propertyIdSet = new ArraySet<Integer>();
+        propertyIdSet.add(propertyId);
+        List<CarPropertyConfig> configs = mCarPropertyManager.getPropertyList(propertyIdSet);
+        List<Integer> availableUnitsId = new ArrayList<Integer>();
+        List<Unit> units = new ArrayList<Unit>();
+
+        if (configs == null || configs.size() < 1 || configs.get(0) == null) {
+            return null;
+        }
+
+        availableUnitsId = configs.get(0).getConfigArray();
+
+        Unit[] result = new Unit[availableUnitsId.size()];
+        for (int unitId : availableUnitsId) {
+            if (UnitsMap.MAP.get(unitId) != null) {
+                Unit unit = UnitsMap.MAP.get(unitId);
+                units.add(unit);
+            }
+        }
+        for (int i = 0; i < result.length; i++) {
+            int unitId = availableUnitsId.get(i);
+            if (UnitsMap.MAP.get(unitId) != null) {
+                Unit unit = UnitsMap.MAP.get(unitId);
+                result[i] = unit;
+            }
+        }
+        return result;
+    }
+
+    protected Unit getUnitUsedByProperty(int propertyId) {
+        try {
+            int unitId = mCarPropertyManager.getIntProperty(propertyId, AREA_ID);
+            if (UnitsMap.MAP.get(unitId) != null) {
+                return UnitsMap.MAP.get(unitId);
+            } else {
+                return null;
+            }
+        } catch (CarNotConnectedException e) {
+            LOG.e("CarPropertyManager cannot get property because Car is not connected.");
+            return null;
+        }
+    }
+
+    protected void setUnitUsedByProperty(int propertyId, int unitId) {
+        try {
+            mCarPropertyManager.setIntProperty(propertyId, AREA_ID, unitId);
+        } catch (CarNotConnectedException e) {
+            LOG.e("CarPropertyManager cannot set property because Car is not connected.");
+        }
+    }
+
+    /**
+     * Returns a boolean that indicates whether the unit is expressed in distance per volume (true)
+     * or volume per distance (false) for fuel consumption. Note that only distance over volume
+     * format is supported when Mile and Gallon (both US and UK) units are used.
+     */
+    protected boolean isDistanceOverVolume() {
+        try {
+            return mCarPropertyManager.getBooleanProperty(
+                    VehiclePropertyIds.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME, AREA_ID);
+        } catch (CarNotConnectedException e) {
+            return true; // Defaults to True.
+        }
+    }
+
+    /** Defines callbacks that listen to {@link Car} service-related events. */
+    public interface OnCarServiceListener {
+        /**
+         * Callback to be run when {@link Car} service is connected and {@link
+         * CarPropertyManager} becomes available.
+         */
+        void handleServiceConnected(CarPropertyManager carPropertyManager);
+
+        /** Callback to be run when {@link Car} service is disconnected. */
+        void handleServiceDisconnected();
+    }
+}
diff --git a/src/com/android/car/settings/units/Unit.java b/src/com/android/car/settings/units/Unit.java
new file mode 100644
index 0000000..bc5e9b7
--- /dev/null
+++ b/src/com/android/car/settings/units/Unit.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.annotation.StringRes;
+import android.car.VehicleUnit;
+
+/**
+ * Contains properties and methods associated with each unit defined in {@link
+ * android.car.VehicleUnit}.
+ */
+public class Unit {
+    private final int mId;
+    private final int mAbbreviationResId;
+    private final int mNameResId;
+
+    Unit(@VehicleUnit.Enum int unitId, @StringRes int unitAbbreviationResId,
+            @StringRes int unitNameResId) {
+        mId = unitId;
+        mAbbreviationResId = unitAbbreviationResId;
+        mNameResId = unitNameResId;
+    }
+
+    public int getId() {
+        return mId;
+    }
+
+    public int getAbbreviationResId() {
+        return mAbbreviationResId;
+    }
+
+    public int getNameResId() {
+        return mNameResId;
+    }
+}
diff --git a/src/com/android/car/settings/units/UnitsBasePreferenceController.java b/src/com/android/car/settings/units/UnitsBasePreferenceController.java
new file mode 100644
index 0000000..8d9066e
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsBasePreferenceController.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.android.car.settings.units;
+
+import android.car.CarNotConnectedException;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.property.CarPropertyManager;
+import android.content.Context;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * Shared business logic for preference controllers related to Units.
+ */
+public abstract class UnitsBasePreferenceController extends PreferenceController<ListPreference> {
+
+    @VisibleForTesting
+    protected final CarUnitsManager.OnCarServiceListener mOnCarServiceListener =
+            new CarUnitsManager.OnCarServiceListener() {
+                @Override
+                public void handleServiceConnected(CarPropertyManager carPropertyManager) {
+                    try {
+                        if (carPropertyManager != null) {
+                            carPropertyManager.registerCallback(mCarPropertyEventCallback,
+                                    getPropertyId(), CarPropertyManager.SENSOR_RATE_ONCHANGE);
+                        }
+                        mSupportedUnits = mCarUnitsManager.getUnitsSupportedByProperty(
+                                getPropertyId());
+                        if (mSupportedUnits != null && mSupportedUnits.length > 0) {
+                            // first element in the config array is the default Unit per VHAL spec.
+                            mDefaultUnit = mSupportedUnits[0];
+                            getPreference().setEntries(getEntriesOfSupportedUnits());
+                            getPreference().setEntryValues(getIdsOfSupportedUnits());
+                            getPreference().setValue(
+                                    Integer.toString(getUnitUsedByThisProperty().getId()));
+                            refreshUi();
+                        }
+
+                        mIsCarUnitsManagerStarted = true;
+                    } catch (CarNotConnectedException e) {
+                    }
+                }
+
+                @Override
+                public void handleServiceDisconnected() {
+                    mIsCarUnitsManagerStarted = false;
+                }
+            };
+
+    @VisibleForTesting
+    protected final CarPropertyManager.CarPropertyEventCallback mCarPropertyEventCallback =
+            new CarPropertyManager.CarPropertyEventCallback() {
+                @Override
+                public void onChangeEvent(CarPropertyValue value) {
+                    if (value != null && value.getStatus() == CarPropertyValue.STATUS_AVAILABLE) {
+                        mUnitBeingUsed = UnitsMap.MAP.get(value.getValue());
+                        refreshUi();
+                    }
+                }
+
+                @Override
+                public void onErrorEvent(int propId, int zone) {
+                }
+            };
+
+    private Unit[] mSupportedUnits;
+    private Unit mUnitBeingUsed;
+    private Unit mDefaultUnit;
+    private boolean mIsCarUnitsManagerStarted = false;
+    private CarUnitsManager mCarUnitsManager;
+
+    public UnitsBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    @CallSuper
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+        mCarUnitsManager = new CarUnitsManager(getContext());
+        mCarUnitsManager.connect();
+        mCarUnitsManager.registerCarServiceListener(mOnCarServiceListener);
+    }
+
+    @Override
+    @CallSuper
+    protected void onDestroyInternal() {
+        super.onDestroyInternal();
+        mCarUnitsManager.disconnect();
+        mCarUnitsManager.unregisterCarServiceListener();
+    }
+
+    @Override
+    @CallSuper
+    protected void updateState(ListPreference preference) {
+        if (mIsCarUnitsManagerStarted && mUnitBeingUsed != null) {
+            preference.setSummary(generateSummaryFromUnit(mUnitBeingUsed));
+            preference.setValue(Integer.toString(mUnitBeingUsed.getId()));
+        }
+    }
+
+    @Override
+    @CallSuper
+    public boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+        int unitId = Integer.parseInt((String) newValue);
+        mCarUnitsManager.setUnitUsedByProperty(getPropertyId(), unitId);
+        return true;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return mSupportedUnits != null && mSupportedUnits.length > 0
+                ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+
+    protected abstract int getPropertyId();
+
+    protected String[] getEntriesOfSupportedUnits() {
+        String[] names = new String[mSupportedUnits.length];
+        for (int i = 0; i < names.length; i++) {
+            Unit unit = mSupportedUnits[i];
+            names[i] = generateEntryStringFromUnit(unit);
+        }
+        return names;
+    }
+
+    protected String generateSummaryFromUnit(Unit unit) {
+        return getContext().getString(unit.getAbbreviationResId());
+    }
+
+    protected String generateEntryStringFromUnit(Unit unit) {
+        return getContext().getString(R.string.units_list_entry,
+                getContext().getString(unit.getAbbreviationResId()),
+                getContext().getString(unit.getNameResId()));
+    }
+
+    protected String[] getIdsOfSupportedUnits() {
+        String[] ids = new String[mSupportedUnits.length];
+        for (int i = 0; i < ids.length; i++) {
+            ids[i] = Integer.toString(mSupportedUnits[i].getId());
+        }
+        return ids;
+    }
+
+    protected CarUnitsManager getCarUnitsManager() {
+        return mCarUnitsManager;
+    }
+
+    private Unit getUnitUsedByThisProperty() {
+        Unit savedUnit = mCarUnitsManager.getUnitUsedByProperty(getPropertyId());
+        if (savedUnit == null) {
+            return mDefaultUnit;
+        }
+        return savedUnit;
+    }
+
+}
diff --git a/src/com/android/car/settings/units/UnitsDistancePreferenceController.java b/src/com/android/car/settings/units/UnitsDistancePreferenceController.java
new file mode 100644
index 0000000..cc69797
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsDistancePreferenceController.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehiclePropertyIds;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Controls {@link Unit} used for Distance Display. */
+public class UnitsDistancePreferenceController extends UnitsBasePreferenceController {
+
+    public UnitsDistancePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected int getPropertyId() {
+        return VehiclePropertyIds.DISTANCE_DISPLAY_UNITS;
+    }
+
+}
diff --git a/src/com/android/car/settings/units/UnitsEnergyConsumptionPreferenceController.java b/src/com/android/car/settings/units/UnitsEnergyConsumptionPreferenceController.java
new file mode 100644
index 0000000..00b763b
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsEnergyConsumptionPreferenceController.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehiclePropertyIds;
+import android.car.VehicleUnit;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/** Controls {@link Unit} used for Energy Consumption Display. */
+public class UnitsEnergyConsumptionPreferenceController extends UnitsBasePreferenceController {
+
+    private final String mKWh;
+
+    public UnitsEnergyConsumptionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mKWh = getContext().getString(UnitsMap.KILOWATT_HOUR.getAbbreviationResId());
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected int getPropertyId() {
+        return VehiclePropertyIds.EV_BATTERY_DISPLAY_UNITS;
+    }
+
+    @Override
+    protected String generateSummaryFromUnit(Unit unit) {
+        return getAbbreviationByUnit(unit);
+    }
+
+    @Override
+    protected String generateEntryStringFromUnit(Unit unit) {
+        int unitNameResId;
+        switch (unit.getId()) {
+            case VehicleUnit.MILE:
+                unitNameResId = R.string.units_unit_name_kilowatt_per_hundred_miles;
+                break;
+            default:
+                unitNameResId = R.string.units_unit_name_kilowatt_per_hundred_kilometers;
+        }
+
+        return getContext().getString(R.string.units_list_entry, getAbbreviationByUnit(unit),
+                getContext().getString(unitNameResId));
+
+    }
+
+    private String getAbbreviationByUnit(Unit unit) {
+        int quantity = 100;
+        String denominator = getContext().getString(R.string.units_ratio_denominator, quantity,
+                getContext().getString(unit.getAbbreviationResId()));
+
+        return getContext().getString(R.string.units_ratio, mKWh, denominator);
+    }
+}
diff --git a/src/com/android/car/settings/units/UnitsFuelConsumptionPreferenceController.java b/src/com/android/car/settings/units/UnitsFuelConsumptionPreferenceController.java
new file mode 100644
index 0000000..95e7f70
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsFuelConsumptionPreferenceController.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehiclePropertyIds;
+import android.car.VehicleUnit;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/** Controls {@link Unit} used for Fuel Consumption Display. */
+public class UnitsFuelConsumptionPreferenceController extends UnitsBasePreferenceController {
+
+    public UnitsFuelConsumptionPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected int getPropertyId() {
+        return VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS;
+    }
+
+    @Override
+    protected String generateSummaryFromUnit(Unit unit) {
+        return getAbbreviationByVolumeUnit(unit);
+    }
+
+    @Override
+    protected String generateEntryStringFromUnit(Unit unit) {
+        return getContext().getString(R.string.units_list_entry, getAbbreviationByVolumeUnit(unit),
+                getPronouncedNameByVolumeUnit(unit));
+    }
+
+    private String getAbbreviationByVolumeUnit(Unit unit) {
+        String abbreviation;
+        switch (unit.getId()) {
+            case VehicleUnit.US_GALLON:
+                abbreviation = getContext().getString(
+                        R.string.units_unit_abbreviation_miles_per_gallon_us);
+                break;
+            case VehicleUnit.IMPERIAL_GALLON:
+                abbreviation = getContext().getString(
+                        R.string.units_unit_abbreviation_miles_per_gallon_uk);
+                break;
+            default:
+                if (getCarUnitsManager().isDistanceOverVolume()) {
+                    abbreviation = getContext().getString(
+                            R.string.units_unit_abbreviation_kilometers_per_liter);
+                } else {
+                    abbreviation = getContext().getString(
+                            R.string.units_unit_abbreviation_liters_per_hundred_kilometers);
+                }
+        }
+        return abbreviation;
+    }
+
+    private String getPronouncedNameByVolumeUnit(Unit unit) {
+        String pronounced;
+        switch (unit.getId()) {
+            case VehicleUnit.US_GALLON:
+                pronounced = getContext().getString(R.string.units_unit_name_miles_per_gallon_us);
+                break;
+            case VehicleUnit.IMPERIAL_GALLON:
+                pronounced = getContext().getString(R.string.units_unit_name_miles_per_gallon_uk);
+                break;
+            default:
+                if (getCarUnitsManager().isDistanceOverVolume()) {
+                    pronounced = getContext().getString(
+                            R.string.units_unit_name_kilometers_per_liter);
+                } else {
+                    pronounced = getContext().getString(
+                            R.string.units_unit_name_liter_per_hundred_kilometers);
+                }
+        }
+        return pronounced;
+    }
+}
diff --git a/src/com/android/car/settings/units/UnitsMap.java b/src/com/android/car/settings/units/UnitsMap.java
new file mode 100644
index 0000000..12264de
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsMap.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehicleUnit;
+
+import com.android.car.settings.R;
+
+import java.util.HashMap;
+
+/**
+ * Contains {@link Unit} instances for all units defined in {@link VehicleUnit}. This mapping is
+ * safe because OEMs cannot define their own VehicleUnit.
+ */
+public final class UnitsMap {
+    protected static final Unit METER_PER_SEC = new Unit(VehicleUnit.METER_PER_SEC,
+            R.string.units_unit_abbreviation_meter_per_sec, R.string.units_unit_name_meter_per_sec);
+    protected static final Unit RPM = new Unit(VehicleUnit.RPM,
+            R.string.units_unit_abbreviation_rpm, R.string.units_unit_name_rpm);
+    protected static final Unit HERTZ = new Unit(VehicleUnit.HERTZ,
+            R.string.units_unit_abbreviation_hertz, R.string.units_unit_name_hertz);
+    protected static final Unit PERCENTILE = new Unit(VehicleUnit.PERCENTILE,
+            R.string.units_unit_abbreviation_percentile, R.string.units_unit_name_percentile);
+    protected static final Unit MILLIMETER = new Unit(VehicleUnit.MILLIMETER,
+            R.string.units_unit_abbreviation_millimeter, R.string.units_unit_name_millimeter);
+    protected static final Unit METER = new Unit(VehicleUnit.METER,
+            R.string.units_unit_abbreviation_meter, R.string.units_unit_name_meter);
+    protected static final Unit KILOMETER = new Unit(VehicleUnit.KILOMETER,
+            R.string.units_unit_abbreviation_kilometer, R.string.units_unit_name_kilometer);
+    protected static final Unit MILE = new Unit(VehicleUnit.MILE,
+            R.string.units_unit_abbreviation_mile, R.string.units_unit_name_mile);
+    protected static final Unit CELSIUS = new Unit(VehicleUnit.CELSIUS,
+            R.string.units_unit_abbreviation_celsius, R.string.units_unit_name_celsius);
+    protected static final Unit FAHRENHEIT = new Unit(VehicleUnit.FAHRENHEIT,
+            R.string.units_unit_abbreviation_fahrenheit, R.string.units_unit_name_fahrenheit);
+    protected static final Unit KELVIN = new Unit(VehicleUnit.KELVIN,
+            R.string.units_unit_abbreviation_kelvin, R.string.units_unit_name_kelvin);
+    protected static final Unit MILLILITER = new Unit(VehicleUnit.MILLILITER,
+            R.string.units_unit_abbreviation_milliliter, R.string.units_unit_name_milliliter);
+    protected static final Unit LITER = new Unit(VehicleUnit.LITER,
+            R.string.units_unit_abbreviation_liter, R.string.units_unit_name_liter);
+    protected static final Unit US_GALLON = new Unit(VehicleUnit.US_GALLON,
+            R.string.units_unit_abbreviation_us_gallon, R.string.units_unit_name_us_gallon);
+    protected static final Unit IMPERIAL_GALLON = new Unit(VehicleUnit.IMPERIAL_GALLON,
+            R.string.units_unit_abbreviation_imperial_gallon,
+            R.string.units_unit_name_imperial_gallon);
+    protected static final Unit NANO_SECS = new Unit(VehicleUnit.NANO_SECS,
+            R.string.units_unit_abbreviation_nano_secs, R.string.units_unit_name_nano_secs);
+    protected static final Unit SECS = new Unit(VehicleUnit.SECS,
+            R.string.units_unit_abbreviation_secs, R.string.units_unit_name_secs);
+    protected static final Unit YEAR = new Unit(VehicleUnit.YEAR,
+            R.string.units_unit_abbreviation_year, R.string.units_unit_name_year);
+    protected static final Unit KILOPASCAL = new Unit(VehicleUnit.KILOPASCAL,
+            R.string.units_unit_abbreviation_kilopascal, R.string.units_unit_name_kilopascal);
+    protected static final Unit WATT_HOUR = new Unit(VehicleUnit.WATT_HOUR,
+            R.string.units_unit_abbreviation_watt_hour, R.string.units_unit_name_watt_hour);
+    protected static final Unit MILLIAMPERE = new Unit(VehicleUnit.MILLIAMPERE,
+            R.string.units_unit_abbreviation_milliampere, R.string.units_unit_name_milliampere);
+    protected static final Unit MILLIVOLT = new Unit(VehicleUnit.MILLIVOLT,
+            R.string.units_unit_abbreviation_millivolt, R.string.units_unit_name_millivolt);
+    protected static final Unit MILLIWATTS = new Unit(VehicleUnit.MILLIWATTS,
+            R.string.units_unit_abbreviation_milliwatts, R.string.units_unit_name_milliwatts);
+    protected static final Unit AMPERE_HOURS = new Unit(VehicleUnit.AMPERE_HOURS,
+            R.string.units_unit_abbreviation_ampere_hour, R.string.units_unit_name_ampere_hour);
+    protected static final Unit KILOWATT_HOUR = new Unit(VehicleUnit.KILOWATT_HOUR,
+            R.string.units_unit_abbreviation_kilowatt_hour, R.string.units_unit_name_kilowatt_hour);
+    protected static final Unit PSI = new Unit(VehicleUnit.PSI,
+            R.string.units_unit_abbreviation_psi, R.string.units_unit_name_psi);
+    protected static final Unit BAR = new Unit(VehicleUnit.BAR,
+            R.string.units_unit_abbreviation_bar, R.string.units_unit_name_bar);
+    protected static final Unit DEGREES = new Unit(VehicleUnit.DEGREES,
+            R.string.units_unit_abbreviation_degrees, R.string.units_unit_name_degrees);
+    protected static final Unit MILES_PER_HOUR = new Unit(VehicleUnit.MILES_PER_HOUR,
+            R.string.units_unit_abbreviation_miles_per_hour,
+            R.string.units_unit_name_miles_per_hour);
+    protected static final Unit KILOMETERS_PER_HOUR = new Unit(VehicleUnit.KILOMETERS_PER_HOUR,
+            R.string.units_unit_abbreviation_kilometers_per_hour,
+            R.string.units_unit_name_kilometers_per_hour);
+
+    public static final HashMap<Integer, Unit> MAP = createMap();
+
+    private static HashMap<Integer, Unit> createMap() {
+        HashMap<Integer, Unit> map = new HashMap();
+        map.put(VehicleUnit.METER_PER_SEC, METER_PER_SEC);
+        map.put(VehicleUnit.RPM, RPM);
+        map.put(VehicleUnit.HERTZ, HERTZ);
+        map.put(VehicleUnit.PERCENTILE, PERCENTILE);
+        map.put(VehicleUnit.MILLIMETER, MILLIMETER);
+        map.put(VehicleUnit.METER, METER);
+        map.put(VehicleUnit.KILOMETER, KILOMETER);
+        map.put(VehicleUnit.MILE, MILE);
+        map.put(VehicleUnit.CELSIUS, CELSIUS);
+        map.put(VehicleUnit.FAHRENHEIT, FAHRENHEIT);
+        map.put(VehicleUnit.KELVIN, KELVIN);
+        map.put(VehicleUnit.MILLILITER, MILLILITER);
+        map.put(VehicleUnit.LITER, LITER);
+        map.put(VehicleUnit.US_GALLON, US_GALLON);
+        map.put(VehicleUnit.IMPERIAL_GALLON, IMPERIAL_GALLON);
+        map.put(VehicleUnit.NANO_SECS, NANO_SECS);
+        map.put(VehicleUnit.SECS, SECS);
+        map.put(VehicleUnit.YEAR, YEAR);
+        map.put(VehicleUnit.KILOPASCAL, KILOPASCAL);
+        map.put(VehicleUnit.WATT_HOUR, WATT_HOUR);
+        map.put(VehicleUnit.MILLIAMPERE, MILLIAMPERE);
+        map.put(VehicleUnit.MILLIVOLT, MILLIVOLT);
+        map.put(VehicleUnit.MILLIWATTS, MILLIWATTS);
+        map.put(VehicleUnit.AMPERE_HOURS, AMPERE_HOURS);
+        map.put(VehicleUnit.KILOWATT_HOUR, KILOWATT_HOUR);
+        map.put(VehicleUnit.PSI, PSI);
+        map.put(VehicleUnit.BAR, BAR);
+        map.put(VehicleUnit.DEGREES, DEGREES);
+        map.put(VehicleUnit.MILES_PER_HOUR, MILES_PER_HOUR);
+        map.put(VehicleUnit.KILOMETERS_PER_HOUR, KILOMETERS_PER_HOUR);
+
+        return map;
+    }
+
+    private UnitsMap() {
+    }
+}
diff --git a/src/com/android/car/settings/units/UnitsPressurePreferenceController.java b/src/com/android/car/settings/units/UnitsPressurePreferenceController.java
new file mode 100644
index 0000000..51da7d6
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsPressurePreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehiclePropertyIds;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Controls {@link Unit} used for Pressure Display. */
+public class UnitsPressurePreferenceController extends UnitsBasePreferenceController {
+
+    public UnitsPressurePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected int getPropertyId() {
+        return VehiclePropertyIds.TIRE_PRESSURE_DISPLAY_UNITS;
+    }
+}
diff --git a/src/com/android/car/settings/units/UnitsSettingsFragment.java b/src/com/android/car/settings/units/UnitsSettingsFragment.java
new file mode 100644
index 0000000..7c0bed9
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsSettingsFragment.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import androidx.annotation.LayoutRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Fragment to host Units-related preferences. */
+public class UnitsSettingsFragment extends SettingsFragment {
+
+    @Override
+    @LayoutRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.units_fragment;
+    }
+
+}
diff --git a/src/com/android/car/settings/units/UnitsSpeedPreferenceController.java b/src/com/android/car/settings/units/UnitsSpeedPreferenceController.java
new file mode 100644
index 0000000..120a3d0
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsSpeedPreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehiclePropertyIds;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Controls {@link Unit} used for Speed Display. */
+public class UnitsSpeedPreferenceController extends UnitsBasePreferenceController {
+
+    public UnitsSpeedPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected int getPropertyId() {
+        return VehiclePropertyIds.VEHICLE_SPEED_DISPLAY_UNITS;
+    }
+}
diff --git a/src/com/android/car/settings/units/UnitsTemperaturePreferenceController.java b/src/com/android/car/settings/units/UnitsTemperaturePreferenceController.java
new file mode 100644
index 0000000..72dbdff
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsTemperaturePreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehiclePropertyIds;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Controls {@link Unit} used for HVAC Temperature Display. */
+public class UnitsTemperaturePreferenceController extends UnitsBasePreferenceController {
+
+    public UnitsTemperaturePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected int getPropertyId() {
+        return VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS;
+    }
+}
diff --git a/src/com/android/car/settings/units/UnitsVolumePreferenceController.java b/src/com/android/car/settings/units/UnitsVolumePreferenceController.java
new file mode 100644
index 0000000..5c7ab2b
--- /dev/null
+++ b/src/com/android/car/settings/units/UnitsVolumePreferenceController.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import android.car.VehiclePropertyIds;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Controls {@link Unit} used for Volume Display. */
+public class UnitsVolumePreferenceController extends UnitsBasePreferenceController {
+
+    public UnitsVolumePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected int getPropertyId() {
+        return VehiclePropertyIds.FUEL_VOLUME_DISPLAY_UNITS;
+    }
+
+}
diff --git a/src/com/android/car/settings/users/AddNewUserTask.java b/src/com/android/car/settings/users/AddNewUserTask.java
index 29f9384..281542d 100644
--- a/src/com/android/car/settings/users/AddNewUserTask.java
+++ b/src/com/android/car/settings/users/AddNewUserTask.java
@@ -16,7 +16,7 @@
 
 package com.android.car.settings.users;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
 import android.content.pm.UserInfo;
 import android.os.AsyncTask;
 
@@ -34,21 +34,19 @@
 
     @Override
     protected UserInfo doInBackground(String... userNames) {
-        // Default to create a non admin user for now. Need to add logic
-        // for user to choose whether they want to create an admin or non-admin
-        // user later.
         return mCarUserManagerHelper.createNewNonAdminUser(userNames[0]);
     }
 
     @Override
-    protected void onPreExecute() {
-    }
+    protected void onPreExecute() { }
 
     @Override
     protected void onPostExecute(UserInfo user) {
-        mAddNewUserListener.onUserAdded();
         if (user != null) {
+            mAddNewUserListener.onUserAddedSuccess();
             mCarUserManagerHelper.switchToUser(user);
+        } else {
+            mAddNewUserListener.onUserAddedFailure();
         }
     }
 
@@ -57,8 +55,13 @@
      */
     public interface AddNewUserListener {
         /**
-         * Invoked in AddNewUserTask.onPostExecute after the task has been completed.
+         * Invoked in AddNewUserTask.onPostExecute after the user has been created successfully.
          */
-        void onUserAdded();
+        void onUserAddedSuccess();
+
+        /**
+         * Invoked in AddNewUserTask.onPostExecute if new user creation failed.
+         */
+        void onUserAddedFailure();
     }
 }
diff --git a/src/com/android/car/settings/users/ChooseNewAdminFragment.java b/src/com/android/car/settings/users/ChooseNewAdminFragment.java
new file mode 100644
index 0000000..09ff61e
--- /dev/null
+++ b/src/com/android/car/settings/users/ChooseNewAdminFragment.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static java.util.Objects.requireNonNull;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * This screen appears after the last admin on the device tries to delete themselves. (but only if
+ * there are other users on the device)
+ *
+ * <p> It lets the Admin see a list of non-Admins on the device and choose a user from the list to
+ * upgrade to Admin.
+ *
+ * <p> After new admin has been selected and upgraded, the old Admin is removed.
+ */
+public class ChooseNewAdminFragment extends SettingsFragment {
+
+    /**
+     * Creates a new instance of {@link ChooseNewAdminFragment} that enables the last remaining
+     * admin to choose a new Admin from a list of Non-Admins.
+     *
+     * @param adminInfo Admin that will get removed after new admin has been designated.
+     */
+    public static ChooseNewAdminFragment newInstance(UserInfo adminInfo) {
+        ChooseNewAdminFragment usersListFragment = new ChooseNewAdminFragment();
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(Intent.EXTRA_USER, adminInfo);
+        usersListFragment.setArguments(bundle);
+        return usersListFragment;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.choose_new_admin_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        UserInfo adminInfo = requireNonNull(getArguments()).getParcelable(
+                Intent.EXTRA_USER);
+        use(ChooseNewAdminPreferenceController.class, R.string.pk_choose_new_admin).setAdminInfo(
+                adminInfo);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        Button cancelBtn = getActivity().findViewById(R.id.action_button1);
+        cancelBtn.setVisibility(View.VISIBLE);
+        cancelBtn.setText(R.string.cancel);
+        cancelBtn.setOnClickListener(v -> getActivity().onBackPressed());
+    }
+}
diff --git a/src/com/android/car/settings/users/ChooseNewAdminPreferenceController.java b/src/com/android/car/settings/users/ChooseNewAdminPreferenceController.java
new file mode 100644
index 0000000..975f5a4
--- /dev/null
+++ b/src/com/android/car/settings/users/ChooseNewAdminPreferenceController.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.ErrorDialog;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Business logic for when the last admin is about to be removed from the device and a new
+ * administrator needs to be chosen.
+ */
+public class ChooseNewAdminPreferenceController extends UsersBasePreferenceController {
+
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        UserInfo userToMakeAdmin = (UserInfo) arguments.get(
+                UsersDialogProvider.KEY_USER_TO_MAKE_ADMIN);
+        assignNewAdminAndRemoveOldAdmin(userToMakeAdmin);
+        getFragmentController().goBack();
+    };
+
+    private UserInfo mAdminInfo;
+
+    public ChooseNewAdminPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        getPreferenceProvider().setIncludeCurrentUser(false);
+        getPreferenceProvider().setIncludeGuest(false);
+    }
+
+    /** Setter for the user info of the admin we're deleting. */
+    public void setAdminInfo(UserInfo adminInfo) {
+        mAdminInfo = adminInfo;
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mAdminInfo == null) {
+            throw new IllegalStateException("Admin info should be set by this point");
+        }
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+        ConfirmationDialogFragment dialogFragment =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG);
+
+        ConfirmationDialogFragment.resetListeners(dialogFragment,
+                mConfirmListener, /* rejectListener= */ null);
+    }
+
+    @Override
+    protected void userClicked(UserInfo userToMakeAdmin) {
+
+        ConfirmationDialogFragment dialogFragment =
+                UsersDialogProvider.getConfirmGrantAdminDialogFragment(getContext(),
+                        mConfirmListener, /* rejectListener= */ null, userToMakeAdmin);
+
+        getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
+    }
+
+    @VisibleForTesting
+    void assignNewAdminAndRemoveOldAdmin(UserInfo userToMakeAdmin) {
+        getCarUserManagerHelper().grantAdminPermissions(userToMakeAdmin);
+        removeOldAdmin();
+    }
+
+    private void removeOldAdmin() {
+        if (!getCarUserManagerHelper().removeUser(mAdminInfo,
+                getContext().getString(R.string.user_guest))) {
+            // If failed, need to show error dialog for users.
+            getFragmentController().showDialog(
+                    ErrorDialog.newInstance(R.string.delete_user_error_title), /* tag= */ null);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/users/ConfirmCreateNewUserDialog.java b/src/com/android/car/settings/users/ConfirmCreateNewUserDialog.java
deleted file mode 100644
index 41037dd..0000000
--- a/src/com/android/car/settings/users/ConfirmCreateNewUserDialog.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.users;
-
-import static android.content.DialogInterface.BUTTON_NEGATIVE;
-import static android.content.DialogInterface.BUTTON_POSITIVE;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-import androidx.car.app.CarAlertDialog;
-import androidx.fragment.app.DialogFragment;
-import androidx.fragment.app.Fragment;
-
-import com.android.car.settings.R;
-
-/**
- * Dialog to confirm creation of new user.
- */
-public class ConfirmCreateNewUserDialog extends DialogFragment implements
-        DialogInterface.OnClickListener {
-    private static final String DIALOG_TAG = "ConfirmCreateNewUserDialog";
-    private ConfirmCreateNewUserListener mCreateListener;
-    private CancelCreateNewUserListener mCancelListener;
-
-    /**
-     * Interface for listeners that want to receive a callback when user confirms new user creation
-     * in the dialog.
-     */
-    public interface ConfirmCreateNewUserListener {
-        void onCreateNewUserConfirmed();
-    }
-
-    /**
-     * Interface for listeners that want to receive a callback when user cancels new user creation
-     * in the dialog.
-     */
-    public interface CancelCreateNewUserListener {
-        void onCreateNewUserCancelled();
-    }
-
-    /**
-     * Shows the dialog.
-     *
-     * @param parent Fragment associated with the dialog.
-     */
-    public void show(Fragment parent) {
-        setTargetFragment(parent, 0);
-        show(parent.getFragmentManager(), DIALOG_TAG);
-    }
-
-    /**
-     * Sets a listener for OnCreateNewUserConfirmed that will get called if user confirms
-     * the dialog.
-     *
-     * @param listener Instance of {@link ConfirmCreateNewUserListener} to call when confirmed.
-     */
-    public void setConfirmCreateNewUserListener(ConfirmCreateNewUserListener listener) {
-        mCreateListener = listener;
-    }
-
-    /**
-     * Sets a listener for OnCancelNewUserConfirmed that will get called if user cancels
-     * the dialog.
-     *
-     * @param listener Instance of {@link CancelCreateNewUserListener} to call when user presses
-     * cancel.
-     */
-    public void setCancelCreateNewUserListener(CancelCreateNewUserListener listener) {
-        mCancelListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        String message = getString(R.string.user_add_user_message_setup)
-                .concat(System.getProperty("line.separator"))
-                .concat(System.getProperty("line.separator"))
-                .concat(getString(R.string.user_add_user_message_update));
-
-        return new CarAlertDialog.Builder(getContext())
-                .setTitle(R.string.user_add_user_title)
-                .setBody(message)
-                .setNegativeButton(android.R.string.cancel, this)
-                .setPositiveButton(android.R.string.ok, this)
-                .create();
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (which == BUTTON_POSITIVE) {
-            if (mCreateListener != null) {
-                mCreateListener.onCreateNewUserConfirmed();
-            }
-        } else if (which == BUTTON_NEGATIVE) {
-            if (mCancelListener != null) {
-                mCancelListener.onCreateNewUserCancelled();
-            }
-        }
-
-        dialog.dismiss();
-    }
-}
diff --git a/src/com/android/car/settings/users/ConfirmExitRetailModeDialog.java b/src/com/android/car/settings/users/ConfirmExitRetailModeDialog.java
index eb48171..6a85227 100644
--- a/src/com/android/car/settings/users/ConfirmExitRetailModeDialog.java
+++ b/src/com/android/car/settings/users/ConfirmExitRetailModeDialog.java
@@ -16,11 +16,12 @@
 
 package com.android.car.settings.users;
 
+import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.os.Bundle;
 
-import androidx.car.app.CarAlertDialog;
+import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 
@@ -32,7 +33,8 @@
  */
 public class ConfirmExitRetailModeDialog extends DialogFragment implements
         DialogInterface.OnClickListener {
-    private static final String DIALOG_TAG = "ConfirmExitRetailModeDialog";
+    @VisibleForTesting
+    static final String DIALOG_TAG = "ConfirmExitRetailModeDialog";
     private ConfirmExitRetailModeListener mListener;
 
     /**
@@ -57,9 +59,9 @@
 
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new CarAlertDialog.Builder(getContext())
+        return new AlertDialog.Builder(getContext())
                 .setTitle(R.string.exit_retail_mode_dialog_title)
-                .setBody(R.string.exit_retail_mode_dialog_body)
+                .setMessage(R.string.exit_retail_mode_dialog_body)
                 .setPositiveButton(R.string.exit_retail_mode_dialog_confirmation_button_text, this)
                 .setNegativeButton(android.R.string.cancel, null)
                 .create();
diff --git a/src/com/android/car/settings/users/ConfirmRemoveUserDialog.java b/src/com/android/car/settings/users/ConfirmRemoveUserDialog.java
deleted file mode 100644
index 679e068..0000000
--- a/src/com/android/car/settings/users/ConfirmRemoveUserDialog.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.users;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.os.Bundle;
-
-import androidx.car.app.CarAlertDialog;
-import androidx.fragment.app.DialogFragment;
-
-import com.android.car.settings.R;
-
-/**
- * Dialog to confirm user removal.
- */
-public class ConfirmRemoveUserDialog extends DialogFragment {
-    private final DialogInterface.OnClickListener mDeleteUserListener = new OnClickListener() {
-        @Override
-        public void onClick(DialogInterface dialog, int which) {
-            if (mListener != null && which == DialogInterface.BUTTON_POSITIVE) {
-                mListener.onRemoveUserConfirmed();
-            }
-            dialog.dismiss();
-        }
-    };
-
-    private ConfirmRemoveUserListener mListener;
-
-    /**
-     * Sets a listener for OnRemoveUserConfirmed that will get called if user confirms
-     * the dialog.
-     *
-     * @param listener Instance of {@link ConfirmRemoveUserListener} to call when confirmed.
-     */
-    public void setConfirmRemoveUserListener(ConfirmRemoveUserListener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new CarAlertDialog.Builder(getContext())
-            .setTitle(R.string.really_remove_user_title)
-            .setBody(R.string.really_remove_user_message)
-            .setPositiveButton(R.string.delete_button, mDeleteUserListener)
-            .setNegativeButton(android.R.string.cancel, null)
-            .create();
-    }
-
-    /**
-     * Interface for listeners that want to receive a callback when user confirms user removal in a
-     * dialog.
-     */
-    public interface ConfirmRemoveUserListener {
-
-        /**
-         * Method called only when user presses delete button.
-         */
-        void onRemoveUserConfirmed();
-    }
-}
diff --git a/src/com/android/car/settings/users/EditUserNameEntryPreferenceController.java b/src/com/android/car/settings/users/EditUserNameEntryPreferenceController.java
new file mode 100644
index 0000000..0f72c48
--- /dev/null
+++ b/src/com/android/car/settings/users/EditUserNameEntryPreferenceController.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.FragmentController;
+
+/** Business logic for the preference which opens the EditUserNameFragment. */
+public class EditUserNameEntryPreferenceController extends
+        UserDetailsBasePreferenceController<ButtonPreference> {
+
+    public EditUserNameEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ButtonPreference> getPreferenceType() {
+        return ButtonPreference.class;
+    }
+
+    @Override
+    protected void updateState(ButtonPreference preference) {
+        preference.setOnButtonClickListener(pref -> {
+            getFragmentController().launchFragment(EditUsernameFragment.newInstance(getUserInfo()));
+        });
+
+        Drawable icon = new UserIconProvider(getCarUserManagerHelper()).getUserIcon(getUserInfo(),
+                getContext());
+        preference.setIcon(icon);
+        preference.setTitle(UserUtils.getUserDisplayName(getContext(), getCarUserManagerHelper(),
+                getUserInfo()));
+
+        if (!getCarUserManagerHelper().isCurrentProcessUser(getUserInfo())) {
+            preference.showAction(false);
+        }
+        preference.setSummary(getSummary());
+    }
+
+    private CharSequence getSummary() {
+        if (!getUserInfo().isInitialized()) {
+            return getContext().getString(R.string.user_summary_not_set_up);
+        }
+        if (getUserInfo().isAdmin()) {
+            return getCarUserManagerHelper().isCurrentProcessUser(getUserInfo())
+                    ? getContext().getString(R.string.signed_in_admin_user)
+                    : getContext().getString(R.string.user_admin);
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/users/EditUsernameFragment.java b/src/com/android/car/settings/users/EditUsernameFragment.java
index e3d969a..03312c8 100644
--- a/src/com/android/car/settings/users/EditUsernameFragment.java
+++ b/src/com/android/car/settings/users/EditUsernameFragment.java
@@ -15,27 +15,32 @@
  */
 package com.android.car.settings.users;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Intent;
 import android.content.pm.UserInfo;
 import android.os.Bundle;
 import android.provider.Settings;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.view.View;
 import android.widget.Button;
+import android.widget.EditText;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
 import com.android.car.settingslib.util.SettingsConstants;
 
-import com.google.android.material.textfield.TextInputEditText;
-
 /**
  * Enables user to edit their username.
  */
 public class EditUsernameFragment extends BaseFragment {
-    public static final String EXTRA_USER_INFO = "extra_user_info";
     private UserInfo mUserInfo;
 
-    private TextInputEditText mUserNameEditText;
+    private EditText mUserNameEditText;
     private Button mOkButton;
     private Button mCancelButton;
     private CarUserManagerHelper mCarUserManagerHelper;
@@ -46,24 +51,39 @@
     public static EditUsernameFragment newInstance(UserInfo userInfo) {
         EditUsernameFragment
                 userSettingsFragment = new EditUsernameFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_TITLE_ID, R.string.edit_user_name_title);
-        bundle.putParcelable(EXTRA_USER_INFO, userInfo);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.edit_username_fragment);
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(Intent.EXTRA_USER, userInfo);
         userSettingsFragment.setArguments(bundle);
         return userSettingsFragment;
     }
 
     @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return R.layout.edit_username_fragment;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return R.string.edit_user_name_title;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mUserInfo = getArguments().getParcelable(EXTRA_USER_INFO);
+        mUserInfo = getArguments().getParcelable(Intent.EXTRA_USER);
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        mUserNameEditText = (TextInputEditText) view.findViewById(R.id.user_name_text_edit);
+        mUserNameEditText = view.findViewById(R.id.user_name_text_edit);
     }
 
     @Override
@@ -71,9 +91,9 @@
         super.onActivityCreated(savedInstanceState);
         mCarUserManagerHelper = new CarUserManagerHelper(getContext());
 
-        configureUsernameEditing();
         showOkButton();
         showCancelButton();
+        configureUsernameEditing();
     }
 
     private void configureUsernameEditing() {
@@ -81,11 +101,34 @@
         mUserNameEditText.setText(mUserInfo.name);
         mUserNameEditText.setEnabled(true);
         mUserNameEditText.setSelectAllOnFocus(true);
+        mUserNameEditText.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                if (TextUtils.isEmpty(s)) {
+                    mOkButton.setEnabled(false);
+                    mUserNameEditText.setError(getString(R.string.name_input_blank_error));
+                } else if (!TextUtils.isGraphic(s)) {
+                    mOkButton.setEnabled(false);
+                    mUserNameEditText.setError(getString(R.string.name_input_invalid_error));
+                } else {
+                    mOkButton.setEnabled(true);
+                    mUserNameEditText.setError(null);
+                }
+            }
+
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+            }
+        });
     }
 
     private void showOkButton() {
         // Configure OK button.
-        mOkButton = (Button) getActivity().findViewById(R.id.action_button2);
+        mOkButton = getActivity().findViewById(R.id.action_button2);
         mOkButton.setVisibility(View.VISIBLE);
         mOkButton.setText(android.R.string.ok);
         mOkButton.setOnClickListener(view -> {
@@ -99,7 +142,7 @@
 
     private void showCancelButton() {
         // Configure Cancel button.
-        mCancelButton = (Button) getActivity().findViewById(R.id.action_button1);
+        mCancelButton = getActivity().findViewById(R.id.action_button1);
         mCancelButton.setVisibility(View.VISIBLE);
         mCancelButton.setText(android.R.string.cancel);
         mCancelButton.setOnClickListener(view -> {
diff --git a/src/com/android/car/settings/users/GuestFragment.java b/src/com/android/car/settings/users/GuestFragment.java
deleted file mode 100644
index eaec0d5..0000000
--- a/src/com/android/car/settings/users/GuestFragment.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.users;
-
-import android.car.user.CarUserManagerHelper;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Shows details for a guest session, including ability to switch to guest.
- */
-public class GuestFragment extends ListItemSettingsFragment {
-    private CarUserManagerHelper mCarUserManagerHelper;
-    private ListItemProvider mItemProvider;
-
-    /**
-     * Create new GuestFragment instance.
-     */
-    public static GuestFragment newInstance() {
-        GuestFragment guestFragment = new GuestFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.user_details_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        guestFragment.setArguments(bundle);
-        return guestFragment;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
-        mItemProvider = new ListItemProvider.ListProvider(getListItems());
-
-        // Super class's onActivityCreated need to be called after mItemProvider is initialized.
-        // Because getItemProvider is called in there.
-        super.onActivityCreated(savedInstanceState);
-
-        showSwitchButton();
-    }
-
-    private void showSwitchButton() {
-        Button switchUserBtn = (Button) getActivity().findViewById(R.id.action_button1);
-        // If the current process is not allowed to switch to another user, doe not show the switch
-        // button.
-        if (!mCarUserManagerHelper.canCurrentProcessSwitchUsers()) {
-            switchUserBtn.setVisibility(View.GONE);
-            return;
-        }
-        switchUserBtn.setVisibility(View.VISIBLE);
-        switchUserBtn.setText(R.string.user_switch);
-        switchUserBtn.setOnClickListener(v -> {
-            getActivity().onBackPressed();
-            mCarUserManagerHelper.startNewGuestSession(getContext().getString(R.string.user_guest));
-        });
-    }
-
-    private List<ListItem> getListItems() {
-        Drawable icon = UserIconProvider.scaleUserIcon(mCarUserManagerHelper.getGuestDefaultIcon(),
-                mCarUserManagerHelper, getContext());
-
-        TextListItem item = new TextListItem(getContext());
-        item.setPrimaryActionIcon(icon, /* useLargeIcon= */ false);
-        item.setTitle(getContext().getString(R.string.user_guest));
-
-        List<ListItem> items = new ArrayList<>();
-        items.add(item);
-        return items;
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-}
diff --git a/src/com/android/car/settings/users/MakeAdminPreferenceController.java b/src/com/android/car/settings/users/MakeAdminPreferenceController.java
new file mode 100644
index 0000000..0b93bbc
--- /dev/null
+++ b/src/com/android/car/settings/users/MakeAdminPreferenceController.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+
+/** Business Logic for preference which promotes a regular user to an admin user. */
+public class MakeAdminPreferenceController extends
+        UserDetailsBasePreferenceController<ButtonPreference> {
+
+    @VisibleForTesting
+    final ConfirmationDialogFragment.ConfirmListener mConfirmListener =
+            arguments -> {
+                UserInfo userToMakeAdmin = (UserInfo) arguments.get(
+                        UsersDialogProvider.KEY_USER_TO_MAKE_ADMIN);
+                getCarUserManagerHelper().grantAdminPermissions(userToMakeAdmin);
+                getFragmentController().goBack();
+            };
+
+    public MakeAdminPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ButtonPreference> getPreferenceType() {
+        return ButtonPreference.class;
+    }
+
+
+    /** Ensure that the listener is reset if the dialog was open during a configuration change. */
+    @Override
+    protected void onCreateInternal() {
+        ConfirmationDialogFragment dialog =
+                (ConfirmationDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmationDialogFragment.TAG);
+
+        ConfirmationDialogFragment.resetListeners(dialog, mConfirmListener, /* rejectListener= */
+                null);
+    }
+
+    @Override
+    protected void updateState(ButtonPreference preference) {
+        preference.setOnButtonClickListener(pref -> {
+
+            ConfirmationDialogFragment dialogFragment =
+                    UsersDialogProvider.getConfirmGrantAdminDialogFragment(getContext(),
+                            mConfirmListener, /* rejectListener= */ null, getUserInfo());
+
+            getFragmentController().showDialog(dialogFragment, ConfirmationDialogFragment.TAG);
+        });
+
+        Drawable icon = new UserIconProvider(getCarUserManagerHelper()).getUserIcon(getUserInfo(),
+                getContext());
+        preference.setIcon(icon);
+    }
+}
diff --git a/src/com/android/car/settings/users/MaxUsersLimitReachedDialog.java b/src/com/android/car/settings/users/MaxUsersLimitReachedDialog.java
new file mode 100644
index 0000000..4a9927e
--- /dev/null
+++ b/src/com/android/car/settings/users/MaxUsersLimitReachedDialog.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.os.Bundle;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.R;
+
+/**
+ * Dialog to inform that user deletion failed and offers to retry.
+ */
+public class MaxUsersLimitReachedDialog extends DialogFragment {
+    @VisibleForTesting
+    static final String DIALOG_TAG = "MaxUsersLimitReachedDialog";
+    private final int mMaxUserLimit;
+
+    public MaxUsersLimitReachedDialog(int maxUserLimit) {
+        super();
+        mMaxUserLimit = maxUserLimit;
+    }
+
+    /**
+     * Shows the dialog.
+     *
+     * @param parent Fragment associated with the dialog.
+     */
+    public void show(Fragment parent) {
+        setTargetFragment(parent, 0);
+        show(parent.getFragmentManager(), DIALOG_TAG);
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        return new AlertDialog.Builder(getContext())
+                .setTitle(R.string.user_limit_reached_title)
+                .setMessage(getResources().getQuantityString(
+                        R.plurals.user_limit_reached_message, mMaxUserLimit, mMaxUserLimit))
+                .setPositiveButton(android.R.string.ok, null)
+                .create();
+    }
+}
diff --git a/src/com/android/car/settings/users/PermissionsPreferenceController.java b/src/com/android/car/settings/users/PermissionsPreferenceController.java
new file mode 100644
index 0000000..c918dbb
--- /dev/null
+++ b/src/com/android/car/settings/users/PermissionsPreferenceController.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.UserManager;
+
+import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Constructs and populates the permissions toggles for non admin users.
+ *
+ * <p>In order to add a new permission, it needs to be added to {@link
+ * CarUserManagerHelper#OPTIONAL_NON_ADMIN_RESTRICTIONS} and the appropriate label needs to be added
+ * to {@link #PERMISSIONS_LIST}.
+ */
+public class PermissionsPreferenceController extends
+        UserDetailsBasePreferenceController<PreferenceGroup> {
+
+    private static class UserPermission {
+        private final String mPermissionKey;
+        @StringRes
+        private final int mPermissionTitle;
+
+        UserPermission(String key, int title) {
+            mPermissionKey = key;
+            mPermissionTitle = title;
+        }
+
+        public String getPermissionKey() {
+            return mPermissionKey;
+        }
+
+        public int getPermissionTitle() {
+            return mPermissionTitle;
+        }
+    }
+
+    @VisibleForTesting
+    static final String PERMISSION_TYPE_KEY = "permission_type_key";
+    private static final List<UserPermission> PERMISSIONS_LIST = new ArrayList<>();
+
+    // Add additional preferences to show here (in the order they should appear).
+    static {
+        PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_ADD_USER,
+                R.string.create_user_permission_title));
+        PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_OUTGOING_CALLS,
+                R.string.outgoing_calls_permission_title));
+        PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_SMS,
+                R.string.sms_messaging_permission_title));
+        PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_INSTALL_APPS,
+                R.string.install_apps_permission_title));
+        PERMISSIONS_LIST.add(new UserPermission(UserManager.DISALLOW_UNINSTALL_APPS,
+                R.string.uninstall_apps_permission_title));
+    }
+
+    private final List<SwitchPreference> mPermissionPreferences = new ArrayList<>();
+
+    public PermissionsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+
+        for (UserPermission permission : PERMISSIONS_LIST) {
+            SwitchPreference preference = new SwitchPreference(context);
+            preference.setTitle(permission.getPermissionTitle());
+            preference.getExtras().putString(PERMISSION_TYPE_KEY, permission.getPermissionKey());
+            preference.setOnPreferenceChangeListener((pref, newValue) -> {
+                boolean granted = (boolean) newValue;
+                getCarUserManagerHelper().setUserRestriction(getUserInfo(),
+                        pref.getExtras().getString(PERMISSION_TYPE_KEY), !granted);
+                return true;
+            });
+            mPermissionPreferences.add(preference);
+        }
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        for (SwitchPreference switchPreference : mPermissionPreferences) {
+            getPreference().addPreference(switchPreference);
+        }
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        for (SwitchPreference switchPreference : mPermissionPreferences) {
+            switchPreference.setChecked(!getCarUserManagerHelper().hasUserRestriction(
+                    switchPreference.getExtras().getString(PERMISSION_TYPE_KEY), getUserInfo()));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/users/RemoveUserErrorDialog.java b/src/com/android/car/settings/users/RemoveUserErrorDialog.java
deleted file mode 100644
index 60dde12..0000000
--- a/src/com/android/car/settings/users/RemoveUserErrorDialog.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.users;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-import androidx.car.app.CarAlertDialog;
-import androidx.fragment.app.DialogFragment;
-
-import com.android.car.settings.R;
-
-/**
- * Dialog to inform that user deletion failed and offers to retry.
- */
-public class RemoveUserErrorDialog extends DialogFragment {
-    private DialogInterface.OnClickListener mRemoveUserRetryListener = new OnClickListener() {
-        @Override
-        public void onClick(DialogInterface dialog, int which) {
-            if (mListener != null && which == DialogInterface.BUTTON_POSITIVE) {
-                mListener.onRetryRemoveUser();
-            }
-            dialog.dismiss();
-        }
-    };
-
-    private RemoveUserErrorListener mListener;
-
-    /**
-     * Sets a listener for onRetryRemoveUser that will get called if user presses positive
-     * button.
-     *
-     * @param listener Instance of {@link RemoveUserErrorListener} to call when confirmed.
-     */
-    public void setRetryListener(@Nullable RemoveUserErrorListener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new CarAlertDialog.Builder(getContext())
-                .setTitle(R.string.remove_user_error_title)
-                .setBody(R.string.remove_user_error_message)
-                .setPositiveButton(R.string.remove_user_error_retry, mRemoveUserRetryListener)
-                .setNegativeButton(R.string.remove_user_error_dismiss, null)
-                .create();
-    }
-
-    /**
-     * Interface for listeners that want to receive a callback when user removal fails.
-     */
-    public interface RemoveUserErrorListener {
-
-        /**
-         * Method called only when user presses retry button.
-         */
-        void onRetryRemoveUser();
-    }
-}
diff --git a/src/com/android/car/settings/users/UserDetailsBaseFragment.java b/src/com/android/car/settings/users/UserDetailsBaseFragment.java
new file mode 100644
index 0000000..2206ec9
--- /dev/null
+++ b/src/com/android/car/settings/users/UserDetailsBaseFragment.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.LayoutRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.ErrorDialog;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Common logic shared for controlling the action bar which contains a button to delete a user. */
+public abstract class UserDetailsBaseFragment extends SettingsFragment {
+
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private UserInfo mUserInfo;
+
+    private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        String userType = arguments.getString(UsersDialogProvider.KEY_USER_TYPE);
+        if (userType.equals(UsersDialogProvider.LAST_ADMIN)) {
+            launchFragment(ChooseNewAdminFragment.newInstance(mUserInfo));
+        } else {
+            if (mCarUserManagerHelper.removeUser(
+                    mUserInfo, getContext().getString(R.string.user_guest))) {
+                getActivity().onBackPressed();
+            } else {
+                // If failed, need to show error dialog for users.
+                ErrorDialog.show(this, R.string.delete_user_error_title);
+            }
+        }
+    };
+
+    /** Adds user id to fragment arguments. */
+    protected static UserDetailsBaseFragment addUserIdToFragmentArguments(
+            UserDetailsBaseFragment fragment, int userId) {
+        Bundle bundle = new Bundle();
+        bundle.putInt(Intent.EXTRA_USER_ID, userId);
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        int userId = getArguments().getInt(Intent.EXTRA_USER_ID);
+        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+        mUserInfo = UserUtils.getUserInfo(getContext(), userId);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        ConfirmationDialogFragment dialogFragment =
+                (ConfirmationDialogFragment) findDialogByTag(ConfirmationDialogFragment.TAG);
+        ConfirmationDialogFragment.resetListeners(dialogFragment,
+                mConfirmListener, /* rejectListener= */ null);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        showRemoveUserButton();
+
+        TextView titleView = getActivity().findViewById(R.id.title);
+        titleView.setText(getTitleText());
+    }
+
+    /** Make CarUserManagerHelper available to subclasses. */
+    protected CarUserManagerHelper getCarUserManagerHelper() {
+        return mCarUserManagerHelper;
+    }
+
+    /** Make UserInfo available to subclasses. */
+    protected UserInfo getUserInfo() {
+        return mUserInfo;
+    }
+
+    /** Refresh UserInfo in case it becomes invalid. */
+    protected void refreshUserInfo() {
+        mUserInfo = UserUtils.getUserInfo(getContext(), mUserInfo.id);
+    }
+
+    /** Defines the text that should be shown in the action bar. */
+    protected abstract String getTitleText();
+
+    private void showRemoveUserButton() {
+        Button removeUserBtn = getActivity().findViewById(R.id.action_button1);
+        // If the current user is not allowed to remove users, the user trying to be removed
+        // cannot be removed, or the current user is a demo user, do not show delete button.
+        if (!mCarUserManagerHelper.canCurrentProcessRemoveUsers()
+                || !mCarUserManagerHelper.canUserBeRemoved(mUserInfo)
+                || mCarUserManagerHelper.isCurrentProcessDemoUser()) {
+            removeUserBtn.setVisibility(View.GONE);
+            return;
+        }
+        removeUserBtn.setVisibility(View.VISIBLE);
+        removeUserBtn.setText(R.string.delete_button);
+        removeUserBtn.setOnClickListener(v -> showConfirmRemoveUserDialog());
+    }
+
+    private void showConfirmRemoveUserDialog() {
+        boolean isLastUser = mCarUserManagerHelper.getAllPersistentUsers().size() == 1;
+        boolean isLastAdmin = mUserInfo.isAdmin()
+                && mCarUserManagerHelper.getAllAdminUsers().size() == 1;
+
+        ConfirmationDialogFragment dialogFragment;
+
+        if (isLastUser) {
+            dialogFragment = UsersDialogProvider.getConfirmRemoveLastUserDialogFragment(
+                    getContext(), mConfirmListener, /* rejectListener= */ null);
+        } else if (isLastAdmin) {
+            dialogFragment = UsersDialogProvider.getConfirmRemoveLastAdminDialogFragment(
+                    getContext(), mConfirmListener, /* rejectListener= */ null);
+        } else {
+            dialogFragment = UsersDialogProvider.getConfirmRemoveUserDialogFragment(getContext(),
+                    mConfirmListener, /* rejectListener= */ null);
+        }
+
+        dialogFragment.show(getFragmentManager(), ConfirmationDialogFragment.TAG);
+    }
+}
diff --git a/src/com/android/car/settings/users/UserDetailsBasePreferenceController.java b/src/com/android/car/settings/users/UserDetailsBasePreferenceController.java
new file mode 100644
index 0000000..73b2969
--- /dev/null
+++ b/src/com/android/car/settings/users/UserDetailsBasePreferenceController.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Common setup of all preference controllers related to user details.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ *            expects to operate.
+ */
+public abstract class UserDetailsBasePreferenceController<V extends Preference> extends
+        PreferenceController<V> {
+
+    private final CarUserManagerHelper.OnUsersUpdateListener mOnUsersUpdateListener = () -> {
+        refreshUserInfo();
+        refreshUi();
+    };
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private UserInfo mUserInfo;
+
+    public UserDetailsBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
+    }
+
+    /** Sets the user info for which this preference controller operates. */
+    public void setUserInfo(UserInfo userInfo) {
+        mUserInfo = userInfo;
+    }
+
+    /** Gets the current user info. */
+    public UserInfo getUserInfo() {
+        return mUserInfo;
+    }
+
+    /** Refreshes the user info, since it might have changed. */
+    protected void refreshUserInfo() {
+        mUserInfo = UserUtils.getUserInfo(getContext(), mUserInfo.id);
+    }
+
+    @Override
+    protected void checkInitialized() {
+        if (mUserInfo == null) {
+            throw new IllegalStateException("UserInfo should be non-null by this point");
+        }
+    }
+
+    /** Registers a listener which updates the displayed user name when a user is modified. */
+    @Override
+    protected void onCreateInternal() {
+        getCarUserManagerHelper().registerOnUsersUpdateListener(mOnUsersUpdateListener);
+    }
+
+    /** Unregisters a listener which updates the displayed user name when a user is modified. */
+    @Override
+    protected void onDestroyInternal() {
+        getCarUserManagerHelper().unregisterOnUsersUpdateListener(mOnUsersUpdateListener);
+    }
+
+    /** Gets the car user manager helper. */
+    protected CarUserManagerHelper getCarUserManagerHelper() {
+        return mCarUserManagerHelper;
+    }
+}
diff --git a/src/com/android/car/settings/users/UserDetailsFragment.java b/src/com/android/car/settings/users/UserDetailsFragment.java
index 2971f4a..304df28 100644
--- a/src/com/android/car/settings/users/UserDetailsFragment.java
+++ b/src/com/android/car/settings/users/UserDetailsFragment.java
@@ -16,179 +16,62 @@
 
 package com.android.car.settings.users;
 
-import android.car.user.CarUserManagerHelper;
-import android.content.pm.UserInfo;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
+import android.widget.TextView;
 
 import androidx.annotation.VisibleForTesting;
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-
-import java.util.Arrays;
-import java.util.List;
 
 /**
- * Shows details for a user with the ability to remove user and switch.
+ * Shows details for a user with the ability to remove user and edit current user.
  */
-public class UserDetailsFragment extends ListItemSettingsFragment implements
-        ConfirmRemoveUserDialog.ConfirmRemoveUserListener,
-        RemoveUserErrorDialog.RemoveUserErrorListener {
-    public static final String EXTRA_USER_INFO = "extra_user_info";
-    private static final String ERROR_DIALOG_TAG = "RemoveUserErrorDialogTag";
-    private static final String CONFIRM_REMOVE_DIALOG_TAG = "ConfirmRemoveUserDialog";
+public class UserDetailsFragment extends UserDetailsBaseFragment {
 
-    private Button mRemoveUserBtn;
-    private Button mSwitchUserBtn;
+    /** Creates instance of UserDetailsFragment. */
+    public static UserDetailsFragment newInstance(int userId) {
+        return (UserDetailsFragment) UserDetailsBaseFragment.addUserIdToFragmentArguments(
+                new UserDetailsFragment(), userId);
+    }
 
-    private UserInfo mUserInfo;
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    CarUserManagerHelper mCarUserManagerHelper;
-    private UserIconProvider mUserIconProvider;
-    private ListItemProvider mItemProvider;
+    @VisibleForTesting
+    final CarUserManagerHelper.OnUsersUpdateListener mOnUsersUpdateListener = () -> {
+        // Update the user info value, as it may have changed.
+        refreshUserInfo();
+        // Update the text in the action bar when there is a user update.
+        ((TextView) getActivity().findViewById(R.id.title)).setText(getTitleText());
+    };
 
-    /**
-     * Creates instance of UserDetailsFragment.
-     */
-    public static UserDetailsFragment newInstance(UserInfo userInfo) {
-        UserDetailsFragment userDetailsFragment = new UserDetailsFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_TITLE_ID, R.string.user_details_title);
-        bundle.putParcelable(EXTRA_USER_INFO, userInfo);
-        userDetailsFragment.setArguments(bundle);
-        return userDetailsFragment;
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.user_details_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(EditUserNameEntryPreferenceController.class,
+                R.string.pk_edit_user_name_entry).setUserInfo(getUserInfo());
     }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mUserInfo = getArguments().getParcelable(EXTRA_USER_INFO);
-
-        if (savedInstanceState != null) {
-            RemoveUserErrorDialog removeUserErrorDialog = (RemoveUserErrorDialog)
-                    getFragmentManager().findFragmentByTag(ERROR_DIALOG_TAG);
-            if (removeUserErrorDialog != null) {
-                removeUserErrorDialog.setRetryListener(this);
-            }
-
-            ConfirmRemoveUserDialog confirmRemoveUserDialog = (ConfirmRemoveUserDialog)
-                    getFragmentManager().findFragmentByTag(CONFIRM_REMOVE_DIALOG_TAG);
-            if (confirmRemoveUserDialog != null) {
-                confirmRemoveUserDialog.setConfirmRemoveUserListener(this);
-            }
-        }
+        getCarUserManagerHelper().registerOnUsersUpdateListener(mOnUsersUpdateListener);
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        createUserManagerHelper();
-        mUserIconProvider = new UserIconProvider(mCarUserManagerHelper);
-        mItemProvider = new ListItemProvider.ListProvider(getListItems());
-
-        // Needs to be called after creation of item provider.
-        super.onActivityCreated(savedInstanceState);
-
-        showActionButtons();
+    public void onDestroy() {
+        super.onDestroy();
+        getCarUserManagerHelper().unregisterOnUsersUpdateListener(mOnUsersUpdateListener);
     }
 
     @Override
-    public void onRemoveUserConfirmed() {
-        removeUser();
-    }
-
-    @Override
-    public void onRetryRemoveUser() {
-        // Retry deleting user.
-        removeUser();
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-
-    private void removeUser() {
-        if (mCarUserManagerHelper.removeUser(
-                mUserInfo, getContext().getString(R.string.user_guest))) {
-            getActivity().onBackPressed();
-        } else {
-            // If failed, need to show error dialog for users, can offer retry.
-            RemoveUserErrorDialog removeUserErrorDialog = new RemoveUserErrorDialog();
-            removeUserErrorDialog.setRetryListener(this);
-            removeUserErrorDialog.show(getFragmentManager(), ERROR_DIALOG_TAG);
-        }
-    }
-
-    private void showActionButtons() {
-        if (mCarUserManagerHelper.isForegroundUser(mUserInfo)) {
-            // Already foreground user, shouldn't show SWITCH button.
-            showRemoveUserButton();
-            return;
-        }
-
-        showRemoveUserButton();
-        showSwitchButton();
-    }
-
-    private void createUserManagerHelper() {
-        // Null check for testing. Don't want to override it if already set by a test.
-        if (mCarUserManagerHelper == null) {
-            mCarUserManagerHelper = new CarUserManagerHelper(getContext());
-        }
-    }
-
-    private void showRemoveUserButton() {
-        Button removeUserBtn = (Button) getActivity().findViewById(R.id.action_button1);
-        // If the current user is not allowed to remove users, the user trying to be removed
-        // cannot be removed, or the current user is a demo user, do not show delete button.
-        if (!mCarUserManagerHelper.canCurrentProcessRemoveUsers()
-                || !mCarUserManagerHelper.canUserBeRemoved(mUserInfo)
-                || mCarUserManagerHelper.isCurrentProcessDemoUser()) {
-            removeUserBtn.setVisibility(View.GONE);
-            return;
-        }
-        removeUserBtn.setVisibility(View.VISIBLE);
-        removeUserBtn.setText(R.string.delete_button);
-        removeUserBtn.setOnClickListener(v -> {
-            ConfirmRemoveUserDialog dialog = new ConfirmRemoveUserDialog();
-            dialog.setConfirmRemoveUserListener(this);
-            dialog.show(getFragmentManager(), CONFIRM_REMOVE_DIALOG_TAG);
-        });
-    }
-
-    private void showSwitchButton() {
-        Button switchUserBtn = (Button) getActivity().findViewById(R.id.action_button2);
-        // If the current process is not allowed to switch to another user, doe not show the switch
-        // button.
-        if (!mCarUserManagerHelper.canCurrentProcessSwitchUsers()) {
-            switchUserBtn.setVisibility(View.GONE);
-            return;
-        }
-        switchUserBtn.setVisibility(View.VISIBLE);
-        switchUserBtn.setText(R.string.user_switch);
-        switchUserBtn.setOnClickListener(v -> {
-            mCarUserManagerHelper.switchToUser(mUserInfo);
-            getActivity().onBackPressed();
-        });
-    }
-
-    private List<ListItem> getListItems() {
-        TextListItem item = new TextListItem(getContext());
-        item.setPrimaryActionIcon(mUserIconProvider.getUserIcon(mUserInfo, getContext()),
-                /* useLargeIcon= */ false);
-        item.setTitle(mUserInfo.name);
-
-        if (!mUserInfo.isInitialized()) {
-            // Indicate that the user has not been initialized yet.
-            item.setBody(getContext().getString(R.string.user_summary_not_set_up));
-        }
-
-        return Arrays.asList(item);
+    protected String getTitleText() {
+        return UserUtils.getUserDisplayName(getContext(), getCarUserManagerHelper(), getUserInfo());
     }
 }
diff --git a/src/com/android/car/settings/users/UserDetailsPermissionsFragment.java b/src/com/android/car/settings/users/UserDetailsPermissionsFragment.java
new file mode 100644
index 0000000..814e2a2
--- /dev/null
+++ b/src/com/android/car/settings/users/UserDetailsPermissionsFragment.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.content.Context;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+
+/**
+ * Business logic for the permissions fragment. This fragment is used when an admin user views the
+ * user details of a non-admin user.
+ */
+public class UserDetailsPermissionsFragment extends UserDetailsBaseFragment {
+
+    /**
+     * Creates instance of UserDetailsPermissionsFragment.
+     */
+    public static UserDetailsPermissionsFragment newInstance(int userId) {
+        return (UserDetailsPermissionsFragment) UserDetailsBaseFragment
+                .addUserIdToFragmentArguments(
+                new UserDetailsPermissionsFragment(), userId);
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.user_details_permissions_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(MakeAdminPreferenceController.class, R.string.pk_make_user_admin).setUserInfo(
+                getUserInfo());
+        use(PermissionsPreferenceController.class, R.string.pk_user_permissions).setUserInfo(
+                getUserInfo());
+    }
+
+    @Override
+    protected String getTitleText() {
+        return getContext().getString(R.string.user_details_admin_title,
+                UserUtils.getUserDisplayName(getContext(), getCarUserManagerHelper(),
+                        getUserInfo()));
+    }
+}
+
diff --git a/src/com/android/car/settings/users/UserGridRecyclerView.java b/src/com/android/car/settings/users/UserGridRecyclerView.java
index 8ff2ea4..bf9492b 100644
--- a/src/com/android/car/settings/users/UserGridRecyclerView.java
+++ b/src/com/android/car/settings/users/UserGridRecyclerView.java
@@ -16,11 +16,12 @@
 
 package com.android.car.settings.users;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Rect;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -29,15 +30,15 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import androidx.car.widget.PagedListView;
 import androidx.core.graphics.drawable.RoundedBitmapDrawable;
 import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
+import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.users.ConfirmCreateNewUserDialog.CancelCreateNewUserListener;
-import com.android.car.settings.users.ConfirmCreateNewUserDialog.ConfirmCreateNewUserListener;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.ErrorDialog;
 import com.android.internal.util.UserIcons;
 
 import java.util.ArrayList;
@@ -47,8 +48,9 @@
  * Displays a GridLayout with icons for the users in the system to allow switching between users.
  * One of the uses of this is for the lock screen in auto.
  */
-public class UserGridRecyclerView extends PagedListView implements
+public class UserGridRecyclerView extends RecyclerView implements
         CarUserManagerHelper.OnUsersUpdateListener {
+
     private UserAdapter mAdapter;
     private CarUserManagerHelper mCarUserManagerHelper;
     private Context mContext;
@@ -61,6 +63,9 @@
         mContext = context;
         mCarUserManagerHelper = new CarUserManagerHelper(mContext);
         mEnableAddUserButton = true;
+
+        addItemDecoration(new ItemSpacingDecoration(context.getResources().getDimensionPixelSize(
+                R.dimen.user_switcher_vertical_spacing_between_users)));
     }
 
     /**
@@ -96,31 +101,46 @@
 
     private List<UserRecord> createUserRecords(List<UserInfo> userInfoList) {
         List<UserRecord> userRecords = new ArrayList<>();
+
+        // If the foreground user CANNOT switch to other users, only display the foreground user.
+        if (!mCarUserManagerHelper.canForegroundUserSwitchUsers()) {
+            userRecords.add(createForegroundUserRecord());
+            return userRecords;
+        }
+
+        // If the foreground user CAN switch to other users, iterate through all users.
         for (UserInfo userInfo : userInfoList) {
-            if (userInfo.isGuest()) {
-                // Don't display guests in the switcher.
-                continue;
-            }
             boolean isForeground =
                     mCarUserManagerHelper.getCurrentForegroundUserId() == userInfo.id;
+
+            if (!isForeground && userInfo.isGuest()) {
+                // Don't display temporary running background guests in the switcher.
+                continue;
+            }
+
             UserRecord record = new UserRecord(userInfo, false /* isStartGuestSession */,
                     false /* isAddUser */, isForeground);
             userRecords.add(record);
         }
 
-        // Add guest user record if the foreground user is not a guest
+        // Add start guest user record if the system is not logged in as guest already.
         if (!mCarUserManagerHelper.isForegroundUserGuest()) {
-            userRecords.add(addGuestUserRecord());
+            userRecords.add(createStartGuestUserRecord());
         }
 
         // Add "add user" record if the foreground user can add users
         if (mCarUserManagerHelper.canForegroundUserAddUsers()) {
-            userRecords.add(addUserRecord());
+            userRecords.add(createAddUserRecord());
         }
 
         return userRecords;
     }
 
+    private UserRecord createForegroundUserRecord() {
+        return new UserRecord(mCarUserManagerHelper.getCurrentForegroundUserInfo(),
+                false /* isStartGuestSession */, false /* isAddUser */, true /* isForeground */);
+    }
+
     /**
      * Show the "Add User" Button
      */
@@ -140,9 +160,9 @@
     /**
      * Create guest user record
      */
-    private UserRecord addGuestUserRecord() {
+    private UserRecord createStartGuestUserRecord() {
         UserInfo userInfo = new UserInfo();
-        userInfo.name = mContext.getString(R.string.user_guest);
+        userInfo.name = mContext.getString(R.string.start_guest_session);
         return new UserRecord(userInfo, true /* isStartGuestSession */,
                 false /* isAddUser */, false /* isForeground */);
     }
@@ -150,7 +170,7 @@
     /**
      * Create add user record
      */
-    private UserRecord addUserRecord() {
+    private UserRecord createAddUserRecord() {
         UserInfo userInfo = new UserInfo();
         userInfo.name = mContext.getString(R.string.user_add_user_menu);
         return new UserRecord(userInfo, false /* isStartGuestSession */,
@@ -164,7 +184,7 @@
     @Override
     public void onUsersUpdate() {
         // If you can show the add user button, there is no restriction
-        mAdapter.setAddUserRestricted(mEnableAddUserButton ? false : true);
+        mAdapter.setAddUserRestricted(!mEnableAddUserButton);
         mAdapter.clearUsers();
         mAdapter.updateUsers(createUserRecords(mCarUserManagerHelper
                 .getAllUsers()));
@@ -175,20 +195,33 @@
      * Adapter to populate the grid layout with the available user profiles
      */
     public final class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserAdapterViewHolder>
-            implements ConfirmCreateNewUserListener, CancelCreateNewUserListener,
-            AddNewUserTask.AddNewUserListener {
+            implements AddNewUserTask.AddNewUserListener {
 
         private final Context mContext;
-        private List<UserRecord> mUsers;
         private final Resources mRes;
         private final String mGuestName;
-        private final String mNewUserName;
+
+        private List<UserRecord> mUsers;
+        private String mNewUserName;
         // View that holds the add user button.  Used to enable/disable the view
         private View mAddUserView;
         private float mOpacityDisabled;
         private float mOpacityEnabled;
         private boolean mIsAddUserRestricted;
 
+        private final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+            mAddNewUserTask = new AddNewUserTask(mCarUserManagerHelper, /* addNewUserListener= */
+                    this);
+            mAddNewUserTask.execute(mNewUserName);
+        };
+
+        /**
+         * Enable the "add user" button if the user cancels adding an user
+         */
+        private final ConfirmationDialogFragment.RejectListener mRejectListener =
+                arguments -> enableAddView();
+
+
         public UserAdapter(Context context, List<UserRecord> users) {
             mRes = context.getResources();
             mContext = context;
@@ -208,7 +241,6 @@
 
         /**
          * Refreshes the User Grid with the new List of users.
-         * @param users
          */
         public void updateUsers(List<UserRecord> users) {
             mUsers = users;
@@ -217,7 +249,7 @@
         @Override
         public UserAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
             View view = LayoutInflater.from(mContext)
-                    .inflate(R.layout.car_user_switcher_pod, parent, false);
+                    .inflate(R.layout.user_switcher_pod, parent, false);
             view.setAlpha(mOpacityEnabled);
             view.bringToFront();
             return new UserAdapterViewHolder(view);
@@ -232,100 +264,117 @@
             holder.mUserAvatarImageView.setImageDrawable(circleIcon);
             holder.mUserNameTextView.setText(userRecord.mInfo.name);
 
-            // Show the current user frame if current user
+            // Defaults to 100% opacity and no circle around the icon.
+            holder.mView.setAlpha(mOpacityEnabled);
+            holder.mFrame.setBackgroundResource(0);
+
+            // Foreground user record.
             if (userRecord.mIsForeground) {
-                holder.mFrame.setBackgroundResource(R.drawable.car_user_avatar_bg_circle);
-            } else {
-                holder.mFrame.setBackgroundResource(0);
+                // Add a circle around the icon.
+                holder.mFrame.setBackgroundResource(R.drawable.user_avatar_bg_circle);
+                // Go back to quick settings if user selected is already the foreground user.
+                holder.mView.setOnClickListener(v -> mBaseFragment.getActivity().onBackPressed());
+                return;
             }
 
-            // If there are restrictions, show a 50% opaque "add user" view
-            if (userRecord.mIsAddUser && mIsAddUserRestricted) {
-                holder.mView.setAlpha(mOpacityDisabled);
-            } else {
-                holder.mView.setAlpha(mOpacityEnabled);
+            // Start guest session record.
+            if (userRecord.mIsStartGuestSession) {
+                holder.mView.setOnClickListener(v -> handleGuestSessionClicked());
+                return;
             }
 
-            holder.mView.setOnClickListener(v -> {
-                if (userRecord == null) {
-                    return;
+            // Add user record.
+            if (userRecord.mIsAddUser) {
+                if (mIsAddUserRestricted) {
+                    // If there are restrictions, show a 50% opaque "add user" view
+                    holder.mView.setAlpha(mOpacityDisabled);
+                    holder.mView.setOnClickListener(
+                            v -> mBaseFragment.getFragmentController().showBlockingMessage());
+                } else {
+                    holder.mView.setOnClickListener(v -> handleAddUserClicked(v));
                 }
+                return;
+            }
 
-                // If the user selects Guest, start the guest session.
-                if (userRecord.mIsStartGuestSession) {
-                    mCarUserManagerHelper.startNewGuestSession(mGuestName);
-                    return;
-                }
-
-                // If the user wants to add a user, show dialog to confirm adding a user
-                if (userRecord.mIsAddUser) {
-                    if (mIsAddUserRestricted) {
-                        mBaseFragment.getFragmentController().showDOBlockingMessage();
-                    } else {
-                        // Disable button so it cannot be clicked multiple times
-                        mAddUserView = holder.mView;
-                        mAddUserView.setEnabled(false);
-
-                        ConfirmCreateNewUserDialog dialog =
-                                new ConfirmCreateNewUserDialog();
-                        dialog.setConfirmCreateNewUserListener(this);
-                        dialog.setCancelCreateNewUserListener(this);
-                        if (mBaseFragment != null) {
-                            dialog.show(mBaseFragment);
-                        }
-                    }
-                    return;
-                }
-                // If the user doesn't want to be a guest or add a user, switch to the user selected
-                mCarUserManagerHelper.switchToUser(userRecord.mInfo);
-            });
-
+            // User record;
+            holder.mView.setOnClickListener(v -> handleUserSwitch(userRecord.mInfo));
         }
 
         /**
          * Specify if adding a user should be restricted.
          *
          * @param isAddUserRestricted should adding a user be restricted
-         *
          */
         public void setAddUserRestricted(boolean isAddUserRestricted) {
             mIsAddUserRestricted = isAddUserRestricted;
         }
 
+        private void handleUserSwitch(UserInfo userInfo) {
+            if (mCarUserManagerHelper.switchToUser(userInfo)) {
+                // Successful switch, close Settings app.
+                mBaseFragment.getActivity().finish();
+            }
+        }
+
+        private void handleGuestSessionClicked() {
+            if (mCarUserManagerHelper.startGuestSession(mGuestName)) {
+                // Successful start, will switch to guest now. Close Settings app.
+                mBaseFragment.getActivity().finish();
+            }
+        }
+
+        private void handleAddUserClicked(View addUserView) {
+            if (mCarUserManagerHelper.isUserLimitReached()) {
+                showMaxUsersLimitReachedDialog();
+            } else {
+                mAddUserView = addUserView;
+                // Disable button so it cannot be clicked multiple times
+                mAddUserView.setEnabled(false);
+                showConfirmCreateNewUserDialog();
+            }
+        }
+
+        private void showMaxUsersLimitReachedDialog() {
+            MaxUsersLimitReachedDialog dialog = new MaxUsersLimitReachedDialog(
+                    mCarUserManagerHelper.getMaxSupportedRealUsers());
+            if (mBaseFragment != null) {
+                dialog.show(mBaseFragment);
+            }
+        }
+
+        private void showConfirmCreateNewUserDialog() {
+            ConfirmationDialogFragment dialogFragment =
+                    UsersDialogProvider.getConfirmCreateNewUserDialogFragment(getContext(),
+                            mConfirmListener, mRejectListener);
+            dialogFragment.show(mBaseFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+        }
+
         private Bitmap getUserRecordIcon(UserRecord userRecord) {
             if (userRecord.mIsStartGuestSession) {
                 return mCarUserManagerHelper.getGuestDefaultIcon();
             }
 
             if (userRecord.mIsAddUser) {
-                return UserIcons.convertToBitmap(mContext
-                    .getDrawable(R.drawable.car_add_circle_round));
+                return UserIcons.convertToBitmap(mContext.getDrawable(R.drawable.user_add_circle));
             }
 
             return mCarUserManagerHelper.getUserIcon(userRecord.mInfo);
         }
 
-        @Override
-        public void onCreateNewUserConfirmed() {
-            mAddNewUserTask =
-                    new AddNewUserTask(mCarUserManagerHelper, /* addNewUserListener= */ this);
-            mAddNewUserTask.execute(mNewUserName);
-        }
 
-        /**
-         * Enable the "add user" button if the user cancels adding an user
-         */
         @Override
-        public void onCreateNewUserCancelled() {
-            if (mAddUserView != null) {
-                mAddUserView.setEnabled(true);
-            }
+        public void onUserAddedSuccess() {
+            enableAddView();
+            // New user added. Will switch to new user, therefore close the app.
+            mBaseFragment.getActivity().finish();
         }
 
         @Override
-        public void onUserAdded() {
-            if (mAddUserView != null) {
-                mAddUserView.setEnabled(true);
+        public void onUserAddedFailure() {
+            enableAddView();
+            // Display failure dialog.
+            if (mBaseFragment != null) {
+                ErrorDialog.show(mBaseFragment, R.string.add_user_error_title);
             }
         }
 
@@ -347,9 +396,15 @@
             public UserAdapterViewHolder(View view) {
                 super(view);
                 mView = view;
-                mUserAvatarImageView = (ImageView) view.findViewById(R.id.user_avatar);
-                mUserNameTextView = (TextView) view.findViewById(R.id.user_name);
-                mFrame = (FrameLayout) view.findViewById(R.id.current_user_frame);
+                mUserAvatarImageView = view.findViewById(R.id.user_avatar);
+                mUserNameTextView = view.findViewById(R.id.user_name);
+                mFrame = view.findViewById(R.id.current_user_frame);
+            }
+        }
+
+        private void enableAddView() {
+            if (mAddUserView != null) {
+                mAddUserView.setEnabled(true);
             }
         }
     }
@@ -373,4 +428,31 @@
             mIsForeground = isForeground;
         }
     }
+
+    /**
+     * A {@link RecyclerView.ItemDecoration} that will add spacing between each item in the
+     * RecyclerView that it is added to.
+     */
+    private static class ItemSpacingDecoration extends RecyclerView.ItemDecoration {
+        private int mItemSpacing;
+
+        private ItemSpacingDecoration(int itemSpacing) {
+            mItemSpacing = itemSpacing;
+        }
+
+        @Override
+        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+                RecyclerView.State state) {
+            super.getItemOffsets(outRect, view, parent, state);
+            int position = parent.getChildAdapterPosition(view);
+
+            // Skip offset for last item except for GridLayoutManager.
+            if (position == state.getItemCount() - 1
+                    && !(parent.getLayoutManager() instanceof GridLayoutManager)) {
+                return;
+            }
+
+            outRect.bottom = mItemSpacing;
+        }
+    }
 }
diff --git a/src/com/android/car/settings/users/UserIconProvider.java b/src/com/android/car/settings/users/UserIconProvider.java
index 895250d..f08ef66 100644
--- a/src/com/android/car/settings/users/UserIconProvider.java
+++ b/src/com/android/car/settings/users/UserIconProvider.java
@@ -16,7 +16,7 @@
 
 package com.android.car.settings.users;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
@@ -44,7 +44,6 @@
      * If icon has not been assigned to this user, it defaults to a generic user icon.
      *
      * @param userInfo User for which the icon is requested.
-     *
      * @return Drawable representing the icon for the user.
      */
     public Drawable getUserIcon(UserInfo userInfo, Context context) {
@@ -55,7 +54,7 @@
         }
         Resources res = context.getResources();
         BitmapDrawable scaledIcon = (BitmapDrawable) mCarUserManagerHelper.scaleUserIcon(icon, res
-                .getDimensionPixelSize(R.dimen.car_primary_icon_size));
+                .getDimensionPixelSize(R.dimen.icon_size));
 
         // Enforce that the icon is circular
         RoundedBitmapDrawable circleIcon = RoundedBitmapDrawableFactory
@@ -65,15 +64,24 @@
     }
 
     /**
+     * Gets the default icon for guest user.
+     *
+     * @return Drawable representing the default guest icon.
+     */
+    public Drawable getDefaultGuestIcon(Context context) {
+        return UserIconProvider.scaleUserIcon(mCarUserManagerHelper.getGuestDefaultIcon(),
+                mCarUserManagerHelper, context);
+    }
+
+    /**
      * Scales passed in bitmap to the appropriate user icon size.
      *
      * @param bitmap Bitmap to scale.
-     *
      * @return Drawable scaled to the user icon size.
      */
     public static Drawable scaleUserIcon(Bitmap bitmap, CarUserManagerHelper userManagerHelper,
             Context context) {
         return userManagerHelper.scaleUserIcon(bitmap, context.getResources()
-                .getDimensionPixelSize(R.dimen.car_primary_icon_size));
+                .getDimensionPixelSize(R.dimen.icon_size));
     }
 }
diff --git a/src/com/android/car/settings/users/UserSwitcherFragment.java b/src/com/android/car/settings/users/UserSwitcherFragment.java
index 8fc89a4..bf18bdd 100644
--- a/src/com/android/car/settings/users/UserSwitcherFragment.java
+++ b/src/com/android/car/settings/users/UserSwitcherFragment.java
@@ -19,6 +19,8 @@
 import android.car.drivingstate.CarUxRestrictions;
 import android.os.Bundle;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
 import androidx.recyclerview.widget.GridLayoutManager;
 
 import com.android.car.settings.R;
@@ -32,18 +34,22 @@
 
     private UserGridRecyclerView mUserGridView;
 
-    /**
-     * Initializes the UserSwitcherFragment
-     * @return instance of the UserSwitcherFragment
-     */
-    public static UserSwitcherFragment newInstance() {
-        UserSwitcherFragment userSwitcherFragment = new UserSwitcherFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.users_list_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.car_user_switcher);
-        userSwitcherFragment.setArguments(bundle);
-        return userSwitcherFragment;
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getLayoutId() {
+        return R.layout.user_switcher;
+    }
+
+    @Override
+    @StringRes
+    protected int getTitleId() {
+        return R.string.users_list_title;
     }
 
     @Override
@@ -54,7 +60,7 @@
         GridLayoutManager layoutManager = new GridLayoutManager(getContext(),
                 getContext().getResources().getInteger(R.integer.user_switcher_num_col));
         mUserGridView.setFragment(this);
-        mUserGridView.getRecyclerView().setLayoutManager(layoutManager);
+        mUserGridView.setLayoutManager(layoutManager);
         mUserGridView.buildAdapter();
     }
 
@@ -73,8 +79,8 @@
 
 
     @Override
-    public void onUxRestrictionChanged(CarUxRestrictions carUxRestrictions) {
-        applyRestriction(CarUxRestrictionsHelper.isNoSetup(carUxRestrictions));
+    public void onUxRestrictionsChanged(CarUxRestrictions restrictionInfo) {
+        applyRestriction(CarUxRestrictionsHelper.isNoSetup(restrictionInfo));
     }
 
     private void applyRestriction(boolean restricted) {
diff --git a/src/com/android/car/settings/users/UserUtils.java b/src/com/android/car/settings/users/UserUtils.java
new file mode 100644
index 0000000..3d26939
--- /dev/null
+++ b/src/com/android/car/settings/users/UserUtils.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+
+import com.android.car.settings.R;
+
+/**
+ * Util class for providing basic, universally needed user-related methods.
+ */
+public class UserUtils {
+    private UserUtils() {
+    }
+
+    /**
+     * Fetches the {@link UserInfo} from UserManager system service for the user ID.
+     *
+     * @param userId ID that corresponds to the returned UserInfo.
+     * @return {@link UserInfo} for the user ID.
+     */
+    public static UserInfo getUserInfo(Context context, int userId) {
+        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        return userManager.getUserInfo(userId);
+    }
+
+    /**
+     * Returns the user name that should be displayed. The caller shouldn't use userInfo.name
+     * directly, because the display name is modified for the current process user.
+     */
+    public static String getUserDisplayName(Context context,
+            CarUserManagerHelper carUserManagerHelper, UserInfo userInfo) {
+        return carUserManagerHelper.isCurrentProcessUser(userInfo) ? context.getString(
+                R.string.current_user_name, userInfo.name) : userInfo.name;
+    }
+
+    /**
+     * Returns whether or not the current user is an admin and whether the user info they are
+     * viewing is of a non-admin.
+     */
+    public static boolean isAdminViewingNonAdmin(CarUserManagerHelper carUserManagerHelper,
+            UserInfo userInfo) {
+        return carUserManagerHelper.isCurrentProcessAdminUser() && !userInfo.isAdmin();
+    }
+
+}
diff --git a/src/com/android/car/settings/users/UsersBasePreferenceController.java b/src/com/android/car/settings/users/UsersBasePreferenceController.java
new file mode 100644
index 0000000..e0f8d4e
--- /dev/null
+++ b/src/com/android/car/settings/users/UsersBasePreferenceController.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/** Shared business logic between {@link UsersListFragment} and {@link ChooseNewAdminFragment}. */
+public abstract class UsersBasePreferenceController extends PreferenceController<PreferenceGroup> {
+
+    /** Update screen when users list is updated. */
+    private final CarUserManagerHelper.OnUsersUpdateListener mOnUsersUpdateListener =
+            this::refreshUi;
+
+    private UsersPreferenceProvider mPreferenceProvider;
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private List<Preference> mUsersToDisplay = new ArrayList<>();
+
+    public UsersBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        UsersPreferenceProvider.UserClickListener userClickListener = this::userClicked;
+        mPreferenceProvider = new UsersPreferenceProvider(context, mCarUserManagerHelper,
+                userClickListener);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    /**
+     * Ensure that helper is set by the time onCreate is called. Register a listener to refresh
+     * screen on updates.
+     */
+    @Override
+    @CallSuper
+    protected void onCreateInternal() {
+        mCarUserManagerHelper.registerOnUsersUpdateListener(mOnUsersUpdateListener);
+    }
+
+    /** Unregister listener to refresh screen on updates. */
+    @Override
+    @CallSuper
+    protected void onDestroyInternal() {
+        mCarUserManagerHelper.unregisterOnUsersUpdateListener(mOnUsersUpdateListener);
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        List<Preference> newUsers = mPreferenceProvider.createUserList();
+        if (userListsAreDifferent(mUsersToDisplay, newUsers)) {
+            mUsersToDisplay = newUsers;
+            preferenceGroup.removeAll();
+
+            for (Preference preference : mUsersToDisplay) {
+                preferenceGroup.addPreference(preference);
+            }
+        }
+    }
+
+    /** Gets the car user manager helper. */
+    protected CarUserManagerHelper getCarUserManagerHelper() {
+        return mCarUserManagerHelper;
+    }
+
+    /** Handles the user click on a preference for a certain user. */
+    protected abstract void userClicked(UserInfo userInfo);
+
+
+    /** Gets the preference provider to set additional arguments if necessary. */
+    protected UsersPreferenceProvider getPreferenceProvider() {
+        return mPreferenceProvider;
+    }
+
+    private boolean userListsAreDifferent(List<Preference> currentList,
+            List<Preference> newList) {
+        if (currentList.size() != newList.size()) {
+            return true;
+        }
+
+        for (int i = 0; i < currentList.size(); i++) {
+            // Cannot use "compareTo" on preference, since it uses the order attribute to compare.
+            if (preferencesAreDifferent(currentList.get(i), newList.get(i))) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private boolean preferencesAreDifferent(Preference lhs, Preference rhs) {
+        return !Objects.equals(lhs.getTitle(), rhs.getTitle())
+                || !Objects.equals(lhs.getSummary(), rhs.getSummary());
+    }
+}
diff --git a/src/com/android/car/settings/users/UsersDialogProvider.java b/src/com/android/car/settings/users/UsersDialogProvider.java
new file mode 100644
index 0000000..cb1fe23
--- /dev/null
+++ b/src/com/android/car/settings/users/UsersDialogProvider.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.users;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+
+/**
+ * Provides common Users-related ConfirmationDialogFragments to ensure consistency
+ */
+public final class UsersDialogProvider {
+
+    /** Argument key to store the user info that the device is trying to make an admin. */
+    static final String KEY_USER_TO_MAKE_ADMIN = "USER_TO_MAKE_ADMIN";
+    /** Argument key to store the user type that the device is trying to remove. */
+    static final String KEY_USER_TYPE = "USER_TYPE";
+    /** {@link KEY_USER_TYPE} value when removing the last admin on the device. */
+    static final String LAST_ADMIN = "LAST_ADMIN";
+    /** {@link KEY_USER_TYPE} value when removing the last user on the device. */
+    static final String LAST_USER = "LAST_USER";
+    /**
+     * Default {@link KEY_USER_TYPE} value when removing a user that is neither {@link LAST_ADMIN}
+     * nor {@link LAST_USER}.
+     */
+    static final String ANY_USER = "ANY_USER";
+
+    private UsersDialogProvider() {
+    }
+
+    /** Gets a confirmation dialog fragment to confirm or reject adding a new user. */
+    public static ConfirmationDialogFragment getConfirmCreateNewUserDialogFragment(Context context,
+            @Nullable ConfirmationDialogFragment.ConfirmListener confirmListener,
+            @Nullable ConfirmationDialogFragment.RejectListener rejectListener) {
+
+        String message = context.getString(R.string.user_add_user_message_setup)
+                .concat(System.lineSeparator())
+                .concat(System.lineSeparator())
+                .concat(context.getString(R.string.user_add_user_message_update));
+
+        ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment.Builder(context)
+                .setTitle(R.string.user_add_user_title)
+                .setMessage(message)
+                .setPositiveButton(android.R.string.ok, confirmListener)
+                .setNegativeButton(android.R.string.cancel, rejectListener)
+                .build();
+
+        return dialogFragment;
+    }
+
+    /** Gets a confirmation dialog fragment to confirm or reject making a user an admin. */
+    public static ConfirmationDialogFragment getConfirmGrantAdminDialogFragment(Context context,
+            @Nullable ConfirmationDialogFragment.ConfirmListener confirmListener,
+            @Nullable ConfirmationDialogFragment.RejectListener rejectListener,
+            UserInfo userToMakeAdmin) {
+
+        String message = context.getString(R.string.grant_admin_permissions_message)
+                .concat(System.lineSeparator())
+                .concat(System.lineSeparator())
+                .concat(context.getString(R.string.action_not_reversible_message));
+
+        ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment.Builder(context)
+                .setTitle(R.string.grant_admin_permissions_title)
+                .setMessage(message)
+                .setPositiveButton(R.string.confirm_grant_admin, confirmListener)
+                .setNegativeButton(android.R.string.cancel, rejectListener)
+                .addArgumentParcelable(KEY_USER_TO_MAKE_ADMIN, userToMakeAdmin)
+                .build();
+
+        return dialogFragment;
+    }
+
+    /**
+     * Gets a confirmation dialog fragment to confirm or reject removing the last user on the
+     * device.
+     */
+    public static ConfirmationDialogFragment getConfirmRemoveLastUserDialogFragment(Context context,
+            @Nullable ConfirmationDialogFragment.ConfirmListener confirmListener,
+            @Nullable ConfirmationDialogFragment.RejectListener rejectListener) {
+
+        String message = context.getString(R.string.delete_last_user_admin_created_message)
+                .concat(System.lineSeparator())
+                .concat(System.lineSeparator())
+                .concat(context.getString(R.string.delete_last_user_system_setup_required_message));
+
+        ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment.Builder(context)
+                .setTitle(R.string.delete_last_user_dialog_title)
+                .setMessage(message)
+                .setPositiveButton(R.string.delete_button, confirmListener)
+                .setNegativeButton(android.R.string.cancel, rejectListener)
+                .addArgumentString(KEY_USER_TYPE, LAST_USER)
+                .build();
+
+        return dialogFragment;
+    }
+
+    /**
+     * Gets a confirmation dialog fragment to confirm or reject removing the last admin user on the
+     * device.
+     */
+    public static ConfirmationDialogFragment getConfirmRemoveLastAdminDialogFragment(
+            Context context,
+            @Nullable ConfirmationDialogFragment.ConfirmListener confirmListener,
+            @Nullable ConfirmationDialogFragment.RejectListener rejectListener) {
+
+        ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment.Builder(context)
+                .setTitle(R.string.choose_new_admin_title)
+                .setMessage(R.string.choose_new_admin_message)
+                .setPositiveButton(R.string.choose_new_admin_label, confirmListener)
+                .setNegativeButton(android.R.string.cancel, rejectListener)
+                .addArgumentString(KEY_USER_TYPE, LAST_ADMIN)
+                .build();
+
+        return dialogFragment;
+    }
+
+    /**
+     * Gets a confirmation dialog fragment to confirm or reject removing a user that is neither the
+     * last admin nor the last user on the device.
+     */
+    public static ConfirmationDialogFragment getConfirmRemoveUserDialogFragment(Context context,
+            @Nullable ConfirmationDialogFragment.ConfirmListener confirmListener,
+            @Nullable ConfirmationDialogFragment.RejectListener rejectListener) {
+
+        ConfirmationDialogFragment dialogFragment = new ConfirmationDialogFragment.Builder(context)
+                .setTitle(R.string.delete_user_dialog_title)
+                .setMessage(R.string.delete_user_dialog_message)
+                .setPositiveButton(R.string.delete_button, confirmListener)
+                .setNegativeButton(android.R.string.cancel, rejectListener)
+                .addArgumentString(KEY_USER_TYPE, ANY_USER)
+                .build();
+
+        return dialogFragment;
+    }
+}
diff --git a/src/com/android/car/settings/users/UsersEntryPreferenceController.java b/src/com/android/car/settings/users/UsersEntryPreferenceController.java
new file mode 100644
index 0000000..a4f8b8f
--- /dev/null
+++ b/src/com/android/car/settings/users/UsersEntryPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller which determines if the top level entry into User settings should direct to a list
+ * of all users or a user details page based on the current user's admin status.
+ */
+public class UsersEntryPreferenceController extends PreferenceController<Preference> {
+
+    private static final Logger LOG = new Logger(UsersEntryPreferenceController.class);
+
+    private final CarUserManagerHelper mCarUserManagerHelper;
+
+    public UsersEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public boolean handlePreferenceClicked(Preference preference) {
+        if (mCarUserManagerHelper.isCurrentProcessAdminUser()) {
+            // Admins can see a full list of users in Settings.
+            LOG.v("Creating UsersListFragment for admin user.");
+            getFragmentController().launchFragment(new UsersListFragment());
+        } else {
+            // Non-admins can only manage themselves in Settings.
+            LOG.v("Creating UserDetailsFragment for non-admin.");
+            getFragmentController().launchFragment(UserDetailsFragment.newInstance(
+                    mCarUserManagerHelper.getCurrentProcessUserId()));
+        }
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/users/UsersItemProvider.java b/src/com/android/car/settings/users/UsersItemProvider.java
deleted file mode 100644
index e6f5108..0000000
--- a/src/com/android/car/settings/users/UsersItemProvider.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.users;
-
-import android.annotation.Nullable;
-import android.car.user.CarUserManagerHelper;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.graphics.drawable.Drawable;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Implementation of {@link ListItemProvider} for {@link UsersListFragment}.
- * Creates items that represent users on the system.
- */
-class UsersItemProvider extends ListItemProvider {
-    private final List<ListItem> mItems = new ArrayList<>();
-    private final Context mContext;
-    private final UserClickListener mUserClickListener;
-    private final CarUserManagerHelper mCarUserManagerHelper;
-    private final UserIconProvider mUserIconProvider;
-
-    UsersItemProvider(Context context, UserClickListener userClickListener,
-            CarUserManagerHelper userManagerHelper) {
-        mContext = context;
-        mUserClickListener = userClickListener;
-        mCarUserManagerHelper = userManagerHelper;
-        mUserIconProvider = new UserIconProvider(mCarUserManagerHelper);
-        refreshItems();
-    }
-
-    @Override
-    public ListItem get(int position) {
-        return mItems.get(position);
-    }
-
-    @Override
-    public int size() {
-        return mItems.size();
-    }
-
-    /**
-     * Clears and recreates the list of items.
-     */
-    public void refreshItems() {
-        mItems.clear();
-
-        UserInfo currUserInfo = mCarUserManagerHelper.getCurrentForegroundUserInfo();
-
-        // Show current user
-        mItems.add(createUserItem(currUserInfo, /* isCurrentUser= */ true));
-
-        // If the current user is a demo user, don't list any of the other users.
-        if (currUserInfo.isDemo()) {
-            return;
-        }
-
-        // Display other users on the system
-        List<UserInfo> infos = mCarUserManagerHelper.getAllSwitchableUsers();
-        for (UserInfo userInfo : infos) {
-            if (!userInfo.isGuest()) { // Do not show guest users.
-                mItems.add(createUserItem(userInfo, /* isCurrentUser= */ false));
-            }
-        }
-
-        // Display guest session option.
-        if (!currUserInfo.isGuest()) {
-            mItems.add(createGuestItem());
-        }
-    }
-
-    // Creates a line for a user, clicking on it leads to the user details page.
-    private ListItem createUserItem(UserInfo userInfo, boolean isCurrentUser) {
-        TextListItem item = new TextListItem(mContext);
-        item.setPrimaryActionIcon(mUserIconProvider.getUserIcon(userInfo, mContext),
-                /* useLargeIcon= */ false);
-        item.setTitle(getUserItemTitle(userInfo, isCurrentUser));
-        item.setBody(getUserItemSummary(userInfo, isCurrentUser));
-        item.setOnClickListener(view -> mUserClickListener.onUserClicked(userInfo));
-        item.setSupplementalIcon(R.drawable.ic_chevron_right, false);
-        return item;
-    }
-
-    @Nullable
-    private String getUserItemSummary(UserInfo userInfo, boolean isCurrentUser) {
-        if (!userInfo.isInitialized()) {
-            return mContext.getString(R.string.user_summary_not_set_up);
-        }
-        if (userInfo.isAdmin()) {
-            return isCurrentUser ? mContext.getString(R.string.signed_in_admin_user)
-                    : mContext.getString(R.string.user_admin);
-        }
-        // No summary for users who are initialized and not admins.
-        return null;
-    }
-
-    private String getUserItemTitle(UserInfo userInfo, boolean isCurrentUser)  {
-        return isCurrentUser ? mContext.getString(R.string.current_user_name, userInfo.name)
-                : userInfo.name;
-    }
-
-    // Creates a line for a guest session.
-    private ListItem createGuestItem() {
-        Drawable icon = UserIconProvider.scaleUserIcon(mCarUserManagerHelper.getGuestDefaultIcon(),
-                mCarUserManagerHelper, mContext);
-
-        TextListItem item = new TextListItem(mContext);
-        item.setPrimaryActionIcon(icon, /* useLargeIcon= */ false);
-        item.setTitle(mContext.getString(R.string.user_guest));
-
-        item.setOnClickListener(view -> mUserClickListener.onGuestClicked());
-        item.setSupplementalIcon(R.drawable.ic_chevron_right, false);
-        return item;
-    }
-
-    /**
-     * Interface for registering clicks on users.
-     */
-    interface UserClickListener {
-        /**
-         * Invoked when user is clicked.
-         *
-         * @param userInfo User for which the click is registered.
-         */
-        void onUserClicked(UserInfo userInfo);
-
-        /**
-         * Invoked when guest is clicked.
-         */
-        void onGuestClicked();
-    }
-}
diff --git a/src/com/android/car/settings/users/UsersListFragment.java b/src/com/android/car/settings/users/UsersListFragment.java
index 2784aee..160fbb6 100644
--- a/src/com/android/car/settings/users/UsersListFragment.java
+++ b/src/com/android/car/settings/users/UsersListFragment.java
@@ -17,93 +17,99 @@
 package com.android.car.settings.users;
 
 import android.car.drivingstate.CarUxRestrictions;
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.content.Intent;
-import android.content.pm.UserInfo;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 import android.widget.ProgressBar;
 
-import androidx.car.widget.ListItemProvider;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
+import com.android.car.settings.common.CarUxRestrictionsHelper;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.ErrorDialog;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.internal.annotations.VisibleForTesting;
 
 /**
  * Lists all Users available on this device.
  */
-public class UsersListFragment extends ListItemSettingsFragment
-        implements CarUserManagerHelper.OnUsersUpdateListener,
-        UsersItemProvider.UserClickListener,
-        ConfirmCreateNewUserDialog.ConfirmCreateNewUserListener,
+public class UsersListFragment extends SettingsFragment implements
         ConfirmExitRetailModeDialog.ConfirmExitRetailModeListener,
         AddNewUserTask.AddNewUserListener {
     private static final String FACTORY_RESET_PACKAGE_NAME = "android";
     private static final String FACTORY_RESET_REASON = "ExitRetailModeConfirmed";
 
-    private UsersItemProvider mItemProvider;
     private CarUserManagerHelper mCarUserManagerHelper;
 
     private ProgressBar mProgressBar;
     private Button mAddUserButton;
 
     private AsyncTask mAddNewUserTask;
+    /** Indicates that a task is running. */
+    private boolean mIsBusy;
+    private float mOpacityDisabled;
+    private float mOpacityEnabled;
+    private boolean mRestricted;
 
-    public static UsersListFragment newInstance() {
-        UsersListFragment usersListFragment = new UsersListFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.users_list_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        usersListFragment.setArguments(bundle);
-        return usersListFragment;
+    @VisibleForTesting
+    final ConfirmationDialogFragment.ConfirmListener mConfirmListener = arguments -> {
+        mAddNewUserTask = new AddNewUserTask(mCarUserManagerHelper, /* addNewUserListener= */
+                this).execute(getContext().getString(R.string.user_new_user_name));
+        mIsBusy = true;
+        updateUi();
+    };
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.users_list_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mOpacityDisabled = getContext().getResources().getFloat(R.dimen.opacity_disabled);
+        mOpacityEnabled = getContext().getResources().getFloat(R.dimen.opacity_enabled);
+        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
-        mItemProvider =
-                new UsersItemProvider(getContext(), this, mCarUserManagerHelper);
-
-        // Register to receive changes to the users.
-        mCarUserManagerHelper.registerOnUsersUpdateListener(this);
-
-        // Super class's onActivityCreated need to be called after itemProvider is initialized.
-        // Because getItemProvider is called in there.
         super.onActivityCreated(savedInstanceState);
 
-        mProgressBar = getActivity().findViewById(R.id.progress_bar);
+        mProgressBar = requireActivity().findViewById(R.id.progress_bar);
 
-        mAddUserButton = (Button) getActivity().findViewById(R.id.action_button1);
+        mAddUserButton = getActivity().findViewById(R.id.action_button1);
+        mAddUserButton.setOnClickListener(v -> {
+            if (mRestricted) {
+                showBlockingMessage();
+            } else {
+                handleAddUserClicked();
+            }
+        });
         if (mCarUserManagerHelper.isCurrentProcessDemoUser()) {
-            // If the user is a demo user, show a dialog asking if they want to exit retail/demo
-            // mode
             mAddUserButton.setText(R.string.exit_retail_button_text);
-            mAddUserButton.setOnClickListener(v -> {
-                ConfirmExitRetailModeDialog dialog = new ConfirmExitRetailModeDialog();
-                dialog.setConfirmExitRetailModeListener(this);
-                dialog.show(this);
-            });
         } else if (mCarUserManagerHelper.canCurrentProcessAddUsers()) {
-            // Only add the add user button if the current user is allowed to add a user.
             mAddUserButton.setText(R.string.user_add_user_menu);
-            mAddUserButton.setOnClickListener(v -> {
-                ConfirmCreateNewUserDialog dialog =
-                        new ConfirmCreateNewUserDialog();
-                dialog.setConfirmCreateNewUserListener(this);
-                dialog.show(this);
-            });
         }
     }
 
     @Override
-    public void onCreateNewUserConfirmed() {
-        mAddUserButton.setEnabled(false);
-        mProgressBar.setVisibility(View.VISIBLE);
-        mAddNewUserTask =
-                new AddNewUserTask(mCarUserManagerHelper, /* addNewUserListener= */ this)
-                        .execute(getContext().getString(R.string.user_new_user_name));
+    public void onUxRestrictionsChanged(CarUxRestrictions restrictionInfo) {
+        mRestricted = CarUxRestrictionsHelper.isNoSetup(restrictionInfo);
+        mAddUserButton.setAlpha(mRestricted ? mOpacityDisabled : mOpacityEnabled);
     }
 
     /**
@@ -123,58 +129,70 @@
     }
 
     @Override
+    public void onStart() {
+        super.onStart();
+        updateUi();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mProgressBar.setVisibility(View.GONE);
+    }
+
+    @Override
     public void onDestroy() {
         super.onDestroy();
 
         if (mAddNewUserTask != null) {
             mAddNewUserTask.cancel(/* mayInterruptIfRunning= */ false);
         }
-
-        mCarUserManagerHelper.unregisterOnUsersUpdateListener(this);
     }
 
     @Override
-    public void onUsersUpdate() {
-        refreshListItems();
+    public void onUserAddedSuccess() {
+        mIsBusy = false;
+        updateUi();
     }
 
     @Override
-    public void onUserClicked(UserInfo userInfo) {
-        if (mCarUserManagerHelper.isForegroundUser(userInfo)) {
-            // If it's the foreground user, launch fragment that allows them to edit their name.
-            getFragmentController().launchFragment(EditUsernameFragment.newInstance(userInfo));
-        } else {
-            // If it's another user, launch fragment that displays their information
-            getFragmentController().launchFragment(UserDetailsFragment.newInstance(userInfo));
+    public void onUserAddedFailure() {
+        mIsBusy = false;
+        updateUi();
+        // Display failure dialog.
+        ErrorDialog.show(this, R.string.add_user_error_title);
+    }
+
+    private void updateUi() {
+        mAddUserButton.setEnabled(!mIsBusy);
+        mProgressBar.setVisibility(mIsBusy ? View.VISIBLE : View.GONE);
+    }
+
+    private void handleAddUserClicked() {
+        // If the user is a demo user, show a dialog asking if they want to exit retail/demo mode.
+        if (mCarUserManagerHelper.isCurrentProcessDemoUser()) {
+            ConfirmExitRetailModeDialog dialog = new ConfirmExitRetailModeDialog();
+            dialog.setConfirmExitRetailModeListener(this);
+            dialog.show(this);
+            return;
         }
-    }
 
-    /**
-     * User list fragment is distraction optimized, so is allowed at all times.
-     */
-    @Override
-    public boolean canBeShown(CarUxRestrictions carUxRestrictions) {
-        return true;
-    }
+        // If no more users can be added because the maximum allowed number is reached, let the user
+        // know.
+        if (mCarUserManagerHelper.isUserLimitReached()) {
+            MaxUsersLimitReachedDialog dialog = new MaxUsersLimitReachedDialog(
+                    mCarUserManagerHelper.getMaxSupportedRealUsers());
+            dialog.show(this);
+            return;
+        }
 
-    @Override
-    public void onGuestClicked() {
-        getFragmentController().launchFragment(GuestFragment.newInstance());
-    }
+        // Only add the add user button if the current user is allowed to add a user.
+        if (mCarUserManagerHelper.canCurrentProcessAddUsers()) {
+            ConfirmationDialogFragment dialogFragment =
+                    UsersDialogProvider.getConfirmCreateNewUserDialogFragment(getContext(),
+                            mConfirmListener, null);
 
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-
-    private void refreshListItems() {
-        mItemProvider.refreshItems();
-        refreshList();
-    }
-
-    @Override
-    public void onUserAdded() {
-        mAddUserButton.setEnabled(true);
-        mProgressBar.setVisibility(View.GONE);
+            dialogFragment.show(getFragmentManager(), ConfirmationDialogFragment.TAG);
+        }
     }
 }
diff --git a/src/com/android/car/settings/users/UsersListPreferenceController.java b/src/com/android/car/settings/users/UsersListPreferenceController.java
new file mode 100644
index 0000000..793e759
--- /dev/null
+++ b/src/com/android/car/settings/users/UsersListPreferenceController.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import com.android.car.settings.common.FragmentController;
+
+/** Business logic for populating the users for the users list settings. */
+public class UsersListPreferenceController extends UsersBasePreferenceController {
+
+    public UsersListPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected void userClicked(UserInfo userInfo) {
+        if (UserUtils.isAdminViewingNonAdmin(getCarUserManagerHelper(), userInfo)) {
+            // Admin viewing non admin.
+            getFragmentController().launchFragment(
+                    UserDetailsPermissionsFragment.newInstance(userInfo.id));
+        } else {
+            getFragmentController().launchFragment(UserDetailsFragment.newInstance(userInfo.id));
+        }
+    }
+}
diff --git a/src/com/android/car/settings/users/UsersPreferenceProvider.java b/src/com/android/car/settings/users/UsersPreferenceProvider.java
new file mode 100644
index 0000000..a34f99b
--- /dev/null
+++ b/src/com/android/car/settings/users/UsersPreferenceProvider.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Constructs the preferences to be displayed in {@link UsersListFragment} and
+ * {@link ChooseNewAdminFragment}.
+ */
+public class UsersPreferenceProvider {
+
+    /**
+     * Interface for registering clicks on users.
+     */
+    public interface UserClickListener {
+        /**
+         * Invoked when user is clicked.
+         *
+         * @param userInfo User for which the click is registered.
+         */
+        void onUserClicked(UserInfo userInfo);
+    }
+
+    private final Context mContext;
+    private final CarUserManagerHelper mCarUserManagerHelper;
+    private final UserClickListener mUserPreferenceClickListener;
+    private boolean mIncludeCurrentUser;
+    private boolean mIncludeGuest;
+
+    public UsersPreferenceProvider(Context context, CarUserManagerHelper carUserManagerHelper,
+            UserClickListener listener) {
+        mContext = context;
+        mCarUserManagerHelper = carUserManagerHelper;
+        mUserPreferenceClickListener = listener;
+        mIncludeCurrentUser = true;
+        mIncludeGuest = true;
+    }
+
+    /**
+     * Sets whether createUserList should include an entry for the current user. Default is
+     * {@code true}.
+     */
+    public void setIncludeCurrentUser(boolean includeCurrentUser) {
+        mIncludeCurrentUser = includeCurrentUser;
+    }
+
+    /**
+     * Sets whether createUserList should include an entry for the guest profile. Default is
+     * {@code true}.
+     */
+    public void setIncludeGuest(boolean includeGuest) {
+        mIncludeGuest = includeGuest;
+    }
+
+    /**
+     * Creates the list of users (as preferences). The first user will be the current user (if
+     * requested) and the last user will be the guest user (if requested). Otherwise, the list is
+     * populated with all of the remaining switchable users.
+     */
+    public List<Preference> createUserList() {
+        List<Preference> users = new ArrayList<>();
+        UserInfo currUserInfo = mCarUserManagerHelper.getCurrentProcessUserInfo();
+
+        // Show current user
+        if (mIncludeCurrentUser) {
+            users.add(createUserPreference(currUserInfo));
+        }
+
+        // Display other users on the system
+        List<UserInfo> infos = mCarUserManagerHelper.getAllSwitchableUsers();
+        for (UserInfo userInfo : infos) {
+            if (!userInfo.isGuest()) { // Do not show guest users.
+                users.add(createUserPreference(userInfo));
+            }
+        }
+
+        // Display guest session option.
+        if (mIncludeGuest) {
+            users.add(createGuestUserPreference());
+        }
+
+        return users;
+    }
+
+    private Preference createUserPreference(UserInfo userInfo) {
+        Preference preference = new Preference(mContext);
+        preference.setIcon(
+                new UserIconProvider(mCarUserManagerHelper).getUserIcon(userInfo, mContext));
+        preference.setTitle(
+                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, userInfo));
+
+        if (!userInfo.isInitialized()) {
+            preference.setSummary(R.string.user_summary_not_set_up);
+        }
+        if (userInfo.isAdmin()) {
+            preference.setSummary(
+                    isCurrentUser(userInfo) ? R.string.signed_in_admin_user : R.string.user_admin);
+        }
+
+        preference.setOnPreferenceClickListener(pref -> {
+            if (mUserPreferenceClickListener == null) {
+                return false;
+            }
+            mUserPreferenceClickListener.onUserClicked(userInfo);
+            return true;
+        });
+
+        return preference;
+    }
+
+    private Preference createGuestUserPreference() {
+        Preference preference = new Preference(mContext);
+        preference.setIcon(
+                new UserIconProvider(mCarUserManagerHelper).getDefaultGuestIcon(mContext));
+        preference.setTitle(R.string.user_guest);
+        return preference;
+    }
+
+    private boolean isCurrentUser(UserInfo userInfo) {
+        return mCarUserManagerHelper.isCurrentProcessUser(userInfo);
+    }
+}
diff --git a/src/com/android/car/settings/wifi/AccessPointListAdapter.java b/src/com/android/car/settings/wifi/AccessPointListAdapter.java
deleted file mode 100644
index f43baaa..0000000
--- a/src/com/android/car/settings/wifi/AccessPointListAdapter.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.wifi;
-
-import android.annotation.NonNull;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.StateListDrawable;
-import android.net.wifi.WifiManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.car.widget.PagedListView;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.settingslib.wifi.AccessPoint;
-
-import java.util.List;
-
-/**
- * Renders {@link AccessPoint} to a view to be displayed as a row in a list.
- */
-public class AccessPointListAdapter
-        extends RecyclerView.Adapter<AccessPointListAdapter.ViewHolder>
-        implements PagedListView.ItemCap {
-    private static final int NETWORK_ROW_TYPE = 1;
-    private static final int ADD_NETWORK_ROW_TYPE = 2;
-
-    private static final int[] STATE_SECURED = {
-            com.android.settingslib.R.attr.state_encrypted
-    };
-    private static final int[] STATE_NONE = {};
-    private static int[] wifi_signal_attributes = {com.android.settingslib.R.attr.wifi_signal};
-
-    private final StateListDrawable mWifiSld;
-    private final Context mContext;
-    private final BaseFragment.FragmentController mFragmentController;
-    private final CarWifiManager mCarWifiManager;
-    private final WifiManager.ActionListener mConnectionListener;
-    private boolean mShowAddNetworkRow;
-
-    private List<AccessPoint> mAccessPoints;
-
-    public AccessPointListAdapter(
-            @NonNull Context context,
-            CarWifiManager carWifiManager,
-            @NonNull List<AccessPoint> accesssPoints,
-            BaseFragment.FragmentController fragmentController) {
-        mContext = context;
-        mFragmentController = fragmentController;
-        mCarWifiManager = carWifiManager;
-        mAccessPoints = accesssPoints;
-        mWifiSld = (StateListDrawable) context.getTheme()
-                .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0);
-
-        mConnectionListener = new WifiManager.ActionListener() {
-            @Override
-            public void onSuccess() {
-            }
-            @Override
-            public void onFailure(int reason) {
-                Toast.makeText(mContext,
-                        R.string.wifi_failed_connect_message,
-                        Toast.LENGTH_SHORT).show();
-            }
-        };
-    }
-
-    /**
-     * Toggles the row that links to add a new network.
-     */
-    public AccessPointListAdapter showAddNetworkRow(boolean show) {
-        mShowAddNetworkRow = show;
-        return this;
-    }
-
-    public void updateAccessPoints(@NonNull List<AccessPoint> accesssPoints) {
-        mAccessPoints = accesssPoints;
-        notifyDataSetChanged();
-    }
-
-    public boolean isEmpty() {
-        return mAccessPoints.isEmpty();
-    }
-
-    public class ViewHolder extends RecyclerView.ViewHolder {
-        private final ImageView mIcon;
-        private final ImageView mRightChevron;
-        private final TextView mWifiName;
-        private final TextView mWifiDesc;
-
-        public ViewHolder(View view) {
-            super(view);
-            mWifiName = (TextView) view.findViewById(R.id.title);
-            mWifiDesc = (TextView) view.findViewById(R.id.desc);
-            mIcon = (ImageView) view.findViewById(R.id.icon);
-            mRightChevron = (ImageView) view.findViewById(R.id.right_chevron);
-        }
-    }
-
-    private class AccessPointClickListener implements OnClickListener {
-        private final AccessPoint mAccessPoint;
-
-        public AccessPointClickListener(AccessPoint accessPoint) {
-            mAccessPoint = accessPoint;
-        }
-
-        @Override
-        public void onClick(View v) {
-            // for new open unsecuried wifi network, connect to it right away
-            if (mAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE &&
-                    !mAccessPoint.isSaved() && !mAccessPoint.isActive()) {
-                mCarWifiManager.connectToPublicWifi(mAccessPoint, mConnectionListener);
-            } else if (mAccessPoint.isSaved()) {
-                mFragmentController.launchFragment(WifiDetailFragment.getInstance(mAccessPoint));
-            } else {
-                mFragmentController.launchFragment(AddWifiFragment.getInstance(mAccessPoint));
-            }
-        }
-    };
-
-    @Override
-    public int getItemViewType(int position) {
-        // the last row is the add device row
-        if (position == mAccessPoints.size()) {
-            return ADD_NETWORK_ROW_TYPE;
-        }
-        return NETWORK_ROW_TYPE;
-    }
-
-    @Override
-    public AccessPointListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
-            int viewType) {
-        ViewHolder viewHolder = new ViewHolder(LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.icon_text_line_item, parent, false));
-        if (viewType == ADD_NETWORK_ROW_TYPE) {
-            viewHolder.mIcon.setImageResource(R.drawable.ic_add);
-            viewHolder.mWifiDesc.setVisibility(View.GONE);
-            viewHolder.mWifiName.setText(R.string.wifi_setup_add_network);
-            viewHolder.itemView.setOnClickListener(v -> {
-                mFragmentController.launchFragment(AddWifiFragment.getInstance(null));
-            });
-        }
-        return viewHolder;
-    }
-
-    @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
-        // for the last row, it's the "add network button", no more binding needed.
-        if (position >= mAccessPoints.size()) {
-            return;
-        }
-        AccessPoint accessPoint = mAccessPoints.get(position);
-        holder.itemView.setOnClickListener(new AccessPointClickListener(accessPoint));
-        holder.mWifiName.setText(accessPoint.getConfigName());
-        holder.mIcon.setImageDrawable(getIcon(accessPoint));
-        String summary = accessPoint.getSummary();
-        if (summary != null && !summary.isEmpty()) {
-            holder.mWifiDesc.setText(summary);
-            holder.mWifiDesc.setVisibility(View.VISIBLE);
-        } else {
-            holder.mWifiDesc.setVisibility(View.GONE);
-        }
-        if (accessPoint.getSecurity() == accessPoint.SECURITY_NONE &&
-                !accessPoint.isSaved() && !accessPoint.isActive()) {
-            holder.mRightChevron.setVisibility(View.GONE);
-        } else {
-            holder.mRightChevron.setVisibility(View.VISIBLE);
-        }
-    }
-
-    @Override
-    public int getItemCount() {
-        // number of rows include one per device and a row for add network.
-        return mShowAddNetworkRow ? mAccessPoints.size() + 1 : mAccessPoints.size();
-    }
-
-    @Override
-    public void setMaxItems(int maxItems) {
-        // no limit in this list.
-    }
-
-    private Drawable getIcon(AccessPoint accessPoint) {
-        mWifiSld.setState((accessPoint.getSecurity() != AccessPoint.SECURITY_NONE)
-                ? STATE_SECURED
-                : STATE_NONE);
-        Drawable drawable = mWifiSld.getCurrent();
-        drawable.setLevel(accessPoint.getLevel());
-        drawable.invalidateSelf();
-        return drawable;
-    }
-}
diff --git a/src/com/android/car/settings/wifi/AccessPointListPreferenceController.java b/src/com/android/car/settings/wifi/AccessPointListPreferenceController.java
new file mode 100644
index 0000000..f53c41b
--- /dev/null
+++ b/src/com/android/car/settings/wifi/AccessPointListPreferenceController.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager;
+import android.content.Context;
+import android.net.wifi.WifiManager;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.CarUxRestrictionsHelper;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.wifi.details.WifiDetailsFragment;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Renders a list of {@link AccessPoint} as a list of preferences.
+ */
+public class AccessPointListPreferenceController extends
+        WifiBasePreferenceController<PreferenceGroup> implements
+        Preference.OnPreferenceClickListener,
+        Preference.OnPreferenceChangeListener,
+        CarUxRestrictionsManager.OnUxRestrictionsChangedListener {
+    private static final Logger LOG = new Logger(AccessPointListPreferenceController.class);
+    private final WifiManager.ActionListener mConnectionListener =
+            new WifiUtil.ActionFailedListener(getContext(), R.string.wifi_failed_connect_message);
+    private List<AccessPoint> mAccessPoints = new ArrayList<>();
+
+    public AccessPointListPreferenceController(@NonNull Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<PreferenceGroup> getPreferenceType() {
+        return PreferenceGroup.class;
+    }
+
+    @Override
+    protected void updateState(PreferenceGroup preferenceGroup) {
+        if (getCarWifiManager() == null) {
+            return;
+        }
+        mAccessPoints = CarUxRestrictionsHelper.isNoSetup(getUxRestrictions())
+                ? getCarWifiManager().getSavedAccessPoints()
+                : getCarWifiManager().getAllAccessPoints();
+        LOG.d("showing accessPoints: " + mAccessPoints.size());
+
+        preferenceGroup.setVisible(!mAccessPoints.isEmpty());
+        preferenceGroup.removeAll();
+        for (AccessPoint accessPoint : mAccessPoints) {
+            preferenceGroup.addPreference(createAccessPointPreference(accessPoint));
+        }
+    }
+
+    @Override
+    protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
+        // Since the list dynamically changes based on the ux restrictions, we enable this fragment
+        // regardless of the restriction. Intentional no-op.
+    }
+
+    @Override
+    public void onAccessPointsChanged() {
+        refreshUi();
+    }
+
+    @Override
+    public void onWifiStateChanged(int state) {
+        if (state == WifiManager.WIFI_STATE_ENABLED) {
+            refreshUi();
+        }
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        AccessPoint accessPoint = ((AccessPointPreference) preference).getAccessPoint();
+        // For new open unsecuried wifi network, connect to it right away.
+        if (accessPoint.getSecurity() == AccessPoint.SECURITY_NONE
+                && !accessPoint.isSaved() && !accessPoint.isActive()) {
+            getCarWifiManager().connectToPublicWifi(accessPoint, mConnectionListener);
+        } else if (accessPoint.isActive()) {
+            getFragmentController().launchFragment(WifiDetailsFragment.getInstance(accessPoint));
+        } else if (accessPoint.isSaved() && !WifiUtil.isAccessPointDisabledByWrongPassword(
+                accessPoint)) {
+            getCarWifiManager().connectToSavedWifi(accessPoint, mConnectionListener);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        AccessPoint accessPoint = ((AccessPointPreference) preference).getAccessPoint();
+        WifiUtil.connectToAccessPoint(getContext(), accessPoint.getSsid().toString(),
+                accessPoint.getSecurity(), newValue.toString(), /* hidden= */ false);
+        return true;
+    }
+
+    private AccessPointPreference createAccessPointPreference(AccessPoint accessPoint) {
+        LOG.d("Adding preference for " + WifiUtil.getKey(accessPoint));
+        AccessPointPreference accessPointPreference = new AccessPointPreference(getContext(),
+                accessPoint);
+        accessPointPreference.setKey(accessPoint.getKey());
+        accessPointPreference.setTitle(accessPoint.getConfigName());
+        accessPointPreference.setDialogTitle(accessPoint.getConfigName());
+        accessPointPreference.setSummary(accessPoint.getSummary());
+        accessPointPreference.setOnPreferenceClickListener(this);
+        accessPointPreference.setOnPreferenceChangeListener(this);
+        accessPointPreference.showButton(false);
+
+        if (accessPoint.isSaved() && WifiUtil.isAccessPointDisabledByWrongPassword(accessPoint)) {
+            accessPointPreference.setWidgetLayoutResource(R.layout.delete_preference_widget);
+            accessPointPreference.setOnButtonClickListener(
+                    preference -> WifiUtil.forget(getContext(), accessPoint));
+            accessPointPreference.showButton(true);
+        }
+
+        return accessPointPreference;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/AccessPointPreference.java b/src/com/android/car/settings/wifi/AccessPointPreference.java
new file mode 100644
index 0000000..f0e2a8d
--- /dev/null
+++ b/src/com/android/car/settings/wifi/AccessPointPreference.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.wifi.AccessPoint;
+
+/** Renders a {@link AccessPoint} as a preference. */
+public class AccessPointPreference extends ButtonPasswordEditTextPreference {
+    private static final Logger LOG = new Logger(AccessPointPreference.class);
+    private static final int[] STATE_SECURED = {
+            com.android.settingslib.R.attr.state_encrypted
+    };
+    private static final int[] STATE_NONE = {};
+    private static int[] sWifiSignalAttributes = {com.android.settingslib.R.attr.wifi_signal};
+
+    private final StateListDrawable mWifiSld;
+    private final AccessPoint mAccessPoint;
+
+    public AccessPointPreference(
+            Context context,
+            AccessPoint accessPoint) {
+        super(context);
+        mWifiSld = (StateListDrawable) context.getTheme()
+                .obtainStyledAttributes(sWifiSignalAttributes).getDrawable(0);
+        mAccessPoint = accessPoint;
+        LOG.d("creating preference for ap: " + mAccessPoint);
+        setIcon(getAccessPointIcon());
+    }
+
+    /**
+     * Returns the {@link AccessPoint}.
+     */
+    public AccessPoint getAccessPoint() {
+        return mAccessPoint;
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        setIcon(getAccessPointIcon());
+    }
+
+    @Override
+    protected void onClick() {
+        if (shouldShowPasswordDialog()) {
+            super.onClick();
+        }
+    }
+
+    /**
+     * Show password dialog for one of the following conditions:
+     * 1. AP with some security but is not saved and not active
+     * 2. AP that has been saved, but not enabled due to wrong password.
+     */
+    private boolean shouldShowPasswordDialog() {
+        return mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE && (!mAccessPoint.isSaved()
+                || WifiUtil.isAccessPointDisabledByWrongPassword(mAccessPoint));
+    }
+
+    private Drawable getAccessPointIcon() {
+        if (mWifiSld == null) {
+            LOG.w("wifiSld is null.");
+            return null;
+        }
+        mWifiSld.setState(
+                (mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE)
+                        ? STATE_SECURED
+                        : STATE_NONE);
+        Drawable drawable = mWifiSld.getCurrent();
+        drawable.setLevel(mAccessPoint.getLevel());
+        return drawable;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/AddWifiFragment.java b/src/com/android/car/settings/wifi/AddWifiFragment.java
index 72b5eeb..000a53a 100644
--- a/src/com/android/car/settings/wifi/AddWifiFragment.java
+++ b/src/com/android/car/settings/wifi/AddWifiFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -13,89 +13,85 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.android.car.settings.wifi;
 
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
+import android.text.TextUtils;
 import android.widget.Button;
-import android.widget.Toast;
 
-import androidx.annotation.Nullable;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 
-import com.android.car.list.EditTextLineItem;
-import com.android.car.list.PasswordLineItem;
-import com.android.car.list.SpinnerLineItem;
-import com.android.car.list.TypedPagedListAdapter;
 import com.android.car.settings.R;
-import com.android.car.settings.common.ListSettingsFragment;
 import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
 import com.android.settingslib.wifi.AccessPoint;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
 /**
- * Adds a wifi network, the network can be public or private. If ADD_NETWORK_MODE is not specified
- * in the intent, then it needs to contain AccessPoint information, which is be use that to
- * render UI, e.g. show SSID etc.
+ * Adds a hidden wifi network. The connect button on the fragment is only used for unsecure hidden
+ * networks. The remaining security types can be connected via pressing connect on the password
+ * dialog.
  */
-public class AddWifiFragment extends ListSettingsFragment implements
-        AdapterView.OnItemSelectedListener {
-    public static final String EXTRA_AP_STATE = "extra_ap_state";
-
+public class AddWifiFragment extends SettingsFragment {
     private static final Logger LOG = new Logger(AddWifiFragment.class);
-    private static final Pattern HEX_PATTERN = Pattern.compile("^[0-9A-F]+$");
-    private static final Pattern VALID_SSID_PATTERN =
-            Pattern.compile("^[A-Za-z]+[\\w\\-\\:\\.]*$");
-    @Nullable
-    private AccessPoint mAccessPoint;
-    @Nullable
-    private SpinnerLineItem<AccessPointSecurity> mSpinnerLineItem;
-    private WifiManager mWifiManager;
-    private Button mAddWifiButton;
-    private final WifiManager.ActionListener mConnectionListener =
-            new WifiManager.ActionListener() {
-                @Override
-                public void onSuccess() {
-                }
+    private static final String KEY_NETWORK_NAME = "network_name";
+    private static final String KEY_SECURITY_TYPE = "security_type";
 
-                @Override
-                public void onFailure(int reason) {
-                    Toast.makeText(getContext(),
-                            R.string.wifi_failed_connect_message,
-                            Toast.LENGTH_SHORT).show();
-                }
-            };
-    private EditTextLineItem mWifiNameInput;
-    private EditTextLineItem mWifiPasswordInput;
-
-    private int mSelectedPosition = AccessPointSecurity.SECURITY_NONE_POSITION;
-
-    public static AddWifiFragment getInstance(AccessPoint accessPoint) {
-        AddWifiFragment addWifiFragment = new AddWifiFragment();
-        Bundle bundle = ListSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.wifi_setup_add_network);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        Bundle accessPointState = new Bundle();
-        if (accessPoint != null) {
-            accessPoint.saveWifiState(accessPointState);
-            bundle.putBundle(EXTRA_AP_STATE, accessPointState);
+    private final BroadcastReceiver mNameChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mNetworkName = intent.getStringExtra(
+                    NetworkNamePreferenceController.KEY_NETWORK_NAME);
+            setButtonEnabledState();
         }
-        addWifiFragment.setArguments(bundle);
-        return addWifiFragment;
+    };
+
+    private final BroadcastReceiver mSecurityChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mSecurityType = intent.getIntExtra(
+                    NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                    AccessPoint.SECURITY_NONE);
+            setButtonEnabledState();
+        }
+    };
+
+    private Button mAddWifiButton;
+    private String mNetworkName;
+    private int mSecurityType = AccessPoint.SECURITY_NONE;
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.add_wifi_fragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
     }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if (getArguments().keySet().contains(EXTRA_AP_STATE)) {
-            mAccessPoint = new AccessPoint(getContext(), getArguments().getBundle(EXTRA_AP_STATE));
+        if (savedInstanceState != null) {
+            mNetworkName = savedInstanceState.getString(KEY_NETWORK_NAME);
+            mSecurityType = savedInstanceState.getInt(KEY_SECURITY_TYPE, AccessPoint.SECURITY_NONE);
         }
-        mWifiManager = getContext().getSystemService(WifiManager.class);
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString(KEY_NETWORK_NAME, mNetworkName);
+        outState.putInt(KEY_SECURITY_TYPE, mSecurityType);
     }
 
     @Override
@@ -104,126 +100,40 @@
 
         mAddWifiButton = getActivity().findViewById(R.id.action_button1);
         mAddWifiButton.setText(R.string.wifi_setup_connect);
+        setButtonEnabledState();
+
+        // This only needs to handle hidden/unsecure networks.
         mAddWifiButton.setOnClickListener(v -> {
-            connectToAccessPoint();
-            getFragmentController().goBack();
+            int netId = WifiUtil.connectToAccessPoint(getContext(), mNetworkName,
+                    AccessPoint.SECURITY_NONE, /* password= */ null, /* hidden= */ true);
+
+            LOG.d("connected to netId: " + netId);
+            if (netId != WifiUtil.INVALID_NET_ID) {
+                goBack();
+            }
         });
-        mAddWifiButton.setEnabled(mAccessPoint != null);
     }
 
     @Override
-    public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
-        ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
-        if (mAccessPoint != null) {
-            mWifiNameInput = new EditTextLineItem(
-                    getContext().getText(R.string.wifi_ssid), mAccessPoint.getSsid());
-            mWifiNameInput.setTextType(EditTextLineItem.TextType.NONE);
-        } else {
-            mWifiNameInput = new EditTextLineItem(
-                    getContext().getText(R.string.wifi_ssid));
-            mWifiNameInput.setTextType(EditTextLineItem.TextType.TEXT);
-            mWifiNameInput.setTextChangeListener(s ->
-                    mAddWifiButton.setEnabled(VALID_SSID_PATTERN.matcher(s).matches()));
-        }
-        lineItems.add(mWifiNameInput);
-
-        if (mAccessPoint == null) {
-            List<AccessPointSecurity> securities =
-                    AccessPointSecurity.getSecurityTypes(getContext());
-            mSpinnerLineItem = new SpinnerLineItem<>(
-                    getContext(),
-                    this,
-                    securities,
-                    getContext().getText(R.string.wifi_security),
-                    mSelectedPosition);
-            lineItems.add(mSpinnerLineItem);
-        }
-
-        if (mAccessPoint != null
-                || mSelectedPosition != AccessPointSecurity.SECURITY_NONE_POSITION) {
-            mWifiPasswordInput = new PasswordLineItem(getContext().getText(R.string.wifi_password));
-            lineItems.add(mWifiPasswordInput);
-        }
-        return lineItems;
+    public void onStart() {
+        super.onStart();
+        LocalBroadcastManager.getInstance(getContext()).registerReceiver(mNameChangeReceiver,
+                new IntentFilter(NetworkNamePreferenceController.ACTION_NAME_CHANGE));
+        LocalBroadcastManager.getInstance(getContext()).registerReceiver(mSecurityChangeReceiver,
+                new IntentFilter(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE));
     }
 
     @Override
-    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        if (position == mSelectedPosition) {
-            return;
-        }
-        mSelectedPosition = position;
-        mPagedListAdapter.setList(getLineItems());
+    public void onStop() {
+        super.onStop();
+        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mNameChangeReceiver);
+        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mSecurityChangeReceiver);
     }
 
-    @Override
-    public void onNothingSelected(AdapterView<?> parent) {
-    }
-
-    private void connectToAccessPoint() {
-        WifiConfiguration wifiConfig = new WifiConfiguration();
-        wifiConfig.SSID = String.format("\"%s\"", getSsId());
-        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
-        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
-        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
-        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
-        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
-        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
-        int security;
-        if (mAccessPoint == null) {
-            security = mSpinnerLineItem.getItem(mSelectedPosition).getSecurityType();
-            wifiConfig.hiddenSSID = true;
-        } else {
-            security = mAccessPoint.getSecurity();
-        }
-        switch (security) {
-            case AccessPoint.SECURITY_NONE:
-                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-                wifiConfig.allowedAuthAlgorithms.clear();
-                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
-                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
-                break;
-            case AccessPoint.SECURITY_WEP:
-                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-                wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
-                wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
-                String password = mWifiPasswordInput.getInput();
-                wifiConfig.wepKeys[0] = isHexString(password) ? password
-                        : "\"" + password + "\"";
-                wifiConfig.wepTxKeyIndex = 0;
-                break;
-            case AccessPoint.SECURITY_PSK:
-            case AccessPoint.SECURITY_EAP:
-                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
-                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
-                wifiConfig.preSharedKey = String.format(
-                        "\"%s\"", mWifiPasswordInput.getInput());
-                break;
-            default:
-                LOG.w("invalid security type: " + security);
-                break;
-        }
-        int netId = mWifiManager.addNetwork(wifiConfig);
-        if (netId == -1) {
-            Toast.makeText(getContext(),
-                    R.string.wifi_failed_connect_message,
-                    Toast.LENGTH_SHORT).show();
-        } else {
-            mWifiManager.enableNetwork(netId, true);
-        }
-    }
-
-    private boolean isHexString(String password) {
-        return HEX_PATTERN.matcher(password).matches();
-    }
-
-    // TODO: handle null case, show warning message etc.
-    private String getSsId() {
-        if (mAccessPoint == null) {
-            return mWifiNameInput.getInput();
-        } else {
-            return mAccessPoint.getSsid().toString();
+    private void setButtonEnabledState() {
+        if (mAddWifiButton != null) {
+            mAddWifiButton.setEnabled(
+                    !TextUtils.isEmpty(mNetworkName) && mSecurityType == AccessPoint.SECURITY_NONE);
         }
     }
 }
diff --git a/src/com/android/car/settings/wifi/AddWifiPreferenceController.java b/src/com/android/car/settings/wifi/AddWifiPreferenceController.java
new file mode 100644
index 0000000..08d2910
--- /dev/null
+++ b/src/com/android/car/settings/wifi/AddWifiPreferenceController.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.wifi.WifiManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Controls preference for adding wifi.
+ */
+public class AddWifiPreferenceController extends WifiBasePreferenceController<Preference> {
+
+    public AddWifiPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public void onWifiStateChanged(int state) {
+        switch (state) {
+            case WifiManager.WIFI_STATE_DISABLED:
+                getPreference().setVisible(false);
+                break;
+            default:
+                getPreference().setVisible(true);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java b/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
new file mode 100644
index 0000000..46834c1
--- /dev/null
+++ b/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreference.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.content.Context;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.PasswordEditTextPreference;
+
+/**
+ * A {@link PasswordEditTextPreference} which has a second button which can perform another action
+ * defined by {@link OnButtonClickListener}.
+ */
+public class ButtonPasswordEditTextPreference extends PasswordEditTextPreference {
+
+    private OnButtonClickListener mOnButtonClickListener;
+
+    private boolean mIsButtonShown = true;
+
+    public ButtonPasswordEditTextPreference(Context context) {
+        super(context);
+        init();
+    }
+
+    private void init() {
+        setLayoutResource(R.layout.two_action_preference);
+    }
+
+    /**
+     * Sets whether the secondary button is visible in the preference.
+     *
+     * @param isShown {@code true} if the secondary button should be shown.
+     */
+    public void showButton(boolean isShown) {
+        mIsButtonShown = isShown;
+        notifyChanged();
+    }
+
+    /** Returns {@code true} if action is shown. */
+    public boolean isButtonShown() {
+        return mIsButtonShown;
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        View actionConatiner = holder.findViewById(R.id.action_widget_container);
+        View widgetFrame = holder.findViewById(android.R.id.widget_frame);
+        if (mIsButtonShown) {
+            actionConatiner.setVisibility(View.VISIBLE);
+            widgetFrame.setOnClickListener(v -> performButtonClick());
+        } else {
+            actionConatiner.setVisibility(View.GONE);
+        }
+    }
+
+    /**
+     * Sets an {@link OnButtonClickListener} to be invoked when the button is clicked.
+     */
+    public void setOnButtonClickListener(OnButtonClickListener listener) {
+        mOnButtonClickListener = listener;
+    }
+
+    /** Virtually clicks the button contained inside this preference. */
+    public void performButtonClick() {
+        if (isButtonShown()) {
+            if (mOnButtonClickListener != null) {
+                mOnButtonClickListener.onButtonClick(this);
+            }
+        }
+    }
+
+    /** Callback to be invoked when the button is clicked. */
+    public interface OnButtonClickListener {
+        /**
+         * Called when a button has been clicked.
+         *
+         * @param preference the preference whose button was clicked.
+         */
+        void onButtonClick(ButtonPasswordEditTextPreference preference);
+    }
+}
diff --git a/src/com/android/car/settings/wifi/CarWifiManager.java b/src/com/android/car/settings/wifi/CarWifiManager.java
index 64414cb..be14f4c 100644
--- a/src/com/android/car/settings/wifi/CarWifiManager.java
+++ b/src/com/android/car/settings/wifi/CarWifiManager.java
@@ -18,6 +18,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 
 import androidx.annotation.UiThread;
@@ -33,11 +34,12 @@
  */
 public class CarWifiManager implements WifiTracker.WifiListener {
     private final Context mContext;
-    private Listener mListener;
+    private final List<Listener> mListeners = new ArrayList<>();
     private boolean mStarted;
 
     private WifiTracker mWifiTracker;
     private WifiManager mWifiManager;
+
     public interface Listener {
         /**
          * Something about wifi setting changed.
@@ -60,14 +62,27 @@
         void onWifiStateChanged(int state);
     }
 
-    public CarWifiManager(Context context, Listener listener) {
+    public CarWifiManager(Context context) {
         mContext = context;
-        mListener = listener;
-        mWifiManager = (WifiManager) mContext.getSystemService(WifiManager.class);
+        mWifiManager = mContext.getSystemService(WifiManager.class);
         mWifiTracker = new WifiTracker(context, this, true, true);
     }
 
     /**
+     * Adds {@link Listener}.
+     */
+    public boolean addListener(Listener listener) {
+        return mListeners.add(listener);
+    }
+
+    /**
+     * Removes {@link Listener}.
+     */
+    public boolean removeListener(Listener listener) {
+        return mListeners.remove(listener);
+    }
+
+    /**
      * Starts {@link CarWifiManager}.
      * This should be called only from main thread.
      */
@@ -142,26 +157,84 @@
         return null;
     }
 
+    /**
+     * Returns {@code true} if Wifi is enabled
+     */
     public boolean isWifiEnabled() {
         return mWifiManager.isWifiEnabled();
     }
 
+    /**
+     * Returns {@code true} if Wifi tethering is enabled
+     */
+    public boolean isWifiApEnabled() {
+        return mWifiManager.isWifiApEnabled();
+    }
+
+    /**
+     * Gets {@link WifiConfiguration} for tethering
+     */
+    public WifiConfiguration getWifiApConfig() {
+        return mWifiManager.getWifiApConfiguration();
+    }
+
+    /**
+     * Sets {@link WifiConfiguration} for tethering
+     */
+    public void setWifiApConfig(WifiConfiguration config) {
+        mWifiManager.setWifiApConfiguration(config);
+    }
+
+    /**
+     * Gets the country code in ISO 3166 format.
+     */
+    public String getCountryCode() {
+        return mWifiManager.getCountryCode();
+    }
+
+    /**
+     * Checks if the chipset supports dual frequency band (2.4 GHz and 5 GHz).
+     */
+    public boolean isDualBandSupported() {
+        return mWifiManager.isDualBandSupported();
+    }
+
+    /**
+     * Check if the chipset requires conversion of 5GHz Only apBand to ANY.
+     * @return {@code true} if required, {@code false} otherwise.
+     */
+    public boolean isDualModeSupported() {
+        return mWifiManager.isDualModeSupported();
+    }
+
+    /** Gets the wifi state from {@link WifiManager}. */
     public int getWifiState() {
         return mWifiManager.getWifiState();
     }
 
+    /** Sets whether wifi is enabled. */
     public boolean setWifiEnabled(boolean enabled) {
         return mWifiManager.setWifiEnabled(enabled);
     }
 
+    /** Connects to an public wifi access point. */
     public void connectToPublicWifi(AccessPoint accessPoint, WifiManager.ActionListener listener) {
         accessPoint.generateOpenNetworkConfig();
         mWifiManager.connect(accessPoint.getConfig(), listener);
     }
 
+    /** Connects to a saved access point. */
+    public void connectToSavedWifi(AccessPoint accessPoint, WifiManager.ActionListener listener) {
+        if (accessPoint.isSaved()) {
+            mWifiManager.connect(accessPoint.getConfig(), listener);
+        }
+    }
+
     @Override
     public void onWifiStateChanged(int state) {
-        mListener.onWifiStateChanged(state);
+        for (Listener listener : mListeners) {
+            listener.onWifiStateChanged(state);
+        }
     }
 
     @Override
@@ -170,6 +243,8 @@
 
     @Override
     public void onAccessPointsChanged() {
-        mListener.onAccessPointsChanged();
+        for (Listener listener : mListeners) {
+            listener.onAccessPointsChanged();
+        }
     }
 }
diff --git a/src/com/android/car/settings/wifi/NetworkNamePreferenceController.java b/src/com/android/car/settings/wifi/NetworkNamePreferenceController.java
new file mode 100644
index 0000000..b58f5c7
--- /dev/null
+++ b/src/com/android/car/settings/wifi/NetworkNamePreferenceController.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.text.TextUtils;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.EditTextPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic for adding/displaying the network name. */
+public class NetworkNamePreferenceController extends PreferenceController<EditTextPreference> {
+
+    /** Action used in the {@link Intent} sent by the {@link LocalBroadcastManager}. */
+    public static final String ACTION_NAME_CHANGE =
+            "com.android.car.settings.wifi.NameChangeAction";
+    /** Key used to store the name of the network. */
+    public static final String KEY_NETWORK_NAME = "network_name";
+
+    public NetworkNamePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<EditTextPreference> getPreferenceType() {
+        return EditTextPreference.class;
+    }
+
+    @Override
+    protected void updateState(EditTextPreference preference) {
+        preference.setSummary(TextUtils.isEmpty(preference.getText()) ? getContext().getString(
+                R.string.default_network_name_summary) : preference.getText());
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(EditTextPreference preference, Object newValue) {
+        String name = newValue.toString();
+        preference.setText(name);
+        notifyNameChange(name);
+        refreshUi();
+        return true;
+    }
+
+    private void notifyNameChange(String newName) {
+        Intent intent = new Intent(ACTION_NAME_CHANGE);
+        intent.putExtra(KEY_NETWORK_NAME, newName);
+        LocalBroadcastManager.getInstance(getContext()).sendBroadcastSync(intent);
+    }
+}
diff --git a/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreference.java b/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreference.java
new file mode 100644
index 0000000..8f52152
--- /dev/null
+++ b/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreference.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.Toast;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.PasswordEditTextPreference;
+
+/**
+ * Custom {@link PasswordEditTextPreference} which doesn't open the password dialog unless the
+ * network name is provided.
+ */
+public class NetworkNameRestrictedPasswordEditTextPreference extends PasswordEditTextPreference {
+
+    private String mNetworkName;
+
+    public NetworkNameRestrictedPasswordEditTextPreference(Context context, AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    public NetworkNameRestrictedPasswordEditTextPreference(Context context, AttributeSet attrs,
+            int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public NetworkNameRestrictedPasswordEditTextPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public NetworkNameRestrictedPasswordEditTextPreference(Context context) {
+        super(context);
+    }
+
+    /** Sets the network name. */
+    public void setNetworkName(String name) {
+        mNetworkName = name;
+    }
+
+    @Override
+    protected void onClick() {
+        if (TextUtils.isEmpty(mNetworkName)) {
+            Toast.makeText(getContext(), R.string.wifi_no_network_name, Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        super.onClick();
+    }
+}
diff --git a/src/com/android/car/settings/wifi/NetworkPasswordPreferenceController.java b/src/com/android/car/settings/wifi/NetworkPasswordPreferenceController.java
new file mode 100644
index 0000000..0616399
--- /dev/null
+++ b/src/com/android/car/settings/wifi/NetworkPasswordPreferenceController.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.text.TextUtils;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.wifi.AccessPoint;
+
+/** Business logic relating to the security type and associated password. */
+public class NetworkPasswordPreferenceController extends
+        PreferenceController<NetworkNameRestrictedPasswordEditTextPreference> {
+
+    private static final Logger LOG = new Logger(NetworkPasswordPreferenceController.class);
+
+    private final BroadcastReceiver mNameChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mNetworkName = intent.getStringExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME);
+            getPreference().setNetworkName(mNetworkName);
+            refreshUi();
+        }
+    };
+
+    private final BroadcastReceiver mSecurityChangeReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mSecurityType = intent.getIntExtra(
+                    NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                    AccessPoint.SECURITY_NONE);
+            refreshUi();
+        }
+    };
+
+    private String mNetworkName;
+    private int mSecurityType = AccessPoint.SECURITY_NONE;
+
+    public NetworkPasswordPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<NetworkNameRestrictedPasswordEditTextPreference> getPreferenceType() {
+        return NetworkNameRestrictedPasswordEditTextPreference.class;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        LocalBroadcastManager.getInstance(getContext()).registerReceiver(mNameChangeReceiver,
+                new IntentFilter(NetworkNamePreferenceController.ACTION_NAME_CHANGE));
+        LocalBroadcastManager.getInstance(getContext()).registerReceiver(mSecurityChangeReceiver,
+                new IntentFilter(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE));
+    }
+
+    @Override
+    protected void onStopInternal() {
+        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mNameChangeReceiver);
+        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mSecurityChangeReceiver);
+    }
+
+    @Override
+    protected void updateState(NetworkNameRestrictedPasswordEditTextPreference preference) {
+        if (TextUtils.isEmpty(mNetworkName)) {
+            getPreference().setDialogTitle(R.string.wifi_password);
+        } else {
+            getPreference().setDialogTitle(mNetworkName);
+        }
+        preference.setVisible(mSecurityType != AccessPoint.SECURITY_NONE);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(
+            NetworkNameRestrictedPasswordEditTextPreference preference, Object newValue) {
+        String password = newValue.toString();
+        int netId = WifiUtil.connectToAccessPoint(getContext(), mNetworkName, mSecurityType,
+                password, /* hidden= */ true);
+
+        LOG.d("connected to netId: " + netId);
+        if (netId != WifiUtil.INVALID_NET_ID) {
+            getFragmentController().goBack();
+        }
+
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/NetworkSecurityPreferenceController.java b/src/com/android/car/settings/wifi/NetworkSecurityPreferenceController.java
new file mode 100644
index 0000000..0d180b2
--- /dev/null
+++ b/src/com/android/car/settings/wifi/NetworkSecurityPreferenceController.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Business logic to select the security type when adding a hidden network. */
+public class NetworkSecurityPreferenceController extends PreferenceController<ListPreference> {
+
+    /** Action used in the {@link Intent} sent by the {@link LocalBroadcastManager}. */
+    public static final String ACTION_SECURITY_CHANGE =
+            "com.android.car.settings.wifi.SecurityChangeAction";
+    /** Key used to store the selected security type. */
+    public static final String KEY_SECURITY_TYPE = "security_type";
+
+    private static final Map<Integer, Integer> SECURITY_TYPE_TO_DESC_RES =
+            createSecurityTypeDescMap();
+
+    private static final List<Integer> SECURITY_TYPES = Arrays.asList(
+            AccessPoint.SECURITY_NONE,
+            AccessPoint.SECURITY_WEP,
+            AccessPoint.SECURITY_PSK,
+            AccessPoint.SECURITY_EAP);
+
+    private CharSequence[] mSecurityTypeNames;
+    private CharSequence[] mSecurityTypeIds;
+    private int mSelectedSecurityType;
+
+    public NetworkSecurityPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        // Security type setup.
+        mSecurityTypeNames = new CharSequence[SECURITY_TYPES.size()];
+        mSecurityTypeIds = new CharSequence[SECURITY_TYPES.size()];
+        mSelectedSecurityType = AccessPoint.SECURITY_NONE;
+
+        for (int i = 0; i < SECURITY_TYPES.size(); i++) {
+            int type = SECURITY_TYPES.get(i);
+            mSecurityTypeNames[i] = getContext().getString(SECURITY_TYPE_TO_DESC_RES.get(type));
+            mSecurityTypeIds[i] = Integer.toString(type);
+        }
+
+        getPreference().setEntries(mSecurityTypeNames);
+        getPreference().setEntryValues(mSecurityTypeIds);
+        getPreference().setDefaultValue(Integer.toString(AccessPoint.SECURITY_NONE));
+    }
+
+    @Override
+    protected void updateState(ListPreference preference) {
+        preference.setSummary(SECURITY_TYPE_TO_DESC_RES.get(mSelectedSecurityType));
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+        mSelectedSecurityType = Integer.parseInt(newValue.toString());
+        notifySecurityChange(mSelectedSecurityType);
+        refreshUi();
+        return true;
+    }
+
+    private void notifySecurityChange(int securityType) {
+        Intent intent = new Intent(ACTION_SECURITY_CHANGE);
+        intent.putExtra(KEY_SECURITY_TYPE, securityType);
+        LocalBroadcastManager.getInstance(getContext()).sendBroadcastSync(intent);
+    }
+
+    private static Map<Integer, Integer> createSecurityTypeDescMap() {
+        Map<Integer, Integer> map = new HashMap<>();
+        map.put(AccessPoint.SECURITY_NONE, R.string.wifi_security_none);
+        map.put(AccessPoint.SECURITY_WEP, R.string.wifi_security_wep);
+        map.put(AccessPoint.SECURITY_PSK, R.string.wifi_security_psk_generic);
+        map.put(AccessPoint.SECURITY_EAP, R.string.wifi_security_eap);
+        return map;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiBasePreferenceController.java b/src/com/android/car/settings/wifi/WifiBasePreferenceController.java
new file mode 100644
index 0000000..b53cf39
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiBasePreferenceController.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Abstract controls preference for Wifi.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ *            expects to operate.
+ */
+public abstract class WifiBasePreferenceController<V extends Preference> extends
+        PreferenceController<V> implements CarWifiManager.Listener {
+
+    private CarWifiManager mCarWifiManager;
+
+    public WifiBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mCarWifiManager = new CarWifiManager(getContext());
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mCarWifiManager.addListener(this);
+        mCarWifiManager.start();
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mCarWifiManager.removeListener(this);
+        mCarWifiManager.stop();
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        mCarWifiManager.destroy();
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return WifiUtil.isWifiAvailable(getContext()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    public void onAccessPointsChanged() {
+        // don't care
+    }
+
+    protected CarWifiManager getCarWifiManager() {
+        return mCarWifiManager;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiDetailFragment.java b/src/com/android/car/settings/wifi/WifiDetailFragment.java
deleted file mode 100644
index 2ce31dc..0000000
--- a/src/com/android/car/settings/wifi/WifiDetailFragment.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.wifi;
-
-import android.net.NetworkInfo.State;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.StringRes;
-
-import com.android.car.list.SimpleTextLineItem;
-import com.android.car.list.TypedPagedListAdapter;
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListSettingsFragment;
-import com.android.car.settings.common.Logger;
-import com.android.settingslib.wifi.AccessPoint;
-
-import java.util.ArrayList;
-
-/**
- * Shows details about a wifi network, including actions related to the network,
- * e.g. ignore, disconnect, etc. The intent should include information about
- * access point, use that to render UI, e.g. show SSID etc.
- */
-public class WifiDetailFragment extends ListSettingsFragment {
-    public static final String EXTRA_AP_STATE = "extra_ap_state";
-    private static final Logger LOG = new Logger(WifiDetailFragment.class);
-
-    private AccessPoint mAccessPoint;
-    private WifiManager mWifiManager;
-
-    private class ActionFailListener implements WifiManager.ActionListener {
-        @StringRes
-        private final int mMessageResId;
-
-        public ActionFailListener(@StringRes int messageResId) {
-            mMessageResId = messageResId;
-        }
-
-        @Override
-        public void onSuccess() {
-        }
-
-        @Override
-        public void onFailure(int reason) {
-            Toast.makeText(getContext(),
-                    R.string.wifi_failed_connect_message,
-                    Toast.LENGTH_SHORT).show();
-        }
-    }
-
-    public static WifiDetailFragment getInstance(AccessPoint accessPoint) {
-        WifiDetailFragment wifiDetailFragment = new WifiDetailFragment();
-        Bundle bundle = ListSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.wifi_settings);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        Bundle accessPointState = new Bundle();
-        accessPoint.saveWifiState(accessPointState);
-        bundle.putBundle(EXTRA_AP_STATE, accessPointState);
-        wifiDetailFragment.setArguments(bundle);
-        return wifiDetailFragment;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mAccessPoint = new AccessPoint(getContext(), getArguments().getBundle(EXTRA_AP_STATE));
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mWifiManager = getContext().getSystemService(WifiManager.class);
-
-        super.onActivityCreated(savedInstanceState);
-        ((TextView) getActivity().findViewById(R.id.title)).setText(mAccessPoint.getSsid());
-        Button forgetButton = (Button) getActivity().findViewById(R.id.action_button1);
-        forgetButton.setText(R.string.forget);
-        forgetButton.setOnClickListener(v -> {
-            forget();
-            getFragmentController().goBack();
-        });
-
-        if (mAccessPoint.isSaved() && !mAccessPoint.isActive()) {
-            Button connectButton = (Button) getActivity().findViewById(R.id.action_button2);
-            connectButton.setVisibility(View.VISIBLE);
-            connectButton.setText(R.string.wifi_setup_connect);
-            connectButton.setOnClickListener(v -> {
-                mWifiManager.connect(mAccessPoint.getConfig(),
-                        new ActionFailListener(R.string.wifi_failed_connect_message));
-                getFragmentController().goBack();
-            });
-        }
-    }
-
-    @Override
-    public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
-        ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
-        lineItems.add(
-                new SimpleTextLineItem(getText(R.string.wifi_status), mAccessPoint.getSummary()));
-        lineItems.add(
-                new SimpleTextLineItem(getText(R.string.wifi_signal), getSignalString()));
-        lineItems.add(new SimpleTextLineItem(getText(R.string.wifi_security),
-                mAccessPoint.getSecurityString(/* concise= */ true)));
-        return lineItems;
-    }
-
-    private String getSignalString() {
-        String[] signalStrings = getResources().getStringArray(R.array.wifi_signals);
-
-        int level = WifiManager.calculateSignalLevel(
-                mAccessPoint.getRssi(), signalStrings.length);
-        return signalStrings[level];
-    }
-
-    private void forget() {
-        if (!mAccessPoint.isSaved()) {
-            if (mAccessPoint.getNetworkInfo() != null &&
-                    mAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) {
-                // Network is active but has no network ID - must be ephemeral.
-                mWifiManager.disableEphemeralNetwork(
-                        AccessPoint.convertToQuotedString(mAccessPoint.getSsidStr()));
-            } else {
-                // Should not happen, but a monkey seems to trigger it
-                LOG.e("Failed to forget invalid network " + mAccessPoint.getConfig());
-                return;
-            }
-        } else {
-            mWifiManager.forget(mAccessPoint.getConfig().networkId,
-                    new ActionFailListener(R.string.wifi_failed_forget_message));
-        }
-    }
-}
diff --git a/src/com/android/car/settings/wifi/WifiEntryPreferenceController.java b/src/com/android/car/settings/wifi/WifiEntryPreferenceController.java
new file mode 100644
index 0000000..a564713
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiEntryPreferenceController.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.MasterSwitchPreference;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controller which determines if the top level entry into Wi-Fi settings should be displayed
+ * based on device capabilities.
+ */
+public class WifiEntryPreferenceController extends PreferenceController<MasterSwitchPreference> {
+
+    private CarWifiManager mCarWifiManager;
+
+    public WifiEntryPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mCarWifiManager = new CarWifiManager(context);
+    }
+
+    @Override
+    protected Class<MasterSwitchPreference> getPreferenceType() {
+        return MasterSwitchPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        getPreference().setSwitchToggleListener((preference, isChecked) -> {
+            if (isChecked != mCarWifiManager.isWifiEnabled()) {
+                mCarWifiManager.setWifiEnabled(isChecked);
+            }
+        });
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return WifiUtil.isWifiAvailable(getContext()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
+    @Override
+    protected void updateState(MasterSwitchPreference preference) {
+        preference.setSwitchChecked(mCarWifiManager.isWifiEnabled());
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java b/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
new file mode 100644
index 0000000..0b79b4b
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiRequestToggleActivity.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.annotation.NonNull;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+
+/**
+ * Code drop from {@link com.android.settings.wifi.RequestToggleWiFiActivity}.
+ *
+ * This {@link Activity} handles requests to toggle WiFi by collecting user
+ * consent and waiting until the state change is completed.
+ */
+public class WifiRequestToggleActivity extends Activity implements DialogInterface.OnClickListener,
+        DialogInterface.OnCancelListener {
+    private static final Logger LOG = new Logger(WifiRequestToggleActivity.class);
+    private static final long TOGGLE_TIMEOUT_MILLIS = 10000; // 10 sec
+
+    private static final int STATE_UNKNOWN = -1;
+    private static final int STATE_ENABLE = 1;
+    private static final int STATE_ENABLING = 2;
+    private static final int STATE_DISABLE = 3;
+    private static final int STATE_DISABLING = 4;
+
+    private final StateChangeReceiver mReceiver = new StateChangeReceiver();
+
+    private final Runnable mTimeoutCommand = () -> {
+        if (!isFinishing() && !isDestroyed()) {
+            finish();
+        }
+    };
+
+    @NonNull
+    private CarWifiManager mCarWifiManager;
+    @NonNull
+    private CharSequence mAppLabel;
+
+    private AlertDialog mDialog;
+    private int mAction = STATE_UNKNOWN;
+    private int mState = STATE_UNKNOWN;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mCarWifiManager = new CarWifiManager(getApplicationContext());
+
+        setResult(Activity.RESULT_CANCELED);
+
+        String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+        if (TextUtils.isEmpty(packageName)) {
+            finish();
+            return;
+        }
+
+        try {
+            ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
+                    packageName,  /* flags= */ 0);
+            mAppLabel = applicationInfo.loadSafeLabel(getPackageManager());
+        } catch (PackageManager.NameNotFoundException e) {
+            LOG.e("Couldn't find app with package name " + packageName);
+            finish();
+            return;
+        }
+
+        mAction = extractActionState();
+        if (mAction == STATE_UNKNOWN) {
+            finish();
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        switch (which) {
+            case DialogInterface.BUTTON_POSITIVE:
+                switch (mState) {
+                    case STATE_ENABLE:
+                        mCarWifiManager.setWifiEnabled(true);
+                        mState = STATE_ENABLING;
+                        updateUi();
+                        scheduleToggleTimeout();
+                        break;
+
+                    case STATE_DISABLE:
+                        mCarWifiManager.setWifiEnabled(false);
+                        mState = STATE_DISABLING;
+                        updateUi();
+                        scheduleToggleTimeout();
+                        break;
+                }
+                setResult(RESULT_OK);
+                break;
+            case DialogInterface.BUTTON_NEGATIVE:
+                finish();
+                break;
+        }
+    }
+
+    @Override
+    public void onCancel(DialogInterface dialog) {
+        finish();
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+
+        mReceiver.register();
+
+        final int wifiState = mCarWifiManager.getWifiState();
+
+        switch (mAction) {
+            case STATE_ENABLE:
+                switch (wifiState) {
+                    case WifiManager.WIFI_STATE_ENABLED:
+                        setResult(RESULT_OK);
+                        finish();
+                        return;
+
+                    case WifiManager.WIFI_STATE_ENABLING:
+                        mState = STATE_ENABLING;
+                        scheduleToggleTimeout();
+                        break;
+                    default:
+                        mState = mAction;
+                }
+                break;
+
+            case STATE_DISABLE:
+                switch (wifiState) {
+                    case WifiManager.WIFI_STATE_DISABLED:
+                        setResult(RESULT_OK);
+                        finish();
+                        return;
+
+                    case WifiManager.WIFI_STATE_DISABLING:
+                        mState = STATE_DISABLING;
+                        scheduleToggleTimeout();
+                        break;
+                    default:
+                        mState = mAction;
+                }
+                break;
+        }
+
+        updateUi();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mReceiver.unregister();
+        unscheduleToggleTimeout();
+        if (mDialog != null) {
+            mDialog.dismiss();
+        }
+    }
+
+    private void updateUi() {
+        if (mDialog != null) {
+            mDialog.dismiss();
+        }
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(/* context= */
+                this).setOnCancelListener(/* listener= */ this);
+        switch (mState) {
+            case STATE_ENABLE:
+                builder.setPositiveButton(R.string.allow, /* listener= */ this);
+                builder.setNegativeButton(R.string.deny, /* listener= */ this);
+                builder.setMessage(getString(R.string.wifi_ask_enable, mAppLabel));
+                break;
+
+            case STATE_ENABLING:
+                builder.setMessage(getString(R.string.wifi_starting, mAppLabel));
+                break;
+
+            case STATE_DISABLE:
+                builder.setPositiveButton(R.string.allow, /* listener= */ this);
+                builder.setNegativeButton(R.string.deny, /* listener= */ this);
+                builder.setMessage(getString(R.string.wifi_ask_disable, mAppLabel));
+                break;
+
+            case STATE_DISABLING:
+                builder.setMessage(getString(R.string.wifi_stopping, mAppLabel));
+                break;
+        }
+        mDialog = builder.create();
+        mDialog.show();
+    }
+
+    private void scheduleToggleTimeout() {
+        getWindow().getDecorView().postDelayed(mTimeoutCommand, TOGGLE_TIMEOUT_MILLIS);
+    }
+
+    private void unscheduleToggleTimeout() {
+        getWindow().getDecorView().removeCallbacks(mTimeoutCommand);
+    }
+
+    private int extractActionState() {
+        String action = getIntent().getAction();
+        switch (action) {
+            case WifiManager.ACTION_REQUEST_ENABLE:
+                return STATE_ENABLE;
+
+            case WifiManager.ACTION_REQUEST_DISABLE:
+                return STATE_DISABLE;
+
+            default:
+                return STATE_UNKNOWN;
+        }
+    }
+
+    private final class StateChangeReceiver extends BroadcastReceiver {
+        private final IntentFilter mFilter = new IntentFilter(
+                WifiManager.WIFI_STATE_CHANGED_ACTION);
+
+        public void register() {
+            registerReceiver(/* receiver= */ this, mFilter);
+        }
+
+        public void unregister() {
+            unregisterReceiver(/* receiver= */ this);
+        }
+
+        public void onReceive(Context context, Intent intent) {
+            Activity activity = WifiRequestToggleActivity.this;
+            if (activity.isFinishing() || activity.isDestroyed()) {
+                return;
+            }
+            int currentState = mCarWifiManager.getWifiState();
+            switch (currentState) {
+                case WifiManager.WIFI_STATE_ENABLED:
+                case WifiManager.WIFI_STATE_DISABLED:
+                    if (mState == STATE_ENABLING || mState == STATE_DISABLING) {
+                        activity.setResult(Activity.RESULT_OK);
+                        finish();
+                    }
+                    break;
+
+                case WifiManager.ERROR:
+                    Toast.makeText(activity, R.string.wifi_error, Toast.LENGTH_SHORT).show();
+                    finish();
+                    break;
+            }
+        }
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiSettingsFragment.java b/src/com/android/car/settings/wifi/WifiSettingsFragment.java
index 7bb7ee3..52706dd 100644
--- a/src/com/android/car/settings/wifi/WifiSettingsFragment.java
+++ b/src/com/android/car/settings/wifi/WifiSettingsFragment.java
@@ -15,94 +15,65 @@
  */
 package com.android.car.settings.wifi;
 
-import android.annotation.NonNull;
-import android.annotation.StringRes;
-import android.car.drivingstate.CarUxRestrictions;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.ProgressBar;
 import android.widget.Switch;
-import android.widget.TextView;
-import android.widget.ViewSwitcher;
 
-import androidx.car.widget.PagedListView;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
-import com.android.car.settings.common.CarUxRestrictionsHelper;
+import com.android.car.settings.common.SettingsFragment;
 
 /**
  * Main page to host Wifi related preferences.
  */
-public class WifiSettingsFragment extends BaseFragment implements CarWifiManager.Listener {
-    private CarWifiManager mCarWifiManager;
-    private AccessPointListAdapter mAdapter;
-    private Switch mWifiSwitch;
-    private ProgressBar mProgressBar;
-    private PagedListView mListView;
-    private TextView mMessageView;
-    private ViewSwitcher mViewSwitcher;
-    private boolean mShowSavedApOnly;
+public class WifiSettingsFragment extends SettingsFragment
+        implements CarWifiManager.Listener {
 
-    /**
-     * Gets a new instance of this object.
-     */
-    public static WifiSettingsFragment newInstance() {
-        WifiSettingsFragment wifiSettingsFragment = new WifiSettingsFragment();
-        Bundle bundle = BaseFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.wifi_settings);
-        bundle.putInt(EXTRA_LAYOUT, R.layout.wifi_list);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_toggle);
-        wifiSettingsFragment.setArguments(bundle);
-        return wifiSettingsFragment;
+    private static final int SEARCHING_DELAY_MILLIS = 1700;
+
+    private CarWifiManager mCarWifiManager;
+    private ProgressBar mProgressBar;
+    private Switch mWifiSwitch;
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_toggle;
     }
 
-    /**
-     * Shows only saved wifi network.
-     */
-    public WifiSettingsFragment showSavedApOnly(boolean showSavedApOnly) {
-        mShowSavedApOnly = showSavedApOnly;
-        return this;
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_list_fragment;
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        mCarWifiManager = new CarWifiManager(getContext(), /* listener= */ this);
+        mCarWifiManager = new CarWifiManager(getContext());
 
-        mProgressBar = (ProgressBar) getView().findViewById(R.id.wifi_search_progress);
-        mListView = (PagedListView) getView().findViewById(R.id.list);
-        mMessageView = (TextView) getView().findViewById(R.id.message);
-        mViewSwitcher = (ViewSwitcher) getView().findViewById(R.id.view_switcher);
+        mProgressBar = requireActivity().findViewById(R.id.progress_bar);
         setupWifiSwitch();
-        if (mCarWifiManager.isWifiEnabled()) {
-            showList();
-            setProgressBarVisible(true);
-        } else {
-            showMessage(R.string.wifi_disabled);
-        }
-        mAdapter = new AccessPointListAdapter(
-                getContext(),
-                mCarWifiManager,
-                mShowSavedApOnly
-                        ? mCarWifiManager.getSavedAccessPoints()
-                        : mCarWifiManager.getAllAccessPoints(),
-                getFragmentController());
-        mAdapter.showAddNetworkRow(!mShowSavedApOnly);
-        mListView.setAdapter(mAdapter);
     }
 
     @Override
     public void onStart() {
         super.onStart();
+        mCarWifiManager.addListener(this);
         mCarWifiManager.start();
+        onWifiStateChanged(mCarWifiManager.getWifiState());
     }
 
     @Override
     public void onStop() {
         super.onStop();
+        mCarWifiManager.removeListener(this);
         mCarWifiManager.stop();
+        mProgressBar.setVisibility(View.GONE);
     }
 
     @Override
@@ -113,7 +84,8 @@
 
     @Override
     public void onAccessPointsChanged() {
-        refreshData();
+        mProgressBar.setVisibility(View.VISIBLE);
+        getView().postDelayed(() -> mProgressBar.setVisibility(View.GONE), SEARCHING_DELAY_MILLIS);
     }
 
     @Override
@@ -121,75 +93,19 @@
         mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
         switch (state) {
             case WifiManager.WIFI_STATE_ENABLING:
-                showList();
-                setProgressBarVisible(true);
-                break;
-            case WifiManager.WIFI_STATE_DISABLED:
-                setProgressBarVisible(false);
-                showMessage(R.string.wifi_disabled);
+                mProgressBar.setVisibility(View.VISIBLE);
                 break;
             default:
-                showList();
-        }
-    }
-
-    /**
-     * This fragment will adapt to restriction, so can always be shown.
-     */
-    @Override
-    public boolean canBeShown(CarUxRestrictions carUxRestrictions) {
-        return true;
-    }
-
-    @Override
-    public void onUxRestrictionChanged(@NonNull CarUxRestrictions carUxRestrictions) {
-        mShowSavedApOnly = CarUxRestrictionsHelper.isNoSetup(carUxRestrictions);
-        refreshData();
-    }
-
-    private  void setProgressBarVisible(boolean visible) {
-        if (mProgressBar != null) {
-            mProgressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
-        }
-    }
-
-    private void refreshData() {
-        if (mAdapter != null) {
-            mAdapter.showAddNetworkRow(!mShowSavedApOnly);
-            mAdapter.updateAccessPoints(mShowSavedApOnly
-                    ? mCarWifiManager.getSavedAccessPoints()
-                    : mCarWifiManager.getAllAccessPoints());
-            // if the list is empty, keep showing the progress bar, the list should reset
-            // every couple seconds.
-            // TODO: Consider show a message in the list view place.
-            if (!mAdapter.isEmpty()) {
-                setProgressBarVisible(false);
-            }
-        }
-        if (mCarWifiManager != null) {
-            mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
-        }
-    }
-
-    private void showMessage(@StringRes int resId) {
-        if (mViewSwitcher.getCurrentView() != mMessageView) {
-            mViewSwitcher.showNext();
-        }
-        mMessageView.setText(getResources().getString(resId));
-    }
-
-    private void showList() {
-        if (mViewSwitcher.getCurrentView() != mListView) {
-            mViewSwitcher.showPrevious();
+                mProgressBar.setVisibility(View.GONE);
         }
     }
 
     private void setupWifiSwitch() {
-        mWifiSwitch = (Switch) getActivity().findViewById(R.id.toggle_switch);
+        mWifiSwitch = getActivity().findViewById(R.id.toggle_switch);
         mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
         mWifiSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
-            if (mWifiSwitch.isChecked() != mCarWifiManager.isWifiEnabled()) {
-                mCarWifiManager.setWifiEnabled(mWifiSwitch.isChecked());
+            if (isChecked != mCarWifiManager.isWifiEnabled()) {
+                mCarWifiManager.setWifiEnabled(isChecked);
             }
         });
     }
diff --git a/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java b/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
new file mode 100644
index 0000000..4bc0b56
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.wifi.WifiManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Controls preference when Wifi is in disabled or enabling state
+ */
+public class WifiStatusPreferenceController extends WifiBasePreferenceController<Preference> {
+
+    public WifiStatusPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    public void onWifiStateChanged(int state) {
+        switch (state) {
+            case WifiManager.WIFI_STATE_DISABLED:
+                getPreference().setVisible(true);
+                getPreference().setTitle(R.string.wifi_disabled);
+                break;
+            case WifiManager.WIFI_STATE_ENABLING:
+                getPreference().setVisible(true);
+                getPreference().setTitle(R.string.loading_wifi_list);
+                break;
+            default:
+                getPreference().setVisible(false);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceController.java
new file mode 100644
index 0000000..1410168
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceController.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Controls WiFi Hotspot AP Band configuration.
+ */
+public class WifiTetherApBandPreferenceController extends
+        WifiTetherBasePreferenceController<ListPreference> {
+
+    private String[] mBandEntries;
+    private String[] mBandSummaries;
+    private int mBandIndex;
+    private boolean mIsDualMode;
+
+    public WifiTetherApBandPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+        mIsDualMode = getCarWifiManager().isDualModeSupported();
+        updatePreferenceEntries();
+        getPreference().setEntries(mBandSummaries);
+        getPreference().setEntryValues(mBandEntries);
+    }
+
+    @Override
+    public void updateState(ListPreference preference) {
+        super.updateState(preference);
+
+        WifiConfiguration config = getCarWifiApConfig();
+        if (config == null) {
+            mBandIndex = 0;
+        } else if (is5GhzBandSupported()) {
+            mBandIndex = validateSelection(config.apBand);
+        } else {
+            config.apBand = 0;
+            setCarWifiApConfig(config);
+            mBandIndex = config.apBand;
+        }
+
+        if (!is5GhzBandSupported()) {
+            preference.setEnabled(false);
+            preference.setSummary(R.string.wifi_ap_choose_2G);
+        } else {
+            preference.setValue(Integer.toString(config.apBand));
+            preference.setSummary(getSummary());
+        }
+
+    }
+
+    @Override
+    protected String getSummary() {
+        if (is5GhzBandSupported()) {
+            if (mBandIndex != WifiConfiguration.AP_BAND_ANY) {
+                return mBandSummaries[mBandIndex];
+            } else {
+                return getContext().getString(R.string.wifi_ap_prefer_5G);
+            }
+        } else {
+            return getContext().getString(R.string.wifi_ap_choose_2G);
+        }
+    }
+
+    @Override
+    protected String getDefaultSummary() {
+        return null;
+    }
+
+    @Override
+    public boolean handlePreferenceChanged(ListPreference preference, Object newValue) {
+        mBandIndex = validateSelection(Integer.parseInt((String) newValue));
+        updateApBand(); // updating AP band because mBandIndex may have been assigned a new value.
+        refreshUi();
+        return true;
+    }
+
+    private int validateSelection(int band) {
+        // Reset the band to 2.4 GHz if we get a weird config back to avoid a crash.
+        boolean isDualMode = getCarWifiManager().isDualModeSupported();
+
+        // unsupported states:
+        // 1: no dual mode means we can't have AP_BAND_ANY - default to 5GHZ
+        // 2: no 5 GHZ support means we can't have AP_BAND_5GHZ - default to 2GHZ
+        // 3: With Dual mode support we can't have AP_BAND_5GHZ - default to ANY
+        if (!isDualMode && WifiConfiguration.AP_BAND_ANY == band) {
+            return WifiConfiguration.AP_BAND_5GHZ;
+        } else if (!is5GhzBandSupported() && WifiConfiguration.AP_BAND_5GHZ == band) {
+            return WifiConfiguration.AP_BAND_2GHZ;
+        } else if (isDualMode && WifiConfiguration.AP_BAND_5GHZ == band) {
+            return WifiConfiguration.AP_BAND_ANY;
+        }
+
+        return band;
+    }
+
+    private void updatePreferenceEntries() {
+        Resources res = getContext().getResources();
+        int entriesRes = R.array.wifi_ap_band_config_full;
+        int summariesRes = R.array.wifi_ap_band_summary_full;
+        // change the list options if this is a dual mode device
+        if (mIsDualMode) {
+            entriesRes = R.array.wifi_ap_band_dual_mode;
+            summariesRes = R.array.wifi_ap_band_dual_mode_summary;
+        }
+        mBandEntries = res.getStringArray(entriesRes);
+        mBandSummaries = res.getStringArray(summariesRes);
+    }
+
+    private void updateApBand() {
+        WifiConfiguration config = getCarWifiApConfig();
+        config.apBand = mBandIndex;
+        setCarWifiApConfig(config);
+        if (mBandIndex == WifiConfiguration.AP_BAND_ANY) {
+            getPreference().setValue(mBandEntries[WifiConfiguration.AP_BAND_2GHZ]);
+        } else {
+            getPreference().setValue(mBandEntries[mBandIndex]);
+        }
+    }
+
+    private boolean is5GhzBandSupported() {
+        String countryCode = getCarWifiManager().getCountryCode();
+        return getCarWifiManager().isDualBandSupported() && countryCode != null;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceController.java
new file mode 100644
index 0000000..ef19a3f
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceController.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controls wifi tethering auto off configuration
+ */
+public class WifiTetherAutoOffPreferenceController extends
+        PreferenceController<TwoStatePreference> {
+
+    public WifiTetherAutoOffPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        boolean settingsOn = Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1) != 0;
+        preference.setChecked(settingsOn);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean settingsOn = (Boolean) newValue;
+        Settings.Global.putInt(getContext().getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, settingsOn ? 1 : 0);
+        return true;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
new file mode 100644
index 0000000..dd74f4b
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherBasePreferenceController.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.text.TextUtils;
+
+import androidx.annotation.CallSuper;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Shared business logic for preference controllers related to Wifi Tethering
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ *            expects to operate.
+ */
+public abstract class WifiTetherBasePreferenceController<V extends Preference> extends
+        PreferenceController<V> {
+
+    private CarWifiManager mCarWifiManager;
+
+    public WifiTetherBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    @CallSuper
+    protected void onCreateInternal() {
+        mCarWifiManager = new CarWifiManager(getContext());
+    }
+
+    @Override
+    @CallSuper
+    protected void onStartInternal() {
+        mCarWifiManager.start();
+        getPreference().setPersistent(true);
+    }
+
+    @Override
+    @CallSuper
+    protected void onStopInternal() {
+        mCarWifiManager.stop();
+    }
+
+    @Override
+    @CallSuper
+    protected void onDestroyInternal() {
+        mCarWifiManager.destroy();
+    }
+
+    @Override
+    @CallSuper
+    protected void updateState(V preference) {
+        String summary = getSummary();
+        String defaultSummary = getDefaultSummary();
+
+        if (TextUtils.isEmpty(summary)) {
+            preference.setSummary(defaultSummary);
+        } else {
+            preference.setSummary(summary);
+        }
+    }
+
+    protected WifiConfiguration getCarWifiApConfig() {
+        return mCarWifiManager.getWifiApConfig();
+    }
+
+    protected void setCarWifiApConfig(WifiConfiguration configuration) {
+        mCarWifiManager.setWifiApConfig(configuration);
+    }
+
+    protected CarWifiManager getCarWifiManager() {
+        return mCarWifiManager;
+    }
+
+    protected abstract String getSummary();
+
+    protected abstract String getDefaultSummary();
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherFragment.java b/src/com/android/car/settings/wifi/WifiTetherFragment.java
new file mode 100644
index 0000000..f8979e1
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherFragment.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.settings.wifi;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.ProgressBar;
+import android.widget.Switch;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Fragment to host tethering-related preferences.
+ */
+public class WifiTetherFragment extends SettingsFragment implements Switch.OnCheckedChangeListener {
+
+    private CarWifiManager mCarWifiManager;
+    private ConnectivityManager mConnectivityManager;
+    private ProgressBar mProgressBar;
+    private Switch mTetherSwitch;
+
+    private final ConnectivityManager.OnStartTetheringCallback mOnStartTetheringCallback =
+            new ConnectivityManager.OnStartTetheringCallback() {
+                @Override
+                public void onTetheringFailed() {
+                    super.onTetheringFailed();
+                    mTetherSwitch.setChecked(false);
+                    mTetherSwitch.setEnabled(true);
+                }
+            };
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_toggle;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_tether_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mCarWifiManager = new CarWifiManager(context);
+        mConnectivityManager = (ConnectivityManager) getContext().getSystemService(
+                Context.CONNECTIVITY_SERVICE);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        mProgressBar = getActivity().findViewById(R.id.progress_bar);
+        mTetherSwitch = getActivity().findViewById(R.id.toggle_switch);
+        setupTetherSwitch();
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        mCarWifiManager.start();
+        getContext().registerReceiver(mReceiver,
+                new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION));
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mCarWifiManager.stop();
+        getContext().unregisterReceiver(mReceiver);
+        mProgressBar.setVisibility(View.GONE);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mCarWifiManager.destroy();
+    }
+
+    @Override
+    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
+        if (!isChecked) {
+            mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
+        } else {
+            mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI,
+                    /* showProvisioningUi= */ true,
+                    mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
+        }
+    }
+
+    protected void setupTetherSwitch() {
+        mTetherSwitch.setChecked(mCarWifiManager.isWifiApEnabled());
+        mTetherSwitch.setOnCheckedChangeListener(this);
+    }
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            final int state = intent.getIntExtra(
+                    WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
+            handleWifiApStateChanged(state);
+        }
+    };
+
+    private void handleWifiApStateChanged(int state) {
+        switch (state) {
+            case WifiManager.WIFI_AP_STATE_ENABLING:
+                mTetherSwitch.setEnabled(false);
+                break;
+            case WifiManager.WIFI_AP_STATE_ENABLED:
+                mTetherSwitch.setEnabled(true);
+                if (!mTetherSwitch.isChecked()) {
+                    mTetherSwitch.setChecked(true);
+                }
+                break;
+            case WifiManager.WIFI_AP_STATE_DISABLING:
+                mTetherSwitch.setEnabled(false);
+                if (mTetherSwitch.isChecked()) {
+                    mTetherSwitch.setChecked(false);
+                }
+                break;
+            case WifiManager.WIFI_AP_STATE_DISABLED:
+                mTetherSwitch.setChecked(false);
+                mTetherSwitch.setEnabled(true);
+                break;
+            default:
+                mTetherSwitch.setChecked(false);
+                mTetherSwitch.setEnabled(true);
+                break;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherNamePreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherNamePreferenceController.java
new file mode 100644
index 0000000..6bc2f58
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherNamePreferenceController.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.ValidatedEditTextPreference;
+
+/**
+ * Controls WiFi Hotspot name configuration. When Hotspot is enabled, this name that will be
+ * displayed as the Access Point to the Hotspot.
+ */
+public class WifiTetherNamePreferenceController extends
+        WifiTetherBasePreferenceController<ValidatedEditTextPreference> {
+
+    private static final int HOTSPOT_NAME_MIN_LENGTH = 1;
+    private static final int HOTSPOT_NAME_MAX_LENGTH = 32;
+    private static final ValidatedEditTextPreference.Validator NAME_VALIDATOR =
+            value -> value.length() >= HOTSPOT_NAME_MIN_LENGTH
+                    && value.length() <= HOTSPOT_NAME_MAX_LENGTH;
+
+    private String mName;
+
+    public WifiTetherNamePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ValidatedEditTextPreference> getPreferenceType() {
+        return ValidatedEditTextPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+        getPreference().setValidator(NAME_VALIDATOR);
+        mName = getCarWifiApConfig().SSID;
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(ValidatedEditTextPreference preference,
+            Object newValue) {
+        mName = newValue.toString();
+        updateSSID(mName);
+        refreshUi();
+        return true;
+    }
+
+    @Override
+    protected void updateState(ValidatedEditTextPreference preference) {
+        super.updateState(preference);
+        preference.setText(mName);
+    }
+
+    private void updateSSID(String ssid) {
+        WifiConfiguration config = getCarWifiApConfig();
+        config.SSID = ssid;
+        setCarWifiApConfig(config);
+    }
+
+    @Override
+    protected String getSummary() {
+        return mName;
+    }
+
+    @Override
+    protected String getDefaultSummary() {
+        return null;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceController.java
new file mode 100644
index 0000000..14f83e0
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceController.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.net.wifi.WifiConfiguration;
+import android.text.InputType;
+import android.text.TextUtils;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.ValidatedEditTextPreference;
+
+import java.util.UUID;
+
+/**
+ * Controls Wifi Hotspot password configuration.
+ *
+ * <p>Note: This controller uses {@link ValidatedEditTextPreference} as opposed to
+ * PasswordEditTextPreference because the input is not obscured by default, and the user is setting
+ * their own password, as opposed to entering password for authentication.
+ */
+public class WifiTetherPasswordPreferenceController extends
+        WifiTetherBasePreferenceController<ValidatedEditTextPreference> {
+
+    protected static final String SHARED_PREFERENCE_PATH =
+            "com.android.car.settings.wifi.WifiTetherPreferenceController";
+    protected static final String KEY_SAVED_PASSWORD =
+            "com.android.car.settings.wifi.SAVED_PASSWORD";
+
+    private static final int HOTSPOT_PASSWORD_MIN_LENGTH = 8;
+    private static final int HOTSPOT_PASSWORD_MAX_LENGTH = 63;
+    private static final ValidatedEditTextPreference.Validator PASSWORD_VALIDATOR =
+            value -> value.length() >= HOTSPOT_PASSWORD_MIN_LENGTH
+                    && value.length() <= HOTSPOT_PASSWORD_MAX_LENGTH;
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mSecurityType = intent.getIntExtra(
+                    WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
+                    /* defaultValue= */ WifiConfiguration.KeyMgmt.NONE);
+            syncPassword();
+        }
+    };
+    private final SharedPreferences mSharedPreferences =
+            getContext().getSharedPreferences(SHARED_PREFERENCE_PATH, Context.MODE_PRIVATE);
+
+    private String mPassword;
+    private int mSecurityType;
+
+    public WifiTetherPasswordPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ValidatedEditTextPreference> getPreferenceType() {
+        return ValidatedEditTextPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+
+        getPreference().setValidator(PASSWORD_VALIDATOR);
+        mSecurityType = getCarWifiApConfig().getAuthType();
+        syncPassword();
+    }
+
+    @Override
+    protected void onStartInternal() {
+        LocalBroadcastManager.getInstance(getContext()).registerReceiver(mReceiver,
+                new IntentFilter(
+                        WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED));
+    }
+
+    @Override
+    protected void onStopInternal() {
+        super.onStopInternal();
+        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(ValidatedEditTextPreference preference,
+            Object newValue) {
+        mPassword = newValue.toString();
+        updatePassword(mPassword);
+        refreshUi();
+        return true;
+    }
+
+    @Override
+    protected void updateState(ValidatedEditTextPreference preference) {
+        super.updateState(preference);
+        updatePasswordDisplay();
+        if (TextUtils.isEmpty(mPassword)) {
+            preference.setSummaryInputType(InputType.TYPE_CLASS_TEXT);
+        } else {
+            preference.setSummaryInputType(
+                    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+        }
+    }
+
+    @Override
+    protected String getSummary() {
+        return mPassword;
+    }
+
+    @Override
+    protected String getDefaultSummary() {
+        return getContext().getString(R.string.default_password_summary);
+    }
+
+    private void syncPassword() {
+        mPassword = getSyncedPassword();
+        updatePassword(mPassword);
+        refreshUi();
+    }
+
+    private String getSyncedPassword() {
+        if (getCarWifiApConfig().getAuthType() == WifiConfiguration.KeyMgmt.NONE) {
+            return null;
+        }
+
+        if (!TextUtils.isEmpty(getCarWifiApConfig().preSharedKey)) {
+            return getCarWifiApConfig().preSharedKey;
+        }
+
+        if (!TextUtils.isEmpty(
+                mSharedPreferences.getString(KEY_SAVED_PASSWORD, /* defaultValue= */ null))) {
+            return mSharedPreferences.getString(KEY_SAVED_PASSWORD, /* defaultValue= */ null);
+        }
+
+        return generateRandomPassword();
+    }
+
+    private static String generateRandomPassword() {
+        String randomUUID = UUID.randomUUID().toString();
+        // First 12 chars from xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
+        return randomUUID.substring(0, 8) + randomUUID.substring(9, 13);
+    }
+
+    private void updatePassword(String password) {
+        WifiConfiguration config = getCarWifiApConfig();
+        config.preSharedKey = password;
+        setCarWifiApConfig(config);
+
+        if (!TextUtils.isEmpty(password)) {
+            mSharedPreferences.edit().putString(KEY_SAVED_PASSWORD, password).commit();
+        }
+    }
+
+    private void updatePasswordDisplay() {
+        getPreference().setText(mPassword);
+        getPreference().setVisible(mSecurityType != WifiConfiguration.KeyMgmt.NONE);
+        getPreference().setSummary(getSummary());
+    }
+
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
new file mode 100644
index 0000000..c4f4a8b
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.ConnectivityManager;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/**
+ * Controls the availability of wifi tethering preference based on whether tethering is supported
+ */
+public class WifiTetherPreferenceController extends PreferenceController<Preference> {
+
+    private final ConnectivityManager mConnectivityManager =
+            (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+
+    public WifiTetherPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return  mConnectivityManager.isTetheringSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceController.java b/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceController.java
new file mode 100644
index 0000000..618bc25
--- /dev/null
+++ b/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceController.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Controls WiFi Hotspot Security Type configuration.
+ */
+public class WifiTetherSecurityPreferenceController extends
+        WifiTetherBasePreferenceController<ListPreference> {
+
+    public static final String KEY_SECURITY_TYPE = "KEY_SECURITY_TYPE";
+    public static final String ACTION_SECURITY_TYPE_CHANGED =
+            "com.android.car.settings.wifi.ACTION_WIFI_TETHER_SECURITY_TYPE_CHANGED";
+
+    private int mSecurityType;
+
+    public WifiTetherSecurityPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<ListPreference> getPreferenceType() {
+        return ListPreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        super.onCreateInternal();
+        mSecurityType = getCarWifiApConfig().getAuthType();
+        getPreference().setEntries(
+                getContext().getResources().getStringArray(R.array.wifi_tether_security));
+        String[] entryValues = {Integer.toString(WifiConfiguration.KeyMgmt.WPA2_PSK),
+                Integer.toString(WifiConfiguration.KeyMgmt.NONE)};
+        getPreference().setEntryValues(entryValues);
+        getPreference().setValue(String.valueOf(mSecurityType));
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(ListPreference preference,
+            Object newValue) {
+        mSecurityType = Integer.parseInt(newValue.toString());
+        updateSecurityType();
+        refreshUi();
+        return true;
+    }
+
+    @Override
+    protected void updateState(ListPreference preference) {
+        super.updateState(preference);
+        preference.setValue(Integer.toString(mSecurityType));
+    }
+
+    @Override
+    protected String getSummary() {
+        int stringResId = mSecurityType == WifiConfiguration.KeyMgmt.WPA2_PSK
+                ? R.string.wifi_hotspot_wpa2_personal : R.string.wifi_hotspot_security_none;
+        return getContext().getString(stringResId);
+    }
+
+    @Override
+    protected String getDefaultSummary() {
+        return null;
+    }
+
+    private void updateSecurityType() {
+        WifiConfiguration config = getCarWifiApConfig();
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(mSecurityType);
+
+        if (mSecurityType == WifiConfiguration.KeyMgmt.NONE) {
+            config.preSharedKey = "";
+        } else {
+            config.preSharedKey = getSavedPassword();
+        }
+
+        setCarWifiApConfig(config);
+        broadcastSecurityTypeChanged();
+    }
+
+    private void broadcastSecurityTypeChanged() {
+        Intent intent = new Intent(ACTION_SECURITY_TYPE_CHANGED);
+        intent.putExtra(KEY_SECURITY_TYPE, mSecurityType);
+        LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
+    }
+
+    private String getSavedPassword() {
+        SharedPreferences sp = getContext().getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        String savedPassword =
+                sp.getString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD,
+                        /* defaultValue= */ null);
+        return savedPassword;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/WifiUtil.java b/src/com/android/car/settings/wifi/WifiUtil.java
index 8d818c9..79db041 100644
--- a/src/com/android/car/settings/wifi/WifiUtil.java
+++ b/src/com/android/car/settings/wifi/WifiUtil.java
@@ -16,18 +16,37 @@
 package com.android.car.settings.wifi;
 
 import android.annotation.DrawableRes;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
+import android.provider.Settings;
+import android.widget.Toast;
 
 import androidx.annotation.StringRes;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.regex.Pattern;
 
 /**
  * A collections of util functions for WIFI.
  */
 public class WifiUtil {
+
+    private static final Logger LOG = new Logger(WifiUtil.class);
+
+    /** Value that is returned when we fail to connect wifi. */
+    public static final int INVALID_NET_ID = -1;
+    private static final Pattern HEX_PATTERN = Pattern.compile("^[0-9A-F]+$");
+
     @DrawableRes
     public static int getIconRes(int state) {
         switch (state) {
@@ -72,4 +91,180 @@
     public static boolean isWifiAvailable(Context context) {
         return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI);
     }
+
+    /**
+     * Gets a unique key for a {@link AccessPoint}.
+     */
+    public static String getKey(AccessPoint accessPoint) {
+        return String.valueOf(accessPoint.hashCode());
+    }
+
+    /**
+     * This method is a stripped and negated version of WifiConfigStore.canModifyNetwork.
+     *
+     * @param context Context of caller
+     * @param config  The WiFi config.
+     * @return {@code true} if Settings cannot modify the config due to lockDown.
+     */
+    public static boolean isNetworkLockedDown(Context context, WifiConfiguration config) {
+        if (config == null) {
+            return false;
+        }
+
+        final DevicePolicyManager dpm =
+                (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        final PackageManager pm = context.getPackageManager();
+
+        // Check if device has DPM capability. If it has and dpm is still null, then we
+        // treat this case with suspicion and bail out.
+        if (pm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN) && dpm == null) {
+            return true;
+        }
+
+        boolean isConfigEligibleForLockdown = false;
+        if (dpm != null) {
+            final ComponentName deviceOwner = dpm.getDeviceOwnerComponentOnAnyUser();
+            if (deviceOwner != null) {
+                final int deviceOwnerUserId = dpm.getDeviceOwnerUserId();
+                try {
+                    final int deviceOwnerUid = pm.getPackageUidAsUser(deviceOwner.getPackageName(),
+                            deviceOwnerUserId);
+                    isConfigEligibleForLockdown = deviceOwnerUid == config.creatorUid;
+                } catch (PackageManager.NameNotFoundException e) {
+                    // don't care
+                }
+            }
+        }
+        if (!isConfigEligibleForLockdown) {
+            return false;
+        }
+
+        final ContentResolver resolver = context.getContentResolver();
+        final boolean isLockdownFeatureEnabled = Settings.Global.getInt(resolver,
+                Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0) != 0;
+        return isLockdownFeatureEnabled;
+    }
+
+    /**
+     * Returns {@code true} if the provided NetworkCapabilities indicate a captive portal network.
+     */
+    public static boolean canSignIntoNetwork(NetworkCapabilities capabilities) {
+        return (capabilities != null
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL));
+    }
+
+    /**
+     * Returns netId. -1 if connection fails.
+     */
+    public static int connectToAccessPoint(Context context, String ssid, int security,
+            String password, boolean hidden) {
+        WifiManager wifiManager = context.getSystemService(WifiManager.class);
+        WifiConfiguration wifiConfig = new WifiConfiguration();
+        wifiConfig.SSID = String.format("\"%s\"", ssid);
+        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
+        wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
+        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
+        wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
+        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
+        wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
+        wifiConfig.hiddenSSID = hidden;
+        switch (security) {
+            case AccessPoint.SECURITY_NONE:
+                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+                wifiConfig.allowedAuthAlgorithms.clear();
+                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
+                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
+                break;
+            case AccessPoint.SECURITY_WEP:
+                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+                wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
+                wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
+                wifiConfig.wepKeys[0] = isHexString(password) ? password
+                        : "\"" + password + "\"";
+                wifiConfig.wepTxKeyIndex = 0;
+                break;
+            case AccessPoint.SECURITY_PSK:
+            case AccessPoint.SECURITY_EAP:
+                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
+                wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
+                wifiConfig.preSharedKey = String.format("\"%s\"", password);
+                break;
+            default:
+                throw new IllegalArgumentException("invalid security type");
+        }
+        int netId = wifiManager.addNetwork(wifiConfig);
+        // This only means wifiManager failed writing the new wifiConfig to the db. It doesn't mean
+        // the network is invalid.
+        if (netId == INVALID_NET_ID) {
+            Toast.makeText(context, R.string.wifi_failed_connect_message,
+                    Toast.LENGTH_SHORT).show();
+        } else {
+            wifiManager.enableNetwork(netId, true);
+        }
+        return netId;
+    }
+
+    /** Forget the network specified by {@code accessPoint}. */
+    public static void forget(Context context, AccessPoint accessPoint) {
+        WifiManager wifiManager = context.getSystemService(WifiManager.class);
+        if (!accessPoint.isSaved()) {
+            if (accessPoint.getNetworkInfo() != null
+                    && accessPoint.getNetworkInfo().getState() != NetworkInfo.State.DISCONNECTED) {
+                // Network is active but has no network ID - must be ephemeral.
+                wifiManager.disableEphemeralNetwork(
+                        AccessPoint.convertToQuotedString(accessPoint.getSsidStr()));
+            } else {
+                // Should not happen, but a monkey seems to trigger it
+                LOG.e("Failed to forget invalid network " + accessPoint.getConfig());
+                return;
+            }
+        } else {
+            wifiManager.forget(accessPoint.getConfig().networkId,
+                    new ActionFailedListener(context, R.string.wifi_failed_forget_message));
+        }
+    }
+
+    /** Returns {@code true} if the access point was disabled due to the wrong password. */
+    public static boolean isAccessPointDisabledByWrongPassword(AccessPoint accessPoint) {
+        WifiConfiguration config = accessPoint.getConfig();
+        if (config == null) {
+            return false;
+        }
+        WifiConfiguration.NetworkSelectionStatus networkStatus =
+                config.getNetworkSelectionStatus();
+        if (networkStatus == null || networkStatus.isNetworkEnabled()) {
+            return false;
+        }
+        return networkStatus.getNetworkSelectionDisableReason()
+                == WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD;
+    }
+
+    private static boolean isHexString(String password) {
+        return HEX_PATTERN.matcher(password).matches();
+    }
+
+    /**
+     * A shared implementation of {@link WifiManager.ActionListener} which shows a failure message
+     * in a toast.
+     */
+    public static class ActionFailedListener implements WifiManager.ActionListener {
+        private final Context mContext;
+        @StringRes
+        private final int mFailureMessage;
+
+        public ActionFailedListener(Context context, @StringRes int failureMessage) {
+            mContext = context;
+            mFailureMessage = failureMessage;
+        }
+
+        @Override
+        public void onSuccess() {
+        }
+
+        @Override
+        public void onFailure(int reason) {
+            Toast.makeText(mContext, mFailureMessage, Toast.LENGTH_SHORT).show();
+        }
+    }
 }
diff --git a/src/com/android/car/settings/wifi/details/WifiDetailsBasePreferenceController.java b/src/com/android/car/settings/wifi/details/WifiDetailsBasePreferenceController.java
new file mode 100644
index 0000000..8c23ed3
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiDetailsBasePreferenceController.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.wifi.WifiUtil;
+import com.android.settingslib.wifi.AccessPoint;
+
+/**
+ * Controller for logic pertaining to displaying Wifi information. Only available when wifi is
+ * active.
+ *
+ * <p>Subclasses should use
+ * {@link com.android.car.settings.common.PreferenceController#updateState(Preference)} to render UI
+ * with latest info if desired.
+ *
+ * @param <V> the upper bound on the type of {@link Preference} on which the controller
+ *            expects to operate.
+ */
+public abstract class WifiDetailsBasePreferenceController<V extends Preference> extends
+        PreferenceController<V> implements WifiInfoProvider.Listener {
+
+    private AccessPoint mAccessPoint;
+    private WifiInfoProvider mWifiInfoProvider;
+
+    public WifiDetailsBasePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    /**
+     * Sets all parameters for the controller to run, need to get called as early as possible.
+     */
+    public WifiDetailsBasePreferenceController init(
+            AccessPoint accessPoint, WifiInfoProvider wifiInfoProvider) {
+        mAccessPoint = accessPoint;
+        mWifiInfoProvider = wifiInfoProvider;
+        return this;
+    }
+
+    /** Gets the access poing that this controller was initialized with. */
+    protected AccessPoint getAccessPoint() {
+        return mAccessPoint;
+    }
+
+    /** Gets the wifi info provider that this controller was initialized with. */
+    protected WifiInfoProvider getWifiInfoProvider() {
+        return mWifiInfoProvider;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mWifiInfoProvider.addListener(this);
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mWifiInfoProvider.removeListener(this);
+    }
+
+    @Override
+    public void onWifiConfigurationChanged(WifiConfiguration wifiConfiguration,
+            NetworkInfo networkInfo, WifiInfo wifiInfo) {
+        refreshUi();
+    }
+
+    @Override
+    public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
+        refreshUi();
+    }
+
+    @Override
+    public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
+    }
+
+    @Override
+    public void onWifiChanged(NetworkInfo networkInfo, WifiInfo wifiInfo) {
+        getPreference().setEnabled(true);
+        refreshUi();
+    }
+
+    @Override
+    public void onLost(Network network) {
+        getPreference().setEnabled(false);
+        refreshUi();
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        if (!WifiUtil.isWifiAvailable(getContext())) {
+            return UNSUPPORTED_ON_DEVICE;
+        }
+        return getAccessPoint().isActive() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiDetailsFragment.java b/src/com/android/car/settings/wifi/details/WifiDetailsFragment.java
new file mode 100644
index 0000000..9027df8
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiDetailsFragment.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import android.content.Context;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.wifi.WifiUtil;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Shows details about a wifi network, including actions related to the network,
+ * e.g. ignore, disconnect, etc. The intent should include information about
+ * access point, use that to render UI, e.g. show SSID etc.
+ */
+public class WifiDetailsFragment extends SettingsFragment
+        implements WifiInfoProvider.Listener {
+    private static final String EXTRA_AP_STATE = "extra_ap_state";
+    private static final Logger LOG = new Logger(WifiDetailsFragment.class);
+
+    private WifiManager mWifiManager;
+    private AccessPoint mAccessPoint;
+    private Button mForgetButton;
+    private Button mConnectButton;
+    private List<WifiDetailsBasePreferenceController> mControllers = new ArrayList<>();
+
+    private WifiInfoProvider mWifiInfoProvider;
+
+    private class ActionFailListener implements WifiManager.ActionListener {
+        @StringRes
+        private final int mMessageResId;
+
+        ActionFailListener(@StringRes int messageResId) {
+            mMessageResId = messageResId;
+        }
+
+        @Override
+        public void onSuccess() {
+        }
+
+        @Override
+        public void onFailure(int reason) {
+            Toast.makeText(getContext(), mMessageResId, Toast.LENGTH_SHORT).show();
+        }
+    }
+
+    /**
+     * Gets an instance of this class.
+     */
+    public static WifiDetailsFragment getInstance(AccessPoint accessPoint) {
+        WifiDetailsFragment wifiDetailsFragment = new WifiDetailsFragment();
+        Bundle bundle = new Bundle();
+        Bundle accessPointState = new Bundle();
+        accessPoint.saveWifiState(accessPointState);
+        bundle.putBundle(EXTRA_AP_STATE, accessPointState);
+        wifiDetailsFragment.setArguments(bundle);
+        return wifiDetailsFragment;
+    }
+
+    @Override
+    @LayoutRes
+    protected int getActionBarLayoutId() {
+        return R.layout.action_bar_with_button;
+    }
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_detail_fragment;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mAccessPoint = new AccessPoint(getContext(), getArguments().getBundle(EXTRA_AP_STATE));
+        mWifiManager = context.getSystemService(WifiManager.class);
+        LOG.d("Creating WifiInfoProvider for " + mAccessPoint);
+        if (mWifiInfoProvider == null) {
+            mWifiInfoProvider = new WifiInfoProviderImpl(getContext(), mAccessPoint);
+        }
+        getLifecycle().addObserver(mWifiInfoProvider);
+
+        LOG.d("Creating WifiInfoProvider.Listeners.");
+        mControllers.add(use(
+                WifiSignalStrengthPreferenceController.class, R.string.pk_wifi_signal_strength)
+                .init(mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiFrequencyPreferenceController.class, R.string.pk_wifi_frequency)
+                .init(mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiSecurityPreferenceController.class, R.string.pk_wifi_security)
+                .init(mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiMacAddressPreferenceController.class, R.string.pk_wifi_mac_address)
+                .init(mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiIpAddressPreferenceController.class, R.string.pk_wifi_ip).init(
+                mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiGatewayPreferenceController.class, R.string.pk_wifi_gateway).init(
+                mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiSubnetPreferenceController.class, R.string.pk_wifi_subnet_mask)
+                .init(mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiDnsPreferenceController.class, R.string.pk_wifi_dns).init(
+                mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiLinkSpeedPreferenceController.class, R.string.pk_wifi_link_speed)
+                .init(mAccessPoint, mWifiInfoProvider));
+        mControllers.add(use(WifiIpv6AddressPreferenceController.class, R.string.pk_wifi_ipv6).init(
+                mAccessPoint, mWifiInfoProvider));
+        LOG.d("Done init.");
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        ((TextView) getActivity().findViewById(R.id.title)).setText(mAccessPoint.getSsid());
+
+        mConnectButton = getActivity().findViewById(R.id.action_button2);
+        mConnectButton.setVisibility(View.VISIBLE);
+        mConnectButton.setText(R.string.wifi_setup_connect);
+        mConnectButton.setOnClickListener(v -> {
+            mWifiManager.connect(mAccessPoint.getConfig(),
+                    new ActionFailListener(R.string.wifi_failed_connect_message));
+            goBack();
+        });
+        mForgetButton = getActivity().findViewById(R.id.action_button1);
+        mForgetButton.setText(R.string.forget);
+        mForgetButton.setOnClickListener(v -> {
+            WifiUtil.forget(getContext(), mAccessPoint);
+            goBack();
+        });
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mWifiInfoProvider.addListener(this);
+        updateUi();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mWifiInfoProvider.removeListener(this);
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        getLifecycle().removeObserver(mWifiInfoProvider);
+    }
+
+    @Override
+    public void onWifiChanged(NetworkInfo networkInfo, WifiInfo wifiInfo) {
+        updateUi();
+    }
+
+    @Override
+    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
+        updateUi();
+    }
+
+    @Override
+    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
+        updateUi();
+    }
+
+    @Override
+    public void onLost(Network network) {
+        updateUi();
+    }
+
+    @Override
+    public void onWifiConfigurationChanged(WifiConfiguration wifiConfiguration,
+            NetworkInfo networkInfo, WifiInfo wifiInfo) {
+        updateUi();
+    }
+
+    private void updateUi() {
+        LOG.d("updating.");
+        // No need to fetch LinkProperties and NetworkCapabilities, they are updated by the
+        // callbacks. mNetwork doesn't change except in onResume.
+        if (mWifiInfoProvider.getNetwork() == null
+                || mWifiInfoProvider.getNetworkInfo() == null
+                || mWifiInfoProvider.getWifiInfo() == null) {
+            LOG.d("WIFI not available.");
+            return;
+        }
+
+        mConnectButton.setVisibility(needConnect() ? View.VISIBLE : View.INVISIBLE);
+        mForgetButton.setVisibility(canForgetNetwork() ? View.VISIBLE : View.INVISIBLE);
+        LOG.d("updated.");
+    }
+
+    private boolean needConnect() {
+        return mAccessPoint.isSaved() && !mAccessPoint.isActive();
+    }
+
+    /**
+     * Returns whether the network represented by this fragment can be forgotten.
+     */
+    private boolean canForgetNetwork() {
+        return (mWifiInfoProvider.getWifiInfo() != null
+                && mWifiInfoProvider.getWifiInfo().isEphemeral()) || canModifyNetwork();
+    }
+
+    /**
+     * Returns whether the network represented by this preference can be modified.
+     */
+    private boolean canModifyNetwork() {
+        WifiConfiguration wifiConfig = mWifiInfoProvider.getNetworkConfiguration();
+        LOG.d("wifiConfig is: " + wifiConfig);
+        return wifiConfig != null && !WifiUtil.isNetworkLockedDown(getContext(), wifiConfig);
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiDetailsPreference.java b/src/com/android/car/settings/wifi/details/WifiDetailsPreference.java
new file mode 100644
index 0000000..4e723ba
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiDetailsPreference.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.R;
+
+/**
+ * A Preference to be used with the Wifi Network Detail Fragment that allows a summary text to be
+ * set inside the widget resource
+ */
+public class WifiDetailsPreference extends Preference {
+    private String mDetailText;
+
+    public WifiDetailsPreference(Context context, AttributeSet attributeSet) {
+        super(context, attributeSet);
+        setWidgetLayoutResource(R.layout.summary_preference_widget);
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    WifiDetailsPreference(Context context) {
+        super(context);
+    }
+
+    /**
+     * Sets the detail text.
+     */
+    public void setDetailText(String text) {
+        if (TextUtils.equals(mDetailText, text)) {
+            return;
+        }
+        mDetailText = text;
+        notifyChanged();
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+        TextView textView = ((TextView) view.findViewById(R.id.widget_summary));
+        textView.setText(mDetailText);
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    String getDetailText() {
+        return mDetailText;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiDnsPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiDnsPreferenceController.java
new file mode 100644
index 0000000..2a508fd
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiDnsPreferenceController.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.net.InetAddress;
+import java.util.stream.Collectors;
+
+/**
+ * Shows info about Wifi DNS info.
+ */
+public class WifiDnsPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+
+    public WifiDnsPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        String dnsServers = getWifiInfoProvider().getLinkProperties().getDnsServers().stream()
+                .map(InetAddress::getHostAddress)
+                .collect(Collectors.joining(System.lineSeparator()));
+
+        if (dnsServers == null) {
+            preference.setVisible(false);
+        } else {
+            preference.setDetailText(dnsServers);
+            preference.setVisible(true);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceController.java
new file mode 100644
index 0000000..3e5f7c6
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceController.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.wifi.AccessPoint;
+
+/**
+ * Shows frequency info about the Wifi connection.
+ */
+public class WifiFrequencyPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+    private static final Logger LOG = new Logger(WifiFrequencyPreferenceController.class);
+
+    public WifiFrequencyPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        int frequency = getWifiInfoProvider().getWifiInfo().getFrequency();
+        String band = null;
+        if (frequency >= AccessPoint.LOWER_FREQ_24GHZ
+                && frequency < AccessPoint.HIGHER_FREQ_24GHZ) {
+            band = getContext().getResources().getString(R.string.wifi_band_24ghz);
+        } else if (frequency >= AccessPoint.LOWER_FREQ_5GHZ
+                && frequency < AccessPoint.HIGHER_FREQ_5GHZ) {
+            band = getContext().getResources().getString(R.string.wifi_band_5ghz);
+        } else {
+            LOG.e("Unexpected frequency " + frequency);
+        }
+        preference.setDetailText(band);
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceController.java
new file mode 100644
index 0000000..23bef4f
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceController.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.RouteInfo;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Shows info about Wifi Gateway info.
+ */
+public class WifiGatewayPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+
+    public WifiGatewayPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        String gateway = null;
+        for (RouteInfo routeInfo : getWifiInfoProvider().getLinkProperties().getRoutes()) {
+            if (routeInfo.isIPv4Default() && routeInfo.hasGateway()) {
+                gateway = routeInfo.getGateway().getHostAddress();
+                break;
+            }
+        }
+
+        if (gateway == null) {
+            preference.setVisible(false);
+        } else {
+            preference.setDetailText(gateway);
+            preference.setVisible(true);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiInfoProvider.java b/src/com/android/car/settings/wifi/details/WifiInfoProvider.java
new file mode 100644
index 0000000..3008ebe
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiInfoProvider.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+
+import androidx.lifecycle.LifecycleObserver;
+
+/**
+ * Provides Wifi related info.
+ */
+public interface WifiInfoProvider extends LifecycleObserver {
+    /**
+     * Observers of Wifi info changes.
+     */
+    public interface Listener {
+        /**
+         * Called when NetworkInfo and/or WifiInfo is changed.
+         */
+        void onWifiChanged(NetworkInfo networkInfo, WifiInfo wifiInfo);
+
+        /**
+         * Called when network is lost.
+         */
+        void onLost(Network network);
+
+        /**
+         * Called when NetworkCapabilities changed.
+         */
+        void onCapabilitiesChanged(Network network, NetworkCapabilities nc);
+
+        /**
+         * Called when WifiConfiguration changed.
+         */
+        void onWifiConfigurationChanged(WifiConfiguration wifiConfiguration,
+                NetworkInfo networkInfo, WifiInfo wifiInfo);
+
+        /**
+         * Called when LinkProperties changed.
+         */
+        void onLinkPropertiesChanged(Network network, LinkProperties lp);
+    }
+
+    /**
+     * Adds the listener.
+     */
+    void addListener(Listener listener);
+
+    /**
+     * Removes the listener.
+     */
+    void removeListener(Listener listener);
+
+    /**
+     * Removes all listeners.
+     */
+    void clearListeners();
+
+    /**
+     * Getter for NetworkInfo
+     */
+    NetworkInfo getNetworkInfo();
+
+    /**
+     * Getter for WifiInfo
+     */
+    WifiInfo getWifiInfo();
+
+    /**
+     * Getter for Network
+     */
+    Network getNetwork();
+
+    /**
+     * Getter for NetworkCapabilities.
+     */
+    NetworkCapabilities getNetworkCapabilities();
+
+    /**
+     * Getter for NetworkConfiguration.
+     */
+    WifiConfiguration getNetworkConfiguration();
+
+    /**
+     * Getter for LinkProperties.
+     */
+    LinkProperties getLinkProperties();
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiInfoProviderImpl.java b/src/com/android/car/settings/wifi/details/WifiInfoProviderImpl.java
new file mode 100644
index 0000000..3ba3dc2
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiInfoProviderImpl.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
+
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.wifi.AccessPoint;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Provides Wifi related info.
+ */
+public class WifiInfoProviderImpl implements WifiInfoProvider {
+    private static final Logger LOG = new Logger(WifiInfoProviderImpl.class);
+
+    private final AccessPoint mAccessPoint;
+    private final Context mContext;
+    private final Set<Listener> mListeners = new HashSet<>();
+    private final WifiManager mWifiManager;
+    private final IntentFilter mFilter;
+    private final ConnectivityManager mConnectivityManager;
+    private final Handler mHandler;
+    private final Network mNetwork;
+
+    private LinkProperties mLinkProperties;
+    private NetworkCapabilities mNetworkCapabilities;
+    private WifiConfiguration mWifiConfig;
+    private NetworkInfo mNetworkInfo;
+    private WifiInfo mWifiInfo;
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            switch (intent.getAction()) {
+                case WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION:
+                    LOG.d("Wifi Config changed.");
+                    if (!intent.getBooleanExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED,
+                            false /* defaultValue */)) {
+                        // only one network changed
+                        WifiConfiguration wifiConfiguration = intent
+                                .getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
+                        if (mAccessPoint.matches(wifiConfiguration)) {
+                            mWifiConfig = wifiConfiguration;
+                        }
+                    }
+                    updateInfo();
+                    for (Listener listener : getListenersCopy()) {
+                        listener.onWifiConfigurationChanged(mWifiConfig, mNetworkInfo, mWifiInfo);
+                    }
+                    break;
+                case WifiManager.NETWORK_STATE_CHANGED_ACTION:
+                case WifiManager.RSSI_CHANGED_ACTION:
+                    LOG.d("wifi changed.");
+                    updateInfo();
+                    for (Listener listener : getListenersCopy()) {
+                        listener.onWifiChanged(mNetworkInfo, mWifiInfo);
+                    }
+                    break;
+            }
+        }
+    };
+
+    private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
+            .clearCapabilities().addTransportType(TRANSPORT_WIFI).build();
+
+    // Must be run on the UI thread since it directly manipulates UI state.
+    private final NetworkCallback mNetworkCallback = new NetworkCallback() {
+        @Override
+        public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
+            if (network.equals(mNetwork) && !lp.equals(mLinkProperties)) {
+                mLinkProperties = lp;
+                for (Listener listener : getListenersCopy()) {
+                    listener.onLinkPropertiesChanged(mNetwork, mLinkProperties);
+                }
+            }
+        }
+
+        private boolean hasCapabilityChanged(NetworkCapabilities nc, int cap) {
+            // If this is the first time we get NetworkCapabilities, report that something changed.
+            if (mNetworkCapabilities == null) return true;
+
+            // nc can never be null, see ConnectivityService#callCallbackForRequest.
+            return mNetworkCapabilities.hasCapability(cap) != nc.hasCapability(cap);
+        }
+
+        @Override
+        public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
+            // If the network just validated or lost Internet access, refresh network state.
+            if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
+                if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
+                        || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) {
+                    mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
+                }
+                mNetworkCapabilities = nc;
+                for (Listener listener : getListenersCopy()) {
+                    listener.onCapabilitiesChanged(mNetwork, mNetworkCapabilities);
+                }
+            }
+        }
+
+        @Override
+        public void onLost(Network network) {
+            if (network.equals(mNetwork)) {
+                for (Listener listener : getListenersCopy()) {
+                    listener.onLost(mNetwork);
+                }
+            }
+        }
+    };
+
+    WifiInfoProviderImpl(Context context, AccessPoint accessPoint) {
+        mContext = context;
+        mAccessPoint = accessPoint;
+        mHandler = new Handler(Looper.getMainLooper());
+        mConnectivityManager =
+                mContext.getSystemService(ConnectivityManager.class);
+        mWifiManager = mContext.getSystemService(WifiManager.class);
+        mWifiConfig = mAccessPoint.getConfig();
+        mNetwork = mWifiManager.getCurrentNetwork();
+        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
+        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
+        updateInfo();
+        mFilter = new IntentFilter();
+        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+    }
+
+    @Override
+    public void addListener(Listener listener) {
+        mListeners.add(listener);
+    }
+
+    @Override
+    public void removeListener(Listener listener) {
+        mListeners.remove(listener);
+    }
+
+    @Override
+    public void clearListeners() {
+        mListeners.clear();
+    }
+
+    /**
+     * Called when Lifecycle owner onStart is called.
+     */
+    @OnLifecycleEvent(Lifecycle.Event.ON_START)
+    public void onStart() {
+        LOG.d("onStart");
+        mContext.registerReceiver(mReceiver, mFilter);
+        mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback,
+                mHandler);
+        for (Listener listener : getListenersCopy()) {
+            listener.onWifiChanged(mNetworkInfo, mWifiInfo);
+        }
+        LOG.d("Done onStart");
+    }
+
+    /**
+     * Called when Lifecycle owner onStop is called.
+     */
+    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
+    public void onStop() {
+        LOG.d("onStop");
+        mContext.unregisterReceiver(mReceiver);
+        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+        LOG.d("done onStop");
+    }
+
+    @Override
+    public NetworkInfo getNetworkInfo() {
+        return mNetworkInfo;
+    }
+
+    @Override
+    public WifiInfo getWifiInfo() {
+        return mWifiInfo;
+    }
+
+    @Override
+    public Network getNetwork() {
+        return mNetwork;
+    }
+
+    @Override
+    public NetworkCapabilities getNetworkCapabilities() {
+        return mNetworkCapabilities;
+    }
+
+    @Override
+    public WifiConfiguration getNetworkConfiguration() {
+        return mWifiConfig;
+    }
+
+    @Override
+    public LinkProperties getLinkProperties() {
+        return mLinkProperties;
+    }
+
+    private Collection<Listener> getListenersCopy() {
+        return Collections.unmodifiableCollection(mListeners);
+    }
+
+    private void updateInfo() {
+        // No need to fetch LinkProperties and NetworkCapabilities, they are updated by the
+        // callbacks.
+        mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork);
+        mWifiInfo = mWifiManager.getConnectionInfo();
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceController.java
new file mode 100644
index 0000000..3b23bf0
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiIpAddressPreferenceController.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.LinkAddress;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.net.Inet4Address;
+
+/**
+ * Shows info about Wifi IP address.
+ */
+public class WifiIpAddressPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+
+    public WifiIpAddressPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        String ipv4Address = null;
+
+        for (LinkAddress addr : getWifiInfoProvider().getLinkProperties().getLinkAddresses()) {
+            if (addr.getAddress() instanceof Inet4Address) {
+                ipv4Address = addr.getAddress().getHostAddress();
+            }
+        }
+
+        if (ipv4Address == null) {
+            preference.setVisible(false);
+        } else {
+            preference.setDetailText(ipv4Address);
+            preference.setVisible(true);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceController.java
new file mode 100644
index 0000000..28b85e5
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiIpv6AddressPreferenceController.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.LinkAddress;
+
+import androidx.core.text.BidiFormatter;
+import androidx.preference.Preference;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.net.Inet6Address;
+import java.util.StringJoiner;
+
+/**
+ * Shows info about Wifi IPv6 address.
+ */
+public class WifiIpv6AddressPreferenceController extends
+        WifiDetailsBasePreferenceController<Preference> {
+
+    public WifiIpv6AddressPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        StringJoiner ipv6Addresses = new StringJoiner(System.lineSeparator());
+
+        for (LinkAddress addr : getWifiInfoProvider().getLinkProperties().getLinkAddresses()) {
+            if (addr.getAddress() instanceof Inet6Address) {
+                ipv6Addresses.add(addr.getAddress().getHostAddress());
+            }
+        }
+
+        if (ipv6Addresses.length() > 0) {
+            preference.setSummary(
+                    BidiFormatter.getInstance().unicodeWrap(ipv6Addresses.toString()));
+            preference.setVisible(true);
+        } else {
+            preference.setVisible(false);
+        }
+    }
+}
+
diff --git a/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceController.java
new file mode 100644
index 0000000..6818e4b
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiLinkSpeedPreferenceController.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Shows info about Wifi link speed info.
+ */
+public class WifiLinkSpeedPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+
+    public WifiLinkSpeedPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        int linkSpeedMbps = getWifiInfoProvider().getWifiInfo().getLinkSpeed();
+        preference.setVisible(linkSpeedMbps >= 0);
+        preference.setDetailText(getContext().getString(
+                R.string.link_speed, getWifiInfoProvider().getWifiInfo().getLinkSpeed()));
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceController.java
new file mode 100644
index 0000000..e57847f
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceController.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Shows info about Wifi MAC address.
+ */
+public class WifiMacAddressPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+
+    public WifiMacAddressPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        preference.setDetailText(getWifiInfoProvider().getWifiInfo().getMacAddress());
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceController.java
new file mode 100644
index 0000000..f36344c
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiSecurityPreferenceController.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Shows security info about the Wifi connection.
+ */
+public class WifiSecurityPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+    public WifiSecurityPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        preference.setDetailText(getAccessPoint().getSecurityString(false /* concise */));
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceController.java
new file mode 100644
index 0000000..e1fe311
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+
+/**
+ * Shows info about Wifi signal strength.
+ */
+public class WifiSignalStrengthPreferenceController
+        extends WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+
+    private int mRssiSignalLevel = -1;
+    private String[] mSignalStr;
+
+    public WifiSignalStrengthPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mSignalStr = context.getResources().getStringArray(R.array.wifi_signals);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        mRssiSignalLevel = getAccessPoint().getLevel();
+        preference.setDetailText(mSignalStr[mRssiSignalLevel]);
+    }
+}
diff --git a/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceController.java b/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceController.java
new file mode 100644
index 0000000..d7aecdd
--- /dev/null
+++ b/src/com/android/car/settings/wifi/details/WifiSubnetPreferenceController.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 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.car.settings.wifi.details;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.net.LinkAddress;
+import android.net.NetworkUtils;
+
+import com.android.car.settings.common.FragmentController;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * Shows info about Wifi subnet.
+ */
+public class WifiSubnetPreferenceController extends
+        WifiDetailsBasePreferenceController<WifiDetailsPreference> {
+
+    public WifiSubnetPreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<WifiDetailsPreference> getPreferenceType() {
+        return WifiDetailsPreference.class;
+    }
+
+    @Override
+    protected void updateState(WifiDetailsPreference preference) {
+        String subnet = null;
+
+        for (LinkAddress addr : getWifiInfoProvider().getLinkProperties().getLinkAddresses()) {
+            if (addr.getAddress() instanceof Inet4Address) {
+                subnet = ipv4PrefixLengthToSubnetMask(addr.getPrefixLength());
+            }
+        }
+
+        if (subnet == null) {
+            preference.setVisible(false);
+        } else {
+            preference.setDetailText(subnet);
+            preference.setVisible(true);
+        }
+    }
+
+    private static String ipv4PrefixLengthToSubnetMask(int prefixLength) {
+        try {
+            InetAddress all = InetAddress.getByAddress(
+                    new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255});
+            return NetworkUtils.getNetworkPart(all, prefixLength).getHostAddress();
+        } catch (UnknownHostException e) {
+            return null;
+        }
+    }
+}
diff --git a/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceController.java b/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceController.java
new file mode 100644
index 0000000..9d3a764
--- /dev/null
+++ b/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceController.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.preferences;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic to enable falling back to cellular data when wifi is poor. */
+public class CellularFallbackTogglePreferenceController extends
+        PreferenceController<TwoStatePreference> {
+
+    private static final String ENABLED = "1";
+    private static final String DISABLED = null;
+
+    public CellularFallbackTogglePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected int getAvailabilityStatus() {
+        return avoidBadWifiConfigEnabled() ? UNSUPPORTED_ON_DEVICE : AVAILABLE;
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(cellularFallbackEnabled());
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(TwoStatePreference preference, Object newValue) {
+        boolean enableCellularFallback = (Boolean) newValue;
+        Settings.Global.putString(getContext().getContentResolver(),
+                Settings.Global.NETWORK_AVOID_BAD_WIFI,
+                enableCellularFallback ? ENABLED : DISABLED);
+        return true;
+    }
+
+    /**
+     * See {@link Settings.Global#NETWORK_AVOID_BAD_WIFI} for description of this configuration. In
+     * short, if the device is configured to avoid bad wifi, the option to fallback to cellular is
+     * not shown.
+     */
+    private boolean avoidBadWifiConfigEnabled() {
+        return getContext().getResources().getInteger(R.integer.config_networkAvoidBadWifi) == 1;
+    }
+
+    private boolean cellularFallbackEnabled() {
+        return TextUtils.equals(ENABLED,
+                Settings.Global.getString(getContext().getContentResolver(),
+                        Settings.Global.NETWORK_AVOID_BAD_WIFI));
+    }
+}
diff --git a/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragment.java b/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragment.java
new file mode 100644
index 0000000..168c99b
--- /dev/null
+++ b/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragment.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.preferences;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.ActivityNotFoundException;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import androidx.fragment.app.DialogFragment;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.Logger;
+import com.android.settingslib.HelpUtils;
+
+/** Dialog to request enabling of wifi scanning when user tries to enable auto wifi wakeup. */
+public class ConfirmEnableWifiScanningDialogFragment extends DialogFragment implements
+        DialogInterface.OnClickListener {
+
+    public static final String TAG = "ConfirmEnableWifiScanningDialogFragment";
+    private static final Logger LOG = new Logger(ConfirmEnableWifiScanningDialogFragment.class);
+
+    private WifiScanningEnabledListener mListener;
+
+    /** Sets the wifi scanning enabled listener. */
+    public void setWifiScanningEnabledListener(WifiScanningEnabledListener listener) {
+        mListener = listener;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
+                .setTitle(R.string.wifi_settings_scanning_required_title)
+                .setPositiveButton(R.string.wifi_settings_scanning_required_turn_on, this)
+                .setNegativeButton(R.string.cancel, null);
+
+        // Only show "learn more" if there is a help page to show
+        if (!TextUtils.isEmpty(getContext().getString(R.string.help_uri_wifi_scanning_required))) {
+            builder.setNeutralButton(R.string.learn_more, this);
+        }
+
+        return builder.create();
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        switch (which) {
+            case DialogInterface.BUTTON_POSITIVE:
+                if (mListener != null) {
+                    mListener.onWifiScanningEnabled();
+                }
+                break;
+            case DialogInterface.BUTTON_NEUTRAL:
+                openHelpPage();
+                break;
+            case DialogInterface.BUTTON_NEGATIVE:
+            default:
+                // do nothing
+        }
+    }
+
+    private void openHelpPage() {
+        Intent intent = HelpUtils.getHelpIntent(getContext(),
+                getContext().getString(R.string.help_uri_wifi_scanning_required),
+                getContext().getClass().getName());
+        if (intent != null) {
+            try {
+                startActivity(intent);
+            } catch (ActivityNotFoundException e) {
+                LOG.e("Activity was not found for intent, " + intent.toString());
+            }
+        }
+    }
+
+    /** Listener for when the dialog is confirmed and the wifi scanning is enabled. */
+    public interface WifiScanningEnabledListener {
+        /** Actions to take when wifi scanning is enabled. */
+        void onWifiScanningEnabled();
+    }
+}
diff --git a/src/com/android/car/settings/wifi/preferences/WifiPreferencesFragment.java b/src/com/android/car/settings/wifi/preferences/WifiPreferencesFragment.java
new file mode 100644
index 0000000..5a73fef
--- /dev/null
+++ b/src/com/android/car/settings/wifi/preferences/WifiPreferencesFragment.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.preferences;
+
+import androidx.annotation.XmlRes;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/** Screen to control wifi specific configurations. */
+public class WifiPreferencesFragment extends SettingsFragment {
+
+    @Override
+    @XmlRes
+    protected int getPreferenceScreenResId() {
+        return R.xml.wifi_preferences_fragment;
+    }
+}
diff --git a/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java b/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
new file mode 100644
index 0000000..363037f
--- /dev/null
+++ b/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceController.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.preferences;
+
+import android.app.Service;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.location.LocationManager;
+import android.provider.Settings;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.URLSpan;
+import android.widget.Toast;
+
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.Logger;
+import com.android.car.settings.common.PreferenceController;
+
+/** Business logic to allow auto-enabling of wifi near saved networks. */
+public class WifiWakeupTogglePreferenceController extends
+        PreferenceController<TwoStatePreference> implements
+        ConfirmEnableWifiScanningDialogFragment.WifiScanningEnabledListener {
+
+    private static final Logger LOG = new Logger(WifiWakeupTogglePreferenceController.class);
+    private final LocationManager mLocationManager;
+
+    public WifiWakeupTogglePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);
+    }
+
+    @Override
+    protected Class<TwoStatePreference> getPreferenceType() {
+        return TwoStatePreference.class;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        ConfirmEnableWifiScanningDialogFragment dialogFragment =
+                (ConfirmEnableWifiScanningDialogFragment) getFragmentController().findDialogByTag(
+                        ConfirmEnableWifiScanningDialogFragment.TAG);
+        if (dialogFragment != null) {
+            dialogFragment.setWifiScanningEnabledListener(this);
+        }
+    }
+
+    @Override
+    protected void updateState(TwoStatePreference preference) {
+        preference.setChecked(getWifiWakeupEnabled()
+                && getWifiScanningEnabled()
+                && mLocationManager.isLocationEnabled());
+        if (!mLocationManager.isLocationEnabled()) {
+            preference.setSummary(getNoLocationSummary());
+        } else {
+            preference.setSummary(R.string.wifi_wakeup_summary);
+        }
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(TwoStatePreference preference) {
+        if (!mLocationManager.isLocationEnabled()) {
+            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+            getContext().startActivity(intent);
+        } else if (getWifiWakeupEnabled()) {
+            setWifiWakeupEnabled(false);
+        } else if (!getWifiScanningEnabled()) {
+            showScanningDialog();
+        } else {
+            setWifiWakeupEnabled(true);
+        }
+
+        refreshUi();
+        return true;
+    }
+
+    private boolean getWifiWakeupEnabled() {
+        return Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1;
+    }
+
+    private void setWifiWakeupEnabled(boolean enabled) {
+        Settings.Global.putInt(getContext().getContentResolver(),
+                Settings.Global.WIFI_WAKEUP_ENABLED,
+                enabled ? 1 : 0);
+    }
+
+    private boolean getWifiScanningEnabled() {
+        return Settings.Global.getInt(getContext().getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1;
+    }
+
+    private void enableWifiScanning() {
+        Settings.Global.putInt(getContext().getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
+        Toast.makeText(
+                getContext(),
+                getContext().getString(R.string.wifi_settings_scanning_required_enabled),
+                Toast.LENGTH_SHORT).show();
+    }
+
+    private CharSequence getNoLocationSummary() {
+        String highlightedWord = "link";
+        CharSequence locationText = getContext()
+                .getText(R.string.wifi_wakeup_summary_no_location);
+
+        SpannableString msg = new SpannableString(locationText);
+        int startIndex = locationText.toString().indexOf(highlightedWord);
+        if (startIndex < 0) {
+            LOG.e("Cannot create URL span");
+            return locationText;
+        }
+        msg.setSpan(new URLSpan((String) null), startIndex, startIndex + highlightedWord.length(),
+                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return msg;
+    }
+
+    private void showScanningDialog() {
+        ConfirmEnableWifiScanningDialogFragment dialogFragment =
+                new ConfirmEnableWifiScanningDialogFragment();
+        dialogFragment.setWifiScanningEnabledListener(this);
+        getFragmentController().showDialog(dialogFragment,
+                ConfirmEnableWifiScanningDialogFragment.TAG);
+    }
+
+    @Override
+    public void onWifiScanningEnabled() {
+        enableWifiScanning();
+        if (mLocationManager.isLocationEnabled()) {
+            setWifiWakeupEnabled(true);
+        }
+        refreshUi();
+    }
+}
diff --git a/tests/robotests/Android.mk b/tests/robotests/Android.mk
index 2d0626d..7992d51 100644
--- a/tests/robotests/Android.mk
+++ b/tests/robotests/Android.mk
@@ -1,46 +1,50 @@
-#############################################
-# Car Settings Robolectric test target. #
-#############################################
-LOCAL_PATH:= $(call my-dir)
+#############################################################
+# Car Settings Robolectric test target.                     #
+#############################################################
+LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := CarSettingsRoboTests
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_JAVA_RESOURCE_DIRS := config
 
-# Include the testing libraries
 LOCAL_JAVA_LIBRARIES := \
-    android.car \
-    robolectric_android-all-stub \
     Robolectric_all-target \
+    robolectric_android-all-stub \
     mockito-robolectric-prebuilt \
-    truth-prebuilt
+    truth-prebuilt \
+    testng \
+    android.car
 
-LOCAL_INSTRUMENTATION_FOR := CarSettings
+LOCAL_INSTRUMENTATION_FOR := CarSettingsForTesting
 
 LOCAL_MODULE_TAGS := optional
 
+# Generate test_config.properties
+include external/robolectric-shadows/gen_test_config.mk
+
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
 #############################################################
-# Car Settings runner target to run the previous target. #
+# Car Settings runner target to run the previous target.    #
 #############################################################
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := RunCarSettingsRoboTests
 
 LOCAL_JAVA_LIBRARIES := \
-    android.car \
-    CarSettingsRoboTests \
-    android.car \
-    robolectric_android-all-stub \
     Robolectric_all-target \
+    robolectric_android-all-stub \
     mockito-robolectric-prebuilt \
-    truth-prebuilt
+    truth-prebuilt \
+    testng \
+    CarSettingsRoboTests \
+    android.car
 
-LOCAL_TEST_PACKAGE := CarSettings
+LOCAL_TEST_PACKAGE := CarSettingsForTesting
 
 LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
 
diff --git a/tests/robotests/AndroidManifest.xml b/tests/robotests/AndroidManifest.xml
deleted file mode 100644
index 77fd39c..0000000
--- a/tests/robotests/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +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.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          coreApp="true"
-          package="com.android.car.settings.robotests">
-    <application/>
-
-</manifest>
diff --git a/tests/robotests/config/robolectric.properties b/tests/robotests/config/robolectric.properties
index 8568e15..01124da 100644
--- a/tests/robotests/config/robolectric.properties
+++ b/tests/robotests/config/robolectric.properties
@@ -13,6 +13,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-manifest=packages/apps/Car/Settings/tests/robotests/AndroidManifest.xml
 sdk=NEWEST_SDK
-shadows=com.android.car.settings.testutils.CarSettingsShadowResources, com.android.car.settings.testutils.ShadowCar
+shadows=com.android.car.settings.testutils.ShadowCar
diff --git a/tests/robotests/res/drawable/test_icon.png b/tests/robotests/res/drawable/test_icon.png
new file mode 100644
index 0000000..a1cf83e
--- /dev/null
+++ b/tests/robotests/res/drawable/test_icon.png
Binary files differ
diff --git a/tests/robotests/res/values/arrays.xml b/tests/robotests/res/values/arrays.xml
new file mode 100644
index 0000000..0b92530
--- /dev/null
+++ b/tests/robotests/res/values/arrays.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<resources>
+    <string-array name="entries" translatable="false">
+        <item>Choose me!</item>
+        <item>No, me!</item>
+        <item>What about me?!</item>
+    </string-array>
+
+    <string-array name="entry_values" translatable="false">
+        <item>alpha</item>
+        <item>beta</item>
+        <item>charlie</item>
+    </string-array>
+</resources>
diff --git a/tests/robotests/res/values/config.xml b/tests/robotests/res/values/config.xml
new file mode 100644
index 0000000..8e168b0
--- /dev/null
+++ b/tests/robotests/res/values/config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<resources>
+    <!-- replace with simple fragment for testing purpose . -->
+    <string name="config_settings_hierarchy_root_fragment" translatable="false">com.android.car.settings.testutils.DummyFragment</string>
+    <!-- explicitly set to unset string for testing purpose -->
+    <string name="config_defaultAssistantComponentName" translatable="false">#+UNSET</string>
+    <!-- Whether exit button in settings' root action bar should be shown or not -->
+    <bool name="config_show_settings_root_exit_icon">true</bool>
+</resources>
diff --git a/tests/robotests/res/values/internal_resources.xml b/tests/robotests/res/values/internal_resources.xml
new file mode 100644
index 0000000..90c541e
--- /dev/null
+++ b/tests/robotests/res/values/internal_resources.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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.
+-->
+
+<resources>
+    <bool name="config_automatic_brightness_available">true</bool>
+    <integer name="config_networkAvoidBadWifi">0</integer>
+
+    <!-- Progress bar preference resources -->
+    <color name="config_progress_background_tint">@android:color/white</color>
+    <color name="white_disabled_material">@android:color/white</color>
+</resources>
diff --git a/tests/robotests/res/values/preference_keys.xml b/tests/robotests/res/values/preference_keys.xml
new file mode 100644
index 0000000..f76feae
--- /dev/null
+++ b/tests/robotests/res/values/preference_keys.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<!-- Namespaced with "tpk" (Test Preference Key) to avoid conflicts. -->
+<resources>
+    <!-- SettingsFragmentTest -->
+    <string name="tpk_fake_controller" translatable="false">fake_controller</string>
+    <string name="tpk_edit_text_preference" translatable="false">edit_text_preference</string>
+    <string name="tpk_list_preference" translatable="false">list_preference</string>
+
+    <string name="tpk_two_action_preference" translatable="false">two_action_preference</string>
+</resources>
diff --git a/tests/robotests/res/values/strings.xml b/tests/robotests/res/values/strings.xml
new file mode 100644
index 0000000..aed9f9e
--- /dev/null
+++ b/tests/robotests/res/values/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="test_volume_call" translatable="false">Call Volume</string>
+    <string name="test_volume_music" translatable="false">Music Volume</string>
+
+    <!-- AccountListPreferenceControllerTest and AddAccountPreferenceControllerTest -->
+    <string name="account_type1_label" translatable="false">Type 1</string>
+    <string name="account_type2_label" translatable="false">Type 2</string>
+    <string name="account_type3_label" translatable="false">Type 3</string>
+
+    <string name="bt_rename_dialog_title" translatable="false">Rename Title</string>
+    <string name="bt_profile_name" translatable="false">Profile Name</string>
+
+    <string name="test_positive_button_label" translatable="false">Positive Button</string>
+    <string name="test_negative_button_label" translatable="false">Negative Button</string>
+
+    <string name="fake_title" translatable="false">fake_title</string>
+    <string name="fake_summary" translatable="false">fake_summary</string>
+    <string name="fake_category" translatable="false">fake_category</string>
+</resources>
diff --git a/tests/robotests/res/xml/preference_controller_list_helper_fail_invalid_controller.xml b/tests/robotests/res/xml/preference_controller_list_helper_fail_invalid_controller.xml
new file mode 100644
index 0000000..32a8722
--- /dev/null
+++ b/tests/robotests/res/xml/preference_controller_list_helper_fail_invalid_controller.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <Preference
+        android:key="key"
+        settings:controller="com.android.car.settings.common.NonExistentPreferenceController"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/preference_controller_list_helper_fail_missing_key.xml b/tests/robotests/res/xml/preference_controller_list_helper_fail_missing_key.xml
new file mode 100644
index 0000000..acbb5ae
--- /dev/null
+++ b/tests/robotests/res/xml/preference_controller_list_helper_fail_missing_key.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 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:settings="http://schemas.android.com/apk/res-auto">
+    <Preference
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/preference_controller_list_helper_success.xml b/tests/robotests/res/xml/preference_controller_list_helper_success.xml
new file mode 100644
index 0000000..de81979
--- /dev/null
+++ b/tests/robotests/res/xml/preference_controller_list_helper_success.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <Preference
+        android:key="key1"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <Preference
+        android:key="key2"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+    <!-- Preferences without controllers should be skipped by the list helper. -->
+    <Preference
+        android:key="key3"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/preference_parser.xml b/tests/robotests/res/xml/preference_parser.xml
new file mode 100644
index 0000000..8d02f1d
--- /dev/null
+++ b/tests/robotests/res/xml/preference_parser.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2018 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res-auto"
+                  android:key="fake_title_key"
+                  android:title="screen_title"
+                  settings:controller="com.android.car.settings.common.FakePreferenceController">
+    <Preference
+        android:key="key1"
+        settings:controller="com.android.car.settings.common.FakePreferenceController"/>
+    <PreferenceCategory
+        android:key="key2"
+        settings:controller="com.android.car.settings.common.FakePreferenceController"/>
+    <com.android.car.settings.common.LogicalPreferenceGroup
+        android:key="key3"
+        settings:controller="com.android.car.settings.common.FakePreferenceController"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/settings_fragment.xml b/tests/robotests/res/xml/settings_fragment.xml
new file mode 100644
index 0000000..0498c50
--- /dev/null
+++ b/tests/robotests/res/xml/settings_fragment.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="screen_title">
+    <Preference
+        android:key="@string/tpk_fake_controller"
+        settings:controller="com.android.car.settings.common.FakePreferenceController"/>
+    <EditTextPreference
+        android:key="@string/tpk_edit_text_preference"/>
+    <ListPreference
+        android:entries="@array/entries"
+        android:entryValues="@array/entry_values"
+        android:key="@string/tpk_list_preference"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/test_car_volume_items.xml b/tests/robotests/res/xml/test_car_volume_items.xml
new file mode 100644
index 0000000..3ac7903
--- /dev/null
+++ b/tests/robotests/res/xml/test_car_volume_items.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<!--
+  We use a separate test file due to the difficulty accessing android internal resources in tests.
+-->
+<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
+    <item car:usage="voice_communication"
+          car:titleText="@string/test_volume_call"
+          car:icon="@drawable/test_icon"/>
+    <item car:usage="voice_communication_signalling"
+          car:titleText="@string/test_volume_call"
+          car:icon="@drawable/test_icon"/>
+    <item car:usage="media"
+          car:titleText="@string/test_volume_music"
+          car:icon="@drawable/test_icon"/>
+</carVolumeItems>
diff --git a/tests/robotests/res/xml/test_user_details_base_fragment.xml b/tests/robotests/res/xml/test_user_details_base_fragment.xml
new file mode 100644
index 0000000..851425e
--- /dev/null
+++ b/tests/robotests/res/xml/test_user_details_base_fragment.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2018 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:title="screen_title">
+    <Preference
+        android:key="@string/tpk_fake_controller"
+        settings:controller="com.android.car.settings.common.FakePreferenceController"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/two_action_preference_action_shown_not_specified.xml b/tests/robotests/res/xml/two_action_preference_action_shown_not_specified.xml
new file mode 100644
index 0000000..bbf93fc
--- /dev/null
+++ b/tests/robotests/res/xml/two_action_preference_action_shown_not_specified.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <!-- Note that action_shown is not specified -->
+    <com.android.car.settings.common.ButtonPreference
+        android:key="@string/tpk_two_action_preference"
+        android:widgetLayout="@layout/details_preference_widget"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/two_action_preference_hidden.xml b/tests/robotests/res/xml/two_action_preference_hidden.xml
new file mode 100644
index 0000000..b703345
--- /dev/null
+++ b/tests/robotests/res/xml/two_action_preference_hidden.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <com.android.car.settings.common.ButtonPreference
+        android:key="@string/tpk_two_action_preference"
+        android:widgetLayout="@layout/details_preference_widget"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
+        settings:actionShown="false"/>
+</PreferenceScreen>
diff --git a/tests/robotests/res/xml/two_action_preference_shown.xml b/tests/robotests/res/xml/two_action_preference_shown.xml
new file mode 100644
index 0000000..428519b
--- /dev/null
+++ b/tests/robotests/res/xml/two_action_preference_shown.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright 2019 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto">
+    <com.android.car.settings.common.ButtonPreference
+        android:key="@string/tpk_two_action_preference"
+        android:widgetLayout="@layout/details_preference_widget"
+        settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"
+        settings:actionShown="true"/>
+</PreferenceScreen>
diff --git a/tests/robotests/src/com/android/car/settings/CarSettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/car/settings/CarSettingsRobolectricTestRunner.java
index 4ede838..f3f2e31 100644
--- a/tests/robotests/src/com/android/car/settings/CarSettingsRobolectricTestRunner.java
+++ b/tests/robotests/src/com/android/car/settings/CarSettingsRobolectricTestRunner.java
@@ -13,95 +13,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.car.settings;
 
-import androidx.annotation.NonNull;
+package com.android.car.settings;
 
 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;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
 
 /**
- * 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.
+ * TODO: Remove this and use RobolectricTestRunner in all tests.
  */
 public class CarSettingsRobolectricTestRunner extends RobolectricTestRunner {
-
-    private static final String AAR_VERSION_APP_COMPAT = "1.0.0-alpha1";
-    private static final String AAR_VERSION_CAR = "1.0.0-alpha3";
-    private static final String SUPPORT_RESOURCE_PATH_TEMPLATE =
-            "jar:file:prebuilts/sdk/current/androidx/m2repository/androidx/"
-                    + "%1$s/%1$s/%2$s/%1$s-%2$s.aar!/res";
-
     /**
      * We don't actually want to change this behavior, so we just call super.
      */
     public CarSettingsRobolectricTestRunner(Class<?> testClass) throws InitializationError {
         super(testClass);
     }
-
-    private static ResourcePath createResourcePath(@NonNull String filePath) {
-        try {
-            return new ResourcePath(null, Fs.fromURL(new URL(filePath)), null);
-        } catch (MalformedURLException e) {
-            throw new RuntimeException("CarSettingsobolectricTestRunner failure", e);
-        }
-    }
-
-    /**
-     * Create the resource path for a support library component's JAR.
-     */
-    private static String createSupportResourcePathFromJar(@NonNull String componentId,
-            @NonNull String version) {
-        return String.format(SUPPORT_RESOURCE_PATH_TEMPLATE, componentId, version);
-    }
-
-    /**
-     * 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/Car/Settings/";
-        final String manifestPath = appRoot + "/AndroidManifest.xml";
-        final String resDir = appRoot + "/res";
-        final String assetsDir = appRoot + config.assetDir();
-
-        // By adding any resources from libraries we need to the AndroidManifest, we can access
-        // them from within the parallel universe's resource loader.
-        return new AndroidManifest(Fs.fileFromPath(manifestPath), Fs.fileFromPath(resDir),
-            Fs.fileFromPath(assetsDir)) {
-            @Override
-            public List<ResourcePath> getIncludedResourcePaths() {
-                List<ResourcePath> paths = super.getIncludedResourcePaths();
-                paths.add(createResourcePath("file:packages/apps/Car/Settings/res"));
-
-                // Support library resources. These need to point to the prebuilts of support
-                // library and not the source.
-                paths.add(createResourcePath(createSupportResourcePathFromJar("appcompat",
-                        AAR_VERSION_APP_COMPAT)));
-                paths.add(createResourcePath(createSupportResourcePathFromJar("car",
-                        AAR_VERSION_CAR)));
-
-                paths.add(createResourcePath("file:packages/apps/Car/libs/car-stream-ui-lib/res "));
-                paths.add(createResourcePath("file:packages/apps/Car/libs/car-list/res"));
-                paths.add(createResourcePath("file:frameworks/base/packages/SettingsLib/res"));
-                paths.add(createResourcePath(
-                        "file:frameworks/opt/setupwizard/library/gingerbread/res"));
-                paths.add(createResourcePath(
-                        "file:frameworks/opt/setupwizard/library/main/res"));
-
-                return paths;
-            }
-        };
-    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/TestConfig.java b/tests/robotests/src/com/android/car/settings/TestConfig.java
deleted file mode 100644
index 51570ea..0000000
--- a/tests/robotests/src/com/android/car/settings/TestConfig.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.car.settings;
-
-public class TestConfig {
-    public static final int SDK_VERSION = 23;
-    public static final String MANIFEST_PATH =
-            "packages/apps/Car/Settings/AndroidManifest.xml";
-}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceControllerTest.java
new file mode 100644
index 0000000..218faf1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountAutoSyncPreferenceControllerTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+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;
+
+/** Unit tests for {@link AccountAutoSyncPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowContentResolver.class, ShadowCarUserManagerHelper.class})
+public class AccountAutoSyncPreferenceControllerTest {
+    private static final int USER_ID = 0;
+    private static final UserHandle USER_HANDLE = new UserHandle(USER_ID);
+
+    private PreferenceControllerTestHelper<AccountAutoSyncPreferenceController> mHelper;
+    private SwitchPreference mSwitchPreference;
+    private AccountAutoSyncPreferenceController mController;
+    private ConfirmationDialogFragment mDialog;
+
+    @Mock
+    private CarUserManagerHelper mMockCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
+        when(mMockCarUserManagerHelper.getCurrentProcessUserInfo())
+                .thenReturn(new UserInfo(USER_ID, "name", 0));
+
+        Context context = RuntimeEnvironment.application;
+        mSwitchPreference = new SwitchPreference(application);
+        mHelper = new PreferenceControllerTestHelper<>(application,
+                AccountAutoSyncPreferenceController.class, mSwitchPreference);
+        mController = mHelper.getController();
+        mDialog = new ConfirmationDialogFragment.Builder(context).build();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testOnCreate_hasPreviousDialog_dialogListenerSet() {
+        when(mHelper.getMockFragmentController().findDialogByTag(
+                ConfirmationDialogFragment.TAG)).thenReturn(mDialog);
+        mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mDialog.getConfirmListener()).isNotNull();
+    }
+
+    @Test
+    public void refreshUi_masterSyncOn_preferenceShouldBeChecked() {
+        mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(true, USER_ID);
+
+        mController.refreshUi();
+
+        assertThat(mSwitchPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_masterSyncOff_preferenceShouldNotBeChecked() {
+        ContentResolver.setMasterSyncAutomaticallyAsUser(false, USER_ID);
+        mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mSwitchPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void onPreferenceClicked_shouldOpenDialog() {
+        mSwitchPreference.performClick();
+
+        verify(mHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class), eq(ConfirmationDialogFragment.TAG));
+    }
+
+    @Test
+    public void onConfirm_shouldTogglePreference() {
+        // Set the preference as unchecked first so that the state is known
+        mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(false, USER_ID);
+        mController.refreshUi();
+
+        assertThat(mSwitchPreference.isChecked()).isFalse();
+
+        Bundle arguments = new Bundle();
+        arguments.putBoolean(AccountAutoSyncPreferenceController.KEY_ENABLING, true);
+        arguments.putParcelable(AccountAutoSyncPreferenceController.KEY_USER_HANDLE, USER_HANDLE);
+        mController.mConfirmListener.onConfirm(arguments);
+
+        assertThat(mSwitchPreference.isChecked()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsFragmentTest.java
new file mode 100644
index 0000000..2a9c08f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsFragmentTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+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.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/**
+ * Tests for the {@link AccountDetailsFragment}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowAccountManager.class,
+        ShadowContentResolver.class})
+public class AccountDetailsFragmentTest {
+    private static final String DIALOG_TAG = "confirmRemoveAccount";
+    private final Account mAccount = new Account("Name", "com.acct");
+    private final UserInfo mUserInfo = new UserInfo(/* id= */ 0, /* name= */ "name", /* flags= */
+            0);
+    private final CharSequence mAccountLabel = "Type 1";
+
+    private Context mContext;
+    private BaseTestActivity mActivity;
+    private AccountDetailsFragment mFragment;
+    @Mock
+    private CarUserManagerHelper mMockCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
+
+        mContext = application;
+        // Add the account to the official list of accounts
+        getShadowAccountManager().addAccount(mAccount);
+
+        mActivity = Robolectric.setupActivity(BaseTestActivity.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowContentResolver.reset();
+        mActivity.clearOnBackPressedFlag();
+    }
+
+    @Test
+    public void onActivityCreated_titleShouldBeSet() {
+        initFragment();
+
+        TextView title = mFragment.requireActivity().findViewById(R.id.title);
+        assertThat(title.getText()).isEqualTo(mAccountLabel);
+    }
+
+    @Test
+    public void cannotModifyUsers_removeAccountButtonShouldNotBeVisible() {
+        doReturn(false).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        initFragment();
+
+        Button removeAccountButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        assertThat(removeAccountButton.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void canModifyUsers_removeAccountButtonShouldBeVisible() {
+        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        initFragment();
+
+        Button removeAccountButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        assertThat(removeAccountButton.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onRemoveAccountButtonClicked_canModifyUsers_shouldShowConfirmRemoveAccountDialog() {
+        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        initFragment();
+
+        Button removeAccountButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        removeAccountButton.performClick();
+
+        Fragment dialogFragment =
+                mFragment.requireActivity().getSupportFragmentManager().findFragmentByTag(
+                        DIALOG_TAG);
+
+        assertThat(dialogFragment).isNotNull();
+        assertThat(dialogFragment).isInstanceOf(
+                AccountDetailsFragment.ConfirmRemoveAccountDialogFragment.class);
+    }
+
+    @Test
+    public void accountExists_accountStillExists_shouldBeTrue() {
+        initFragment();
+
+        // Nothing has happened to the account so this should return true;
+        assertThat(mFragment.accountExists()).isTrue();
+    }
+
+    @Test
+    public void accountExists_accountWasRemoved_shouldBeFalse() {
+        initFragment();
+
+        // Clear accounts so that the account being displayed appears to have been removed
+        getShadowAccountManager().removeAllAccounts();
+        assertThat(mFragment.accountExists()).isFalse();
+    }
+
+    @Test
+    public void onAccountsUpdate_accountDoesNotExist_shouldGoBack() {
+        initFragment();
+
+        // Clear accounts so that the account being displayed appears to have been removed
+        getShadowAccountManager().removeAllAccounts();
+        mFragment.onAccountsUpdate(null);
+
+        assertThat(mActivity.getOnBackPressedFlag()).isTrue();
+    }
+
+    private void initFragment() {
+        mFragment = AccountDetailsFragment.newInstance(mAccount, mAccountLabel, mUserInfo);
+        mActivity.launchFragment(mFragment);
+    }
+
+    private ShadowAccountManager getShadowAccountManager() {
+        return Shadow.extract(AccountManager.get(mContext));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
new file mode 100644
index 0000000..0b375f4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsPreferenceControllerTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.RuntimeEnvironment.application;
+import static org.testng.Assert.assertThrows;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.os.UserHandle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link AccountDetailsPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class,
+        ShadowApplicationPackageManager.class})
+public class AccountDetailsPreferenceControllerTest {
+    private static final String ACCOUNT_NAME = "Name";
+    private static final String ACCOUNT_TYPE = "com.acct";
+    private final Account mAccount = new Account(ACCOUNT_NAME, ACCOUNT_TYPE);
+    private final UserHandle mUserHandle = new UserHandle(0);
+
+    private AccountDetailsPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        PreferenceControllerTestHelper<AccountDetailsPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(application,
+                        AccountDetailsPreferenceController.class);
+        mController = helper.getController();
+        mController.setAccount(mAccount);
+        mController.setUserHandle(mUserHandle);
+
+        mPreference = new Preference(application);
+        helper.setPreference(mPreference);
+        helper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void checkInitialized_accountSetAndUserHandleSet_doesNothing() {
+        mController = new PreferenceControllerTestHelper<>(application,
+                AccountDetailsPreferenceController.class).getController();
+        mController.setAccount(mAccount);
+        mController.setUserHandle(mUserHandle);
+
+        mController.checkInitialized();
+    }
+
+    @Test
+    public void checkInitialized_nullAccount_throwsIllegalStateException() {
+        mController = new PreferenceControllerTestHelper<>(application,
+                AccountDetailsPreferenceController.class).getController();
+        mController.setUserHandle(mUserHandle);
+
+        assertThrows(IllegalStateException.class, () -> mController.checkInitialized());
+    }
+
+    @Test
+    public void checkInitialized_nullUserHandle_throwsIllegalStateException() {
+        mController = new PreferenceControllerTestHelper<>(application,
+                AccountDetailsPreferenceController.class).getController();
+        mController.setAccount(mAccount);
+
+        assertThrows(IllegalStateException.class, () -> mController.checkInitialized());
+    }
+
+    @Test
+    public void refreshUi_shouldSetTitle() {
+        mController.refreshUi();
+
+        assertThat(mPreference.getTitle().toString()).isEqualTo(ACCOUNT_NAME);
+    }
+
+    @Test
+    public void refreshUi_shouldSetIcon() {
+        // Add authenticator description with icon resource
+        addAuthenticator(/* type= */ ACCOUNT_TYPE, /* labelRes= */
+                R.string.account_type1_label, /* iconId= */ R.drawable.ic_add);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getIcon()).isNotNull();
+        assertThat(Shadows.shadowOf(mPreference.getIcon()).getCreatedFromResId()).isEqualTo(
+                R.drawable.ic_add);
+    }
+
+    private void addAuthenticator(String type, int labelRes, int iconId) {
+        getShadowAccountManager().addAuthenticator(
+                new AuthenticatorDescription(type, "com.android.car.settings",
+                        labelRes, iconId, /* smallIconId= */ 0, /* prefId= */ 0,
+                        /* customTokens= */ false));
+    }
+
+    private ShadowAccountManager getShadowAccountManager() {
+        return Shadow.extract(AccountManager.get(application));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsSettingControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsSettingControllerTest.java
new file mode 100644
index 0000000..326f56c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsSettingControllerTest.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.robolectric.RuntimeEnvironment.application;
+import static org.testng.Assert.assertThrows;
+
+import android.accounts.Account;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ExtraSettingsLoader;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Unit test for {@link AccountDetailsSettingController}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class,
+        ShadowApplicationPackageManager.class})
+public class AccountDetailsSettingControllerTest {
+
+    private static final String ACCOUNT_NAME = "account_name";
+    private static final String MATCHING_ACCOUNT_TYPE = "account_type";
+    private static final String ACCOUNT_ACCESS_ID = "account_access_id";
+    private static final String METADATA_IA_ACCOUNT = "com.android.settings.ia.account";
+    private static final String NOT_MATCHING_ACCOUNT_TYPE = "com.android.settings.ia.account";
+
+    private Context mContext;
+    private PreferenceGroup mPreference;
+    @Mock
+    private ExtraSettingsLoader mExtraSettingsLoader;
+    private AccountDetailsSettingController mAccountDetailsSettingController;
+    private Account mAccount = new Account(ACCOUNT_NAME, MATCHING_ACCOUNT_TYPE, ACCOUNT_ACCESS_ID);
+    private List<Preference> mPreferenceList;
+    private HashMap<Preference, Bundle> mPreferenceBundleMap;
+    PreferenceControllerTestHelper<AccountDetailsSettingController> mHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        mHelper = new PreferenceControllerTestHelper<>(application,
+                AccountDetailsSettingController.class);
+
+        mAccountDetailsSettingController = mHelper.getController();
+        mAccountDetailsSettingController.setAccount(mAccount);
+
+        mPreferenceList = new ArrayList<>();
+        mPreferenceBundleMap = new HashMap<>();
+        mPreference = new LogicalPreferenceGroup(application);
+        mPreference.setIntent(new Intent());
+        mHelper.setPreference(mPreference);
+    }
+
+    @Test
+    public void checkInitialized_accountSetAndUserHandleSet_doesNothing() {
+        mAccountDetailsSettingController = new PreferenceControllerTestHelper<>(application,
+                AccountDetailsSettingController.class).getController();
+        mAccountDetailsSettingController.setAccount(mAccount);
+
+        mAccountDetailsSettingController.checkInitialized();
+    }
+
+    @Test
+    public void checkInitialized_nullAccount_throwsIllegalStateException() {
+        assertThrows(IllegalStateException.class,
+                () -> new PreferenceControllerTestHelper<>(mContext,
+                        AccountDetailsSettingController.class,
+                        new LogicalPreferenceGroup(mContext)));
+    }
+
+    @Test
+    public void addExtraSettings_preferenceEmpty_shouldNotAddAnyPreferences() {
+        mHelper.markState(Lifecycle.State.STARTED);
+
+        setupMockSettingLoaderAndRefreshUI();
+
+        assertThat(mPreference.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void addExtraSettings_preferenceEmpty_isNotVisible() {
+        mHelper.markState(Lifecycle.State.STARTED);
+
+        setupMockSettingLoaderAndRefreshUI();
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void addExtraSettings_accountTypeNotEqual_shouldNotAddAnyPreferences() {
+        mHelper.markState(Lifecycle.State.STARTED);
+        Preference preference = new Preference(mContext);
+        mPreferenceList.add(preference);
+        Bundle bundle = new Bundle();
+        bundle.putString(METADATA_IA_ACCOUNT, NOT_MATCHING_ACCOUNT_TYPE);
+        mPreferenceBundleMap.put(preference, bundle);
+
+        setupMockSettingLoaderAndRefreshUI();
+
+        assertThat(mPreference.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void addExtraSettings_accountTypeNotEqual_isNotVisible() {
+        mHelper.markState(Lifecycle.State.STARTED);
+        Preference preference = new Preference(mContext);
+        mPreferenceList.add(preference);
+        Bundle bundle = new Bundle();
+        bundle.putString(METADATA_IA_ACCOUNT, NOT_MATCHING_ACCOUNT_TYPE);
+        mPreferenceBundleMap.put(preference, bundle);
+
+        setupMockSettingLoaderAndRefreshUI();
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void addExtraSettings_accountTypeEqual_shouldAddPreferences() {
+        Preference preference = new Preference(mContext);
+        mPreferenceList.add(preference);
+        Bundle bundle = new Bundle();
+        bundle.putString(METADATA_IA_ACCOUNT, MATCHING_ACCOUNT_TYPE);
+        mPreferenceBundleMap.put(preference, bundle);
+
+        setupMockSettingLoaderAndRefreshUI();
+        mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mPreference.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void addExtraSettings_accountTypeEqual_isVisible() {
+        Preference preference = new Preference(mContext);
+        mPreferenceList.add(preference);
+        Bundle bundle = new Bundle();
+        bundle.putString(METADATA_IA_ACCOUNT, MATCHING_ACCOUNT_TYPE);
+        mPreferenceBundleMap.put(preference, bundle);
+
+        setupMockSettingLoaderAndRefreshUI();
+        mHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    private void setupMockSettingLoaderAndRefreshUI() {
+        when(mExtraSettingsLoader.loadPreferences(any())).thenReturn(mPreferenceBundleMap);
+
+        mAccountDetailsSettingController.setExtraSettingsLoader(mExtraSettingsLoader);
+        mAccountDetailsSettingController.refreshUi();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceControllerTest.java
new file mode 100644
index 0000000..f70d499
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountDetailsWithSyncStatusPreferenceControllerTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SyncAdapterType;
+import android.content.SyncStatusInfo;
+import android.content.SyncStatusObserver;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.ProviderInfo;
+import android.os.UserHandle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link AccountDetailsWithSyncStatusPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class,
+        ShadowApplicationPackageManager.class})
+public class AccountDetailsWithSyncStatusPreferenceControllerTest {
+    private static final int SYNCABLE = 1;
+    private static final String AUTHORITY = "authority";
+    private static final String ACCOUNT_NAME = "Name";
+    private static final String ACCOUNT_TYPE = "com.acct";
+    private final Account mAccount = new Account(ACCOUNT_NAME, ACCOUNT_TYPE);
+    private final UserHandle mUserHandle = new UserHandle(0);
+
+    private Context mContext;
+    private AccountDetailsWithSyncStatusPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        mContext = application;
+        PreferenceControllerTestHelper<AccountDetailsWithSyncStatusPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        AccountDetailsWithSyncStatusPreferenceController.class);
+        mController = helper.getController();
+        mController.setAccount(mAccount);
+        mController.setUserHandle(mUserHandle);
+
+        mPreference = new Preference(application);
+        helper.setPreference(mPreference);
+        helper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void refreshUi_syncIsNotFailing_summaryShouldBeBlank() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo("");
+    }
+
+    @Test
+    public void refreshUi_syncIsFailing_summaryShouldBeSet() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        // Turns on automatic sync for the the sync adapter.
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                mUserHandle.getIdentifier());
+        // Sets the sync adapter's last failure time and message so it appears to have failed
+        // previously.
+        SyncStatusInfo status = new SyncStatusInfo(0);
+        status.lastFailureTime = 10;
+        status.lastFailureMesg = "too-many-deletions";
+        ShadowContentResolver.setSyncStatus(mAccount, AUTHORITY, status);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.sync_is_failing));
+    }
+
+    @Test
+    public void onSyncStatusChanged_summaryShouldUpdated() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        // Make sure the summary is blank first
+        mController.refreshUi();
+        assertThat(mPreference.getSummary()).isEqualTo("");
+
+        // Turns on automatic sync for the the sync adapter.
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                mUserHandle.getIdentifier());
+        // Sets the sync adapter's last failure time and message so it appears to have failed
+        // previously.
+        SyncStatusInfo status = new SyncStatusInfo(0);
+        status.lastFailureTime = 10;
+        status.lastFailureMesg = "too-many-deletions";
+        ShadowContentResolver.setSyncStatus(mAccount, AUTHORITY, status);
+
+        SyncStatusObserver listener = ShadowContentResolver.getStatusChangeListener();
+        listener.onStatusChanged(/* which= */ 0);
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.sync_is_failing));
+    }
+
+    private void setUpVisibleSyncAdapters(String... authorities) {
+        SyncAdapterType[] syncAdapters = new SyncAdapterType[authorities.length];
+        for (int i = 0; i < authorities.length; i++) {
+            String authority = authorities[i];
+            // Adds a sync adapter type that has the right account type and is visible.
+            SyncAdapterType syncAdapterType = new SyncAdapterType(authority,
+                    ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+            syncAdapters[i] = syncAdapterType;
+
+            // Sets that the sync adapter is syncable.
+            ShadowContentResolver.setIsSyncable(mAccount, authority, /* syncable= */ SYNCABLE);
+
+            // Sets provider info with a label for the sync adapter.
+            ProviderInfo info = new ProviderInfo();
+            info.authority = authority;
+            info.name = authority;
+            // Set an application info to avoid an NPE
+            info.applicationInfo = new ApplicationInfo();
+            ProviderInfo[] providers = {info};
+
+            PackageInfo packageInfo = new PackageInfo();
+            packageInfo.packageName = authority;
+            packageInfo.providers = providers;
+            getShadowApplicationManager().addPackage(packageInfo);
+        }
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+    }
+
+    private ShadowApplicationPackageManager getShadowApplicationManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
new file mode 100644
index 0000000..9da11e4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountListPreferenceControllerTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+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.shadow.api.Shadow;
+
+/** Unit tests for {@link AccountListPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowContentResolver.class,
+        ShadowAccountManager.class})
+public class AccountListPreferenceControllerTest {
+    private static final int USER_ID = 0;
+    private static final String USER_NAME = "name";
+    private static final int NOT_THIS_USER_ID = 1;
+    private PreferenceControllerTestHelper<AccountListPreferenceController> mHelper;
+    private AccountManager mAccountManager = AccountManager.get(application);
+    private PreferenceCategory mPreferenceCategory;
+    private AccountListPreferenceController mController;
+    private FragmentController mFragmentController;
+
+    @Mock
+    private CarUserManagerHelper mMockCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        // Set up user info
+        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
+        doReturn(new UserInfo(USER_ID, USER_NAME, 0)).when(
+                mMockCarUserManagerHelper).getCurrentProcessUserInfo();
+        doReturn(true).when(
+                mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+
+        // Add authenticated account types so that they are listed below
+        addAuthenticator(/* type= */ "com.acct1", /* labelRes= */ R.string.account_type1_label);
+        addAuthenticator(/* type= */ "com.acct2", /* labelRes= */ R.string.account_type2_label);
+
+        mPreferenceCategory = new PreferenceCategory(application);
+        mHelper = new PreferenceControllerTestHelper<>(application,
+                AccountListPreferenceController.class, mPreferenceCategory);
+        mHelper.markState(Lifecycle.State.CREATED);
+        mController = mHelper.getController();
+        mFragmentController = mHelper.getMockFragmentController();
+    }
+
+    @After
+    public void reset() {
+        removeAllAccounts();
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void onCreate_preferenceCategoryTitleShouldBeSet() {
+        String expectedTitle = application.getString(R.string.account_list_title, "name");
+        assertThat(mPreferenceCategory.getTitle()).isEqualTo(expectedTitle);
+    }
+
+    @Test
+    public void refreshUi_hasNoAccounts_shouldDisplayNoAccountPref() {
+        mController.refreshUi();
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+        Preference noAccountPref = mPreferenceCategory.getPreference(0);
+
+        assertThat(noAccountPref.getTitle()).isEqualTo(
+                application.getString(R.string.no_accounts_added));
+    }
+
+    @Test
+    public void refreshUi_hasAccounts_shouldDisplayAccounts() {
+        addAccount(/* name= */ "Account1", /* type= */ "com.acct1");
+        addAccount(/* name= */ "Account2", /* type= */ "com.acct2");
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+
+        Preference firstPref = mPreferenceCategory.getPreference(0);
+        assertThat(firstPref.getTitle()).isEqualTo("Account1");
+        assertThat(firstPref.getSummary()).isEqualTo("Type 1");
+
+        Preference secondPref = mPreferenceCategory.getPreference(1);
+        assertThat(secondPref.getTitle()).isEqualTo("Account2");
+        assertThat(secondPref.getSummary()).isEqualTo("Type 2");
+    }
+
+    @Test
+    public void refreshUi_hasUnauthenticatedAccount_shouldNotDisplayAccount() {
+        addAccount(/* name= */ "Account1", /* type= */ "com.acct1");
+        addAccount(/* name= */ "Account2", /* type= */ "com.acct2");
+        // There is not authenticator for account type "com.acct3" so this account should not
+        // appear in the list of displayed accounts.
+        addAccount(/* name= */ "Account3", /* type= */ "com.acct3");
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+
+        Preference firstPref = mPreferenceCategory.getPreference(0);
+        assertThat(firstPref.getTitle()).isEqualTo("Account1");
+        assertThat(firstPref.getSummary()).isEqualTo("Type 1");
+
+        Preference secondPref = mPreferenceCategory.getPreference(1);
+        assertThat(secondPref.getTitle()).isEqualTo("Account2");
+        assertThat(secondPref.getSummary()).isEqualTo("Type 2");
+    }
+
+    @Test
+    public void onAccountsUpdate_isThisUser_shouldForceUpdate() {
+        addAccount(/* name= */ "Account1", /* type= */ "com.acct1");
+        addAccount(/* name= */ "Account2", /* type= */ "com.acct2");
+
+        mController.refreshUi();
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+
+        getShadowAccountManager().removeAllAccounts();
+        addAccount(/* name= */ "Account3", /* type= */ "com.acct1");
+
+        mController.onAccountsUpdate(new UserHandle(USER_ID));
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+        Preference firstPref = mPreferenceCategory.getPreference(0);
+        assertThat(firstPref.getTitle()).isEqualTo("Account3");
+        assertThat(firstPref.getSummary()).isEqualTo("Type 1");
+    }
+
+    @Test
+    public void onAccountsUpdate_updatedUserIsNotCurrentUser_shouldNotForceUpdate() {
+        addAccount(/* name= */ "Account1", /* type= */ "com.acct1");
+        addAccount(/* name= */ "Account2", /* type= */ "com.acct2");
+
+        mController.refreshUi();
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+
+        getShadowAccountManager().removeAllAccounts();
+        addAccount(/* name= */ "Account3", /* type= */ "com.acct1");
+
+        mController.onAccountsUpdate(new UserHandle(NOT_THIS_USER_ID));
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void onUsersUpdate_shouldForceUpdate() {
+        addAccount(/* name= */ "Account1", /* type= */ "com.acct1");
+        addAccount(/* name= */ "Account2", /* type= */ "com.acct2");
+
+        mController.refreshUi();
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(2);
+
+        getShadowAccountManager().removeAllAccounts();
+        addAccount(/* name= */ "Account3", /* type= */ "com.acct1");
+
+        mController.onUsersUpdate();
+
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+        Preference firstPref = mPreferenceCategory.getPreference(0);
+        assertThat(firstPref.getTitle()).isEqualTo("Account3");
+        assertThat(firstPref.getSummary()).isEqualTo("Type 1");
+    }
+
+    @Test
+    public void onAccountPreferenceClicked_shouldLaunchAccountDetailsFragment() {
+        addAccount(/* name= */ "Account1", /* type= */ "com.acct1");
+        mController.refreshUi();
+
+        Preference firstPref = mPreferenceCategory.getPreference(0);
+        firstPref.performClick();
+
+        verify(mFragmentController).launchFragment(any(AccountDetailsFragment.class));
+    }
+
+    private void addAccount(String name, String type) {
+        getShadowAccountManager().addAccount(new Account(name, type));
+    }
+
+    private void removeAllAccounts() {
+        getShadowAccountManager().removeAllAccounts();
+    }
+
+    private void addAuthenticator(String type, int labelRes) {
+        getShadowAccountManager().addAuthenticator(
+                new AuthenticatorDescription(type, "com.android.car.settings",
+                        labelRes, 0, 0, 0, false));
+    }
+
+    private ShadowAccountManager getShadowAccountManager() {
+        return Shadow.extract(mAccountManager);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSettingsFragmentTest.java
new file mode 100644
index 0000000..bf3da2e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSettingsFragmentTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.pm.UserInfo;
+import android.view.View;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+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.annotation.Config;
+
+/**
+ * Tests for AccountSettingsFragment class.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowAccountManager.class,
+        ShadowContentResolver.class})
+public class AccountSettingsFragmentTest {
+    private BaseTestActivity mActivity;
+    private AccountSettingsFragment mFragment;
+
+    @Mock
+    private CarUserManagerHelper mMockCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        // Set up user info
+        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
+        doReturn(new UserInfo()).when(
+                mMockCarUserManagerHelper).getCurrentProcessUserInfo();
+
+        mActivity = Robolectric.setupActivity(BaseTestActivity.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void cannotModifyUsers_addAccountButtonShouldNotBeVisible() {
+        doReturn(false).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        initFragment();
+
+        Button addAccountButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        assertThat(addAccountButton.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void canModifyUsers_addAccountButtonShouldBeVisible() {
+        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        initFragment();
+
+        Button addAccountButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        assertThat(addAccountButton.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void clickAddAccountButton_shouldOpenChooseAccountFragment() {
+        doReturn(true).when(mMockCarUserManagerHelper).canCurrentProcessModifyAccounts();
+        initFragment();
+
+        Button addAccountButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        addAccountButton.performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentById(
+                R.id.fragment_container)).isInstanceOf(ChooseAccountFragment.class);
+    }
+
+    private void initFragment() {
+        mFragment = new AccountSettingsFragment();
+        mActivity.launchFragment(mFragment);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsFragmentTest.java
new file mode 100644
index 0000000..37ce2a4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsFragmentTest.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.content.SyncAdapterType;
+import android.content.SyncInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+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.Robolectric;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for the {@link AccountSyncDetailsFragment}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowContentResolver.class, ShadowAccountManager.class})
+public class AccountSyncDetailsFragmentTest {
+    private static final int USER_ID = 3;
+    private static final String ACCOUNT_TYPE = "com.acct1";
+    private static final String AUTHORITY = "authority";
+    private static final String AUTHORITY_2 = "authority2";
+
+    private final Account mAccount = new Account("Name", ACCOUNT_TYPE);
+    private final UserHandle mUserHandle = new UserHandle(USER_ID);
+
+    private BaseTestActivity mActivity;
+    private AccountSyncDetailsFragment mFragment;
+    @Mock
+    ShadowContentResolver.SyncListener mMockSyncListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mActivity = Robolectric.setupActivity(BaseTestActivity.class);
+        ShadowContentResolver.setSyncListener(mMockSyncListener);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void onInit_doesNotHaveActiveSyncs_actionButtonShouldSaySyncNow() {
+        initFragment();
+
+        Button syncButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        assertThat(syncButton.getText()).isEqualTo(
+                application.getString(R.string.sync_button_sync_now));
+    }
+
+    @Test
+    public void onInit_hasActiveSyncs_actionButtonShouldSayCancelSync() {
+        SyncInfo syncInfo = mock(SyncInfo.class);
+        List<SyncInfo> syncs = new ArrayList<>();
+        syncs.add(syncInfo);
+        ShadowContentResolver.setCurrentSyncs(syncs);
+
+        initFragment();
+
+        Button syncButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        assertThat(syncButton.getText()).isEqualTo(
+                application.getString(R.string.sync_button_sync_cancel));
+    }
+
+    @Test
+    public void onButtonClicked_doesNotHaveActiveSyncs_shouldSyncSyncableAdapters() {
+        setUpSyncAdapters(AUTHORITY, AUTHORITY_2);
+        initFragment();
+
+        Button syncButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        syncButton.performClick();
+
+        ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
+        verify(mMockSyncListener, times(2)).onSyncRequested(eq(mAccount), argument.capture(),
+                eq(USER_ID), any(Bundle.class));
+
+        List<String> values = argument.getAllValues();
+
+        assertThat(values).contains(AUTHORITY);
+        assertThat(values).contains(AUTHORITY_2);
+    }
+
+    @Test
+    public void onButtonClicked_doesNotHaveActiveSyncs_oneTimeSyncIsOff_shouldNotSyncOffAdapters() {
+        setUpSyncAdapters(AUTHORITY, AUTHORITY_2);
+        // Turns off one time sync and automatic sync for the adapter
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ true, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY_2, /* sync= */ false,
+                USER_ID);
+        initFragment();
+
+        Button syncButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        syncButton.performClick();
+
+        ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
+        verify(mMockSyncListener, times(1)).onSyncRequested(eq(mAccount), argument.capture(),
+                eq(USER_ID), any(Bundle.class));
+
+        List<String> values = argument.getAllValues();
+
+        assertThat(values).contains(AUTHORITY);
+        assertThat(values).doesNotContain(AUTHORITY_2);
+    }
+
+    @Test
+    public void onButtonClicked_doesNotHaveActiveSyncs_oneTimeSyncIsOn_shouldSyncOffAdapters() {
+        setUpSyncAdapters(AUTHORITY, AUTHORITY_2);
+        // Turns on one time sync and turns off automatic sync for the adapter
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ false, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY_2, /* sync= */ false,
+                USER_ID);
+        initFragment();
+
+        Button syncButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        syncButton.performClick();
+
+        ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
+        verify(mMockSyncListener, times(2)).onSyncRequested(eq(mAccount), argument.capture(),
+                eq(USER_ID), any(Bundle.class));
+
+        List<String> values = argument.getAllValues();
+
+        assertThat(values).contains(AUTHORITY);
+        assertThat(values).contains(AUTHORITY_2);
+    }
+
+    @Test
+    public void onButtonClicked_doesHaveActiveSyncs_shouldCancelSyncForSyncableAdapters() {
+        // Add active syncs
+        SyncInfo syncInfo = mock(SyncInfo.class);
+        List<SyncInfo> syncs = new ArrayList<>();
+        syncs.add(syncInfo);
+        ShadowContentResolver.setCurrentSyncs(syncs);
+
+        setUpSyncAdapters(AUTHORITY, AUTHORITY_2);
+        initFragment();
+
+        Button syncButton = mFragment.requireActivity().findViewById(R.id.action_button1);
+        syncButton.performClick();
+
+        ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
+        verify(mMockSyncListener, times(2)).onSyncCanceled(eq(mAccount), argument.capture(),
+                eq(USER_ID));
+
+        List<String> values = argument.getAllValues();
+
+        assertThat(values).contains(AUTHORITY);
+        assertThat(values).contains(AUTHORITY_2);
+    }
+
+    private void initFragment() {
+        mFragment = AccountSyncDetailsFragment.newInstance(mAccount, mUserHandle);
+        mActivity.launchFragment(mFragment);
+    }
+
+    private void setUpSyncAdapters(String... authorities) {
+        SyncAdapterType[] syncAdapters = new SyncAdapterType[authorities.length];
+        for (int i = 0; i < authorities.length; i++) {
+            String authority = authorities[i];
+            // Adds a sync adapter type that has the right account type and is visible.
+            SyncAdapterType syncAdapterType = new SyncAdapterType(authority,
+                    ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+            syncAdapters[i] = syncAdapterType;
+
+            // Sets that the sync adapter is syncable.
+            ShadowContentResolver.setIsSyncable(mAccount, authority, /* syncable= */ 1);
+        }
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceControllerTest.java
new file mode 100644
index 0000000..9e0fe78
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncDetailsPreferenceControllerTest.java
@@ -0,0 +1,543 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.SyncAdapterType;
+import android.content.SyncInfo;
+import android.content.SyncStatusInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.ProviderInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Unit test for {@link AccountSyncDetailsPreferenceController}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowContentResolver.class, ShadowApplicationPackageManager.class,
+        ShadowAccountManager.class})
+public class AccountSyncDetailsPreferenceControllerTest {
+    private static final int SYNCABLE = 1;
+    private static final int NOT_SYNCABLE = 0;
+
+    private static final int USER_ID = 3;
+    private static final int NOT_USER_ID = 5;
+
+    private static final String AUTHORITY = "authority";
+    private static final String ACCOUNT_TYPE = "com.acct1";
+    private static final String DIFFERENT_ACCOUNT_TYPE = "com.acct2";
+
+    private final Account mAccount = new Account("acct1", ACCOUNT_TYPE);
+    private final UserHandle mUserHandle = new UserHandle(USER_ID);
+    @Mock
+    ShadowContentResolver.SyncListener mMockSyncListener;
+    private Context mContext;
+    private AccountSyncDetailsPreferenceController mController;
+    private LogicalPreferenceGroup mPreferenceGroup;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = application;
+        ShadowContentResolver.setSyncListener(mMockSyncListener);
+
+        PreferenceControllerTestHelper<AccountSyncDetailsPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        AccountSyncDetailsPreferenceController.class);
+        mController = helper.getController();
+        mController.setAccount(mAccount);
+        mController.setUserHandle(mUserHandle);
+
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        helper.setPreference(mPreferenceGroup);
+
+        helper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void refreshUi_syncAdapterDoesNotHaveSameAccountType_shouldNotBeShown() {
+        // Adds a sync adapter type that is visible but does not have the right account type.
+        SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
+                DIFFERENT_ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_syncAdapterIsNotVisible_shouldNotBeShown() {
+        // Adds a sync adapter type that has the right account type but is not visible.
+        SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
+                ACCOUNT_TYPE, /* userVisible */ false, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_syncAdapterIsNotSyncable_shouldNotBeShown() {
+        // Adds a sync adapter type that has the right account type and is visible.
+        SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
+                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        // Sets that the sync adapter to not syncable.
+        ShadowContentResolver.setIsSyncable(mAccount, AUTHORITY, /* syncable= */ NOT_SYNCABLE);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_syncAdapterDoesNotHaveProviderInfo_shouldNotBeShown() {
+        // Adds a sync adapter type that has the right account type and is visible.
+        SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
+                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        // Sets that the sync adapter to syncable.
+        ShadowContentResolver.setIsSyncable(mAccount, AUTHORITY, /* syncable= */ SYNCABLE);
+
+        // However, no provider info is set for the sync adapter, so it shouldn't be visible.
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_providerInfoDoesNotHaveLabel_shouldNotBeShown() {
+        // Adds a sync adapter type that has the right account type and is visible.
+        SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
+                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        // Sets that the sync adapter to syncable.
+        ShadowContentResolver.setIsSyncable(mAccount, AUTHORITY, /* syncable= */ SYNCABLE);
+        // Sets provider info for the sync adapter but it does not have a label.
+        ProviderInfo info = new ProviderInfo();
+        info.authority = AUTHORITY;
+        info.name = "";
+
+        ProviderInfo[] providers = {info};
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = AUTHORITY;
+        packageInfo.providers = providers;
+        getShadowApplicationManager().addPackage(packageInfo);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_providerLabelShouldBeSet() {
+        // Adds a sync adapter type that has the right account type and is visible.
+        SyncAdapterType syncAdapterType = new SyncAdapterType(AUTHORITY,
+                ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        // Sets that the sync adapter to syncable.
+        ShadowContentResolver.setIsSyncable(mAccount, AUTHORITY, /* syncable= */ SYNCABLE);
+        // Sets provider info for the sync adapter with a label.
+        ProviderInfo info = new ProviderInfo();
+        info.authority = AUTHORITY;
+        info.name = "label";
+
+        ProviderInfo[] providers = {info};
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = AUTHORITY;
+        packageInfo.providers = providers;
+        getShadowApplicationManager().addPackage(packageInfo);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+        assertThat(pref.getTitle()).isEqualTo("label");
+    }
+
+    @Test
+    public void refreshUi_masterSyncOff_syncDisabled_shouldNotBeChecked() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Turns off master sync and automatic sync for the adapter.
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ true, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ false,
+                USER_ID);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+        assertThat(pref.isChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_masterSyncOn_syncDisabled_shouldBeChecked() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Turns on master sync and turns off automatic sync for the adapter.
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ false, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ false,
+                USER_ID);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+        assertThat(pref.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_masterSyncOff_syncEnabled_shouldBeChecked() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Turns off master sync and turns on automatic sync for the adapter.
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ true, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                USER_ID);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+        assertThat(pref.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_syncDisabled_summaryShouldBeSet() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Turns off automatic sync for the the sync adapter.
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ false,
+                mUserHandle.getIdentifier());
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+        assertThat(pref.getSummary()).isEqualTo(mContext.getString(R.string.sync_disabled));
+    }
+
+    @Test
+    public void refreshUi_syncEnabled_activelySyncing_summaryShouldBeSet() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Turns on automatic sync for the the sync adapter.
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                mUserHandle.getIdentifier());
+        // Adds the sync adapter to the list of currently syncing adapters.
+        SyncInfo syncInfo = new SyncInfo(/* authorityId= */ 0, mAccount, AUTHORITY, /* startTime= */
+                0);
+        List<SyncInfo> syncs = new ArrayList<>();
+        syncs.add(syncInfo);
+        ShadowContentResolver.setCurrentSyncs(syncs);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+        assertThat(pref.getSummary()).isEqualTo(mContext.getString(R.string.sync_in_progress));
+    }
+
+    @Test
+    public void refreshUi_syncEnabled_syncHasHappened_summaryShouldBeSet() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Turns on automatic sync for the the sync adapter.
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                mUserHandle.getIdentifier());
+        // Sets the sync adapter's last successful sync time.
+        SyncStatusInfo status = new SyncStatusInfo(0);
+        status.setLastSuccess(0, 83091);
+        ShadowContentResolver.setSyncStatus(mAccount, AUTHORITY, status);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+
+        String expectedTimeString = mController.formatSyncDate(new Date(83091));
+        assertThat(pref.getSummary()).isEqualTo(
+                mContext.getString(R.string.last_synced, expectedTimeString));
+    }
+
+    @Test
+    public void refreshUi_activelySyncing_notInitialSync_shouldHaveActiveSyncIcon() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Adds the sync adapter to the list of currently syncing adapters.
+        SyncInfo syncInfo = new SyncInfo(/* authorityId= */ 0, mAccount, AUTHORITY, /* startTime= */
+                0);
+        List<SyncInfo> syncs = new ArrayList<>();
+        syncs.add(syncInfo);
+        ShadowContentResolver.setCurrentSyncs(syncs);
+        // Sets the sync adapter's initializing state to false (i.e. it's not performing an
+        // initial sync).
+        SyncStatusInfo status = new SyncStatusInfo(0);
+        status.initialize = false;
+        ShadowContentResolver.setSyncStatus(mAccount, AUTHORITY, status);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+
+        assertThat(Shadows.shadowOf(pref.getIcon()).getCreatedFromResId()).isEqualTo(
+                R.drawable.ic_sync_anim);
+    }
+
+    @Test
+    public void refreshUi_syncPending_notInitialSync_shouldHaveActiveSyncIcon() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Sets the sync adapter's initializing state to false (i.e. it's not performing an
+        // initial sync).
+        // Also sets the the sync status to pending
+        SyncStatusInfo status = new SyncStatusInfo(0);
+        status.initialize = false;
+        status.pending = true;
+        ShadowContentResolver.setSyncStatus(mAccount, AUTHORITY, status);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+
+        assertThat(Shadows.shadowOf(pref.getIcon()).getCreatedFromResId()).isEqualTo(
+                R.drawable.ic_sync);
+    }
+
+    @Test
+    public void refreshUi_syncFailed_shouldHaveProblemSyncIcon() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+        // Turns on automatic sync for the the sync adapter.
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                mUserHandle.getIdentifier());
+        // Sets the sync adapter's last failure time and message so it appears to have failed
+        // previously.
+        SyncStatusInfo status = new SyncStatusInfo(0);
+        status.lastFailureTime = 10;
+        status.lastFailureMesg = "too-many-deletions";
+        ShadowContentResolver.setSyncStatus(mAccount, AUTHORITY, status);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+
+        assertThat(Shadows.shadowOf(pref.getIcon()).getCreatedFromResId()).isEqualTo(
+                R.drawable.ic_sync_problem);
+    }
+
+    @Test
+    public void refreshUi_noSyncStatus_shouldHaveNoIcon() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        Preference pref = mPreferenceGroup.getPreference(0);
+
+        assertThat(pref.getIcon()).isNull();
+        assertThat(pref.isIconSpaceReserved()).isTrue();
+    }
+
+    @Test
+    public void onAccountsUpdate_correctUserId_shouldForceUpdatePreferences() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        ShadowContentResolver.reset();
+        mController.onAccountsUpdate(mUserHandle);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onAccountsUpdate_incorrectUserId_shouldNotForceUpdatePreferences() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        ShadowContentResolver.reset();
+        mController.onAccountsUpdate(new UserHandle(NOT_USER_ID));
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onSyncPreferenceClicked_preferenceUnchecked_shouldSetSyncAutomaticallyOff() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        // Turns off one time sync and turns on automatic sync for the adapter so the preference is
+        // checked.
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ true, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                USER_ID);
+
+        mController.refreshUi();
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+        pref.performClick();
+
+        assertThat(ContentResolver.getSyncAutomaticallyAsUser(mAccount, AUTHORITY,
+                USER_ID)).isFalse();
+    }
+
+    @Test
+    public void onSyncPreferenceClicked_preferenceUnchecked_shouldCancelSync() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        // Turns off one time sync and turns on automatic sync for the adapter so the preference is
+        // checked.
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ true, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ true,
+                USER_ID);
+
+        mController.refreshUi();
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+        pref.performClick();
+
+        verify(mMockSyncListener).onSyncCanceled(eq(mAccount), eq(AUTHORITY), eq(USER_ID));
+    }
+
+    @Test
+    public void onSyncPreferenceClicked_preferenceChecked_shouldSetSyncAutomaticallyOn() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        // Turns off one time sync and automatic sync for the adapter so the preference is
+        // unchecked.
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ true, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ false,
+                USER_ID);
+
+        mController.refreshUi();
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+        pref.performClick();
+
+        assertThat(ContentResolver.getSyncAutomaticallyAsUser(mAccount, AUTHORITY,
+                USER_ID)).isTrue();
+    }
+
+    @Test
+    public void onSyncPreferenceClicked_preferenceChecked_masterSyncOff_shouldRequestSync() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        // Turns off master sync and automatic sync for the adapter so the preference is unchecked.
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ false, USER_ID);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, AUTHORITY, /* sync= */ false,
+                USER_ID);
+
+        mController.refreshUi();
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+
+        // Sets master sync off
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ false, USER_ID);
+        pref.performClick();
+
+        verify(mMockSyncListener).onSyncRequested(eq(mAccount), eq(AUTHORITY), eq(USER_ID),
+                any(Bundle.class));
+    }
+
+    @Test
+    public void onSyncPreferenceClicked_oneTimeSyncOn_shouldRequestSync() {
+        setUpVisibleSyncAdapters(AUTHORITY);
+
+        // Turns on one time sync mode
+        ContentResolver.setMasterSyncAutomaticallyAsUser(/* sync= */ false, USER_ID);
+
+        mController.refreshUi();
+        SyncPreference pref = (SyncPreference) mPreferenceGroup.getPreference(0);
+        pref.performClick();
+
+        verify(mMockSyncListener).onSyncRequested(eq(mAccount), eq(AUTHORITY), eq(USER_ID),
+                any(Bundle.class));
+    }
+
+    private void setUpVisibleSyncAdapters(String... authorities) {
+        SyncAdapterType[] syncAdapters = new SyncAdapterType[authorities.length];
+        for (int i = 0; i < authorities.length; i++) {
+            String authority = authorities[i];
+            // Adds a sync adapter type that has the right account type and is visible.
+            SyncAdapterType syncAdapterType = new SyncAdapterType(authority,
+                    ACCOUNT_TYPE, /* userVisible */ true, /* supportsUploading */ true);
+            syncAdapters[i] = syncAdapterType;
+
+            // Sets that the sync adapter is syncable.
+            ShadowContentResolver.setIsSyncable(mAccount, authority, /* syncable= */ SYNCABLE);
+
+            // Sets provider info with a label for the sync adapter.
+            ProviderInfo info = new ProviderInfo();
+            info.authority = authority;
+            info.name = "label";
+            ProviderInfo[] providers = {info};
+
+            PackageInfo packageInfo = new PackageInfo();
+            packageInfo.packageName = authority;
+            packageInfo.providers = providers;
+            getShadowApplicationManager().addPackage(packageInfo);
+        }
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+    }
+
+    private ShadowApplicationPackageManager getShadowApplicationManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountSyncPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncPreferenceControllerTest.java
new file mode 100644
index 0000000..aa940d1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountSyncPreferenceControllerTest.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.Account;
+import android.content.ContentResolver;
+import android.content.SyncAdapterType;
+import android.os.UserHandle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+/**
+ * Unit test for {@link AccountSyncPreferenceController}.
+ *
+ * <p>Largely copied from {@link com.android.settings.accounts.AccountSyncPreferenceControllerTest}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowContentResolver.class})
+public class AccountSyncPreferenceControllerTest {
+    private static final int SYNCABLE = 1;
+    private static final int NOT_SYNCABLE = 0;
+
+    private final Account mAccount = new Account("acct1", "type1");
+    private final int mUserId = 3;
+    private final UserHandle mUserHandle = new UserHandle(mUserId);
+
+    private AccountSyncPreferenceController mController;
+    private FragmentController mMockFragmentController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        PreferenceControllerTestHelper<AccountSyncPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(application,
+                        AccountSyncPreferenceController.class);
+        mController = helper.getController();
+        mMockFragmentController = helper.getMockFragmentController();
+
+        mController.setAccount(mAccount);
+        mController.setUserHandle(mUserHandle);
+
+        mPreference = new Preference(application);
+        helper.setPreference(mPreference);
+        helper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void refreshUi_notSameAccountType_shouldNotCount() {
+        // Adds a sync adapter type that has a visible user, is syncable, and syncs automatically
+        // but does not have the right account type.
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
+                "type5", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount,
+                "authority", /* sync= */ true, /* userId= */ mUserId);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(application.getString(R.string.account_sync_summary_all_off));
+    }
+
+    @Test
+    public void refreshUi_adapterInvisible_shouldNotCount() {
+        // Adds a sync adapter type that has the right account type, is syncable, and syncs
+        // automatically, but doesn't have a visible user
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority",
+                /* accountType */ "type1", /* userVisible */ false, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority", /* sync= */
+                true, /* userId= */ mUserId);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(application.getString(R.string.account_sync_summary_all_off));
+    }
+
+    @Test
+    public void refreshUi_notSyncable_shouldNotCount() {
+        // Adds a sync adapter type that is the right account type and a visible user, but is not
+        // syncable
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        ContentResolver.setIsSyncable(mAccount, "authority", NOT_SYNCABLE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(application.getString(R.string.account_sync_summary_all_off));
+    }
+
+    @Test
+    public void refreshUi_masterAutomaticSyncIgnoredAndAccountSyncDisabled_shouldNotCount() {
+        // Adds a sync adapter type that is the right account type, has a visible user, and is
+        // syncable, but has master automatic sync ignored and account-level sync disabled
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(true, mUserId);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority", /* sync= */
+                false, /* userId= */ mUserId);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(application.getString(R.string.account_sync_summary_all_off));
+    }
+
+    @Test
+    public void refreshUi_masterAutomaticSyncUsed_shouldCount() {
+        // Adds a sync adapter type that is the right account type, has a visible user, is
+        // syncable, and has master-level automatic syncing enabled
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
+        ContentResolver.setMasterSyncAutomaticallyAsUser(false, mUserId);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(application.getString(R.string.account_sync_summary_all_on));
+    }
+
+    @Test
+    public void refreshUi_automaticSyncEnabled_shouldCount() {
+        // Adds a sync adapter type that is the right account type, has a visible user, is
+        // syncable, and has account-level automatic syncing enabled
+        SyncAdapterType syncAdapterType = new SyncAdapterType("authority", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+        ContentResolver.setIsSyncable(mAccount, "authority", SYNCABLE);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority", /* sync= */
+                true, /* userId= */ mUserId);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(application.getString(R.string.account_sync_summary_all_on));
+    }
+
+    @Test
+    public void refreshUi_someEnabled_shouldSetSummary() {
+        SyncAdapterType syncAdapterType1 = new SyncAdapterType("authority1", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType2 = new SyncAdapterType("authority2", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType3 = new SyncAdapterType("authority3", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType syncAdapterType4 = new SyncAdapterType("authority4", /* accountType */
+                "type1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters =
+                {syncAdapterType1, syncAdapterType2, syncAdapterType3, syncAdapterType4};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+
+        // Enable sync for the first three authorities and disable it for the fourth one
+        ContentResolver.setIsSyncable(mAccount, "authority1", SYNCABLE);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority1", /* sync= */
+                true, /* userId= */ mUserId);
+
+        ContentResolver.setIsSyncable(mAccount, "authority2", SYNCABLE);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority2", /* sync= */
+                true, /* userId= */ mUserId);
+
+        ContentResolver.setIsSyncable(mAccount, "authority3", SYNCABLE);
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority3", /* sync= */
+                true, /* userId= */ mUserId);
+
+        ContentResolver.setSyncAutomaticallyAsUser(mAccount, "authority4", /* sync= */
+                false, /* userId= */ mUserId);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(application.getString(R.string.account_sync_summary_some_on, 3, 4));
+    }
+
+    @Test
+    public void handlePreferenceClicked_shouldLaunchAccountSyncDetailsFragment() {
+        mController.refreshUi();
+        mController.handlePreferenceClicked(mPreference);
+
+        verify(mMockFragmentController).launchFragment(any(AccountSyncDetailsFragment.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountsEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..4cc9d71
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/AccountsEntryPreferenceControllerTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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;
+
+/** Unit test for {@link AccountsEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class AccountsEntryPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private AccountsEntryPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+
+        mController = new PreferenceControllerTestHelper<>(RuntimeEnvironment.application,
+                AccountsEntryPreferenceController.class).getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_cannotModifyAccounts_disabledForUser() {
+        when(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_canModifyAccounts_available() {
+        when(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/AccountsItemProviderTest.java b/tests/robotests/src/com/android/car/settings/accounts/AccountsItemProviderTest.java
deleted file mode 100644
index e74a161..0000000
--- a/tests/robotests/src/com/android/car/settings/accounts/AccountsItemProviderTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.accounts;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.car.user.CarUserManagerHelper;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.os.UserHandle;
-import android.os.UserManager;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-
-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 java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(CarSettingsRobolectricTestRunner.class)
-public class AccountsItemProviderTest {
-    @Mock
-    private AccountManagerHelper mAccountManagerHelper;
-    @Mock
-    private UserManager mUserManager;
-    @Mock
-    private AccountManager mAccountManager;
-    @Mock
-    private Context mContext;
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-
-    private AccountsItemProvider mProvider;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
-        when(mContext.getSystemService(Context.ACCOUNT_SERVICE)).thenReturn(mAccountManager);
-        when(mContext.getApplicationContext()).thenReturn(mContext);
-        when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(new UserInfo());
-        when(mAccountManagerHelper.getAccountsForCurrentUser()).thenReturn(new ArrayList<>());
-
-        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
-        mProvider = new AccountsItemProvider(
-                RuntimeEnvironment.application,
-                null,
-                mCarUserManagerHelper,
-                mAccountManagerHelper);
-    }
-
-    @Test
-    public void testAccountsAreSorted() {
-        Account account1 = new Account("g name", "g test type");
-        Account account2 = new Account("b name", "t test type");
-        Account account3 = new Account("a name", "g test type");
-        Account account4 = new Account("a name", "p test type");
-        List<Account> accounts = Arrays.asList(account1, account2, account3, account4);
-
-        when(mAccountManagerHelper.getAccountsForCurrentUser()).thenReturn(accounts);
-        when(mAccountManagerHelper.getLabelForType("g test type")).thenReturn("g test type");
-        when(mAccountManagerHelper.getLabelForType("t test type")).thenReturn("t test type");
-        when(mAccountManagerHelper.getLabelForType("p test type")).thenReturn("p test type");
-
-        assertThat(mProvider.getSortedUserAccounts())
-                .containsExactly(account3, account1, account4, account2).inOrder();
-    }
-
-}
diff --git a/tests/robotests/src/com/android/car/settings/accounts/ChooseAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/accounts/ChooseAccountPreferenceControllerTest.java
new file mode 100644
index 0000000..b706ff7
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/accounts/ChooseAccountPreferenceControllerTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2018 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.car.settings.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Intent;
+import android.content.SyncAdapterType;
+import android.content.pm.UserInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowContentResolver;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/** Unit tests for {@link ChooseAccountPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowContentResolver.class,
+        ShadowAccountManager.class})
+public class ChooseAccountPreferenceControllerTest {
+    private static final int ADD_ACCOUNT_REQUEST_CODE = 1;
+    private static final int USER_ID = 0;
+
+    PreferenceControllerTestHelper<ChooseAccountPreferenceController> mHelper;
+    private PreferenceGroup mPreferenceGroup;
+    private ChooseAccountPreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mMockCarUserManagerHelper;
+
+    private AccountManager mAccountManager = AccountManager.get(application);
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        // Set up user info
+        ShadowCarUserManagerHelper.setMockInstance(mMockCarUserManagerHelper);
+        doReturn(new UserInfo(USER_ID, "name", 0)).when(
+                mMockCarUserManagerHelper).getCurrentProcessUserInfo();
+
+        // Add authenticated account types
+        addAuthenticator(/* type= */ "com.acct1", /* label= */ R.string.account_type1_label);
+        addAuthenticator(/* type= */ "com.acct2", /* label= */ R.string.account_type2_label);
+
+        mPreferenceGroup = new LogicalPreferenceGroup(application);
+        mHelper = new PreferenceControllerTestHelper<>(application,
+                ChooseAccountPreferenceController.class, mPreferenceGroup);
+        // Mark state as started so the AuthenticatorHelper listener is attached.
+        mHelper.markState(Lifecycle.State.STARTED);
+        mController = mHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void refreshUi_authenticatorPreferencesShouldBeSet() {
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        Preference acct1Pref = mPreferenceGroup.getPreference(0);
+        assertThat(acct1Pref.getTitle()).isEqualTo("Type 1");
+
+        Preference acct2Pref = mPreferenceGroup.getPreference(1);
+        assertThat(acct2Pref.getTitle()).isEqualTo("Type 2");
+    }
+
+    @Test
+    public void refreshUi_hasAccountTypeFilter_shouldFilterAccounts() {
+        // Add a filter that should filter out the second account type (com.acct2)
+        Set<String> accountTypesFilter = new HashSet<>();
+        accountTypesFilter.add("com.acct1");
+        mController.setAccountTypesFilter(accountTypesFilter);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        Preference acct1Pref = mPreferenceGroup.getPreference(0);
+        assertThat(acct1Pref.getTitle()).isEqualTo("Type 1");
+    }
+
+    @Test
+    public void refreshUi_hasAccountExclusionFilter_shouldFilterAccounts() {
+        // Add a filter that should filter out the first account type (com.acct1)
+        Set<String> accountExclusionTypesFilter = new HashSet<>();
+        accountExclusionTypesFilter.add("com.acct1");
+        mController.setAccountTypesExclusionFilter(accountExclusionTypesFilter);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        Preference acct1Pref = mPreferenceGroup.getPreference(0);
+        assertThat(acct1Pref.getTitle()).isEqualTo("Type 2");
+    }
+
+    @Test
+    public void refreshUi_doesNotHaveAuthoritiesInFilter_shouldNotBeShown() {
+        // Adds a sync adapter type for the com.acct1 account type that does not have the same
+        // authority as the one passed to someAuthority
+        SyncAdapterType syncAdapterType = new SyncAdapterType("someAuthority",
+                "com.acct1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+
+        mController.setAuthorities(Collections.singletonList("someOtherAuthority"));
+
+        // Force an authenticator refresh so the authorities are refreshed
+        mController.getAuthenticatorHelper().onReceive(application, null);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        Preference acct2Pref = mPreferenceGroup.getPreference(0);
+        assertThat(acct2Pref.getTitle()).isEqualTo("Type 2");
+    }
+
+    @Test
+    public void refreshUi_hasAuthoritiesInFilter_shouldBeShown() {
+        // Adds a sync adapter type for the com.acct1 account type that has the same authority as
+        // the one passed to someAuthority
+        SyncAdapterType syncAdapterType = new SyncAdapterType("someAuthority",
+                "com.acct1", /* userVisible */ true, /* supportsUploading */ true);
+        SyncAdapterType[] syncAdapters = {syncAdapterType};
+        ShadowContentResolver.setSyncAdapterTypes(syncAdapters);
+
+        mController.setAuthorities(Collections.singletonList("someAuthority"));
+
+        // Force an authenticator refresh so the authorities are refreshed
+        mController.getAuthenticatorHelper().onReceive(application, null);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        Preference acct1Pref = mPreferenceGroup.getPreference(0);
+        assertThat(acct1Pref.getTitle()).isEqualTo("Type 1");
+
+        Preference acct2Pref = mPreferenceGroup.getPreference(1);
+        assertThat(acct2Pref.getTitle()).isEqualTo("Type 2");
+    }
+
+    @Test
+    public void onAccountsUpdate_currentUserUpdated_shouldForceUpdate() {
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        addAuthenticator(/* type= */ "com.acct3", /* label= */ R.string.account_type3_label);
+
+        // Trigger an account update via the authenticator helper so that the state matches what
+        // it would be during actual execution.
+        mController.getAuthenticatorHelper().onReceive(application, null);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+        Preference acct3Pref = mPreferenceGroup.getPreference(2);
+        assertThat(acct3Pref.getTitle()).isEqualTo("Type 3");
+    }
+
+    @Test
+    public void onPreferenceClick_shouldStartActivity() {
+        Preference acct1Pref = mPreferenceGroup.getPreference(0);
+        acct1Pref.performClick();
+
+        ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+
+        verify(mHelper.getMockFragmentController()).startActivityForResult(captor.capture(),
+                anyInt(), any(ActivityResultCallback.class));
+
+        Intent intent = captor.getValue();
+        assertThat(intent.getComponent().getClassName()).isEqualTo(
+                AddAccountActivity.class.getName());
+        assertThat(intent.getStringExtra(AddAccountActivity.EXTRA_SELECTED_ACCOUNT)).isEqualTo(
+                "com.acct1");
+    }
+
+    @Test
+    public void onAccountAdded_shouldGoBack() {
+        Preference acct1Pref = mPreferenceGroup.getPreference(0);
+        acct1Pref.performClick();
+
+        ArgumentCaptor<ActivityResultCallback> captor = ArgumentCaptor.forClass(
+                ActivityResultCallback.class);
+
+        verify(mHelper.getMockFragmentController()).startActivityForResult(any(Intent.class),
+                anyInt(), captor.capture());
+
+        ActivityResultCallback callback = captor.getValue();
+        callback.processActivityResult(ADD_ACCOUNT_REQUEST_CODE, /* resultCode= */ 0, /* data= */
+                null);
+
+        verify(mHelper.getMockFragmentController()).goBack();
+    }
+
+    private void addAuthenticator(String type, int labelRes) {
+        getShadowAccountManager().addAuthenticator(
+                new AuthenticatorDescription(type, "com.android.car.settings",
+                        labelRes, 0, 0, 0, false));
+    }
+
+    private ShadowAccountManager getShadowAccountManager() {
+        return Shadow.extract(mAccountManager);
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..031236c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/AppPermissionsEntryPreferenceControllerTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowPackageManager;
+
+/** Unit test for {@link AppPermissionsEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AppPermissionsEntryPreferenceControllerTest {
+
+    private Context mContext;
+    private Preference mPreference;
+    private AppPermissionsEntryPreferenceController mController;
+
+    private PermissionInfo mPermLocation;
+    private PermissionInfo mPermMic;
+    private PermissionInfo mPermCamera;
+    private PermissionInfo mPermSms;
+    private PermissionInfo mPermContacts;
+    private PermissionInfo mPermPhone;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        PreferenceControllerTestHelper<AppPermissionsEntryPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        AppPermissionsEntryPreferenceController.class, mPreference);
+        mController = controllerHelper.getController();
+        controllerHelper.markState(Lifecycle.State.STARTED);
+
+        mPermLocation = new PermissionInfo();
+        mPermLocation.name = "Permission1";
+        mPermLocation.group = "android.permission-group.LOCATION";
+        PermissionGroupInfo groupLocation = new PermissionGroupInfo();
+        groupLocation.name = mPermLocation.group;
+        groupLocation.nonLocalizedLabel = "Location";
+        getShadowPackageManager().addPermissionGroupInfo(groupLocation);
+
+        mPermMic = new PermissionInfo();
+        mPermMic.name = "Permission2";
+        mPermMic.group = "android.permission-group.MICROPHONE";
+        PermissionGroupInfo groupMic = new PermissionGroupInfo();
+        groupMic.name = mPermMic.group;
+        groupMic.nonLocalizedLabel = "Microphone";
+        getShadowPackageManager().addPermissionGroupInfo(groupMic);
+
+        mPermCamera = new PermissionInfo();
+        mPermCamera.name = "Permission3";
+        mPermCamera.group = "android.permission-group.CAMERA";
+        PermissionGroupInfo groupCamera = new PermissionGroupInfo();
+        groupCamera.name = mPermCamera.group;
+        groupCamera.nonLocalizedLabel = "Camera";
+        getShadowPackageManager().addPermissionGroupInfo(groupCamera);
+
+        mPermSms = new PermissionInfo();
+        mPermSms.name = "Permission4";
+        mPermSms.group = "android.permission-group.SMS";
+        PermissionGroupInfo groupSms = new PermissionGroupInfo();
+        groupSms.name = mPermSms.group;
+        groupSms.nonLocalizedLabel = "Sms";
+        getShadowPackageManager().addPermissionGroupInfo(groupSms);
+
+        mPermContacts = new PermissionInfo();
+        mPermContacts.name = "Permission5";
+        mPermContacts.group = "android.permission-group.CONTACTS";
+        PermissionGroupInfo groupContacts = new PermissionGroupInfo();
+        groupContacts.name = mPermContacts.group;
+        groupContacts.nonLocalizedLabel = "Contacts";
+        getShadowPackageManager().addPermissionGroupInfo(groupContacts);
+
+        mPermPhone = new PermissionInfo();
+        mPermPhone.name = "Permission6";
+        mPermPhone.group = "android.permission-group.PHONE";
+        PermissionGroupInfo groupPhone = new PermissionGroupInfo();
+        groupPhone.name = mPermPhone.group;
+        groupPhone.nonLocalizedLabel = "Phone";
+
+        getShadowPackageManager().addPermissionGroupInfo(groupPhone);
+    }
+
+
+    @Test
+    public void refreshUi_noGrantedPermissions_setsNullSummary() {
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void refreshUi_grantedPermissions_aboveMax_setsSummary_maxCountDefinedByController() {
+        setupPackageWithPermissions(mPermLocation, mPermMic, mPermCamera, mPermSms);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                "Apps using location, microphone, and camera");
+    }
+
+    @Test
+    public void refreshUi_grantedPermissions_setsSummary_inOrderDefinedByController() {
+        setupPackageWithPermissions(mPermPhone, mPermMic, mPermContacts, mPermSms);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo("Apps using microphone, sms, and contacts");
+    }
+
+    @Test
+    public void refreshUi_grantedPermissions_onlyTwo_setsSummary() {
+        setupPackageWithPermissions(mPermLocation, mPermCamera);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo("Apps using location and camera");
+    }
+
+    @Test
+    public void refreshUi_grantedPermissions_onlyOne_setsSummary() {
+        setupPackageWithPermissions(mPermCamera);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo("Apps using camera");
+    }
+
+    private void setupPackageWithPermissions(PermissionInfo... permissions) {
+        PackageInfo info = new PackageInfo();
+        info.packageName = "fake.package.name";
+        info.permissions = permissions;
+        getShadowPackageManager().addPackage(info);
+    }
+
+    private ShadowPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
new file mode 100644
index 0000000..b6647af
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
@@ -0,0 +1,637 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.Signature;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowActivityManager;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowDevicePolicyManager;
+import com.android.car.settings.testutils.ShadowIconDrawableFactory;
+import com.android.car.settings.testutils.ShadowPermissionControllerManager;
+import com.android.car.settings.testutils.ShadowSmsApplication;
+import com.android.car.settings.testutils.ShadowUserManager;
+import com.android.car.settings.testutils.ShadowUtils;
+import com.android.settingslib.Utils;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.After;
+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.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+/** Unit test for {@link ApplicationDetailsFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {
+        ShadowActivityManager.class,
+        ShadowApplicationPackageManager.class,
+        ShadowCarUserManagerHelper.class,
+        ShadowDevicePolicyManager.class,
+        ShadowIconDrawableFactory.class,
+        ShadowPermissionControllerManager.class,
+        ShadowSmsApplication.class,
+        ShadowUserManager.class,
+        ShadowUtils.class})
+public class ApplicationDetailsFragmentTest {
+
+    private static final String PACKAGE_NAME = "com.android.car.settings.test";
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    private Context mContext;
+    private TestActivity mActivity;
+    private ActivityController<TestActivity> mController;
+    private ApplicationDetailsFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        int userId = UserHandle.myUserId();
+        UserInfo userInfo = new UserInfo();
+        userInfo.id = userId;
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(userId);
+        when(mCarUserManagerHelper.getAllUsers()).thenReturn(Collections.singletonList(userInfo));
+        UserManager mockUserManager = mock(UserManager.class);
+        when(mockUserManager.getUserInfo(userId)).thenReturn(userInfo);
+        ShadowUserManager.setInstance(mockUserManager);
+
+        mContext = RuntimeEnvironment.application;
+        getShadowUserManager().addProfile(userId, userId, "profileName", /* profileFlags= */ 0);
+
+        mActivity = new TestActivity();
+        mController = ActivityController.of(mActivity);
+        mController.create();
+
+        mFragment = ApplicationDetailsFragment.getInstance(PACKAGE_NAME);
+    }
+
+    @After
+    public void tearDown() {
+        // Prevent caching from interfering across tests.
+        ReflectionHelpers.setStaticField(ApplicationsState.class, "sInstance", null);
+        ReflectionHelpers.setStaticField(Utils.class, "sSystemSignature", null);
+        ShadowApplicationPackageManager.reset();
+        ShadowCarUserManagerHelper.reset();
+        ShadowDevicePolicyManager.reset();
+        ShadowSmsApplication.reset();
+        ShadowUserManager.reset();
+        ShadowUtils.reset();
+    }
+
+    @Test
+    public void onStart_packageNotExplicitlyStopped_enablesForceStopButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findForceStopButton(mActivity).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onStart_packageHasActiveAdmins_disablesForceStopButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        getShadowDevicePolicyManager().setPackageHasActiveAdmins(
+                PACKAGE_NAME, /* hasActiveAdmins= */ true);
+        mController.start();
+
+        assertThat(findForceStopButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_appsControlUserRestriction_disablesForceStopButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_APPS_CONTROL)).thenReturn(true);
+        mController.start();
+
+        assertThat(findForceStopButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_packageExplicitlyStopped_queriesPackageRestart() {
+        int uid = 123;
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.uid = uid;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED;
+
+        mController.start();
+
+        Intent broadcast = mActivity.getMostRecentOrderedBroadcastIntent();
+        assertThat(broadcast).isNotNull();
+        assertThat(broadcast.getAction()).isEqualTo(Intent.ACTION_QUERY_PACKAGE_RESTART);
+        assertThat(broadcast.getStringArrayExtra(Intent.EXTRA_PACKAGES)).isEqualTo(
+                new String[]{PACKAGE_NAME});
+        assertThat(broadcast.getIntExtra(Intent.EXTRA_UID, 0)).isEqualTo(uid);
+    }
+
+    @Test
+    public void onStart_packageExplicitlyStopped_success_enablesForceStopButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED;
+        mController.start();
+        BroadcastReceiver receiver = mActivity.getMostRecentOrderedBroadcastResultReceiver();
+        receiver.setPendingResult(
+                new BroadcastReceiver.PendingResult(Activity.RESULT_OK,
+                        "resultData",
+                        /* resultExtras= */ null,
+                        BroadcastReceiver.PendingResult.TYPE_UNREGISTERED,
+                        /* ordered= */ true,
+                        /* sticky= */ false,
+                        /* token= */ null,
+                        UserHandle.myUserId(),
+                        /* flags= */ 0));
+        receiver.onReceive(mContext, mActivity.getMostRecentOrderedBroadcastIntent());
+
+        assertThat(findForceStopButton(mActivity).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onStart_packageExplicitlyStopped_failure_disablesForceStopButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED;
+        mController.start();
+        BroadcastReceiver receiver = mActivity.getMostRecentOrderedBroadcastResultReceiver();
+        receiver.setPendingResult(
+                new BroadcastReceiver.PendingResult(Activity.RESULT_CANCELED,
+                        "resultData",
+                        /* resultExtras= */ null,
+                        BroadcastReceiver.PendingResult.TYPE_UNREGISTERED,
+                        /* ordered= */ true,
+                        /* sticky= */ false,
+                        /* token= */ null,
+                        UserHandle.myUserId(),
+                        /* flags= */ 0));
+        receiver.onReceive(mContext, mActivity.getMostRecentOrderedBroadcastIntent());
+
+        assertThat(findForceStopButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_bundledApp_showsDisableButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findDisableButton(mActivity).getText()).isEqualTo(
+                mContext.getString(R.string.disable_text));
+    }
+
+    @Test
+    public void onStart_bundledApp_notEnabled_showsEnableButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        packageInfo.applicationInfo.enabled = false;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findDisableButton(mActivity).getText()).isEqualTo(
+                mContext.getString(R.string.enable_text));
+    }
+
+    @Test
+    public void onStart_bundledApp_enabled_disableUntilUsed_showsEnableButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        packageInfo.applicationInfo.enabledSetting =
+                PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findDisableButton(mActivity).getText()).isEqualTo(
+                mContext.getString(R.string.enable_text));
+    }
+
+    @Test
+    public void onStart_bundledApp_homePackage_disablesDisableButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        getShadowPackageManager().addPackage(packageInfo);
+
+        ResolveInfo homeActivity = new ResolveInfo();
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = PACKAGE_NAME;
+        homeActivity.activityInfo = activityInfo;
+
+        getShadowPackageManager().setHomeActivities(Collections.singletonList(homeActivity));
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findDisableButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_bundledApp_systemPackage_disablesDisableButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        Signature[] signatures = new Signature[]{new Signature(PACKAGE_NAME.getBytes())};
+        packageInfo.signatures = signatures;
+        getShadowPackageManager().addPackage(packageInfo);
+
+        PackageInfo systemPackage = createPackageInfoWithApplicationInfo("android");
+        systemPackage.signatures = signatures;
+        getShadowPackageManager().addPackage(systemPackage);
+
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findDisableButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_bundledApp_enabledApp_keepEnabledPackage_disablesDisableButton() {
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+
+        ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(PACKAGE_NAME, "cls"));
+        mController.start();
+
+        assertThat(findDisableButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_appNotBundled_showsUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).getText()).isEqualTo(
+                mContext.getString(R.string.uninstall_text));
+    }
+
+    @Test
+    public void onStart_packageHasActiveAdmins_disablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        getShadowDevicePolicyManager().setPackageHasActiveAdmins(
+                PACKAGE_NAME, /* hasActiveAdmins= */ true);
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_deviceProvisioningPackage_disablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        ShadowUtils.setDeviceProvisioningPackage(PACKAGE_NAME);
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_uninstallQueued_disablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        getShadowDevicePolicyManager().setIsUninstallInQueue(true);
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_noDefaultHome_onlyHomeApp_disablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+
+        ResolveInfo homeActivity = new ResolveInfo();
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = PACKAGE_NAME;
+        homeActivity.activityInfo = activityInfo;
+
+        getShadowPackageManager().setHomeActivities(Collections.singletonList(homeActivity));
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_noDefaultHome_multipleHomeApps_enablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+
+        ResolveInfo homeActivity = new ResolveInfo();
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = PACKAGE_NAME;
+        homeActivity.activityInfo = activityInfo;
+
+        ResolveInfo altHomeActivity = new ResolveInfo();
+        ActivityInfo altActivityInfo = new ActivityInfo();
+        altActivityInfo.packageName = PACKAGE_NAME + ".Someotherhome";
+        altHomeActivity.activityInfo = altActivityInfo;
+
+        getShadowPackageManager().setHomeActivities(Arrays.asList(homeActivity, altHomeActivity));
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onStart_defaultHomeApp_disablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+
+        ResolveInfo homeActivity = new ResolveInfo();
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = PACKAGE_NAME;
+        homeActivity.activityInfo = activityInfo;
+
+        ResolveInfo altHomeActivity = new ResolveInfo();
+        ActivityInfo altActivityInfo = new ActivityInfo();
+        altActivityInfo.packageName = PACKAGE_NAME + ".Someotherhome";
+        altHomeActivity.activityInfo = altActivityInfo;
+
+        getShadowPackageManager().setHomeActivities(Arrays.asList(homeActivity, altHomeActivity));
+        getShadowPackageManager().setDefaultHomeActivity(new ComponentName(PACKAGE_NAME, "cls"));
+        mActivity.launchFragment(mFragment);
+
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_appsControlUserRestriction_disablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_APPS_CONTROL)).thenReturn(true);
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onStart_uninstallAppsRestriction_disablesUninstallButton() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_UNINSTALL_APPS)).thenReturn(true);
+        mController.start();
+
+        assertThat(findUninstallButton(mActivity).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void forceStopClicked_showsDialog() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+        mController.start();
+
+        findForceStopButton(mActivity).performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentByTag(
+                ApplicationDetailsFragment.FORCE_STOP_CONFIRM_DIALOG_TAG)).isInstanceOf(
+                ConfirmationDialogFragment.class);
+    }
+
+    @Test
+    public void forceStopDialogConfirmed_forceStopsPackage() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+        mController.start();
+        findForceStopButton(mActivity).performClick();
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+
+        dialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+
+        assertThat(getShadowActivityManager().getMostRecentlyStoppedPackage()).isEqualTo(
+                PACKAGE_NAME);
+    }
+
+    @Test
+    public void disableClicked_showsDialog() {
+        // Use bundled app to get disable button.
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+        mController.start();
+
+        findDisableButton(mActivity).performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentByTag(
+                ApplicationDetailsFragment.DISABLE_CONFIRM_DIALOG_TAG)).isInstanceOf(
+                ConfirmationDialogFragment.class);
+    }
+
+    @Test
+    public void disableDialogConfirmed_disablesPackage() {
+        // Use bundled app to get disable button.
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+        mController.start();
+        findDisableButton(mActivity).performClick();
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+
+        dialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+
+        assertThat(
+                mContext.getPackageManager().getApplicationEnabledSetting(PACKAGE_NAME)).isEqualTo(
+                PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
+    }
+
+    @Test
+    public void enableClicked_enablesPackage() {
+        // Use disabled bundled app to get enable button.
+        PackageInfo packageInfo = createPackageInfoWithApplicationInfo(PACKAGE_NAME);
+        packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        packageInfo.applicationInfo.enabled = false;
+        getShadowPackageManager().addPackage(packageInfo);
+        mActivity.launchFragment(mFragment);
+        mController.start();
+
+        findDisableButton(mActivity).performClick();
+
+        assertThat(
+                mContext.getPackageManager().getApplicationEnabledSetting(PACKAGE_NAME)).isEqualTo(
+                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
+    }
+
+    @Test
+    public void uninstallClicked_startsUninstallActivity() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+        mController.start();
+
+        findUninstallButton(mActivity).performClick();
+
+        Intent intent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_UNINSTALL_PACKAGE);
+        assertThat(intent.getBooleanExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, false)).isTrue();
+        assertThat(intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)).isTrue();
+        assertThat(intent.getData().toString()).isEqualTo("package:" + PACKAGE_NAME);
+    }
+
+    @Test
+    public void processActivityResult_uninstall_resultOk_goesBack() {
+        getShadowPackageManager().addPackage(createPackageInfoWithApplicationInfo(PACKAGE_NAME));
+        mActivity.launchFragment(mFragment);
+        mController.start();
+        findUninstallButton(mActivity).performClick();
+
+        mFragment.processActivityResult(ApplicationDetailsFragment.UNINSTALL_REQUEST_CODE,
+                Activity.RESULT_OK, /* data= */ null);
+
+        assertThat(mActivity.getOnBackPressedFlag()).isTrue();
+    }
+
+    private Button findForceStopButton(Activity activity) {
+        return activity.findViewById(R.id.action_button2);
+    }
+
+    private Button findDisableButton(Activity activity) {
+        // Same button is used with a different handler.  This method is purely for readability.
+        return findUninstallButton(activity);
+    }
+
+    private Button findUninstallButton(Activity activity) {
+        return activity.findViewById(R.id.action_button1);
+    }
+
+    private PackageInfo createPackageInfoWithApplicationInfo(String packageName) {
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = packageName;
+        packageInfo.applicationInfo = createApplicationInfo(packageName);
+        return packageInfo;
+    }
+
+    private ApplicationInfo createApplicationInfo(String packageName) {
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = packageName;
+        applicationInfo.sourceDir =
+                RuntimeEnvironment.getTempDirectory()
+                        .createIfNotExists(applicationInfo.packageName + "-sourceDir")
+                        .toAbsolutePath()
+                        .toString();
+        return applicationInfo;
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+
+    private ShadowDevicePolicyManager getShadowDevicePolicyManager() {
+        return Shadow.extract(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE));
+    }
+
+    private ShadowActivityManager getShadowActivityManager() {
+        return Shadow.extract(mContext.getSystemService(Context.ACTIVITY_SERVICE));
+    }
+
+    /** We extend the test activity here to add functionality that isn't useful elsewhere. */
+    private static class TestActivity extends BaseTestActivity {
+
+        private Intent mOrderedBroadcastIntent;
+        private BroadcastReceiver mOrderedBroadcastResultReceiver;
+
+        @Override
+        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
+                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
+                int initialCode, String initialData, Bundle initialExtras) {
+            mOrderedBroadcastIntent = intent;
+            mOrderedBroadcastResultReceiver = resultReceiver;
+        }
+
+        Intent getMostRecentOrderedBroadcastIntent() {
+            return mOrderedBroadcastIntent;
+        }
+
+        BroadcastReceiver getMostRecentOrderedBroadcastResultReceiver() {
+            return mOrderedBroadcastResultReceiver;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationListItemManagerTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationListItemManagerTest.java
new file mode 100644
index 0000000..78702cd
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationListItemManagerTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.storage.VolumeInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+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.RuntimeEnvironment;
+
+import java.util.ArrayList;
+
+/** Unit test for {@link ApplicationListItemManager}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ApplicationListItemManagerTest {
+    private static final String LABEL = "label";
+    private static final String SIZE_STR = "12.34 MB";
+    private static final String SOURCE = "source";
+    private static final int UID = 12;
+
+    private Context mContext;
+    private ApplicationListItemManager mApplicationListItemManager;
+
+    @Mock
+    private VolumeInfo mVolumeInfo;
+    @Mock
+    private Lifecycle mLifecycle;
+    @Mock
+    private ApplicationsState mAppState;
+    @Mock
+    ApplicationsState.AppFilter mAppFilter;
+    @Mock
+    ApplicationListItemManager.AppListItemListener mAppListItemListener1;
+    @Mock
+    ApplicationListItemManager.AppListItemListener mAppListItemListener2;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mApplicationListItemManager = new ApplicationListItemManager(mVolumeInfo, mLifecycle,
+                mAppState);
+    }
+
+    @Test
+    public void startLoading_shouldStartNewSession() {
+        mApplicationListItemManager.startLoading(mAppFilter, /* param= */ null);
+
+        verify(mAppState).newSession(any(), eq(mLifecycle));
+    }
+
+    @Test
+    public void onRebuildComplete_shouldNotifyRegisteredListener() {
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        apps.add(appEntry);
+
+        mApplicationListItemManager.registerListener(mAppListItemListener1);
+        mApplicationListItemManager.registerListener(mAppListItemListener2);
+        mApplicationListItemManager.onRebuildComplete(apps);
+
+        verify(mAppListItemListener1).onDataLoaded(apps);
+        verify(mAppListItemListener2).onDataLoaded(apps);
+    }
+
+    @Test
+    public void onRebuildComplete_unRegisterOneListener_shouldNotifyRegisteredListener() {
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        apps.add(appEntry);
+
+        mApplicationListItemManager.registerListener(mAppListItemListener1);
+        mApplicationListItemManager.registerListener(mAppListItemListener2);
+        mApplicationListItemManager.unregisterlistener(mAppListItemListener2);
+        mApplicationListItemManager.onRebuildComplete(apps);
+
+        verify(mAppListItemListener1).onDataLoaded(apps);
+        verify(mAppListItemListener2, times(0)).onDataLoaded(apps);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationPreferenceControllerTest.java
new file mode 100644
index 0000000..ecfd20a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationPreferenceControllerTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.testng.Assert.assertThrows;
+
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+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.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ApplicationPreferenceControllerTest {
+    private static final String PACKAGE_NAME = "Test Package Name";
+
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<ApplicationPreferenceController>
+            mPreferenceControllerHelper;
+    private ApplicationPreferenceController mController;
+    @Mock
+    private ApplicationsState mMockAppState;
+    @Mock
+    private ApplicationsState.AppEntry mMockAppEntry;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = spy(RuntimeEnvironment.application);
+        mMockAppEntry.label = PACKAGE_NAME;
+
+        mPreference = new Preference(context);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                ApplicationPreferenceController.class);
+        mController = mPreferenceControllerHelper.getController();
+    }
+
+    @Test
+    public void testCheckInitialized_noAppState_throwException() {
+        mController.setAppEntry(mMockAppEntry);
+        assertThrows(IllegalStateException.class,
+                () -> mPreferenceControllerHelper.setPreference(mPreference));
+    }
+
+    @Test
+    public void testCheckInitialized_noAppEntry_throwException() {
+        mController.setAppState(mMockAppState);
+        assertThrows(IllegalStateException.class,
+                () -> mPreferenceControllerHelper.setPreference(mPreference));
+    }
+
+    @Test
+    public void testRefreshUi_hasResolveInfo_setTitle() {
+        mController.setAppEntry(mMockAppEntry);
+        mController.setAppState(mMockAppState);
+        mPreferenceControllerHelper.setPreference(mPreference);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+        assertThat(mPreference.getTitle()).isEqualTo(PACKAGE_NAME);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceControllerTest.java
new file mode 100644
index 0000000..ed26ea1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationsSettingsPreferenceControllerTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+
+/** Unit test for {@link ApplicationsSettingsPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ApplicationsSettingsPreferenceControllerTest {
+
+    private static final String SOURCE = "source";
+    private static final int UID = 12;
+    private static final String LABEL = "label";
+    private static final String SIZE_STR = "12.34 MB";
+
+    private Context mContext;
+    private LogicalPreferenceGroup mLogicalPreferenceGroup;
+    private PreferenceControllerTestHelper<ApplicationsSettingsPreferenceController>
+            mPreferenceControllerHelper;
+    private ApplicationsSettingsPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                ApplicationsSettingsPreferenceController.class, mLogicalPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void defaultInitialize_hasNoPreference() {
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onDataLoaded_addPreference_hasOnePreference() {
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        apps.add(appEntry);
+
+        mController.onDataLoaded(apps);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getTitle()).isEqualTo(LABEL);
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getSummary()).isEqualTo(SIZE_STR);
+    }
+
+    @Test
+    public void preferenceClick_launchesDetailFragment() {
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        apps.add(appEntry);
+
+        mController.onDataLoaded(apps);
+
+        Preference preference = mLogicalPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        verify(mPreferenceControllerHelper.getMockFragmentController()).launchFragment(
+                any(ApplicationDetailsFragment.class));
+    }
+
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationsUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationsUtilsTest.java
new file mode 100644
index 0000000..a5b5b51
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationsUtilsTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.pm.UserInfo;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowDefaultDialerManager;
+import com.android.car.settings.testutils.ShadowSmsApplication;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.Collections;
+
+/** Unit test for {@link ApplicationsUtils}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowDefaultDialerManager.class, ShadowSmsApplication.class})
+public class ApplicationsUtilsTest {
+
+    private static final String PACKAGE_NAME = "com.android.car.settings.test";
+
+    @After
+    public void tearDown() {
+        ShadowDefaultDialerManager.reset();
+        ShadowSmsApplication.reset();
+    }
+
+    @Test
+    public void isKeepEnabledPackage_defaultDialerApplication_returnsTrue() {
+        ShadowDefaultDialerManager.setDefaultDialerApplication(PACKAGE_NAME);
+
+        assertThat(ApplicationsUtils.isKeepEnabledPackage(RuntimeEnvironment.application,
+                PACKAGE_NAME)).isTrue();
+    }
+
+    @Test
+    public void isKeepEnabledPackage_defaultSmsApplication_returnsTrue() {
+        ShadowSmsApplication.setDefaultSmsApplication(new ComponentName(PACKAGE_NAME, "cls"));
+
+        assertThat(ApplicationsUtils.isKeepEnabledPackage(RuntimeEnvironment.application,
+                PACKAGE_NAME)).isTrue();
+    }
+
+    @Test
+    public void isKeepEnabledPackage_returnsFalse() {
+        assertThat(ApplicationsUtils.isKeepEnabledPackage(RuntimeEnvironment.application,
+                PACKAGE_NAME)).isFalse();
+    }
+
+    @Test
+    public void isProfileOrDeviceOwner_profileOwner_returnsTrue() {
+        UserInfo userInfo = new UserInfo();
+        userInfo.id = 123;
+        DevicePolicyManager dpm = mock(DevicePolicyManager.class);
+        CarUserManagerHelper um = mock(CarUserManagerHelper.class);
+        when(um.getAllUsers()).thenReturn(Collections.singletonList(userInfo));
+        when(dpm.getProfileOwnerAsUser(userInfo.id)).thenReturn(
+                new ComponentName(PACKAGE_NAME, "cls"));
+
+        assertThat(ApplicationsUtils.isProfileOrDeviceOwner(PACKAGE_NAME, dpm, um)).isTrue();
+    }
+
+    @Test
+    public void isProfileOrDeviceOwner_deviceOwner_returnsTrue() {
+        DevicePolicyManager dpm = mock(DevicePolicyManager.class);
+        when(dpm.isDeviceOwnerAppOnAnyUser(PACKAGE_NAME)).thenReturn(true);
+
+        assertThat(ApplicationsUtils.isProfileOrDeviceOwner(PACKAGE_NAME, dpm,
+                mock(CarUserManagerHelper.class))).isTrue();
+    }
+
+    @Test
+    public void isProfileOrDeviceOwner_returnsFalse() {
+        assertThat(ApplicationsUtils.isProfileOrDeviceOwner(PACKAGE_NAME,
+                mock(DevicePolicyManager.class), mock(CarUserManagerHelper.class))).isFalse();
+    }
+
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/NotificationsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/NotificationsPreferenceControllerTest.java
new file mode 100644
index 0000000..90630ea
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/NotificationsPreferenceControllerTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.INotificationManager;
+import android.app.NotificationChannel;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class NotificationsPreferenceControllerTest {
+    private static final String PKG_NAME = "package.name";
+    private static final int UID = 1001010;
+    private Context mContext;
+    private NotificationsPreferenceController mController;
+    private PreferenceControllerTestHelper<NotificationsPreferenceController>
+            mPreferenceControllerHelper;
+    private TwoStatePreference mTwoStatePreference;
+    @Mock
+    private INotificationManager mMockManager;
+    @Mock
+    private NotificationChannel mMockChannel;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        mTwoStatePreference = new SwitchPreference(mContext);
+
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                NotificationsPreferenceController.class, mTwoStatePreference);
+        mController = mPreferenceControllerHelper.getController();
+        mController.mNotificationManager = mMockManager;
+
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = PKG_NAME;
+
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = PKG_NAME;
+        packageInfo.applicationInfo = applicationInfo;
+        packageInfo.applicationInfo.uid = UID;
+        mController.setPackageInfo(packageInfo);
+    }
+
+    @Test
+    public void onCreate_notificationEnabled_isChecked() throws Exception {
+        when(mMockManager.areNotificationsEnabledForPackage(PKG_NAME, UID)).thenReturn(true);
+
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mTwoStatePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onCreate_notificationDisabled_isNotChecked() throws Exception {
+        when(mMockManager.areNotificationsEnabledForPackage(PKG_NAME, UID)).thenReturn(false);
+
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void callChangeListener_setEnable_enablingNotification() throws Exception {
+        when(mMockManager.onlyHasDefaultChannel(PKG_NAME, UID)).thenReturn(false);
+
+        mTwoStatePreference.callChangeListener(true);
+
+        verify(mMockManager).setNotificationsEnabledForPackage(PKG_NAME, UID, true);
+    }
+
+    @Test
+    public void callChangeListener_setDisable_disablingNotification() throws Exception {
+        when(mMockManager.onlyHasDefaultChannel(PKG_NAME, UID)).thenReturn(false);
+
+        mTwoStatePreference.callChangeListener(false);
+
+        verify(mMockManager).setNotificationsEnabledForPackage(PKG_NAME, UID, false);
+    }
+
+    @Test
+    public void callChangeListener_onlyHasDefaultChannel_updateChannel() throws Exception {
+        when(mMockManager.onlyHasDefaultChannel(PKG_NAME, UID)).thenReturn(true);
+        when(mMockManager
+                .getNotificationChannelForPackage(
+                        PKG_NAME, UID, NotificationChannel.DEFAULT_CHANNEL_ID, true))
+                .thenReturn(mMockChannel);
+
+        mTwoStatePreference.callChangeListener(true);
+
+        verify(mMockManager).updateNotificationChannelForPackage(PKG_NAME, UID, mMockChannel);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/PermissionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/PermissionsPreferenceControllerTest.java
new file mode 100644
index 0000000..445383d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/PermissionsPreferenceControllerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowPermissionControllerManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowPermissionControllerManager.class})
+public class PermissionsPreferenceControllerTest {
+
+    private static final String PACKAGE_NAME = "Test Package Name";
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<PermissionsPreferenceController>
+        mPreferenceControllerHelper;
+    private PermissionsPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+            PermissionsPreferenceController.class);
+        mController = mPreferenceControllerHelper.getController();
+        mPreference = new Preference(mContext);
+    }
+
+    @Test
+    public void testCheckInitialized_noResolveInfo_throwException() {
+        assertThrows(IllegalStateException.class,
+            () -> mPreferenceControllerHelper.setPreference(mPreference));
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_navigateToNextActivity() {
+        // Setup so the controller knows about the preference.
+        mController.setPackageName(PACKAGE_NAME);
+        mPreferenceControllerHelper.setPreference(mPreference);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getAction()).isEqualTo(Intent.ACTION_MANAGE_APP_PERMISSIONS);
+        assertThat(actual.getStringExtra(Intent.EXTRA_PACKAGE_NAME)).isEqualTo(PACKAGE_NAME);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/VersionPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/VersionPreferenceControllerTest.java
new file mode 100644
index 0000000..aa53c6c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/VersionPreferenceControllerTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 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.car.settings.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class VersionPreferenceControllerTest {
+    private static final String TEST_VERSION_NAME = "9";
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<VersionPreferenceController> mPreferenceControllerHelper;
+    private VersionPreferenceController mController;
+    private PackageInfo mPackageInfo;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                VersionPreferenceController.class);
+        mController = mPreferenceControllerHelper.getController();
+        mPreference = new Preference(mContext);
+
+        mPackageInfo = new PackageInfo();
+        mPackageInfo.versionName = TEST_VERSION_NAME;
+    }
+
+    @Test
+    public void testCheckInitialized_noPackageInfo_throwException() {
+        assertThrows(IllegalStateException.class,
+                () -> mPreferenceControllerHelper.setPreference(mPreference));
+    }
+
+    @Test
+    public void testRefreshUi_hasPackageInfo_setTitle() {
+        mController.setPackageInfo(mPackageInfo);
+        mPreferenceControllerHelper.setPreference(mPreference);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+        assertThat(mPreference.getTitle()).isEqualTo(
+                mContext.getString(R.string.application_version_label, TEST_VERSION_NAME));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
new file mode 100644
index 0000000..5b99a3e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/AssistConfigBasePreferenceControllerTest.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+
+import com.google.common.collect.Iterables;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowContentResolver;
+
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowSecureSettings.class})
+public class AssistConfigBasePreferenceControllerTest {
+
+    private static class TestAssistConfigBasePreferenceController extends
+            AssistConfigBasePreferenceController {
+
+        private int mNumCallsToUpdateState;
+
+        TestAssistConfigBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+            mNumCallsToUpdateState = 0;
+        }
+
+        public int getNumCallsToUpdateState() {
+            return mNumCallsToUpdateState;
+        }
+
+        @Override
+        protected void updateState(TwoStatePreference preference) {
+            mNumCallsToUpdateState++;
+        }
+
+        @Override
+        protected List<Uri> getSettingUris() {
+            return Collections.singletonList(
+                    Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED));
+        }
+    }
+
+    private static final int TEST_USER_ID = 10;
+    private static final String TEST_PACKAGE_NAME = "com.test.package";
+    private static final String TEST_SERVICE = "TestService";
+
+    private Context mContext;
+    private TwoStatePreference mTwoStatePreference;
+    private PreferenceControllerTestHelper<TestAssistConfigBasePreferenceController>
+            mControllerHelper;
+    private TestAssistConfigBasePreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        mTwoStatePreference = new SwitchPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestAssistConfigBasePreferenceController.class, mTwoStatePreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasAssistComponent_isAvailable() {
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                key, TEST_USER_ID);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_noAssistComponent_conditionallyUnavailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void onStart_registersObserver() {
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                key, TEST_USER_ID);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isNotEmpty();
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED))).isNotEmpty();
+    }
+
+    @Test
+    public void onStop_unregistersObserver() {
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                key, TEST_USER_ID);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isEmpty();
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED))).isEmpty();
+    }
+
+    @Test
+    public void onChange_changeRegisteredSetting_callsRefreshUi() {
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                key, TEST_USER_ID);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        int currentCount = mController.getNumCallsToUpdateState();
+
+        ContentObserver observer = Iterables.get(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED)), 0);
+        observer.onChange(/* selfChange= */ false,
+                Settings.Secure.getUriFor(Settings.Secure.ASSIST_STRUCTURE_ENABLED));
+
+        assertThat(mController.getNumCallsToUpdateState()).isEqualTo(currentCount + 1);
+    }
+
+    private ShadowContentResolver getShadowContentResolver() {
+        return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..97c5264
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerEntryPreferenceControllerTest.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.database.ContentObserver;
+import android.provider.Settings;
+import android.service.voice.VoiceInteractionServiceInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import com.google.common.collect.Iterables;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplicationPackageManager;
+import org.robolectric.shadows.ShadowContentResolver;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowCarUserManagerHelper.class,
+        ShadowVoiceInteractionServiceInfo.class})
+public class DefaultVoiceInputPickerEntryPreferenceControllerTest {
+
+    private static final String TEST_PACKAGE = "com.android.car.settings.testutils";
+    private static final String TEST_ASSIST = "TestAssistService";
+    private static final String TEST_VOICE = "TestVoiceService";
+    private static final String TEST_SETTINGS_CLASS = "TestSettingsActivity";
+    private static final int TEST_USER_ID = 10;
+
+    private Context mContext;
+    private DefaultVoiceInputPickerEntryPreferenceController mController;
+    private PreferenceControllerTestHelper<DefaultVoiceInputPickerEntryPreferenceController>
+            mControllerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        CarUserManagerHelper carUserManagerHelper = mock(CarUserManagerHelper.class);
+        ShadowCarUserManagerHelper.setMockInstance(carUserManagerHelper);
+
+        mContext = RuntimeEnvironment.application;
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DefaultVoiceInputPickerEntryPreferenceController.class,
+                new ButtonPreference(mContext));
+        mController = mControllerHelper.getController();
+
+        // Set user.
+        when(carUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowSecureSettings.reset();
+        ShadowVoiceInteractionServiceInfo.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_sameComponents_returnsConditionallyUnavailable() {
+        setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_VOICE));
+        setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_bothNull_returnsConditionallyUnavailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_differentComponents_returnsAvailable() {
+        setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_ASSIST));
+        setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                PreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_assistNull_returnsAvailable() {
+        setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                PreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_voiceInputNull_returnsAvailable() {
+        setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_ASSIST));
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                PreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void onStart_registersObserver() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isNotEmpty();
+    }
+
+    @Test
+    public void onStop_unregistersObserver() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSISTANT))).isEmpty();
+    }
+
+    @Test
+    public void onChange_changeRegisteredSetting_callsRefreshUi() {
+        setCurrentVoiceService(new ComponentName(TEST_PACKAGE, TEST_VOICE));
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(PreferenceController.AVAILABLE);
+
+        setCurrentAssistant(new ComponentName(TEST_PACKAGE, TEST_VOICE));
+        ContentObserver observer = Iterables.get(getShadowContentResolver().getContentObservers(
+                Settings.Secure.getUriFor(Settings.Secure.ASSISTANT)), 0);
+        observer.onChange(/* selfChange= */ false,
+                Settings.Secure.getUriFor(Settings.Secure.ASSISTANT));
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                PreferenceController.CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void getCurrentDefaultAppInfo_providerHasCurrentService_returnsValidDefaultAppInfo() {
+        // This is used so tht the VoiceInputInfoProvider returns a valid service.
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+        resolveInfo.serviceInfo.name = TEST_VOICE;
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
+
+        // Create new controller to rerun the constructor with the new shadow package manager.
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DefaultVoiceInputPickerEntryPreferenceController.class,
+                new ButtonPreference(mContext));
+        mController = mControllerHelper.getController();
+
+        ComponentName voiceService = new ComponentName(TEST_PACKAGE, TEST_VOICE);
+        setCurrentVoiceService(voiceService);
+
+        assertThat(mController.getCurrentDefaultAppInfo()).isNotNull();
+    }
+
+    @Test
+    public void getCurrentDefaultAppInfo_providerHasNoService_returnsNull() {
+        assertThat(mController.getCurrentDefaultAppInfo()).isNull();
+    }
+
+    @Test
+    public void getSettingIntent_nullInput_returnsNull() {
+        assertThat(mController.getSettingIntent(null)).isEqualTo(null);
+    }
+
+    @Test
+    public void getSettingIntent_inputIsWrongType_returnsNull() {
+        DefaultAppInfo info = mock(DefaultAppInfo.class);
+        assertThat(mController.getSettingIntent(info)).isEqualTo(null);
+    }
+
+    @Test
+    public void getSettingIntent_validInput_returnsIntent() {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+        resolveInfo.serviceInfo.name = TEST_VOICE;
+
+        ShadowVoiceInteractionServiceInfo.setSettingsActivity(resolveInfo.serviceInfo,
+                TEST_SETTINGS_CLASS);
+        VoiceInteractionServiceInfo interactionServiceInfo = new VoiceInteractionServiceInfo(
+                mContext.getPackageManager(), resolveInfo.serviceInfo);
+        VoiceInputInfoProvider.VoiceInputInfo info =
+                new VoiceInputInfoProvider.VoiceInteractionInfo(mContext, interactionServiceInfo);
+
+        DefaultVoiceInputServiceInfo serviceInfo = new DefaultVoiceInputServiceInfo(mContext,
+                mContext.getPackageManager(), TEST_USER_ID, info, true);
+        Intent settingIntent = mController.getSettingIntent(serviceInfo);
+
+        assertThat(settingIntent.getAction()).isEqualTo(Intent.ACTION_MAIN);
+        assertThat(settingIntent.getComponent()).isEqualTo(
+                new ComponentName(TEST_PACKAGE, TEST_SETTINGS_CLASS));
+    }
+
+    private void setCurrentVoiceService(ComponentName service) {
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_INTERACTION_SERVICE, service.flattenToString());
+    }
+
+    private void setCurrentAssistant(ComponentName assist) {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                assist.flattenToString(), TEST_USER_ID);
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+
+    private ShadowContentResolver getShadowContentResolver() {
+        return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
new file mode 100644
index 0000000..84e8572
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/DefaultVoiceInputPickerPreferenceControllerTest.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.provider.Settings;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplicationPackageManager;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class,
+        ShadowCarUserManagerHelper.class})
+public class DefaultVoiceInputPickerPreferenceControllerTest {
+
+    private static final String TEST_PACKAGE_NAME = "com.test.package";
+    private static final String TEST_SERVICE = "TestService";
+    private static final String TEST_OTHER_SERVICE = "TestOtherService";
+    private static final String TEST_RECOGNIZER = "TestRecognizer";
+    private static final int TEST_USER_ID = 10;
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<DefaultVoiceInputPickerPreferenceController>
+            mControllerHelper;
+    private DefaultVoiceInputPickerPreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+
+        mContext = RuntimeEnvironment.application;
+
+        // Set user.
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSecureSettings.reset();
+        ShadowCarUserManagerHelper.reset();
+        ShadowVoiceInteractionServiceInfo.reset();
+    }
+
+    @Test
+    public void getCandidates_voiceInteractionService_hasOneElement() {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        resolveInfo.serviceInfo.name = TEST_SERVICE;
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
+        setupController();
+
+        assertThat(mController.getCandidates()).hasSize(1);
+    }
+
+    @Test
+    public void getCandidates_voiceRecognitionService_hasOneElement() {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        resolveInfo.serviceInfo.name = TEST_RECOGNIZER;
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_RECOGNITION_SERVICE_TAG, resolveInfo);
+        setupController();
+
+        assertThat(mController.getCandidates()).hasSize(1);
+    }
+
+    @Test
+    public void getCandidates_oneIsSameAsAssistant_hasTwoElements() {
+        ResolveInfo interactionInfo = new ResolveInfo();
+        interactionInfo.serviceInfo = new ServiceInfo();
+        interactionInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        interactionInfo.serviceInfo.name = TEST_SERVICE;
+        interactionInfo.serviceInfo.applicationInfo = new ApplicationInfo();
+        interactionInfo.serviceInfo.applicationInfo.nonLocalizedLabel = "1";
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo);
+
+        ResolveInfo interactionInfo2 = new ResolveInfo();
+        interactionInfo2.serviceInfo = new ServiceInfo();
+        interactionInfo2.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        interactionInfo2.serviceInfo.name = TEST_OTHER_SERVICE;
+        interactionInfo2.serviceInfo.applicationInfo = new ApplicationInfo();
+        interactionInfo2.serviceInfo.applicationInfo.nonLocalizedLabel = "2";
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo2);
+
+        ComponentName voiceInteraction = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
+        setCurrentAssistant(voiceInteraction);
+        setCurrentVoiceInteractionService(voiceInteraction);
+
+        setupController();
+
+        assertThat(mController.getCandidates()).hasSize(2);
+    }
+
+    @Test
+    public void getCandidates_oneIsSameAsAssistant_sameOneIsEnabled() {
+        ResolveInfo interactionInfo = new ResolveInfo();
+        interactionInfo.serviceInfo = new ServiceInfo();
+        interactionInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        interactionInfo.serviceInfo.name = TEST_SERVICE;
+        interactionInfo.serviceInfo.applicationInfo = new ApplicationInfo();
+        interactionInfo.serviceInfo.applicationInfo.nonLocalizedLabel = "1";
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo);
+
+        ResolveInfo interactionInfo2 = new ResolveInfo();
+        interactionInfo2.serviceInfo = new ServiceInfo();
+        interactionInfo2.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        interactionInfo2.serviceInfo.name = TEST_OTHER_SERVICE;
+        interactionInfo2.serviceInfo.applicationInfo = new ApplicationInfo();
+        interactionInfo2.serviceInfo.applicationInfo.nonLocalizedLabel = "2";
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo2);
+
+        ComponentName voiceInteraction = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
+        setCurrentAssistant(voiceInteraction);
+        setCurrentVoiceInteractionService(voiceInteraction);
+
+        setupController();
+
+        DefaultAppInfo defaultAppInfo = null;
+        for (DefaultAppInfo info : mController.getCandidates()) {
+            if (info.componentName.equals(new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE))) {
+                defaultAppInfo = info;
+            }
+        }
+        assertThat(defaultAppInfo).isNotNull();
+        assertThat(defaultAppInfo.enabled).isTrue();
+    }
+
+    @Test
+    public void getCandidates_oneIsSameAsAssistant_differentOneIsDisabled() {
+        ResolveInfo interactionInfo = new ResolveInfo();
+        interactionInfo.serviceInfo = new ServiceInfo();
+        interactionInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        interactionInfo.serviceInfo.name = TEST_SERVICE;
+        interactionInfo.serviceInfo.applicationInfo = new ApplicationInfo();
+        interactionInfo.serviceInfo.applicationInfo.nonLocalizedLabel = "1";
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo);
+
+        ResolveInfo interactionInfo2 = new ResolveInfo();
+        interactionInfo2.serviceInfo = new ServiceInfo();
+        interactionInfo2.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        interactionInfo2.serviceInfo.name = TEST_OTHER_SERVICE;
+        interactionInfo2.serviceInfo.applicationInfo = new ApplicationInfo();
+        interactionInfo2.serviceInfo.applicationInfo.nonLocalizedLabel = "2";
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, interactionInfo2);
+
+        ComponentName voiceInteraction = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
+        setCurrentAssistant(voiceInteraction);
+        setCurrentVoiceInteractionService(voiceInteraction);
+
+        setupController();
+
+        DefaultAppInfo defaultAppInfo = null;
+        for (DefaultAppInfo info : mController.getCandidates()) {
+            if (info.componentName.equals(
+                    new ComponentName(TEST_PACKAGE_NAME, TEST_OTHER_SERVICE))) {
+                defaultAppInfo = info;
+            }
+        }
+        assertThat(defaultAppInfo).isNotNull();
+        assertThat(defaultAppInfo.enabled).isFalse();
+    }
+
+    @Test
+    public void getCurrentDefaultKey_defaultIsNull_returnsNull() {
+        setupController();
+
+        assertThat(mController.getCurrentDefaultKey()).isNull();
+    }
+
+    @Test
+    public void getCurrentDefaultKey_defaultExists_returnsComponentName() {
+        setupController();
+
+        ComponentName cn = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE);
+        setCurrentVoiceInteractionService(cn);
+
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo(cn.flattenToString());
+    }
+
+    @Test
+    public void setCurrentDefault_typeVoiceInteractionInfo_setsServices() {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        resolveInfo.serviceInfo.name = TEST_SERVICE;
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
+        ShadowVoiceInteractionServiceInfo.setRecognitionService(resolveInfo.serviceInfo,
+                TEST_RECOGNIZER);
+        setupController();
+
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        String recognizer = new ComponentName(TEST_PACKAGE_NAME, TEST_RECOGNIZER).flattenToString();
+        mController.setCurrentDefault(key);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_INTERACTION_SERVICE)).isEqualTo(key);
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_RECOGNITION_SERVICE)).isEqualTo(recognizer);
+    }
+
+    @Test
+    public void setCurrentDefault_typeVoiceRecognitionInfo_setsRecognitionService() {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        resolveInfo.serviceInfo.name = TEST_RECOGNIZER;
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_RECOGNITION_SERVICE_TAG, resolveInfo);
+        setupController();
+
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_RECOGNIZER).flattenToString();
+        mController.setCurrentDefault(key);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_INTERACTION_SERVICE)).isEmpty();
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_RECOGNITION_SERVICE)).isEqualTo(key);
+    }
+
+    private void setupController() {
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DefaultVoiceInputPickerPreferenceController.class,
+                new LogicalPreferenceGroup(mContext));
+        mController = mControllerHelper.getController();
+    }
+
+    private void setCurrentVoiceInteractionService(ComponentName service) {
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_INTERACTION_SERVICE, service.flattenToString());
+    }
+
+    private void setCurrentAssistant(ComponentName assist) {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                assist.flattenToString(), TEST_USER_ID);
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
new file mode 100644
index 0000000..efd0934
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/ScreenshotContextPreferenceControllerTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ScreenshotContextPreferenceControllerTest {
+
+    private static final int TEST_USER_ID = 10;
+    private static final String TEST_PACKAGE_NAME = "com.test.package";
+    private static final String TEST_SERVICE = "TestService";
+
+    private Context mContext;
+    private TwoStatePreference mTwoStatePreference;
+    private PreferenceControllerTestHelper<ScreenshotContextPreferenceController>
+            mControllerHelper;
+    private ScreenshotContextPreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        mTwoStatePreference = new SwitchPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                ScreenshotContextPreferenceController.class, mTwoStatePreference);
+        mController = mControllerHelper.getController();
+
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                key, TEST_USER_ID);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void refreshUi_screenshotEnabled_preferenceChecked() {
+        mTwoStatePreference.setChecked(false);
+
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1);
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_screenshotDisabled_preferenceUnchecked() {
+        mTwoStatePreference.setChecked(true);
+
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0);
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_structureEnabled_preferenceEnabled() {
+        mTwoStatePreference.setEnabled(false);
+
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_structureDisabled_preferenceDisabled() {
+        mTwoStatePreference.setEnabled(true);
+
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void callChangeListener_toggleTrue_screenshotEnabled() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0);
+        mTwoStatePreference.callChangeListener(true);
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0)).isEqualTo(1);
+    }
+
+    @Test
+    public void callChangeListener_toggleFalse_screenshotDisabled() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1);
+        mTwoStatePreference.callChangeListener(false);
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1)).isEqualTo(0);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
new file mode 100644
index 0000000..7b915ea
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/TextContextPreferenceControllerTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class TextContextPreferenceControllerTest {
+
+    private static final int TEST_USER_ID = 10;
+    private static final String TEST_PACKAGE_NAME = "com.test.package";
+    private static final String TEST_SERVICE = "TestService";
+
+    private Context mContext;
+    private TwoStatePreference mTwoStatePreference;
+    private PreferenceControllerTestHelper<TextContextPreferenceController>
+            mControllerHelper;
+    private TextContextPreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        mTwoStatePreference = new SwitchPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TextContextPreferenceController.class, mTwoStatePreference);
+        mController = mControllerHelper.getController();
+
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT,
+                key, TEST_USER_ID);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void refreshUi_contextEnabled_preferenceChecked() {
+        mTwoStatePreference.setChecked(false);
+
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_contextDisabled_preferenceUnchecked() {
+        mTwoStatePreference.setChecked(true);
+
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void callChangeListener_toggleTrue_contextEnabled() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0);
+        mTwoStatePreference.callChangeListener(true);
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0)).isEqualTo(1);
+    }
+
+    @Test
+    public void callChangeListener_toggleFalse_contextDisabled() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1);
+        mTwoStatePreference.callChangeListener(false);
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1)).isEqualTo(0);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
new file mode 100644
index 0000000..34361e7
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputInfoProviderTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplicationPackageManager;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class, ShadowVoiceInteractionServiceInfo.class})
+public class VoiceInputInfoProviderTest {
+
+    private static final String TEST_PACKAGE = "test.package";
+    private static final String TEST_CLASS = "Class1";
+    private static final String TEST_RECOGNITION_SERVICE = "Recognition1";
+
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @After
+    public void tearDown() {
+        ShadowVoiceInteractionServiceInfo.reset();
+    }
+
+    @Test
+    public void getInteractionInfoList_hasElement() {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+        resolveInfo.serviceInfo.name = TEST_CLASS;
+        ShadowVoiceInteractionServiceInfo.setRecognitionService(resolveInfo.serviceInfo,
+                TEST_RECOGNITION_SERVICE);
+
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_INTERACTION_SERVICE_TAG, resolveInfo);
+
+        VoiceInputInfoProvider provider = new VoiceInputInfoProvider(mContext);
+        assertThat(provider.getVoiceInteractionInfoList()).hasSize(1);
+    }
+
+    @Test
+    public void getRecognitionInfoList_hasElement() {
+        ResolveInfo otherInfo = new ResolveInfo();
+        otherInfo.serviceInfo = new ServiceInfo();
+        otherInfo.serviceInfo.packageName = TEST_PACKAGE;
+        otherInfo.serviceInfo.name = TEST_RECOGNITION_SERVICE;
+
+        getShadowPackageManager().addResolveInfoForIntent(
+                VoiceInputInfoProvider.VOICE_RECOGNITION_SERVICE_TAG, otherInfo);
+
+        VoiceInputInfoProvider provider = new VoiceInputInfoProvider(mContext);
+        assertThat(provider.getVoiceRecognitionInfoList()).hasSize(1);
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
new file mode 100644
index 0000000..7b2b47a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/assist/VoiceInputUtilsTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.assist;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class})
+public class VoiceInputUtilsTest {
+
+    private static final String TEST_PACKAGE = "test.package";
+    private static final String TEST_CLASS_1 = "Class1";
+    private static final String TEST_CLASS_2 = "Class2";
+
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void getCurrentService_nullInteraction_nullRecognition_returnsNull() {
+        assertThat(VoiceInputUtils.getCurrentService(mContext)).isNull();
+    }
+
+    @Test
+    public void getCurrentService_emptyInteraction_emptyRecognition_returnsNull() {
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_INTERACTION_SERVICE, "");
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_RECOGNITION_SERVICE, "");
+        assertThat(VoiceInputUtils.getCurrentService(mContext)).isNull();
+    }
+
+    @Test
+    public void getCurrentService_hasInteraction_returnsInteraction() {
+        ComponentName interaction = new ComponentName(TEST_PACKAGE, TEST_CLASS_1);
+        ComponentName recognition = new ComponentName(TEST_PACKAGE, TEST_CLASS_2);
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_INTERACTION_SERVICE, interaction.flattenToString());
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_RECOGNITION_SERVICE, recognition.flattenToString());
+        assertThat(VoiceInputUtils.getCurrentService(mContext)).isEqualTo(interaction);
+    }
+
+    @Test
+    public void getCurrentService_noInteraction_hasRecognition_returnsRecogntion() {
+        ComponentName recognition = new ComponentName(TEST_PACKAGE, TEST_CLASS_2);
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_INTERACTION_SERVICE, "");
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.VOICE_RECOGNITION_SERVICE, recognition.flattenToString());
+        assertThat(VoiceInputUtils.getCurrentService(mContext)).isEqualTo(recognition);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceControllerTest.java
new file mode 100644
index 0000000..955f2d0
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppEntryBasePreferenceControllerTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DefaultAppEntryBasePreferenceControllerTest {
+    private static final CharSequence TEST_LABEL = "Test Label";
+
+    private static class TestDefaultAppEntryBasePreferenceController extends
+            DefaultAppEntryBasePreferenceController<Preference> {
+
+        private DefaultAppInfo mDefaultAppInfo;
+
+        TestDefaultAppEntryBasePreferenceController(Context context,
+                String preferenceKey, FragmentController fragmentController,
+                CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Class<Preference> getPreferenceType() {
+            return Preference.class;
+        }
+
+        @Nullable
+        @Override
+        protected DefaultAppInfo getCurrentDefaultAppInfo() {
+            return mDefaultAppInfo;
+        }
+
+        protected void setCurrentDefaultAppInfo(DefaultAppInfo defaultAppInfo) {
+            mDefaultAppInfo = defaultAppInfo;
+        }
+    }
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<TestDefaultAppEntryBasePreferenceController>
+            mControllerHelper;
+    private TestDefaultAppEntryBasePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestDefaultAppEntryBasePreferenceController.class,
+                mPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @Test
+    public void refreshUi_hasDefaultAppWithLabel_summaryAndIconAreSet() {
+        DefaultAppInfo defaultAppInfo = mock(DefaultAppInfo.class);
+        when(defaultAppInfo.loadLabel()).thenReturn(TEST_LABEL);
+        when(defaultAppInfo.loadIcon()).thenReturn(mContext.getDrawable(R.drawable.test_icon));
+        mController.setCurrentDefaultAppInfo(defaultAppInfo);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_LABEL);
+        assertThat(mPreference.getIcon()).isNotNull();
+    }
+
+    @Test
+    public void refreshUi_hasDefaultAppWithoutLabel_summaryAndIconAreNotSet() {
+        DefaultAppInfo defaultAppInfo = mock(DefaultAppInfo.class);
+        when(defaultAppInfo.loadLabel()).thenReturn(null);
+        when(defaultAppInfo.loadIcon()).thenReturn(null);
+        mController.setCurrentDefaultAppInfo(defaultAppInfo);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.app_list_preference_none));
+        assertThat(mPreference.getIcon()).isNull();
+    }
+
+    @Test
+    public void refreshUi_hasNoDefaultApp_summaryAndIconAreNotSet() {
+        mController.setCurrentDefaultAppInfo(null);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.app_list_preference_none));
+        assertThat(mPreference.getIcon()).isNull();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppUtilsTest.java
new file mode 100644
index 0000000..a28af16
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppUtilsTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DefaultAppUtilsTest {
+
+    @Test
+    public void setSafeIcon_smallerThanLimit() {
+        Context context = RuntimeEnvironment.application;
+        Drawable drawable = context.getDrawable(R.drawable.test_icon);
+        int height = drawable.getMinimumHeight();
+        int width = drawable.getMinimumWidth();
+
+        // Set to some value larger than current height or width;
+        int testMaxDimensions = Math.max(height, width) + 1;
+        Preference preference = new Preference(context);
+        DefaultAppUtils.setSafeIcon(preference, drawable, testMaxDimensions);
+
+        assertThat(preference.getIcon().getMinimumHeight()).isEqualTo(height);
+        assertThat(preference.getIcon().getMinimumWidth()).isEqualTo(width);
+    }
+
+    @Test
+    public void setSafeIcon_largerThanLimit() {
+        Context context = RuntimeEnvironment.application;
+        Drawable drawable = context.getDrawable(R.drawable.test_icon);
+        int height = drawable.getMinimumHeight();
+        int width = drawable.getMinimumWidth();
+
+        // Set to some value smaller than current height or width;
+        int testMaxDimensions = Math.min(height, width) - 1;
+        Preference preference = new Preference(context);
+        DefaultAppUtils.setSafeIcon(preference, drawable, testMaxDimensions);
+
+        assertThat(preference.getIcon().getMinimumHeight()).isEqualTo(testMaxDimensions);
+        assertThat(preference.getIcon().getMinimumWidth()).isEqualTo(testMaxDimensions);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
new file mode 100644
index 0000000..aeea7bb
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerBasePreferenceControllerTest.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.text.TextUtils;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import com.google.android.collect.Lists;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DefaultAppsPickerBasePreferenceControllerTest {
+
+    private static class TestDefaultAppsPickerBasePreferenceController extends
+            DefaultAppsPickerBasePreferenceController {
+
+        private List<DefaultAppInfo> mCandidates;
+        private String mKey;
+        private CharSequence mMessage;
+        private boolean mIncludeNone = true;
+
+        TestDefaultAppsPickerBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        public void setTestCandidates(List<DefaultAppInfo> candidates) {
+            mCandidates = candidates;
+        }
+
+        public void setTestMessage(String s) {
+            mMessage = s;
+        }
+
+        public void setIncludeNonePreference(boolean include) {
+            mIncludeNone = include;
+        }
+
+        @Override
+        protected List<DefaultAppInfo> getCandidates() {
+            return mCandidates;
+        }
+
+        @Override
+        protected String getCurrentDefaultKey() {
+            return mKey;
+        }
+
+        @Override
+        protected void setCurrentDefault(String key) {
+            mKey = key;
+        }
+
+        @Override
+        protected CharSequence getConfirmationMessage(DefaultAppInfo info) {
+            return mMessage;
+        }
+
+        @Override
+        protected boolean includeNonePreference() {
+            return mIncludeNone;
+        }
+    }
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<TestDefaultAppsPickerBasePreferenceController>
+            mControllerHelper;
+    private TestDefaultAppsPickerBasePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestDefaultAppsPickerBasePreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+    }
+
+    @Test
+    public void refreshUi_noCandidates_hasSingleNoneElement() {
+        mController.setCurrentDefault("");
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        // Has the "None" element.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        assertThat(preference.getTitle()).isEqualTo(
+                mContext.getString(R.string.app_list_preference_none));
+        assertThat(preference.getIcon()).isNotNull();
+        assertThat(preference.getSummary()).isEqualTo(
+                mContext.getString(R.string.default_app_selected_app));
+    }
+
+    @Test
+    public void refreshUi_noCandidates_noNoneElement() {
+        mController.setCurrentDefault("");
+        mController.setIncludeNonePreference(false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        // None element removed.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_hasAdditionalCandidate_hasTwoElements() {
+        String testKey = "testKey";
+
+        DefaultAppInfo testApp = mock(DefaultAppInfo.class);
+        when(testApp.getKey()).thenReturn(testKey);
+        mController.setTestCandidates(Lists.newArrayList(testApp));
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void refreshUi_hasAdditionalCandidateAsDefault_secondElementIsSelected() {
+        String testKey = "testKey";
+
+        DefaultAppInfo testApp = mock(DefaultAppInfo.class);
+        when(testApp.getKey()).thenReturn(testKey);
+        mController.setTestCandidates(Lists.newArrayList(testApp));
+        mController.setCurrentDefault(testKey);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.findPreference(testKey).getSummary()).isEqualTo(
+                mContext.getString(R.string.default_app_selected_app));
+    }
+
+    @Test
+    public void performClick_currentDefaultApp_nothingHappened() {
+        String testKey = "testKey";
+
+        DefaultAppInfo testApp = mock(DefaultAppInfo.class);
+        when(testApp.getKey()).thenReturn(testKey);
+        mController.setTestCandidates(Lists.newArrayList(testApp));
+        mController.setCurrentDefault(testKey);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        Preference currentDefault = mPreferenceGroup.findPreference(testKey);
+        Preference otherOption = mPreferenceGroup.getPreference(0);
+
+        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
+        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+
+        currentDefault.performClick();
+
+        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
+        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+    }
+
+    @Test
+    public void performClick_otherOptionNoMessage_otherOptionSelected() {
+        String testKey = "testKey";
+
+        DefaultAppInfo testApp = mock(DefaultAppInfo.class);
+        when(testApp.getKey()).thenReturn(testKey);
+        mController.setTestCandidates(Lists.newArrayList(testApp));
+        mController.setCurrentDefault(testKey);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        Preference currentDefault = mPreferenceGroup.findPreference(testKey);
+        Preference otherOption = mPreferenceGroup.getPreference(0);
+
+        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
+        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+
+        otherOption.performClick();
+
+        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isTrue();
+        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isFalse();
+    }
+
+    @Test
+    public void performClick_otherOptionHasMessage_dialogOpened() {
+        String testKey = "testKey";
+
+        DefaultAppInfo testApp = mock(DefaultAppInfo.class);
+        when(testApp.getKey()).thenReturn(testKey);
+        mController.setTestCandidates(Lists.newArrayList(testApp));
+        mController.setCurrentDefault(testKey);
+        mController.setTestMessage("Non-empty message");
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        Preference currentDefault = mPreferenceGroup.findPreference(testKey);
+        Preference otherOption = mPreferenceGroup.getPreference(0);
+
+        assertThat(TextUtils.isEmpty(currentDefault.getSummary())).isFalse();
+        assertThat(TextUtils.isEmpty(otherOption.getSummary())).isTrue();
+
+        otherOption.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class),
+                eq(ConfirmationDialogFragment.TAG));
+    }
+
+    @Test
+    public void performClick_otherOptionNoMessage_newKeySet() {
+        String testKey = "testKey";
+
+        DefaultAppInfo testApp = mock(DefaultAppInfo.class);
+        when(testApp.getKey()).thenReturn(testKey);
+        mController.setTestCandidates(Lists.newArrayList(testApp));
+
+        // Currently, the testApp is the default selection.
+        mController.setCurrentDefault(testKey);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        // This preference represents the "None" option.
+        Preference otherOption = mPreferenceGroup.getPreference(0);
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo(testKey);
+
+        otherOption.performClick();
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo("");
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceControllerTest.java
new file mode 100644
index 0000000..8119755
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAppsPickerEntryBasePreferenceControllerTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DefaultAppsPickerEntryBasePreferenceControllerTest {
+
+    private static final Intent TEST_INTENT = new Intent(Settings.ACTION_SETTINGS);
+
+    private static class TestDefaultAppsPickerEntryBasePreferenceController extends
+            DefaultAppsPickerEntryBasePreferenceController {
+
+        private final DefaultAppInfo mDefaultAppInfo;
+        private Intent mSettingIntent;
+
+        TestDefaultAppsPickerEntryBasePreferenceController(Context context,
+                String preferenceKey, FragmentController fragmentController,
+                CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+            mDefaultAppInfo = mock(DefaultAppInfo.class);
+        }
+
+        @Nullable
+        @Override
+        protected Intent getSettingIntent(@Nullable DefaultAppInfo info) {
+            return mSettingIntent;
+        }
+
+        protected void setSettingIntent(Intent settingIntent) {
+            mSettingIntent = settingIntent;
+        }
+
+        @Nullable
+        @Override
+        protected DefaultAppInfo getCurrentDefaultAppInfo() {
+            return mDefaultAppInfo;
+        }
+    }
+
+    private Context mContext;
+    private ButtonPreference mButtonPreference;
+    private PreferenceControllerTestHelper<TestDefaultAppsPickerEntryBasePreferenceController>
+            mControllerHelper;
+    private TestDefaultAppsPickerEntryBasePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mButtonPreference = new ButtonPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestDefaultAppsPickerEntryBasePreferenceController.class, mButtonPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @Test
+    public void refreshUi_hasSettingIntent_actionButtonIsVisible() {
+        mController.setSettingIntent(TEST_INTENT);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mButtonPreference.isActionShown()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_hasNoSettingIntent_actionButtonIsNotVisible() {
+        mController.setSettingIntent(null);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mButtonPreference.isActionShown()).isFalse();
+    }
+
+    @Test
+    public void performButtonClick_launchesIntent() {
+        mController.setSettingIntent(TEST_INTENT);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mButtonPreference.performButtonClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getAction()).isEqualTo(TEST_INTENT.getAction());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..9ab0536
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAssistantPickerEntryPreferenceControllerTest.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.role.RoleManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.provider.Settings;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+import com.android.car.settings.testutils.ShadowVoiceInteractionServiceInfo;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowVoiceInteractionServiceInfo.class,
+        ShadowCarUserManagerHelper.class, ShadowApplicationPackageManager.class})
+public class DefaultAssistantPickerEntryPreferenceControllerTest {
+
+    private static final String TEST_PACKAGE = "com.android.car.settings.testutils";
+    private static final String TEST_CLASS = "BaseTestActivity";
+    private static final String TEST_SETTINGS_CLASS = "TestSettingsActivity";
+    private static final String TEST_COMPONENT =
+            new ComponentName(TEST_PACKAGE, TEST_CLASS).flattenToString();
+    private static final int TEST_USER_ID = 10;
+
+    private Context mContext;
+    private ButtonPreference mButtonPreference;
+    private DefaultAssistantPickerEntryPreferenceController mController;
+    private PreferenceControllerTestHelper<DefaultAssistantPickerEntryPreferenceController>
+            mControllerHelper;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+
+        mContext = RuntimeEnvironment.application;
+        mButtonPreference = new ButtonPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DefaultAssistantPickerEntryPreferenceController.class, mButtonPreference);
+        mController = mControllerHelper.getController();
+
+        // Set user.
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowVoiceInteractionServiceInfo.reset();
+    }
+
+    @Test
+    public void getCurrentDefaultAppInfo_noAssistant_returnsNull() {
+        assertThat(mController.getCurrentDefaultAppInfo()).isNull();
+    }
+
+    @Test
+    public void getCurrentDefaultAppInfo_hasService_returnsDefaultAppInfo() {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+
+        DefaultAppInfo info = mController.getCurrentDefaultAppInfo();
+        assertThat(info.getKey()).isEqualTo(TEST_COMPONENT);
+    }
+
+    @Test
+    public void getSettingIntent_noAssistant_returnsNull() {
+        DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
+                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+        assertThat(mController.getSettingIntent(info)).isNull();
+    }
+
+    @Test
+    public void getSettingIntent_hasAssistant_noAssistSupport_returnsNull() {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+        resolveInfo.serviceInfo.name = TEST_CLASS;
+
+        ShadowVoiceInteractionServiceInfo.setSupportsAssist(resolveInfo.serviceInfo, false);
+        ShadowVoiceInteractionServiceInfo.setSettingsActivity(resolveInfo.serviceInfo,
+                TEST_SETTINGS_CLASS);
+
+        Intent intent =
+                DefaultAssistantPickerEntryPreferenceController.ASSISTANT_SERVICE.setComponent(
+                        ComponentName.unflattenFromString(TEST_COMPONENT));
+        getShadowApplicationManager().addResolveInfoForIntent(intent, resolveInfo);
+
+        DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
+                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+
+        assertThat(mController.getSettingIntent(info)).isNull();
+    }
+
+    @Test
+    public void getSettingIntent_hasAssistant_supportsAssist_noSettingsActivity_returnsNull() {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+        resolveInfo.serviceInfo.name = TEST_CLASS;
+
+        ShadowVoiceInteractionServiceInfo.setSupportsAssist(resolveInfo.serviceInfo, true);
+        ShadowVoiceInteractionServiceInfo.setSettingsActivity(resolveInfo.serviceInfo, null);
+
+        Intent intent =
+                DefaultAssistantPickerEntryPreferenceController.ASSISTANT_SERVICE.setComponent(
+                        ComponentName.unflattenFromString(TEST_COMPONENT));
+        getShadowApplicationManager().addResolveInfoForIntent(intent, resolveInfo);
+
+        DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
+                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+
+        assertThat(mController.getSettingIntent(info)).isNull();
+    }
+
+    @Test
+    public void getSettingIntent_hasAssistant_supportsAssist_hasSettingsActivity_returnsIntent() {
+        Settings.Secure.putStringForUser(mContext.getContentResolver(),
+                Settings.Secure.ASSISTANT, TEST_COMPONENT, TEST_USER_ID);
+
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+        resolveInfo.serviceInfo.name = TEST_CLASS;
+
+        ShadowVoiceInteractionServiceInfo.setSupportsAssist(resolveInfo.serviceInfo, true);
+        ShadowVoiceInteractionServiceInfo.setSettingsActivity(resolveInfo.serviceInfo,
+                TEST_SETTINGS_CLASS);
+
+        Intent intent =
+                DefaultAssistantPickerEntryPreferenceController.ASSISTANT_SERVICE.setComponent(
+                        ComponentName.unflattenFromString(TEST_COMPONENT));
+        getShadowApplicationManager().addResolveInfoForIntent(intent, resolveInfo);
+
+        DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
+                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+
+        Intent result = mController.getSettingIntent(info);
+        assertThat(result.getAction()).isEqualTo(Intent.ACTION_MAIN);
+        assertThat(result.getComponent()).isEqualTo(
+                new ComponentName(TEST_PACKAGE, TEST_SETTINGS_CLASS));
+    }
+
+    @Test
+    public void performClick_permissionControllerExists_startsPermissionController() {
+        String testPackage = "com.test.permissions";
+        getShadowApplicationManager().setPermissionControllerPackageName(testPackage);
+        mButtonPreference.performClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getAction()).isEqualTo(Intent.ACTION_MANAGE_DEFAULT_APP);
+    }
+
+    @Test
+    public void performClick_permissionControllerExists_intentHasPackageName() {
+        String testPackage = "com.test.permissions";
+        getShadowApplicationManager().setPermissionControllerPackageName(testPackage);
+        mButtonPreference.performClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getPackage()).isEqualTo(testPackage);
+    }
+
+    @Test
+    public void performClick_permissionControllerExists_intentHasRole() {
+        String testPackage = "com.test.permissions";
+        getShadowApplicationManager().setPermissionControllerPackageName(testPackage);
+        mButtonPreference.performClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getStringExtra(Intent.EXTRA_ROLE_NAME)).isEqualTo(
+                RoleManager.ROLE_ASSISTANT);
+    }
+
+    @Test
+    public void performClick_permissionControllerDoesntExist_doesNotStartPermissionController() {
+        mButtonPreference.performClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual).isNull();
+    }
+
+    private ShadowApplicationPackageManager getShadowApplicationManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..cba714c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerEntryPreferenceControllerTest.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.provider.Settings;
+import android.service.autofill.AutofillService;
+import android.view.autofill.AutofillManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAutofillServiceInfo;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+import com.android.settingslib.applications.DefaultAppInfo;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowPackageManager;
+
+import java.util.Collections;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowAutofillServiceInfo.class})
+public class DefaultAutofillPickerEntryPreferenceControllerTest {
+
+    private static final String TEST_PACKAGE = "com.android.car.settings.testutils";
+    private static final String TEST_CLASS = "BaseTestActivity";
+    private static final String TEST_OTHER_CLASS = "BaseTestOtherActivity";
+    private static final String TEST_COMPONENT =
+            new ComponentName(TEST_PACKAGE, TEST_CLASS).flattenToString();
+    private static final int TEST_USER_ID = 10;
+
+    private Context mContext;
+    private ButtonPreference mButtonPreference;
+    private DefaultAutofillPickerEntryPreferenceController mController;
+    private PreferenceControllerTestHelper<DefaultAutofillPickerEntryPreferenceController>
+            mControllerHelper;
+    @Mock
+    private AutofillManager mAutofillManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Shadows.shadowOf(RuntimeEnvironment.application).setSystemService(
+                Context.AUTOFILL_MANAGER_SERVICE, mAutofillManager);
+        mContext = RuntimeEnvironment.application;
+        mButtonPreference = new ButtonPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DefaultAutofillPickerEntryPreferenceController.class, mButtonPreference);
+        mController = mControllerHelper.getController();
+
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE,
+                "");
+    }
+
+    @After
+    public void tearDown() {
+        ShadowAutofillServiceInfo.reset();
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_autofillManagerIsNull_unsupportedOnDevice() {
+        Shadows.shadowOf(RuntimeEnvironment.application).setSystemService(
+                Context.AUTOFILL_MANAGER_SERVICE, null);
+
+        // Reinitialize so that it uses the system service set in this test.
+        ButtonPreference preference = new ButtonPreference(mContext);
+        PreferenceControllerTestHelper<DefaultAutofillPickerEntryPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        DefaultAutofillPickerEntryPreferenceController.class, preference);
+        DefaultAutofillPickerEntryPreferenceController controller = helper.getController();
+
+        assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_autofillNotSupported_unsupportedOnDevice() {
+        when(mAutofillManager.isAutofillSupported()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_autofillSupported_isAvailable() {
+        when(mAutofillManager.isAutofillSupported()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getCurrentDefaultAppInfo_noService_returnsNull() {
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE,
+                "");
+
+        assertThat(mController.getCurrentDefaultAppInfo()).isNull();
+    }
+
+    @Test
+    public void getCurrentDefaultAppInfo_hasService_returnsDefaultAppInfo() {
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE,
+                TEST_COMPONENT);
+
+        DefaultAppInfo info = mController.getCurrentDefaultAppInfo();
+        assertThat(info.getKey()).isEqualTo(TEST_COMPONENT);
+    }
+
+    @Test
+    public void getSettingIntent_nullDefaultAppInfo_returnsNull() {
+        assertThat(mController.getSettingIntent(null)).isNull();
+    }
+
+    @Test
+    public void getSettingIntent_noServiceInterface_returnsNull() {
+        Intent intent = new Intent(AutofillService.SERVICE_INTERFACE);
+        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.addResolveInfoForIntent(intent, Collections.emptyList());
+
+        DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
+                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+
+        assertThat(mController.getSettingIntent(info)).isNull();
+    }
+
+    @Test
+    public void getSettingIntent_hasServiceInterface_returnsIntent() {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = new ServiceInfo();
+        resolveInfo.serviceInfo.packageName = TEST_PACKAGE;
+        resolveInfo.serviceInfo.name = TEST_CLASS;
+
+        ShadowAutofillServiceInfo.setSettingsActivity(TEST_OTHER_CLASS);
+
+        Intent intent = new Intent(AutofillService.SERVICE_INTERFACE);
+        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.addResolveInfoForIntent(intent, Lists.newArrayList(resolveInfo));
+
+        DefaultAppInfo info = new DefaultAppInfo(mContext, mContext.getPackageManager(),
+                TEST_USER_ID, ComponentName.unflattenFromString(TEST_COMPONENT));
+
+        Intent result = mController.getSettingIntent(info);
+        assertThat(result.getAction()).isEqualTo(Intent.ACTION_MAIN);
+        assertThat(result.getComponent()).isEqualTo(
+                new ComponentName(TEST_PACKAGE, TEST_OTHER_CLASS));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceControllerTest.java
new file mode 100644
index 0000000..4a15e47
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/defaultapps/DefaultAutofillPickerPreferenceControllerTest.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.defaultapps;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.Manifest;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.provider.Settings;
+import android.service.autofill.AutofillService;
+
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowPackageManager;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class})
+public class DefaultAutofillPickerPreferenceControllerTest {
+
+    private static final String TEST_PACKAGE_NAME = "com.test.package";
+    private static final String TEST_SERVICE = "TestService";
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private DefaultAutofillPickerPreferenceController mController;
+    private PreferenceControllerTestHelper<DefaultAutofillPickerPreferenceController>
+            mControllerHelper;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DefaultAutofillPickerPreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void getCandidates_hasServiceWithoutPermissions_returnsEmptyList() {
+        ResolveInfo serviceResolveInfo = new ResolveInfo();
+        serviceResolveInfo.serviceInfo = new ServiceInfo();
+        serviceResolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        serviceResolveInfo.serviceInfo.name = TEST_SERVICE;
+        serviceResolveInfo.serviceInfo.permission = "";
+        getShadowPackageManager().addResolveInfoForIntent(
+                new Intent(AutofillService.SERVICE_INTERFACE), serviceResolveInfo);
+
+        assertThat(mController.getCandidates()).hasSize(0);
+    }
+
+    @Test
+    public void getCandidates_hasServiceWithBindAutofillServicePermission_returnsService() {
+        ResolveInfo serviceResolveInfo = new ResolveInfo();
+        serviceResolveInfo.serviceInfo = new ServiceInfo();
+        serviceResolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        serviceResolveInfo.serviceInfo.name = TEST_SERVICE;
+        serviceResolveInfo.serviceInfo.permission = Manifest.permission.BIND_AUTOFILL_SERVICE;
+        getShadowPackageManager().addResolveInfoForIntent(
+                new Intent(AutofillService.SERVICE_INTERFACE), serviceResolveInfo);
+
+        assertThat(mController.getCandidates()).hasSize(1);
+    }
+
+    @Test
+    public void getCandidates_hasServiceWithBindAutofillPermission_returnsEmptyList() {
+        ResolveInfo serviceResolveInfo = new ResolveInfo();
+        serviceResolveInfo.serviceInfo = new ServiceInfo();
+        serviceResolveInfo.serviceInfo.packageName = TEST_PACKAGE_NAME;
+        serviceResolveInfo.serviceInfo.name = TEST_SERVICE;
+        serviceResolveInfo.serviceInfo.permission = Manifest.permission.BIND_AUTOFILL;
+        getShadowPackageManager().addResolveInfoForIntent(
+                new Intent(AutofillService.SERVICE_INTERFACE), serviceResolveInfo);
+
+        assertThat(mController.getCandidates()).hasSize(0);
+    }
+
+    @Test
+    public void getCurrentDefaultKey_secureSettingEmpty_returnsNoneKey() {
+        // Secure Setting not set should return null.
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo(
+                DefaultAppsPickerBasePreferenceController.NONE_PREFERENCE_KEY);
+    }
+
+    @Test
+    public void getCurrentDefaultKey_secureSettingReturnsInvalidString_returnsNoneKey() {
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE,
+                "invalid");
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo(
+                DefaultAppsPickerBasePreferenceController.NONE_PREFERENCE_KEY);
+    }
+
+    @Test
+    public void getCurrentDefaultKey_secureSettingReturnsValidString_returnsCorrectKey() {
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE,
+                key);
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo(key);
+    }
+
+    @Test
+    public void setCurrentDefault_setInvalidKey_getCurrentDefaultKeyReturnsNone() {
+        mController.setCurrentDefault("invalid");
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo(
+                DefaultAppsPickerBasePreferenceController.NONE_PREFERENCE_KEY);
+    }
+
+    @Test
+    public void setCurrentDefault_setValidKey_getCurrentDefaultKeyReturnsKey() {
+        String key = new ComponentName(TEST_PACKAGE_NAME, TEST_SERVICE).flattenToString();
+        mController.setCurrentDefault(key);
+        assertThat(mController.getCurrentDefaultKey()).isEqualTo(key);
+    }
+
+    private ShadowPackageManager getShadowPackageManager() {
+        return Shadows.shadowOf(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
new file mode 100644
index 0000000..1e9b365
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/AppLinkStatePreferenceControllerTest.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+import java.util.Arrays;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowApplicationPackageManager.class})
+public class AppLinkStatePreferenceControllerTest {
+
+    private static final int USER_ID = 10;
+    private static final String TEST_PACKAGE_NAME = "com.example.test";
+    private static final int TEST_PACKAGE_ID = 1;
+    private static final String TEST_LABEL = "Test App";
+    private static final String TEST_PATH = "TEST_PATH";
+    private static final String TEST_ACTIVITY = "TestActivity";
+
+    private Context mContext;
+    private ListPreference mPreference;
+    private PreferenceControllerTestHelper<AppLinkStatePreferenceController> mControllerHelper;
+    private AppLinkStatePreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        mPreference = new ListPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AppLinkStatePreferenceController.class);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void refreshUi_isBrowserApp_isDisabled() {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        setupIsBrowserApp(true);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_noDomainUrls_isDisabled() {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        info.privateFlags = 0;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        setupIsBrowserApp(false);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_hasDomainUrls_isEnabled() {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        setupIsBrowserApp(false);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_hasDomainUrls_defaultState_entrySetToAsk() {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        setupIsBrowserApp(false);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getEntry()).isEqualTo(
+                mContext.getString(R.string.app_link_open_ask));
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_hasDomainUrls_askState_entrySetToAsk() {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        setupIsBrowserApp(false);
+        mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
+                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getEntry()).isEqualTo(
+                mContext.getString(R.string.app_link_open_ask));
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_hasDomainUrls_alwaysState_entrySetToAlways() {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        setupIsBrowserApp(false);
+        mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
+                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS, USER_ID);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getEntry()).isEqualTo(
+                mContext.getString(R.string.app_link_open_always));
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_hasDomainUrls_neverState_entrySetToNever() {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        info.privateFlags = ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        setupIsBrowserApp(false);
+        mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE_NAME,
+                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER, USER_ID);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getEntry()).isEqualTo(
+                mContext.getString(R.string.app_link_open_never));
+    }
+
+    private void setupIsBrowserApp(boolean isBrowserApp) {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = new ActivityInfo();
+        resolveInfo.handleAllWebDataURI = isBrowserApp;
+        AppLaunchSettingsBasePreferenceController.sBrowserIntent.setPackage(TEST_PACKAGE_NAME);
+        getShadowPackageManager().addResolveInfoForIntent(
+                AppLaunchSettingsBasePreferenceController.sBrowserIntent,
+                Arrays.asList(resolveInfo));
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
new file mode 100644
index 0000000..453b938
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/ClearDefaultsPreferenceControllerTest.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.hardware.usb.IUsbManager;
+import android.os.RemoteException;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowIUsbManager;
+import com.android.settingslib.applications.AppUtils;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowApplicationPackageManager.class,
+        ShadowIUsbManager.class})
+public class ClearDefaultsPreferenceControllerTest {
+
+    private static final int USER_ID = 10;
+    private static final String TEST_PACKAGE_NAME = "com.example.test";
+    private static final int TEST_PACKAGE_ID = 1;
+    private static final String TEST_LABEL = "Test App";
+    private static final String TEST_PATH = "TEST_PATH";
+    private static final String TEST_ACTIVITY = "TestActivity";
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<ClearDefaultsPreferenceController> mControllerHelper;
+    private ClearDefaultsPreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private IUsbManager mIUsbManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowIUsbManager.setInstance(mIUsbManager);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                ClearDefaultsPreferenceController.class);
+        mController = mControllerHelper.getController();
+
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+
+        mController.setAppEntry(entry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowIUsbManager.reset();
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void refreshUi_hasPreferredActivities_hasSummary() {
+        IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
+        filter.addCategory(Intent.CATEGORY_HOME);
+        ComponentName name = new ComponentName(TEST_PACKAGE_NAME, TEST_ACTIVITY);
+        getShadowPackageManager().addPreferredActivity(filter, 0, null, name);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary().toString()).isNotEmpty();
+    }
+
+    @Test
+    public void refreshUi_isDefaultBrowser_hasSummary() {
+        mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, USER_ID);
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary().toString()).isNotEmpty();
+    }
+
+    @Test
+    public void refreshUi_hasUsbDefaults_hasSummary() throws RemoteException {
+        when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, USER_ID)).thenReturn(true);
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary().toString()).isNotEmpty();
+    }
+
+    @Test
+    public void refreshUi_autoLaunchDisabled_hasNoSummary() {
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void performClick_hasUsbManager_hasPreferredActivities_clearsPreferredActivities() {
+        IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
+        filter.addCategory(Intent.CATEGORY_HOME);
+        ComponentName name = new ComponentName(TEST_PACKAGE_NAME, TEST_ACTIVITY);
+        getShadowPackageManager().addPreferredActivity(filter, 0, null, name);
+        assertThat(AppUtils.hasPreferredActivities(mContext.getPackageManager(),
+                TEST_PACKAGE_NAME)).isTrue();
+        mController.refreshUi();
+        mPreference.performClick();
+
+        assertThat(AppUtils.hasPreferredActivities(mContext.getPackageManager(),
+                TEST_PACKAGE_NAME)).isFalse();
+    }
+
+    @Test
+    public void performClick_hasUsbManager_isDefaultBrowser_clearsDefaultBrowser() {
+        mContext.getPackageManager().setDefaultBrowserPackageNameAsUser(TEST_PACKAGE_NAME, USER_ID);
+        assertThat(mContext.getPackageManager().getDefaultBrowserPackageNameAsUser(
+                USER_ID)).isNotNull();
+        mController.refreshUi();
+        mPreference.performClick();
+
+        assertThat(
+                mContext.getPackageManager().getDefaultBrowserPackageNameAsUser(USER_ID)).isNull();
+    }
+
+    @Test
+    public void performClick_hasUsbDefaults_clearsUsbDefaults() throws RemoteException {
+        when(mIUsbManager.hasDefaults(TEST_PACKAGE_NAME, USER_ID)).thenReturn(true);
+        mController.refreshUi();
+        mPreference.performClick();
+
+        verify(mIUsbManager).clearDefaults(TEST_PACKAGE_NAME, USER_ID);
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
new file mode 100644
index 0000000..412f782
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static android.content.pm.UserInfo.FLAG_ADMIN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.UserManager;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationsState;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowIconDrawableFactory;
+import com.android.car.settings.testutils.ShadowUserManager;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.ArrayList;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
+        ShadowIconDrawableFactory.class, ShadowApplicationsState.class})
+public class DomainAppPreferenceControllerTest {
+
+    private static final int USER_ID = 10;
+    private static final String TEST_PACKAGE_NAME = "com.android.test.package";
+    private static final int TEST_PACKAGE_ID = 1;
+    private static final String TEST_LABEL = "Test App";
+    private static final String TEST_PATH = "TEST_PATH";
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<DomainAppPreferenceController> mControllerHelper;
+    private DomainAppPreferenceController mController;
+    private Lifecycle mLifecycle;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private ApplicationsState mApplicationsState;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplicationsState.setInstance(mApplicationsState);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        getShadowUserManager().addProfile(USER_ID, USER_ID, "Test Name", /* profileFlags= */
+                FLAG_ADMIN);
+
+        when(mApplicationsState.newSession(any(), any())).thenReturn(
+                mock(ApplicationsState.Session.class));
+
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DomainAppPreferenceController.class);
+        mController = mControllerHelper.getController();
+
+        LifecycleOwner lifecycleOwner = () -> mLifecycle;
+        mLifecycle = new Lifecycle(lifecycleOwner);
+        mController.setLifecycle(mLifecycle);
+
+        mControllerHelper.setPreference(mPreferenceGroup);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationsState.reset();
+        ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
+    }
+
+    @Test
+    public void checkInitialized_noLifecycle_throwsError() {
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DomainAppPreferenceController.class);
+
+        assertThrows(IllegalStateException.class,
+                () -> mControllerHelper.setPreference(mPreferenceGroup));
+    }
+
+    @Test
+    public void onRebuildComplete_sessionLoadsValues_preferenceGroupHasValues() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+        entry.label = TEST_LABEL;
+        apps.add(entry);
+        mController.mApplicationStateCallbacks.onRebuildComplete(apps);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void performClick_startsApplicationLaunchSettingsFragmentWithPackageName() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        ApplicationsState.AppEntry entry = new ApplicationsState.AppEntry(mContext, info,
+                TEST_PACKAGE_ID);
+        entry.label = TEST_LABEL;
+        apps.add(entry);
+        mController.mApplicationStateCallbacks.onRebuildComplete(apps);
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        ArgumentCaptor<ApplicationLaunchSettingsFragment> captor = ArgumentCaptor.forClass(
+                ApplicationLaunchSettingsFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(captor.capture());
+
+        String pkgName = captor.getValue().getArguments().getString(
+                ApplicationLaunchSettingsFragment.ARG_PACKAGE_NAME);
+        assertThat(pkgName).isEqualTo(TEST_PACKAGE_NAME);
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceControllerTest.java
new file mode 100644
index 0000000..70478bc
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsPreferenceControllerTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+import java.util.Arrays;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class, ShadowCarUserManagerHelper.class})
+public class DomainUrlsPreferenceControllerTest {
+
+    private static final int USER_ID = 10;
+    private static final String TEST_PACKAGE_NAME = "com.example.test";
+    private static final int TEST_PACKAGE_ID = 1;
+    private static final String TEST_LABEL = "Test App";
+    private static final String TEST_PATH = "TEST_PATH";
+    private static final String TEST_ACTIVITY = "TestActivity";
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<DomainUrlsPreferenceController> mControllerHelper;
+    private DomainUrlsPreferenceController mController;
+    private ApplicationsState.AppEntry mAppEntry;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DomainUrlsPreferenceController.class);
+        mController = mControllerHelper.getController();
+
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = TEST_PACKAGE_NAME;
+        info.uid = TEST_PACKAGE_ID;
+        info.sourceDir = TEST_PATH;
+        mAppEntry = new ApplicationsState.AppEntry(mContext, info, TEST_PACKAGE_ID);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void refreshUi_isBrowserApp_isDisabled() {
+        setupIsBrowserApp(true);
+
+        mController.setAppEntry(mAppEntry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_isEnabled() {
+        setupIsBrowserApp(false);
+
+        mController.setAppEntry(mAppEntry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_isBrowserApp_summarySet() {
+        setupIsBrowserApp(true);
+
+        mController.setAppEntry(mAppEntry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isNotNull();
+    }
+
+    @Test
+    public void refreshUi_isNotBrowserApp_summarySet() {
+        setupIsBrowserApp(false);
+
+        mController.setAppEntry(mAppEntry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isNotNull();
+    }
+
+    @Test
+    public void performClick_isNotBrowserApp_opensDialog() {
+        setupIsBrowserApp(false);
+
+        mController.setAppEntry(mAppEntry);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mPreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class), eq(ConfirmationDialogFragment.TAG));
+    }
+
+    private void setupIsBrowserApp(boolean isBrowserApp) {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = new ActivityInfo();
+        resolveInfo.handleAllWebDataURI = isBrowserApp;
+        AppLaunchSettingsBasePreferenceController.sBrowserIntent.setPackage(TEST_PACKAGE_NAME);
+        getShadowPackageManager().addResolveInfoForIntent(
+                AppLaunchSettingsBasePreferenceController.sBrowserIntent,
+                Arrays.asList(resolveInfo));
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
new file mode 100644
index 0000000..fc0cbcf
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainUrlsUtilsTest.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.managedomainurls;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.IntentFilterVerificationInfo;
+import android.content.pm.PackageManager;
+import android.util.ArraySet;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.Arrays;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
+public class DomainUrlsUtilsTest {
+
+    private static final String TEST_PACKAGE = "com.test.android.Package";
+    private static final int USER_ID = 10;
+
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @Test
+    public void getDomainsSummary_domainStatusSetToNever_showNoneText() {
+        mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
+                PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER, USER_ID);
+
+        assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+                new ArraySet<>())).isEqualTo(mContext.getString(R.string.domain_urls_summary_none));
+    }
+
+    @Test
+    public void getDomainsSummary_domainStatusSet_noDomains_showNoneText() {
+        mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
+                PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
+
+        assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+                new ArraySet<>())).isEqualTo(mContext.getString(R.string.domain_urls_summary_none));
+    }
+
+    @Test
+    public void getDomainsSummary_domainStatusSet_oneDomain_showSingleDomain() {
+        mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
+                PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
+        ArraySet<String> domains = new ArraySet<>();
+        domains.add("test.domain.com");
+
+        assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+                domains)).isEqualTo(
+                mContext.getString(R.string.domain_urls_summary_one, domains.valueAt(0)));
+    }
+
+    @Test
+    public void getDomainsSummary_domainStatusSet_multipleDomain_showMultipleDomains() {
+        mContext.getPackageManager().updateIntentVerificationStatusAsUser(TEST_PACKAGE,
+                PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK, USER_ID);
+        ArraySet<String> domains = new ArraySet<>();
+        domains.add("test.domain.com");
+        domains.add("test.domain2.com");
+
+        assertThat(DomainUrlsUtils.getDomainsSummary(mContext, TEST_PACKAGE, USER_ID,
+                domains)).isEqualTo(
+                mContext.getString(R.string.domain_urls_summary_some, domains.valueAt(0)));
+    }
+
+    @Test
+    public void getHandledDomains_includeIntentFilterVerificationInfoDomains() {
+        PackageManager pm = mock(PackageManager.class);
+        String domain = "test.domain.com";
+        ArraySet<String> domains = new ArraySet<>();
+        domains.add(domain);
+        IntentFilterVerificationInfo info = new IntentFilterVerificationInfo(TEST_PACKAGE, domains);
+        when(pm.getIntentFilterVerifications(TEST_PACKAGE)).thenReturn(Arrays.asList(info));
+
+        assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).hasSize(1);
+        assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).contains(domain);
+    }
+
+    @Test
+    public void getHandledDomains_includeBrowsableIntentFiltersWithHttpDataScheme() {
+        PackageManager pm = mock(PackageManager.class);
+        String domain = "test.domain.com";
+        String port = "80";
+        IntentFilter filter = new IntentFilter();
+        filter.addCategory(Intent.CATEGORY_BROWSABLE);
+        filter.addDataScheme(IntentFilter.SCHEME_HTTP);
+        filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
+        when(pm.getAllIntentFilters(TEST_PACKAGE)).thenReturn(Arrays.asList(filter));
+
+        assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).hasSize(1);
+        assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).contains(domain);
+    }
+
+    @Test
+    public void getHandledDomains_includeBrowsableIntentFiltersWithHttpsDataScheme() {
+        PackageManager pm = mock(PackageManager.class);
+        String domain = "test.domain.com";
+        String port = "80";
+        IntentFilter filter = new IntentFilter();
+        filter.addCategory(Intent.CATEGORY_BROWSABLE);
+        filter.addDataScheme(IntentFilter.SCHEME_HTTPS);
+        filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
+        when(pm.getAllIntentFilters(TEST_PACKAGE)).thenReturn(Arrays.asList(filter));
+
+        assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).hasSize(1);
+        assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).contains(domain);
+    }
+
+    @Test
+    public void getHandledDomains_excludeBrowsableIntentFiltersWithOtherDataScheme() {
+        PackageManager pm = mock(PackageManager.class);
+        String domain = "test.domain.com";
+        String port = "80";
+        IntentFilter filter = new IntentFilter();
+        filter.addCategory(Intent.CATEGORY_BROWSABLE);
+        filter.addDataAuthority(new IntentFilter.AuthorityEntry(domain, port));
+        when(pm.getAllIntentFilters(TEST_PACKAGE)).thenReturn(Arrays.asList(filter));
+
+        assertThat(DomainUrlsUtils.getHandledDomains(pm, TEST_PACKAGE)).isEmpty();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
new file mode 100644
index 0000000..96143f9
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppEntryListManagerTest.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.os.Looper;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowApplicationsState;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Unit test for {@link AppEntryListManager}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationsState.class})
+public class AppEntryListManagerTest {
+
+    @Mock
+    private ApplicationsState mApplicationsState;
+    @Mock
+    private ApplicationsState.Session mSession;
+    @Mock
+    private AppEntryListManager.ExtraInfoBridge mExtraInfoBridge;
+    @Mock
+    private AppEntryListManager.AppFilterProvider mFilterProvider;
+    @Mock
+    private AppEntryListManager.Callback mCallback;
+    @Captor
+    private ArgumentCaptor<ApplicationsState.Callbacks> mSessionCallbacksCaptor;
+    @Captor
+    private ArgumentCaptor<List<AppEntry>> mEntriesCaptor;
+
+    private AppEntryListManager mAppEntryListManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplicationsState.setInstance(mApplicationsState);
+        when(mApplicationsState.newSession(mSessionCallbacksCaptor.capture())).thenReturn(mSession);
+        when(mApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
+
+        mAppEntryListManager = new AppEntryListManager(RuntimeEnvironment.application);
+        mAppEntryListManager.init(mExtraInfoBridge, mFilterProvider, mCallback);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationsState.reset();
+    }
+
+    @Test
+    public void start_resumesSession() {
+        mAppEntryListManager.start();
+
+        verify(mSession).onResume();
+    }
+
+    @Test
+    public void onPackageListChanged_loadsExtraInfo() {
+        mSessionCallbacksCaptor.getValue().onPackageListChanged();
+
+        verify(mExtraInfoBridge).loadExtraInfo(any());
+    }
+
+    @Test
+    public void onLoadEntriesComplete_loadsExtraInfo() {
+        mSessionCallbacksCaptor.getValue().onLoadEntriesCompleted();
+
+        verify(mExtraInfoBridge).loadExtraInfo(any());
+    }
+
+    @Test
+    public void stop_pausesSession() {
+        mAppEntryListManager.stop();
+
+        verify(mSession).onPause();
+    }
+
+    @Test
+    public void destroy_destroysSession() {
+        mAppEntryListManager.destroy();
+
+        verify(mSession).onDestroy();
+    }
+
+    @Test
+    public void forceUpdate_loadsExtraInfo() {
+        ArrayList<AppEntry> entries = new ArrayList<>();
+        entries.add(mock(AppEntry.class));
+        when(mSession.getAllApps()).thenReturn(entries);
+
+        mAppEntryListManager.forceUpdate();
+
+        verify(mExtraInfoBridge).loadExtraInfo(entries);
+    }
+
+    @Test
+    public void forceUpdate_forEntry_loadsExtraInfo() {
+        AppEntry entry = mock(AppEntry.class);
+
+        mAppEntryListManager.forceUpdate(entry);
+
+        verify(mExtraInfoBridge).loadExtraInfo(mEntriesCaptor.capture());
+        assertThat(mEntriesCaptor.getValue()).containsExactly(entry);
+    }
+
+    @Test
+    public void loadingFinished_rebuildsSession() {
+        ApplicationsState.AppFilter appFilter = mock(ApplicationsState.AppFilter.class);
+        when(mFilterProvider.getAppFilter()).thenReturn(appFilter);
+
+        mSessionCallbacksCaptor.getValue().onLoadEntriesCompleted();
+
+        verify(mSession).rebuild(eq(appFilter),
+                eq(ApplicationsState.ALPHA_COMPARATOR), /* foreground= */ eq(false));
+    }
+
+    @Test
+    public void onRebuildComplete_callsCallback() {
+        ArrayList<AppEntry> entries = new ArrayList<>();
+        entries.add(mock(AppEntry.class));
+
+        mSessionCallbacksCaptor.getValue().onRebuildComplete(entries);
+
+        verify(mCallback).onAppEntryListChanged(entries);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
new file mode 100644
index 0000000..b8e70f3
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppOpsPreferenceControllerTest.java
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Looper;
+import android.os.RemoteException;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAppOpsManager;
+import com.android.car.settings.testutils.ShadowApplicationsState;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/** Unit test for {@link AppOpsPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAppOpsManager.class, ShadowApplicationsState.class})
+public class AppOpsPreferenceControllerTest {
+
+    private static final int APP_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
+    private static final String PERMISSION = Manifest.permission.WRITE_SETTINGS;
+    private static final int NEGATIVE_MODE = AppOpsManager.MODE_ERRORED;
+
+    @Mock
+    private AppEntryListManager mAppEntryListManager;
+    @Mock
+    private ApplicationsState mApplicationsState;
+    @Captor
+    private ArgumentCaptor<AppEntryListManager.Callback> mCallbackCaptor;
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<AppOpsPreferenceController> mControllerHelper;
+    private AppOpsPreferenceController mController;
+
+    @Before
+    public void setUp() throws RemoteException {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplicationsState.setInstance(mApplicationsState);
+        when(mApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
+
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AppOpsPreferenceController.class);
+        mController = mControllerHelper.getController();
+        mController.init(APP_OP_CODE, PERMISSION, NEGATIVE_MODE);
+        mController.mAppEntryListManager = mAppEntryListManager;
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        verify(mAppEntryListManager).init(any(AppStateAppOpsBridge.class), any(),
+                mCallbackCaptor.capture());
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationsState.reset();
+    }
+
+    @Test
+    public void checkInitialized_noOpCode_throwsIllegalStateException() {
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AppOpsPreferenceController.class);
+        mController = mControllerHelper.getController();
+
+        mController.init(AppOpsManager.OP_NONE, PERMISSION, NEGATIVE_MODE);
+
+        assertThrows(IllegalStateException.class,
+                () -> mControllerHelper.setPreference(mPreferenceGroup));
+    }
+
+    @Test
+    public void checkInitialized_noPermission_throwsIllegalStateException() {
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AppOpsPreferenceController.class);
+        mController = mControllerHelper.getController();
+
+        mController.init(APP_OP_CODE, /* permission= */ null, NEGATIVE_MODE);
+
+        assertThrows(IllegalStateException.class,
+                () -> mControllerHelper.setPreference(mPreferenceGroup));
+    }
+
+    @Test
+    public void checkInitialized_noNegativeOpMode_throwsIllegalStateException() {
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AppOpsPreferenceController.class);
+        mController = mControllerHelper.getController();
+
+        mController.init(APP_OP_CODE, PERMISSION, AppOpsManager.MODE_DEFAULT);
+
+        assertThrows(IllegalStateException.class,
+                () -> mControllerHelper.setPreference(mPreferenceGroup));
+    }
+
+    @Test
+    public void onStart_startsListManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(mAppEntryListManager).start();
+    }
+
+    @Test
+    public void onStop_stopsListManager() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        verify(mAppEntryListManager).stop();
+    }
+
+    @Test
+    public void onDestroy_destroysListManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        verify(mAppEntryListManager).destroy();
+    }
+
+    @Test
+    public void onAppEntryListChanged_addsPreferencesForEntries() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        List<AppEntry> entries = Arrays.asList(
+                createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */ true),
+                createAppEntry("another.test.package", /* uid= */ 2, /* isOpPermissible= */ false));
+
+        mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+        assertThat(((TwoStatePreference) mPreferenceGroup.getPreference(0)).isChecked()).isTrue();
+        assertThat(((TwoStatePreference) mPreferenceGroup.getPreference(1)).isChecked()).isFalse();
+    }
+
+    @Test
+    public void onPreferenceChange_checkedState_setsAppOpModeAllowed() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        String packageName = "test.package";
+        int uid = 1;
+        List<AppEntry> entries = Collections.singletonList(
+                createAppEntry(packageName, uid, /* isOpPermissible= */ false));
+        mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+        TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+        appPref.performClick();
+
+        assertThat(getShadowAppOpsManager().getMode(APP_OP_CODE, uid, packageName)).isEqualTo(
+                AppOpsManager.MODE_ALLOWED);
+    }
+
+    @Test
+    public void onPreferenceChange_uncheckedState_setsNegativeAppOpMode() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        String packageName = "test.package";
+        int uid = 1;
+        List<AppEntry> entries = Collections.singletonList(
+                createAppEntry(packageName, uid, /* isOpPermissible= */ true));
+        mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+        TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+        appPref.performClick();
+
+        assertThat(getShadowAppOpsManager().getMode(APP_OP_CODE, uid, packageName)).isEqualTo(
+                NEGATIVE_MODE);
+    }
+
+    @Test
+    public void onPreferenceChange_updatesEntry() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        List<AppEntry> entries = Collections.singletonList(
+                createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */ false));
+        mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+        TwoStatePreference appPref = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+        appPref.performClick();
+
+        verify(mAppEntryListManager).forceUpdate(entries.get(0));
+    }
+
+    @Test
+    public void showSystem_updatesEntries() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mController.setShowSystem(true);
+
+        verify(mAppEntryListManager).forceUpdate();
+    }
+
+    @Test
+    public void appFilter_showingSystemApps_keepsSystemEntries() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mController.setShowSystem(true);
+        ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+                ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+        verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
+        ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+
+        AppEntry systemApp = createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */
+                false);
+        systemApp.info.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+        assertThat(filter.filterApp(systemApp)).isTrue();
+    }
+
+    @Test
+    public void appFilter_notShowingSystemApps_removesSystemEntries() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        // Not showing system by default.
+        ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+                ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+        verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
+        ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+
+        AppEntry systemApp = createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */
+                false);
+        systemApp.info.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+        assertThat(filter.filterApp(systemApp)).isFalse();
+    }
+
+    @Test
+    public void appFilter_removesNullExtraInfoEntries() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+                ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+        verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
+        ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+
+        AppEntry appEntry = createAppEntry("test.package", /* uid= */ 1, /* isOpPermissible= */
+                false);
+        appEntry.extraInfo = null;
+
+        assertThat(filter.filterApp(appEntry)).isFalse();
+    }
+
+    private AppEntry createAppEntry(String packageName, int uid, boolean isOpPermissible) {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = packageName;
+        info.uid = uid;
+
+        AppStateAppOpsBridge.PermissionState extraInfo = mock(
+                AppStateAppOpsBridge.PermissionState.class);
+        when(extraInfo.isPermissible()).thenReturn(isOpPermissible);
+
+        AppEntry appEntry = mock(AppEntry.class);
+        appEntry.info = info;
+        appEntry.label = packageName;
+        appEntry.extraInfo = extraInfo;
+
+        return appEntry;
+    }
+
+    private ShadowAppOpsManager getShadowAppOpsManager() {
+        return Shadow.extract(mContext.getSystemService(Context.APP_OPS_SERVICE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
new file mode 100644
index 0000000..718edde
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStateAppOpsBridgeTest.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.applications.specialaccess.AppStateAppOpsBridge.PermissionState;
+import com.android.car.settings.testutils.ShadowAppOpsManager;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.AdditionalMatchers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowUserManager;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/** Unit test for {@link AppStateAppOpsBridge}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowAppOpsManager.class})
+public class AppStateAppOpsBridgeTest {
+
+    private static final int APP_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
+    private static final String PERMISSION = Manifest.permission.WRITE_SETTINGS;
+
+    @Mock
+    private IPackageManager mIPackageManager;
+    @Mock
+    private ParceledListSlice<PackageInfo> mParceledPackages;
+    @Mock
+    private ParceledListSlice<PackageInfo> mParceledPackagesOtherProfile;
+
+    private List<PackageInfo> mPackages;
+
+    private Context mContext;
+    private AppOpsManager mAppOpsManager;
+    private AppStateAppOpsBridge mBridge;
+
+    @Before
+    public void setUp() throws RemoteException {
+        MockitoAnnotations.initMocks(this);
+        mPackages = new ArrayList<>();
+        when(mIPackageManager.getPackagesHoldingPermissions(
+                AdditionalMatchers.aryEq(new String[]{PERMISSION}),
+                eq(PackageManager.GET_PERMISSIONS),
+                eq(UserHandle.myUserId())))
+                .thenReturn(mParceledPackages);
+        when(mParceledPackages.getList()).thenReturn(mPackages);
+
+        mContext = RuntimeEnvironment.application;
+        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
+        mBridge = new AppStateAppOpsBridge(mContext, APP_OP_CODE, PERMISSION, mIPackageManager);
+    }
+
+    @Test
+    public void androidPackagesIgnored() throws RemoteException {
+        String packageName = "android";
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
+        AppEntry entry = createAppEntry(packageInfo);
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNull();
+    }
+
+    @Test
+    public void selfPackageIgnored() throws RemoteException {
+        String packageName = mContext.getPackageName();
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
+        AppEntry entry = createAppEntry(packageInfo);
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNull();
+    }
+
+    @Test
+    public void packagesNotRequestingPermissionIgnored() throws RemoteException {
+        String packageName = "test.package";
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        packageInfo.requestedPermissions = null;
+        mPackages.add(packageInfo);
+        when(mIPackageManager.isPackageAvailable(packageInfo.packageName,
+                UserHandle.myUserId())).thenReturn(true);
+        AppEntry entry = createAppEntry(packageInfo);
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNull();
+    }
+
+    @Test
+    public void unavailablePackageIgnored() throws RemoteException {
+        String packageName = "test.package";
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
+        when(mIPackageManager.isPackageAvailable(packageInfo.packageName,
+                UserHandle.myUserId())).thenReturn(false);
+        AppEntry entry = createAppEntry(packageInfo);
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNull();
+    }
+
+    @Test
+    public void loadsAppOpsExtraInfo_modeAllowed_isPermissible() throws RemoteException {
+        String packageName = "test.package";
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        addPackageWithPermission(packageInfo, AppOpsManager.MODE_ALLOWED);
+        AppEntry entry = createAppEntry(packageInfo);
+        assertThat(entry.extraInfo).isNull();
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNotNull();
+        assertThat(((PermissionState) entry.extraInfo).isPermissible()).isTrue();
+    }
+
+    @Test
+    public void loadsAppOpsExtraInfo_modeDefault_isPermissible() throws RemoteException {
+        String packageName = "test.package";
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        addPackageWithPermission(packageInfo, AppOpsManager.MODE_DEFAULT);
+        AppEntry entry = createAppEntry(packageInfo);
+        assertThat(entry.extraInfo).isNull();
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNotNull();
+        assertThat(((PermissionState) entry.extraInfo).isPermissible()).isTrue();
+    }
+
+    @Test
+    public void loadsAppOpsExtraInfo_modeIgnored_isNotPermissible() throws RemoteException {
+        String packageName = "test.package";
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        addPackageWithPermission(packageInfo, AppOpsManager.MODE_IGNORED);
+        AppEntry entry = createAppEntry(packageInfo);
+        assertThat(entry.extraInfo).isNull();
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNotNull();
+        assertThat(((PermissionState) entry.extraInfo).isPermissible()).isFalse();
+    }
+
+    @Test
+    public void loadsAppOpsExtraInfo_multipleApps() throws RemoteException {
+        String packageName1 = "test.package1";
+        int uid1 = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo1 = createPackageInfo(packageName1, uid1);
+        addPackageWithPermission(packageInfo1, AppOpsManager.MODE_ALLOWED);
+        AppEntry entry1 = createAppEntry(packageInfo1);
+
+        String packageName2 = "test.package2";
+        int uid2 = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 2);
+        PackageInfo packageInfo2 = createPackageInfo(packageName2, uid2);
+        addPackageWithPermission(packageInfo2, AppOpsManager.MODE_ALLOWED);
+        AppEntry entry2 = createAppEntry(packageInfo2);
+
+        mBridge.loadExtraInfo(Arrays.asList(entry1, entry2));
+
+        assertThat(entry1.extraInfo).isNotNull();
+        assertThat(entry2.extraInfo).isNotNull();
+    }
+
+    @Test
+    public void loadsAppOpExtraInfo_multipleProfiles() throws RemoteException {
+        String packageName1 = "test.package1";
+        int uid1 = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo1 = createPackageInfo(packageName1, uid1);
+        addPackageWithPermission(packageInfo1, AppOpsManager.MODE_ALLOWED);
+        AppEntry entry1 = createAppEntry(packageInfo1);
+
+        // Add a package for another profile.
+        int otherUserId = UserHandle.myUserId() + 1;
+        String packageName2 = "test.package2";
+        int uid2 = UserHandle.getUid(otherUserId, /* appId= */ 2);
+        PackageInfo packageInfo2 = createPackageInfo(packageName2, uid2);
+        when(mIPackageManager.getPackagesHoldingPermissions(
+                AdditionalMatchers.aryEq(new String[]{PERMISSION}),
+                eq(PackageManager.GET_PERMISSIONS),
+                eq(otherUserId)))
+                .thenReturn(mParceledPackagesOtherProfile);
+        when(mParceledPackagesOtherProfile.getList()).thenReturn(
+                Collections.singletonList(packageInfo2));
+        when(mIPackageManager.isPackageAvailable(packageInfo2.packageName,
+                otherUserId)).thenReturn(true);
+        mAppOpsManager.setMode(APP_OP_CODE, packageInfo2.applicationInfo.uid,
+                packageInfo2.packageName, AppOpsManager.MODE_ALLOWED);
+        AppEntry entry2 = createAppEntry(packageInfo2);
+
+        getShadowUserManager().addUserProfile(UserHandle.of(otherUserId));
+        // Recreate the bridge so it has all user profiles.
+        mBridge = new AppStateAppOpsBridge(mContext, APP_OP_CODE, PERMISSION, mIPackageManager);
+
+        mBridge.loadExtraInfo(Arrays.asList(entry1, entry2));
+
+        assertThat(entry1.extraInfo).isNotNull();
+        assertThat(entry2.extraInfo).isNotNull();
+    }
+
+    @Test
+    public void appEntryNotIncluded_extraInfoCleared() {
+        String packageName = "test.package";
+        int uid = UserHandle.getUid(UserHandle.myUserId(), /* appId= */ 1);
+        PackageInfo packageInfo = createPackageInfo(packageName, uid);
+        AppEntry entry = createAppEntry(packageInfo);
+        entry.extraInfo = new Object();
+
+        mBridge.loadExtraInfo(Collections.singletonList(entry));
+
+        assertThat(entry.extraInfo).isNull();
+    }
+
+    private PackageInfo createPackageInfo(String packageName, int uid) {
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = packageName;
+        applicationInfo.uid = uid;
+
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = packageName;
+        packageInfo.applicationInfo = applicationInfo;
+        packageInfo.requestedPermissions = new String[]{PERMISSION};
+
+        return packageInfo;
+    }
+
+    private void addPackageWithPermission(PackageInfo packageInfo, int mode)
+            throws RemoteException {
+        mPackages.add(packageInfo);
+        when(mIPackageManager.isPackageAvailable(packageInfo.packageName,
+                UserHandle.myUserId())).thenReturn(true);
+        mAppOpsManager.setMode(APP_OP_CODE, packageInfo.applicationInfo.uid,
+                packageInfo.packageName, mode);
+    }
+
+    private AppEntry createAppEntry(PackageInfo packageInfo) {
+        AppEntry appEntry = mock(AppEntry.class);
+        appEntry.info = packageInfo.applicationInfo;
+        return appEntry;
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadows.shadowOf(UserManager.get(mContext));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
new file mode 100644
index 0000000..382917c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/AppStatePremiumSmsBridgeTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.ApplicationInfo;
+import android.os.RemoteException;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.internal.telephony.ISms;
+import com.android.internal.telephony.SmsUsageMonitor;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+
+/** Unit test for {@link AppStatePremiumSmsBridge}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AppStatePremiumSmsBridgeTest {
+
+    @Mock
+    private ISms mSmsManager;
+    private AppStatePremiumSmsBridge mBridge;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mBridge = new AppStatePremiumSmsBridge(mSmsManager);
+    }
+
+    @Test
+    public void loadExtraInfo() throws RemoteException {
+        String package1 = "test.package1";
+        AppEntry appEntry1 = createAppEntry(package1);
+        int value1 = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW;
+        when(mSmsManager.getPremiumSmsPermission(package1)).thenReturn(value1);
+
+        String package2 = "test.package2";
+        AppEntry appEntry2 = createAppEntry(package2);
+        int value2 = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW;
+        when(mSmsManager.getPremiumSmsPermission(package2)).thenReturn(value2);
+
+        mBridge.loadExtraInfo(Arrays.asList(appEntry1, appEntry2));
+
+        assertThat(appEntry1.extraInfo).isEqualTo(value1);
+        assertThat(appEntry2.extraInfo).isEqualTo(value2);
+    }
+
+    private AppEntry createAppEntry(String packageName) {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = packageName;
+
+        AppEntry appEntry = mock(AppEntry.class);
+        appEntry.info = info;
+        appEntry.label = packageName;
+
+        return appEntry;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..de6cd2e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/MoreSpecialAccessPreferenceControllerTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.Collections;
+
+/** Unit test for {@link MoreSpecialAccessPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
+public class MoreSpecialAccessPreferenceControllerTest {
+
+    private static final String PACKAGE = "test.package";
+
+    private Context mContext;
+    private Preference mPreference;
+    private Intent mIntent;
+    private ResolveInfo mResolveInfo;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mIntent = new Intent(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES);
+        mIntent.setPackage(PACKAGE);
+
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = PACKAGE;
+        applicationInfo.name = "TestClass";
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.applicationInfo = applicationInfo;
+
+        mResolveInfo = new ResolveInfo();
+        mResolveInfo.activityInfo = activityInfo;
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_noPermissionController_returnsUnsupportedOnDevice() {
+        PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        MoreSpecialAccessPreferenceController.class, mPreference);
+
+        assertThat(controllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_noResolvedActivity_returnsUnsupportedOnDevice() {
+        getShadowApplicationPackageManager().setPermissionControllerPackageName(PACKAGE);
+
+        PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        MoreSpecialAccessPreferenceController.class, mPreference);
+
+        assertThat(controllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_resolvedActivity_returnsAvailable() {
+        getShadowApplicationPackageManager().setPermissionControllerPackageName(PACKAGE);
+        getShadowApplicationPackageManager().setResolveInfosForIntent(mIntent,
+                Collections.singletonList(mResolveInfo));
+
+        PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        MoreSpecialAccessPreferenceController.class, mPreference);
+
+        assertThat(controllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                AVAILABLE);
+    }
+
+    @Test
+    public void preferenceClicked_startsResolvedActivity() {
+        getShadowApplicationPackageManager().setPermissionControllerPackageName(PACKAGE);
+        getShadowApplicationPackageManager().setResolveInfosForIntent(mIntent,
+                Collections.singletonList(mResolveInfo));
+
+        PreferenceControllerTestHelper<MoreSpecialAccessPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        MoreSpecialAccessPreferenceController.class, mPreference);
+        controllerHelper.markState(Lifecycle.State.STARTED);
+
+        mPreference.performClick();
+
+        Intent started = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(started.getAction()).isEqualTo(Intent.ACTION_MANAGE_SPECIAL_APP_ACCESSES);
+        assertThat(started.getPackage()).isEqualTo(PACKAGE);
+    }
+
+    private ShadowApplicationPackageManager getShadowApplicationPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..a8cd5c9
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceControllerTest.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.Manifest;
+import android.app.AutomaticZenRule;
+import android.app.NotificationManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.service.notification.NotificationListenerService;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowNotificationManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link NotificationAccessPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class, ShadowNotificationManager.class})
+public class NotificationAccessPreferenceControllerTest {
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<NotificationAccessPreferenceController>
+            mControllerHelper;
+    private NotificationAccessPreferenceController mController;
+
+    private ServiceInfo mListenerServiceInfo;
+    private ComponentName mListenerComponent;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                NotificationAccessPreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+
+        mListenerServiceInfo = new ServiceInfo();
+        mListenerServiceInfo.permission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
+        mListenerServiceInfo.packageName = "com.android.test.package";
+        mListenerServiceInfo.name = "SomeListenerService";
+        mListenerServiceInfo.nonLocalizedLabel = "label";
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.uid = 123;
+        mListenerServiceInfo.applicationInfo = applicationInfo;
+
+        mListenerComponent = new ComponentName(mListenerServiceInfo.packageName,
+                mListenerServiceInfo.name);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void onStart_loadsListenerServices() {
+        addNotificationListenerService(mListenerServiceInfo);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onStart_serviceAccessGranted_setsPreferenceChecked() {
+        addNotificationListenerService(mListenerServiceInfo);
+        mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
+                mListenerComponent, /* granted= */ true);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+        assertThat(preference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onStart_serviceAccessNotGranted_setsPreferenceUnchecked() {
+        addNotificationListenerService(mListenerServiceInfo);
+        mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
+                mListenerComponent, /* granted= */ false);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+        assertThat(preference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void preferenceClicked_serviceAccessGranted_showsRevokeConfirmDialog() {
+        addNotificationListenerService(mListenerServiceInfo);
+        mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
+                mListenerComponent, /* granted= */ true);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+        preference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(any(
+                ConfirmationDialogFragment.class),
+                eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
+    }
+
+    @Test
+    public void preferenceClicked_serviceAccessNotGranted_showsGrantConfirmDialog() {
+        addNotificationListenerService(mListenerServiceInfo);
+        mContext.getSystemService(NotificationManager.class).setNotificationListenerAccessGranted(
+                mListenerComponent, /* granted= */ false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+
+        preference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(any(
+                ConfirmationDialogFragment.class),
+                eq(NotificationAccessPreferenceController.GRANT_CONFIRM_DIALOG_TAG));
+    }
+
+    @Test
+    public void revokeConfirmed_revokesNotificationAccess() {
+        addNotificationListenerService(mListenerServiceInfo);
+        NotificationManager notificationManager = mContext.getSystemService(
+                NotificationManager.class);
+        notificationManager.setNotificationListenerAccessGranted(
+                mListenerComponent, /* granted= */ true);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(notificationManager.isNotificationListenerAccessGranted(
+                mListenerComponent)).isFalse();
+    }
+
+    @Test
+    public void revokeConfirmed_notificationPolicyAccessNotGranted_removesAutomaticZenRules() {
+        addNotificationListenerService(mListenerServiceInfo);
+        NotificationManager notificationManager = mContext.getSystemService(
+                NotificationManager.class);
+        notificationManager.setNotificationListenerAccessGranted(
+                mListenerComponent, /* granted= */ true);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(NotificationAccessPreferenceController.REVOKE_CONFIRM_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        // Add a rule to be removed on access revoke.
+        notificationManager.addAutomaticZenRule(mock(AutomaticZenRule.class));
+        assertThat(notificationManager.getAutomaticZenRules()).isNotEmpty();
+
+        notificationManager.setNotificationPolicyAccessGranted(
+                mListenerServiceInfo.packageName, /* granted= */ false);
+        dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
+
+        Robolectric.flushBackgroundThreadScheduler();
+        Robolectric.flushForegroundThreadScheduler();
+
+        assertThat(notificationManager.getAutomaticZenRules()).isEmpty();
+    }
+
+    @Test
+    public void grantConfirmed_grantsNotificationAccess() {
+        addNotificationListenerService(mListenerServiceInfo);
+        NotificationManager notificationManager = mContext.getSystemService(
+                NotificationManager.class);
+        notificationManager.setNotificationListenerAccessGranted(
+                mListenerComponent, /* granted= */ false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        TwoStatePreference preference = (TwoStatePreference) mPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(NotificationAccessPreferenceController.GRANT_CONFIRM_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(/* dialog= */ null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(notificationManager.isNotificationListenerAccessGranted(
+                mListenerComponent)).isTrue();
+    }
+
+    private void addNotificationListenerService(ServiceInfo serviceInfo) {
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.serviceInfo = serviceInfo;
+        getShadowPackageManager().addResolveInfoForIntent(
+                new Intent(NotificationListenerService.SERVICE_INTERFACE), resolveInfo);
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.packageName = serviceInfo.packageName;
+        packageInfo.applicationInfo = serviceInfo.applicationInfo;
+        getShadowPackageManager().addPackage(packageInfo);
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..38c1678
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/applications/specialaccess/PremiumSmsAccessPreferenceControllerTest.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.applications.specialaccess;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Looper;
+import android.os.RemoteException;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowApplicationsState;
+import com.android.car.settings.testutils.ShadowISms;
+import com.android.internal.telephony.ISms;
+import com.android.internal.telephony.SmsUsageMonitor;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.ApplicationsState.AppEntry;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/** Unit test for {@link PremiumSmsAccessPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationsState.class, ShadowISms.class})
+public class PremiumSmsAccessPreferenceControllerTest {
+
+    @Mock
+    private AppEntryListManager mAppEntryListManager;
+    @Mock
+    private ApplicationsState mApplicationsState;
+    @Mock
+    private ISms mISms;
+    @Captor
+    private ArgumentCaptor<AppEntryListManager.Callback> mCallbackCaptor;
+
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<PremiumSmsAccessPreferenceController> mControllerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplicationsState.setInstance(mApplicationsState);
+        when(mApplicationsState.getBackgroundLooper()).thenReturn(Looper.getMainLooper());
+        ShadowISms.setISms(mISms);
+
+        Context context = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                PremiumSmsAccessPreferenceController.class, mPreferenceGroup);
+        mControllerHelper.getController().mAppEntryListManager = mAppEntryListManager;
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        verify(mAppEntryListManager).init(any(AppStatePremiumSmsBridge.class), any(),
+                mCallbackCaptor.capture());
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationsState.reset();
+        ShadowISms.reset();
+    }
+
+    @Test
+    public void onStart_startsListManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(mAppEntryListManager).start();
+    }
+
+    @Test
+    public void onStop_stopsListManager() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        verify(mAppEntryListManager).stop();
+    }
+
+    @Test
+    public void onDestroy_destroysListManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        verify(mAppEntryListManager).destroy();
+    }
+
+    @Test
+    public void onAppEntryListChanged_addsPreferencesForEntries() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        List<AppEntry> entries = Arrays.asList(
+                createAppEntry("test.package", /* uid= */ 1,
+                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW),
+                createAppEntry("another.test.package", /* uid= */ 2,
+                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+
+        mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+        assertThat(((ListPreference) mPreferenceGroup.getPreference(0)).getValue()).isEqualTo(
+                String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW));
+        assertThat(((ListPreference) mPreferenceGroup.getPreference(1)).getValue()).isEqualTo(
+                String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+    }
+
+    @Test
+    public void onPreferenceChange_setsPremiumSmsPermission() throws RemoteException {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        String packageName = "test.package";
+        List<AppEntry> entries = Collections.singletonList(
+                createAppEntry(packageName, /* uid= */ 1,
+                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+        mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+        Preference appPref = mPreferenceGroup.getPreference(0);
+        int updatedValue = SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER;
+
+        appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
+                String.valueOf(updatedValue));
+
+        verify(mISms).setPremiumSmsPermission(packageName, updatedValue);
+    }
+
+    @Test
+    public void onPreferenceChange_updatesEntry() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        List<AppEntry> entries = Collections.singletonList(
+                createAppEntry("test.package", /* uid= */ 1,
+                        SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW));
+        mCallbackCaptor.getValue().onAppEntryListChanged(entries);
+        Preference appPref = mPreferenceGroup.getPreference(0);
+
+        appPref.getOnPreferenceChangeListener().onPreferenceChange(appPref,
+                String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER));
+
+        verify(mAppEntryListManager).forceUpdate(entries.get(0));
+    }
+
+    @Test
+    public void appFilter_removesUnknownStates() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        ArgumentCaptor<AppEntryListManager.AppFilterProvider> filterCaptor =
+                ArgumentCaptor.forClass(AppEntryListManager.AppFilterProvider.class);
+        verify(mAppEntryListManager).init(any(), filterCaptor.capture(), any());
+        ApplicationsState.AppFilter filter = filterCaptor.getValue().getAppFilter();
+        AppEntry unknownStateApp = createAppEntry("test.package", /* uid= */ 1,
+                SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN);
+
+        assertThat(filter.filterApp(unknownStateApp)).isFalse();
+    }
+
+    private AppEntry createAppEntry(String packageName, int uid, int smsState) {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = packageName;
+        info.uid = uid;
+
+        AppEntry appEntry = mock(AppEntry.class);
+        appEntry.info = info;
+        appEntry.label = packageName;
+        appEntry.extraInfo = smsState;
+
+        return appEntry;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceControllerTest.java
new file mode 100644
index 0000000..eb35004
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothAddressPreferenceControllerTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link BluetoothAddressPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothAddressPreferenceControllerTest {
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void refreshUi_setsAddress() {
+        Context context = RuntimeEnvironment.application;
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        String address = "address";
+        getShadowBluetoothAdapter().setAddress(address);
+
+        // Construct controller.
+        Preference preference = new Preference(context);
+        PreferenceControllerTestHelper<BluetoothAddressPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(context,
+                        BluetoothAddressPreferenceController.class,
+                        preference);
+        controllerHelper.markState(Lifecycle.State.CREATED);
+
+        controllerHelper.getController().refreshUi();
+
+        assertThat(preference.getTitle()).isEqualTo(
+                context.getString(R.string.bluetooth_vehicle_mac_address, address));
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
new file mode 100644
index 0000000..e7f518a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothBondedDevicesPreferenceControllerTest.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.Arrays;
+
+/** Unit test for {@link BluetoothBondedDevicesPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothBondedDevicesPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private CachedBluetoothDevice mBondedCachedDevice;
+    @Mock
+    private BluetoothDevice mBondedDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<BluetoothBondedDevicesPreferenceController>
+            mControllerHelper;
+    private BluetoothBondedDevicesPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        when(mBondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+        when(mBondedCachedDevice.getDevice()).thenReturn(mBondedDevice);
+        BluetoothDevice unbondedDevice = mock(BluetoothDevice.class);
+        when(unbondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        CachedBluetoothDevice unbondedCachedDevice = mock(CachedBluetoothDevice.class);
+        when(unbondedCachedDevice.getDevice()).thenReturn(unbondedDevice);
+
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Arrays.asList(mBondedCachedDevice, unbondedCachedDevice));
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                BluetoothBondedDevicesPreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void showsOnlyBondedDevices() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(devicePreference.getCachedDevice()).isEqualTo(mBondedCachedDevice);
+    }
+
+    @Test
+    public void onDeviceBondStateChanged_refreshesUi() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        // Unbond the only bonded device.
+        when(mBondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        when(mBondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        mController.onDeviceBondStateChanged(mBondedCachedDevice, BluetoothDevice.BOND_NONE);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onDeviceClicked_notConnected_connectsToDevice() {
+        when(mBondedCachedDevice.isConnected()).thenReturn(false);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        verify(mBondedCachedDevice).connect(/* connectAllProfiles= */ true);
+    }
+
+    @Test
+    public void onDeviceClicked_connected_showsDisconnectConfirmDialog() {
+        when(mBondedCachedDevice.isConnected()).thenReturn(true);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(BluetoothDisconnectConfirmDialogFragment.class), isNull());
+    }
+
+    @Test
+    public void devicePreferenceButtonClicked_noUserRestrictions_launchesDetailsFragment() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(false);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(devicePreference.isActionShown()).isTrue();
+        devicePreference.performButtonClick();
+
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(
+                any(BluetoothDeviceDetailsFragment.class));
+    }
+
+    @Test
+    public void devicePreferenceButton_disallowConfigBluetooth_actionStaysHidden() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(devicePreference.isActionShown()).isFalse();
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceControllerTest.java
new file mode 100644
index 0000000..68a901a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceAddressPreferenceControllerTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link BluetoothAddressPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothDeviceAddressPreferenceControllerTest {
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void refreshUi_setsAddress() {
+        // Make sure controller is available.
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        String address = "address";
+        CachedBluetoothDevice device = mock(CachedBluetoothDevice.class);
+        when(device.getAddress()).thenReturn(address);
+
+        // Construct controller.
+        Context context = RuntimeEnvironment.application;
+        Preference preference = new Preference(context);
+        PreferenceControllerTestHelper<BluetoothDeviceAddressPreferenceController>
+                controllerHelper = new PreferenceControllerTestHelper<>(context,
+                BluetoothDeviceAddressPreferenceController.class);
+        controllerHelper.getController().setCachedDevice(device);
+        controllerHelper.setPreference(preference);
+        controllerHelper.markState(Lifecycle.State.CREATED);
+
+        controllerHelper.getController().refreshUi();
+
+        assertThat(preference.getTitle()).isEqualTo(
+                context.getString(R.string.bluetooth_device_mac_address, address));
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
new file mode 100644
index 0000000..cf43354
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+/** Unit test for {@link BluetoothDeviceDetailsFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothDeviceDetailsFragmentTest {
+
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private Context mContext;
+    private FragmentController<BluetoothDeviceDetailsFragment> mFragmentController;
+    private BluetoothDeviceDetailsFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
+                null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        String address = "00:11:22:33:AA:BB";
+        BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address);
+        when(mCachedDeviceManager.findDevice(device)).thenReturn(mCachedDevice);
+        when(mCachedDevice.getAddress()).thenReturn(address);
+
+        mFragment = BluetoothDeviceDetailsFragment.newInstance(mCachedDevice);
+        mFragmentController = FragmentController.of(mFragment);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void forgetButtonClicked_unpairsDevice() {
+        mFragmentController.setup();
+
+        findForgetButton(mFragment.requireActivity()).performClick();
+
+        verify(mCachedDevice).unpair();
+    }
+
+    @Test
+    public void forgetButtonClicked_goesBack() {
+        mFragmentController.setup();
+
+        findForgetButton(mFragment.requireActivity()).performClick();
+
+        assertThat(
+                ((BaseTestActivity) mFragment.requireActivity()).getOnBackPressedFlag()).isTrue();
+    }
+
+    @Test
+    public void connectionButtonClicked_deviceConnected_disconnectsDevice() {
+        when(mCachedDevice.isConnected()).thenReturn(true);
+        mFragmentController.setup();
+
+        findConnectionButton(mFragment.requireActivity()).performClick();
+
+        verify(mCachedDevice).disconnect();
+    }
+
+    @Test
+    public void connectionButtonClicked_deviceNotConnected_connectsDevice() {
+        when(mCachedDevice.isConnected()).thenReturn(false);
+        mFragmentController.setup();
+
+        findConnectionButton(mFragment.requireActivity()).performClick();
+
+        verify(mCachedDevice).connect(/* connectAllProfiles= */ true);
+    }
+
+    @Test
+    public void deviceConnected_connectionButtonShowsDisconnect() {
+        when(mCachedDevice.isConnected()).thenReturn(true);
+        mFragmentController.setup();
+
+        assertThat(findConnectionButton(mFragment.requireActivity()).getText()).isEqualTo(
+                mContext.getString(R.string.disconnect));
+    }
+
+    @Test
+    public void deviceNotConnected_connectionButtonShowsConnect() {
+        when(mCachedDevice.isConnected()).thenReturn(false);
+        mFragmentController.setup();
+
+        assertThat(findConnectionButton(mFragment.requireActivity()).getText()).isEqualTo(
+                mContext.getString(R.string.connect));
+    }
+
+    @Test
+    public void deviceBusy_connectionButtonDisabled() {
+        when(mCachedDevice.isBusy()).thenReturn(true);
+        mFragmentController.setup();
+
+        assertThat(findConnectionButton(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void deviceNotBusy_connectionButtonEnabled() {
+        when(mCachedDevice.isBusy()).thenReturn(false);
+        mFragmentController.setup();
+
+        assertThat(findConnectionButton(mFragment.requireActivity()).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onStart_listensForDeviceAttributesChanges() {
+        mFragmentController.create().start();
+
+        verify(mCachedDevice).registerCallback(any(CachedBluetoothDevice.Callback.class));
+    }
+
+    @Test
+    public void onStop_stopsListeningForDeviceAttributeChanges() {
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        mFragmentController.create().start();
+        verify(mCachedDevice).registerCallback(callbackCaptor.capture());
+
+        mFragmentController.stop();
+
+        verify(mCachedDevice).unregisterCallback(callbackCaptor.getValue());
+    }
+
+    @Test
+    public void deviceAttributesChanged_updatesConnectionButtonState() {
+        when(mCachedDevice.isBusy()).thenReturn(true);
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        mFragmentController.create().start();
+        assertThat(findConnectionButton(mFragment.requireActivity()).isEnabled()).isFalse();
+        verify(mCachedDevice).registerCallback(callbackCaptor.capture());
+
+        when(mCachedDevice.isBusy()).thenReturn(false);
+        callbackCaptor.getValue().onDeviceAttributesChanged();
+
+        assertThat(findConnectionButton(mFragment.requireActivity()).isEnabled()).isTrue();
+    }
+
+    private Button findForgetButton(Activity activity) {
+        return activity.findViewById(R.id.action_button2);
+    }
+
+    private Button findConnectionButton(Activity activity) {
+        return activity.findViewById(R.id.action_button1);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
new file mode 100644
index 0000000..09790b0
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceNamePreferenceControllerTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.StringJoiner;
+
+/** Unit test for {@link BluetoothDeviceNamePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothDeviceNamePreferenceControllerTest {
+
+    @Mock
+    private CachedBluetoothDevice mDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<BluetoothDeviceNamePreferenceController>
+            mControllerHelper;
+    private BluetoothDeviceNamePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreference = new Preference(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                BluetoothDeviceNamePreferenceController.class);
+        mController = mControllerHelper.getController();
+        mController.setCachedDevice(mDevice);
+        mControllerHelper.setPreference(mPreference);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void refreshUi_setsDeviceNameAsTitle() {
+        String name = "name";
+        when(mDevice.getName()).thenReturn(name);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getTitle()).isEqualTo(name);
+    }
+
+    @Test
+    public void refreshUi_setsCarConnectionSummaryAsSummary() {
+        String summary = "summary";
+        when(mDevice.getCarConnectionSummary()).thenReturn(summary);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(summary);
+    }
+
+    @Test
+    public void refreshUi_setsIcon() {
+        when(mDevice.getBtClass()).thenReturn(
+                new BluetoothClass(BluetoothClass.Device.Major.PHONE));
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getIcon()).isNotNull();
+    }
+
+    @Test
+    public void refreshUi_hearingAidDevice_setsBatteryStatusesAsSummary() {
+        String summary = "summary";
+        when(mDevice.getCarConnectionSummary()).thenReturn(summary);
+        String otherSummary = "other summary";
+        when(mCachedDeviceManager.getSubDeviceSummary(mDevice)).thenReturn("other summary");
+
+        mController.refreshUi();
+
+        String expected = new StringJoiner(System.lineSeparator()).add(summary).add(
+                otherSummary).toString();
+        assertThat(mPreference.getSummary()).isEqualTo(expected);
+    }
+
+    @Test
+    public void preferenceClicked_launchesRenameDialog() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mPreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(RemoteRenameDialogFragment.class), eq(RemoteRenameDialogFragment.TAG));
+    }
+
+    @Test
+    public void preferenceClicked_handled() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        assertThat(
+                mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference)).isTrue();
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragmentTest.java
new file mode 100644
index 0000000..d6c877b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerFragmentTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.View;
+import android.widget.ProgressBar;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+/** Unit test for {@link BluetoothDevicePickerFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothDevicePickerFragmentTest {
+
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private FragmentController<BluetoothDevicePickerFragment> mFragmentController;
+    private BluetoothDevicePickerFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+
+        mFragment = new BluetoothDevicePickerFragment();
+        mFragmentController = FragmentController.of(mFragment);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void onStart_setsBluetoothManagerForegroundActivity() {
+        mFragmentController.create().start();
+
+        assertThat(mLocalBluetoothManager.getForegroundActivity()).isEqualTo(
+                mFragment.requireActivity());
+    }
+
+    @Test
+    public void onStart_showsProgressBar() {
+        mFragmentController.create();
+        ProgressBar progressBar = findProgressBar(mFragment.requireActivity());
+        progressBar.setVisibility(View.GONE);
+
+        mFragmentController.start();
+
+        assertThat(progressBar.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onStop_clearsBluetoothManagerForegroundActivity() {
+        mFragmentController.create().start().resume().pause().stop();
+
+        assertThat(mLocalBluetoothManager.getForegroundActivity()).isNull();
+    }
+
+    @Test
+    public void onStop_hidesProgressBar() {
+        mFragmentController.setup().onPause();
+        ProgressBar progressBar = findProgressBar(mFragment.requireActivity());
+        progressBar.setVisibility(View.VISIBLE);
+
+        mFragmentController.stop();
+
+        assertThat(progressBar.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    private ProgressBar findProgressBar(Activity activity) {
+        return activity.findViewById(R.id.progress_bar);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
new file mode 100644
index 0000000..1c4934a4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePickerPreferenceControllerTest.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothDevicePicker;
+import android.bluetooth.BluetoothUuid;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.ParcelUuid;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.Arrays;
+
+/** Unit test for {@link BluetoothDevicePickerPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothDevicePickerPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private CachedBluetoothDevice mUnbondedCachedDevice;
+    @Mock
+    private BluetoothDevice mUnbondedDevice;
+    @Mock
+    private CachedBluetoothDevice mBondedCachedDevice;
+    @Mock
+    private BluetoothDevice mBondedDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<BluetoothDevicePickerPreferenceController>
+            mControllerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        when(mUnbondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        when(mUnbondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        when(mUnbondedCachedDevice.getDevice()).thenReturn(mUnbondedDevice);
+        when(mBondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+        when(mBondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+        when(mBondedCachedDevice.getDevice()).thenReturn(mBondedDevice);
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Arrays.asList(mUnbondedCachedDevice, mBondedCachedDevice));
+        // Make bonded device appear first in the list.
+        when(mBondedCachedDevice.compareTo(mUnbondedCachedDevice)).thenReturn(-1);
+        when(mUnbondedCachedDevice.compareTo(mBondedCachedDevice)).thenReturn(1);
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                BluetoothDevicePickerPreferenceController.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void checkInitialized_noLaunchIntentSet_throwsIllegalStateException() {
+        assertThrows(IllegalStateException.class,
+                () -> mControllerHelper.setPreference(mPreferenceGroup));
+    }
+
+    @Test
+    public void onStart_appliesFilterType() {
+        // Setup device to pass the filter.
+        when(mBondedDevice.getUuids()).thenReturn(new ParcelUuid[]{BluetoothUuid.AudioSink});
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ false,
+                BluetoothDevicePicker.FILTER_TYPE_AUDIO, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(((BluetoothDevicePreference) mPreferenceGroup.getPreference(
+                0)).getCachedDevice()).isEqualTo(mBondedCachedDevice);
+    }
+
+    @Test
+    public void onDeviceClicked_bondedDevice_sendsPickedIntent() {
+        ComponentName component = new ComponentName("test.package", "TestClass");
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, component.getPackageName(),
+                component.getClassName());
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        assertThat(ShadowApplication.getInstance().getBroadcastIntents()).hasSize(1);
+        Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(pickedIntent.getAction()).isEqualTo(
+                BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+        assertThat(pickedIntent.getComponent()).isEqualTo(component);
+        assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
+                BluetoothDevice.EXTRA_DEVICE)).isEqualTo(mBondedDevice);
+    }
+
+    @Test
+    public void onDeviceClicked_bondedDevice_goesBack() {
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).goBack();
+    }
+
+    @Test
+    public void onDeviceClicked_unbondedDevice_doesNotNeedAuth_sendsPickedIntent() {
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ false,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+        devicePreference.performClick();
+
+        Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(pickedIntent.getAction()).isEqualTo(
+                BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+    }
+
+    @Test
+    public void onDeviceClicked_unbondedDevice_needsAuth_startsPairing() {
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+        devicePreference.performClick();
+
+        verify(mUnbondedCachedDevice).startPairing();
+    }
+
+    @Test
+    public void onDeviceClicked_unbondedDevice_needsAuth_pairingStartFails_resumesScanning() {
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+        when(mUnbondedCachedDevice.startPairing()).thenReturn(false);
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+
+        devicePreference.performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+    }
+
+    @Test
+    public void onDeviceBondStateChanged_selectedDeviceBonded_sendsPickedIntent() {
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+        // Select device.
+        devicePreference.performClick();
+        // Device bonds.
+        mControllerHelper.getController().onDeviceBondStateChanged(
+                devicePreference.getCachedDevice(), BluetoothDevice.BOND_BONDED);
+
+        Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(pickedIntent.getAction()).isEqualTo(
+                BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+    }
+
+    @Test
+    public void onDeviceBondStateChanged_selectedDeviceBonded_goesBack() {
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+        // Select device.
+        devicePreference.performClick();
+        // Device bonds.
+        mControllerHelper.getController().onDeviceBondStateChanged(
+                devicePreference.getCachedDevice(), BluetoothDevice.BOND_BONDED);
+
+        verify(mControllerHelper.getMockFragmentController()).goBack();
+    }
+
+    @Test
+    public void onDestroy_noDeviceSelected_sendsNullPickedIntent() {
+        Intent launchIntent = createLaunchIntent(/* needsAuth= */ true,
+                BluetoothDevicePicker.FILTER_TYPE_ALL, "test.package", "TestClass");
+        mControllerHelper.getController().setLaunchIntent(launchIntent);
+        mControllerHelper.setPreference(mPreferenceGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        Intent pickedIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(pickedIntent.getAction()).isEqualTo(
+                BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+        assertThat((BluetoothDevice) pickedIntent.getParcelableExtra(
+                BluetoothDevice.EXTRA_DEVICE)).isNull();
+    }
+
+    private Intent createLaunchIntent(boolean needAuth, int filterType, String packageName,
+            String className) {
+        Intent intent = new Intent(BluetoothDevicePicker.ACTION_LAUNCH);
+        intent.putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, needAuth);
+        intent.putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE, filterType);
+        intent.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE, packageName);
+        intent.putExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS, className);
+        return intent;
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceControllerTest.java
new file mode 100644
index 0000000..d79578e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceControllerTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link BluetoothDevicePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothDevicePreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private CachedBluetoothDevice mDevice;
+    private Context mContext;
+    private PreferenceControllerTestHelper<TestBluetoothDevicePreferenceController>
+            mControllerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+
+        // Make sure controller is available.
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestBluetoothDevicePreferenceController.class);
+        mControllerHelper.getController().setCachedDevice(mDevice);
+        mControllerHelper.setPreference(new Preference(mContext));
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void setPreference_deviceNotSet_throwsIllegalStateException() {
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestBluetoothDevicePreferenceController.class);
+        assertThrows(IllegalStateException.class,
+                () -> mControllerHelper.setPreference(new Preference(mContext)));
+    }
+
+    @Test
+    public void getAvailabilityStatus_disallowConfigBluetooth_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void onStart_registersDeviceCallback() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(mDevice).registerCallback(any(CachedBluetoothDevice.Callback.class));
+    }
+
+    @Test
+    public void onStop_unregistersDeviceCallback() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        verify(mDevice).registerCallback(callbackCaptor.capture());
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        verify(mDevice).unregisterCallback(callbackCaptor.getValue());
+    }
+
+    @Test
+    public void started_onDeviceAttributesChanged_refreshesUi() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        verify(mDevice).registerCallback(callbackCaptor.capture());
+        // onCreate, onStart.
+        assertThat(mControllerHelper.getController().getUpdateStateCallCount()).isEqualTo(2);
+
+        callbackCaptor.getValue().onDeviceAttributesChanged();
+
+        // onCreate, onStart, callback.
+        assertThat(mControllerHelper.getController().getUpdateStateCallCount()).isEqualTo(3);
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+
+    /** Concrete impl of {@link BluetoothDevicePreferenceController} for testing. */
+    private static class TestBluetoothDevicePreferenceController extends
+            BluetoothDevicePreferenceController<Preference> {
+
+        private int mUpdateStateCallCount;
+
+        TestBluetoothDevicePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Class<Preference> getPreferenceType() {
+            return Preference.class;
+        }
+
+        @Override
+        protected void updateState(Preference preference) {
+            mUpdateStateCallCount++;
+        }
+
+        int getUpdateStateCallCount() {
+            return mUpdateStateCallCount;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceTest.java
new file mode 100644
index 0000000..b3003f6
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicePreferenceTest.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.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;
+
+import android.bluetooth.BluetoothClass;
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+
+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.RuntimeEnvironment;
+
+/** Unit test for {@link BluetoothDevicePreference}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class BluetoothDevicePreferenceTest {
+
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    private Context mContext;
+    private BluetoothDevicePreference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new BluetoothDevicePreference(mContext, mCachedDevice);
+    }
+
+    @Test
+    public void actionIsHiddenByDefault() {
+        assertThat(mPreference.isActionShown()).isFalse();
+    }
+
+    @Test
+    public void onAttached_registersDeviceCallback() {
+        mPreference.onAttached();
+
+        verify(mCachedDevice).registerCallback(any(CachedBluetoothDevice.Callback.class));
+    }
+
+    @Test
+    public void onAttached_setsDeviceNameAsTitle() {
+        String name = "name";
+        when(mCachedDevice.getName()).thenReturn(name);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.getTitle()).isEqualTo(name);
+    }
+
+    @Test
+    public void onAttached_setsCarConnectionSummaryAsSummary() {
+        String summary = "summary";
+        when(mCachedDevice.getCarConnectionSummary()).thenReturn(summary);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.getSummary()).isEqualTo(summary);
+    }
+
+    @Test
+    public void onAttached_setsIcon() {
+        when(mCachedDevice.getBtClass()).thenReturn(
+                new BluetoothClass(BluetoothClass.Device.Major.PHONE));
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.getIcon()).isNotNull();
+    }
+
+    @Test
+    public void onAttached_deviceNotBusy_setsEnabled() {
+        when(mCachedDevice.isBusy()).thenReturn(false);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onAttached_deviceBusy_setsNotEnabled() {
+        when(mCachedDevice.isBusy()).thenReturn(true);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onAttached_deviceNameNotHumanReadable_setsHidden() {
+        when(mCachedDevice.hasHumanReadableName()).thenReturn(false);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void onAttached_deviceNameNotHumanReadable_showWithoutNamesTrue_setsShown() {
+        SystemProperties.set("persist.bluetooth.showdeviceswithoutnames", Boolean.TRUE.toString());
+        when(mCachedDevice.hasHumanReadableName()).thenReturn(false);
+        mPreference = new BluetoothDevicePreference(mContext, mCachedDevice);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void onDetached_unregistersDeviceCallback() {
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        mPreference.onAttached();
+        verify(mCachedDevice).registerCallback(callbackCaptor.capture());
+
+        mPreference.onDetached();
+
+        verify(mCachedDevice).unregisterCallback(callbackCaptor.getValue());
+    }
+
+    @Test
+    public void onDeviceAttributesChanged_refreshesUi() {
+        String name = "name";
+        when(mCachedDevice.getName()).thenReturn(name);
+        String summary = "summary";
+        when(mCachedDevice.getCarConnectionSummary()).thenReturn(summary);
+        when(mCachedDevice.isBusy()).thenReturn(false);
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        mPreference.onAttached();
+        verify(mCachedDevice).registerCallback(callbackCaptor.capture());
+
+        assertThat(mPreference.getTitle()).isEqualTo(name);
+        assertThat(mPreference.getSummary()).isEqualTo(summary);
+        assertThat(mPreference.isEnabled()).isTrue();
+
+        String updatedName = "updatedName";
+        when(mCachedDevice.getName()).thenReturn(updatedName);
+        String updatedSummary = "updatedSummary";
+        when(mCachedDevice.getCarConnectionSummary()).thenReturn(updatedSummary);
+        when(mCachedDevice.isBusy()).thenReturn(true);
+
+        callbackCaptor.getValue().onDeviceAttributesChanged();
+
+        assertThat(mPreference.getTitle()).isEqualTo(updatedName);
+        assertThat(mPreference.getSummary()).isEqualTo(updatedSummary);
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void equals_devicesEqual_returnsTrue() {
+        BluetoothDevicePreference otherPreference = new BluetoothDevicePreference(mContext,
+                mCachedDevice);
+
+        assertThat(mPreference.equals(otherPreference)).isTrue();
+    }
+
+    @Test
+    public void equals_devicesNotEqual_returnsFalse() {
+        BluetoothDevicePreference otherPreference = new BluetoothDevicePreference(mContext,
+                mock(CachedBluetoothDevice.class));
+
+        assertThat(mPreference.equals(otherPreference)).isFalse();
+    }
+
+    @Test
+    public void compareTo_sameType_usesDeviceCompareTo() {
+        CachedBluetoothDevice otherDevice = mock(CachedBluetoothDevice.class);
+        BluetoothDevicePreference otherPreference = new BluetoothDevicePreference(mContext,
+                otherDevice);
+        when(mCachedDevice.compareTo(otherDevice)).thenReturn(1);
+        when(otherDevice.compareTo(mCachedDevice)).thenReturn(-1);
+
+        assertThat(mPreference.compareTo(otherPreference)).isEqualTo(1);
+        assertThat(otherPreference.compareTo(mPreference)).isEqualTo(-1);
+    }
+
+    @Test
+    public void compareTo_differentType_fallsBackToDefaultCompare() {
+        mPreference.setOrder(1);
+        Preference otherPreference = new Preference(mContext);
+        otherPreference.setOrder(2);
+
+        assertThat(mPreference.compareTo(otherPreference)).isEqualTo(-1);
+        verify(mCachedDevice, never()).compareTo(any());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreferenceTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreferenceTest.java
new file mode 100644
index 0000000..5d04587
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilePreferenceTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.bluetooth.BluetoothProfile.STATE_CONNECTED;
+import static android.bluetooth.BluetoothProfile.STATE_DISCONNECTED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import com.android.settingslib.bluetooth.PanProfile;
+
+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.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class BluetoothDeviceProfilePreferenceTest {
+
+    @Mock
+    private LocalBluetoothProfile mProfile;
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    private BluetoothDevice mDevice;
+    private Context mContext;
+    private BluetoothDeviceProfilePreference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:11:22:33:AA:BB");
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+        when(mProfile.toString()).thenReturn("key");
+        when(mProfile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        mPreference = new BluetoothDeviceProfilePreference(mContext, mProfile, mCachedDevice);
+    }
+
+    @Test
+    public void onConstruction_setsProfileStringAsKey() {
+        assertThat(mPreference.getKey()).isEqualTo(mProfile.toString());
+    }
+
+    @Test
+    public void onConstruction_setsProfileNameAsTitle() {
+        assertThat(mPreference.getTitle()).isEqualTo(mContext.getString(R.string.bt_profile_name));
+    }
+
+    @Test
+    public void onAttached_registersDeviceCallback() {
+        mPreference.onAttached();
+
+        verify(mCachedDevice).registerCallback(any(CachedBluetoothDevice.Callback.class));
+    }
+
+    @Test
+    public void onAttached_deviceNotBusy_setsEnabled() {
+        when(mCachedDevice.isBusy()).thenReturn(false);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onAttached_deviceBusy_setsNotEnabled() {
+        when(mCachedDevice.isBusy()).thenReturn(true);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onAttached_preferred_setsChecked() {
+        when(mProfile.isPreferred(mDevice)).thenReturn(true);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onAttached_notPreferred_setsUnchecked() {
+        when(mProfile.isPreferred(mDevice)).thenReturn(false);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void onAttached_panProfile_connected_setsChecked() {
+        mProfile = mock(PanProfile.class);
+        when(mProfile.getConnectionStatus(mDevice)).thenReturn(STATE_CONNECTED);
+        when(mProfile.toString()).thenReturn("key");
+        when(mProfile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        mPreference = new BluetoothDeviceProfilePreference(mContext, mProfile, mCachedDevice);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onAttached_panProfile_notConnected_setsUnchecked() {
+        mProfile = mock(PanProfile.class);
+        when(mProfile.getConnectionStatus(mDevice)).thenReturn(STATE_DISCONNECTED);
+        when(mProfile.toString()).thenReturn("key");
+        when(mProfile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        mPreference = new BluetoothDeviceProfilePreference(mContext, mProfile, mCachedDevice);
+
+        mPreference.onAttached();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void onDeviceAttributesChanged_refreshesUi() {
+        when(mProfile.isPreferred(mDevice)).thenReturn(false);
+        when(mCachedDevice.isBusy()).thenReturn(false);
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        mPreference.onAttached();
+        verify(mCachedDevice).registerCallback(callbackCaptor.capture());
+
+        assertThat(mPreference.isEnabled()).isTrue();
+        assertThat(mPreference.isChecked()).isFalse();
+
+        when(mProfile.isPreferred(mDevice)).thenReturn(true);
+        when(mCachedDevice.isBusy()).thenReturn(true);
+
+        callbackCaptor.getValue().onDeviceAttributesChanged();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onDetached_unregistersDeviceCallback() {
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        mPreference.onAttached();
+        verify(mCachedDevice).registerCallback(callbackCaptor.capture());
+
+        mPreference.onDetached();
+
+        verify(mCachedDevice).unregisterCallback(callbackCaptor.getValue());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceControllerTest.java
new file mode 100644
index 0000000..31ecd21
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDeviceProfilesPreferenceControllerTest.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+/** Unit test for {@link BluetoothDeviceProfilesPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothDeviceProfilesPreferenceControllerTest {
+
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    private BluetoothDevice mDevice;
+    private PreferenceGroup mPreferenceGroup;
+    private BluetoothDeviceProfilesPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:11:22:33:AA:BB");
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreferenceGroup = new PreferenceCategory(context);
+        PreferenceControllerTestHelper<BluetoothDeviceProfilesPreferenceController>
+                controllerHelper = new PreferenceControllerTestHelper<>(context,
+                BluetoothDeviceProfilesPreferenceController.class);
+        mController = controllerHelper.getController();
+        mController.setCachedDevice(mCachedDevice);
+        controllerHelper.setPreference(mPreferenceGroup);
+        controllerHelper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void refreshUi_addsNewProfiles() {
+        LocalBluetoothProfile profile1 = mock(LocalBluetoothProfile.class);
+        when(profile1.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile1));
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        LocalBluetoothProfile profile2 = mock(LocalBluetoothProfile.class);
+        when(profile2.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(mCachedDevice.getProfiles()).thenReturn(Arrays.asList(profile1, profile2));
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+        BluetoothDeviceProfilePreference profilePreference =
+                (BluetoothDeviceProfilePreference) mPreferenceGroup.getPreference(1);
+        assertThat(profilePreference.getProfile()).isEqualTo(profile2);
+    }
+
+    @Test
+    public void refreshUi_removesRemovedProfiles() {
+        LocalBluetoothProfile profile1 = mock(LocalBluetoothProfile.class);
+        when(profile1.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        LocalBluetoothProfile profile2 = mock(LocalBluetoothProfile.class);
+        when(profile2.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(mCachedDevice.getProfiles()).thenReturn(Arrays.asList(profile1, profile2));
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile2));
+        when(mCachedDevice.getRemovedProfiles()).thenReturn(Collections.singletonList(profile1));
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDeviceProfilePreference profilePreference =
+                (BluetoothDeviceProfilePreference) mPreferenceGroup.getPreference(0);
+        assertThat(profilePreference.getProfile()).isEqualTo(profile2);
+    }
+
+    @Test
+    public void refreshUi_profiles_showsPreference() {
+        LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
+        when(profile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile));
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_noProfiles_hidesPreference() {
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.emptyList());
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void profileChecked_setsProfilePreferred() {
+        LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
+        when(profile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile));
+        mController.refreshUi();
+        BluetoothDeviceProfilePreference profilePreference =
+                (BluetoothDeviceProfilePreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(profilePreference.isChecked()).isFalse();
+        profilePreference.performClick();
+
+        verify(profile).setPreferred(mDevice, true);
+    }
+
+    @Test
+    public void profileChecked_connectsToProfile() {
+        LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
+        when(profile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile));
+        mController.refreshUi();
+        BluetoothDeviceProfilePreference profilePreference =
+                (BluetoothDeviceProfilePreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(profilePreference.isChecked()).isFalse();
+        profilePreference.performClick();
+
+        verify(mCachedDevice).connectProfile(profile);
+    }
+
+    @Test
+    public void profileUnchecked_setsProfileNotPreferred() {
+        LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
+        when(profile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(profile.isPreferred(mDevice)).thenReturn(true);
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile));
+        mController.refreshUi();
+        BluetoothDeviceProfilePreference profilePreference =
+                (BluetoothDeviceProfilePreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(profilePreference.isChecked()).isTrue();
+        profilePreference.performClick();
+
+        verify(profile).setPreferred(mDevice, false);
+    }
+
+    @Test
+    public void profileUnchecked_disconnectsFromProfile() {
+        LocalBluetoothProfile profile = mock(LocalBluetoothProfile.class);
+        when(profile.getNameResource(mDevice)).thenReturn(R.string.bt_profile_name);
+        when(profile.isPreferred(mDevice)).thenReturn(true);
+        when(mCachedDevice.getProfiles()).thenReturn(Collections.singletonList(profile));
+        mController.refreshUi();
+        BluetoothDeviceProfilePreference profilePreference =
+                (BluetoothDeviceProfilePreference) mPreferenceGroup.getPreference(0);
+
+        assertThat(profilePreference.isChecked()).isTrue();
+        profilePreference.performClick();
+
+        verify(mCachedDevice).disconnect(profile);
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceControllerTest.java
new file mode 100644
index 0000000..da7406f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDevicesGroupPreferenceControllerTest.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+/** Unit test for {@link BluetoothDevicesGroupPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothDevicesGroupPreferenceControllerTest {
+
+    @Mock
+    private BluetoothDeviceFilter.Filter mFilter;
+    @Mock
+    private CachedBluetoothDevice mCachedDevice1;
+    @Mock
+    private CachedBluetoothDevice mCachedDevice2;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private BluetoothDevice mDevice1;
+    private PreferenceGroup mPreferenceGroup;
+    private TestBluetoothDevicesGroupPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        mDevice1 = BluetoothAdapter.getDefaultAdapter().getRemoteDevice("00:11:22:33:AA:BB");
+        when(mCachedDevice1.getDevice()).thenReturn(mDevice1);
+        BluetoothDevice device2 = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
+                "BB:AA:33:22:11:00");
+        when(mCachedDevice2.getDevice()).thenReturn(device2);
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreferenceGroup = new PreferenceCategory(context);
+        PreferenceControllerTestHelper<TestBluetoothDevicesGroupPreferenceController>
+                controllerHelper = new PreferenceControllerTestHelper<>(context,
+                TestBluetoothDevicesGroupPreferenceController.class);
+        mController = controllerHelper.getController();
+        mController.setDeviceFilter(mFilter);
+        controllerHelper.setPreference(mPreferenceGroup);
+        controllerHelper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void refreshUi_filterMatch_addsToGroup() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(mDevice1)).thenReturn(true);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(devicePreference.getCachedDevice()).isEqualTo(mCachedDevice1);
+    }
+
+    @Test
+    public void refreshUi_filterMatch_addsToPreferenceMap() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(mDevice1)).thenReturn(true);
+
+        mController.refreshUi();
+
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(mController.getPreferenceMap()).containsEntry(devicePreference.getCachedDevice(),
+                devicePreference);
+    }
+
+    @Test
+    public void refreshUi_filterMismatch_removesFromGroup() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(mDevice1)).thenReturn(true);
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(devicePreference.getCachedDevice()).isEqualTo(mCachedDevice1);
+
+        when(mFilter.matches(mDevice1)).thenReturn(false);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_filterMismatch_removesFromPreferenceMap() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(mDevice1)).thenReturn(true);
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(devicePreference.getCachedDevice()).isEqualTo(mCachedDevice1);
+
+        when(mFilter.matches(mDevice1)).thenReturn(false);
+        mController.refreshUi();
+
+        assertThat(mController.getPreferenceMap()).doesNotContainKey(mCachedDevice1);
+    }
+
+    @Test
+    public void refreshUi_noDevices_hidesGroup() {
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_devices_showsGroup() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(mDevice1)).thenReturn(true);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isTrue();
+    }
+
+    @Test
+    public void onBluetoothStateChanged_turningOff_clearsPreferences() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(mDevice1)).thenReturn(true);
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+
+        mController.onBluetoothStateChanged(BluetoothAdapter.STATE_TURNING_OFF);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+        assertThat(mController.getPreferenceMap()).isEmpty();
+    }
+
+    @Test
+    public void onDeviceAdded_refreshesUi() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(mDevice1)).thenReturn(true);
+
+        mController.onDeviceAdded(mCachedDevice1);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(devicePreference.getCachedDevice()).isEqualTo(mCachedDevice1);
+    }
+
+    @Test
+    public void onDeviceDeleted_refreshesUi() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Arrays.asList(mCachedDevice1, mCachedDevice2));
+        when(mFilter.matches(any(BluetoothDevice.class))).thenReturn(true);
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice2));
+        mController.onDeviceDeleted(mCachedDevice1);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(devicePreference.getCachedDevice()).isEqualTo(mCachedDevice2);
+    }
+
+    @Test
+    public void onDeviceDeleted_lastDevice_hidesGroup() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice1));
+        when(mFilter.matches(any(BluetoothDevice.class))).thenReturn(true);
+        mController.refreshUi();
+
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(Collections.emptyList());
+        mController.onDeviceDeleted(mCachedDevice1);
+
+        assertThat(mPreferenceGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void preferenceClicked_callsOnDeviceClicked() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Arrays.asList(mCachedDevice1, mCachedDevice2));
+        when(mFilter.matches(any(BluetoothDevice.class))).thenReturn(true);
+        mController.refreshUi();
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+        devicePreference.performClick();
+
+        assertThat(mController.getClickedDevice()).isEqualTo(devicePreference.getCachedDevice());
+    }
+
+    @Test
+    public void preferenceClicked_handled() {
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Arrays.asList(mCachedDevice1, mCachedDevice2));
+        when(mFilter.matches(any(BluetoothDevice.class))).thenReturn(true);
+        mController.refreshUi();
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(1);
+
+        assertThat(devicePreference.getOnPreferenceClickListener().onPreferenceClick(
+                devicePreference)).isTrue();
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+
+    /** Concrete impl of {@link BluetoothDevicesGroupPreferenceController} for testing. */
+    private static class TestBluetoothDevicesGroupPreferenceController extends
+            BluetoothDevicesGroupPreferenceController {
+
+        private BluetoothDeviceFilter.Filter mFilter;
+        private CachedBluetoothDevice mClickedDevice;
+
+        TestBluetoothDevicesGroupPreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected BluetoothDeviceFilter.Filter getDeviceFilter() {
+            return mFilter;
+        }
+
+        void setDeviceFilter(BluetoothDeviceFilter.Filter filter) {
+            mFilter = filter;
+        }
+
+        @Override
+        protected void onDeviceClicked(CachedBluetoothDevice cachedDevice) {
+            mClickedDevice = cachedDevice;
+        }
+
+        CachedBluetoothDevice getClickedDevice() {
+            return mClickedDevice;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragmentTest.java
new file mode 100644
index 0000000..1653461
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothDisconnectConfirmDialogFragmentTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.AlertDialog;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.DialogInterface;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.ReflectionHelpers;
+
+/** Unit test for {@link BluetoothDisconnectConfirmDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothDisconnectConfirmDialogFragmentTest {
+
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private BluetoothDisconnectConfirmDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(
+                RuntimeEnvironment.application, /* onInitCallback= */ null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        String address = "00:11:22:33:AA:BB";
+        BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address);
+        when(mCachedDeviceManager.findDevice(device)).thenReturn(mCachedDevice);
+        when(mCachedDevice.getAddress()).thenReturn(address);
+        when(mCachedDevice.isConnected()).thenReturn(true);
+
+        mFragment = BluetoothDisconnectConfirmDialogFragment.newInstance(mCachedDevice);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void confirmDisconnect_disconnectsFromDevice() {
+        AlertDialog dialog = showDialog(mFragment);
+
+        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        verify(mCachedDevice).disconnect();
+    }
+
+    @Test
+    public void deviceNoLongerConnected_dismiss() {
+        ArgumentCaptor<CachedBluetoothDevice.Callback> callbackCaptor = ArgumentCaptor.forClass(
+                CachedBluetoothDevice.Callback.class);
+        AlertDialog dialog = showDialog(mFragment);
+        verify(mCachedDevice).registerCallback(callbackCaptor.capture());
+
+        when(mCachedDevice.isConnected()).thenReturn(false);
+        callbackCaptor.getValue().onDeviceAttributesChanged();
+
+        assertThat(dialog.isShowing()).isFalse();
+    }
+
+    private AlertDialog showDialog(BluetoothDisconnectConfirmDialogFragment fragment) {
+        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
+        activity.showDialog(fragment, /* tag= */ null);
+        return (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..64647f5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothEntryPreferenceControllerTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+
+/** Unit test for {@link BluetoothEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class BluetoothEntryPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private BluetoothEntryPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mController = new PreferenceControllerTestHelper<>(RuntimeEnvironment.application,
+                BluetoothEntryPreferenceController.class).getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_bluetoothAvailable_available() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(any())).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_bluetoothAvailable_disallowBluetooth_disabledForUser() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_bluetoothNotAvailable_unsupportedOnDevice() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceControllerTest.java
new file mode 100644
index 0000000..353c7a1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothNamePreferenceControllerTest.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link BluetoothNamePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothNamePreferenceControllerTest {
+
+    private static final String NAME = "name";
+    private static final String NAME_UPDATED = "name updated";
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<BluetoothNamePreferenceController> mControllerHelper;
+    private BluetoothNamePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreference = new Preference(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                BluetoothNamePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void refreshUi_setsNameAsSummary() {
+        BluetoothAdapter.getDefaultAdapter().setName(NAME);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(NAME);
+    }
+
+    @Test
+    public void refreshUi_noUserRestrictions_setsSelectable() {
+        mController.refreshUi();
+
+        assertThat(mPreference.isSelectable()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_userHasConfigRestriction_setsNotSelectable() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isSelectable()).isFalse();
+    }
+
+    @Test
+    public void started_localNameChangedBroadcast_updatesSummary() {
+        BluetoothAdapter.getDefaultAdapter().setName(NAME);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreference.getSummary()).isEqualTo(NAME);
+
+        BluetoothAdapter.getDefaultAdapter().setName(NAME_UPDATED);
+        RuntimeEnvironment.application.sendBroadcast(
+                new Intent(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED));
+
+        assertThat(mPreference.getSummary()).isEqualTo(NAME_UPDATED);
+    }
+
+    @Test
+    public void stopped_noUpdateOnLocalNameChangedBroadcast() {
+        BluetoothAdapter.getDefaultAdapter().setName(NAME);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreference.getSummary()).isEqualTo(NAME);
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        BluetoothAdapter.getDefaultAdapter().setName(NAME_UPDATED);
+        RuntimeEnvironment.application.sendBroadcast(
+                new Intent(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED));
+
+        assertThat(mPreference.getSummary()).isEqualTo(NAME);
+    }
+
+    @Test
+    public void preferenceClicked_launchesRenameDialog() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mPreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(LocalRenameDialogFragment.class), eq(LocalRenameDialogFragment.TAG));
+    }
+
+    @Test
+    public void preferenceClicked_handled() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        assertThat(
+                mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference)).isTrue();
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
new file mode 100644
index 0000000..2073778
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPairingSelectionFragmentTest.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.view.View;
+import android.widget.ProgressBar;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+/** Unit test for {@link BluetoothPairingSelectionFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothPairingSelectionFragmentTest {
+
+    @Mock
+    private BluetoothEventManager mEventManager;
+    private BluetoothEventManager mSaveRealEventManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private FragmentController<BluetoothPairingSelectionFragment> mFragmentController;
+    private BluetoothPairingSelectionFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+        mSaveRealEventManager = mLocalBluetoothManager.getEventManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mEventManager);
+
+        mFragment = new BluetoothPairingSelectionFragment();
+        mFragmentController = FragmentController.of(mFragment);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mSaveRealEventManager);
+    }
+
+    @Test
+    public void onStart_setsBluetoothManagerForegroundActivity() {
+        mFragmentController.create().start();
+
+        assertThat(mLocalBluetoothManager.getForegroundActivity()).isEqualTo(
+                mFragment.requireActivity());
+    }
+
+    @Test
+    public void onStart_registersEventListener() {
+        mFragmentController.create().start();
+
+        verify(mEventManager).registerCallback(any(BluetoothCallback.class));
+    }
+
+    @Test
+    public void onStart_showsProgressBar() {
+        mFragmentController.create();
+        ProgressBar progressBar = findProgressBar(mFragment.requireActivity());
+        progressBar.setVisibility(View.GONE);
+
+        mFragmentController.start();
+
+        assertThat(progressBar.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onStop_clearsBluetoothManagerForegroundActivity() {
+        mFragmentController.create().start().resume().pause().stop();
+
+        assertThat(mLocalBluetoothManager.getForegroundActivity()).isNull();
+    }
+
+    @Test
+    public void onStop_unregistersEventListener() {
+        ArgumentCaptor<BluetoothCallback> callbackCaptor = ArgumentCaptor.forClass(
+                BluetoothCallback.class);
+        mFragmentController.create().start().resume().pause().stop();
+
+        verify(mEventManager).registerCallback(callbackCaptor.capture());
+        verify(mEventManager).unregisterCallback(callbackCaptor.getValue());
+    }
+
+    @Test
+    public void onStop_hidesProgressBar() {
+        mFragmentController.setup().onPause();
+        ProgressBar progressBar = findProgressBar(mFragment.requireActivity());
+        progressBar.setVisibility(View.VISIBLE);
+
+        mFragmentController.stop();
+
+        assertThat(progressBar.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void onDeviceBondStateChanged_deviceBonded_goesBack() {
+        ArgumentCaptor<BluetoothCallback> callbackCaptor = ArgumentCaptor.forClass(
+                BluetoothCallback.class);
+        mFragmentController.setup();
+        verify(mEventManager).registerCallback(callbackCaptor.capture());
+
+        callbackCaptor.getValue().onDeviceBondStateChanged(mock(CachedBluetoothDevice.class),
+                BluetoothDevice.BOND_BONDED);
+
+        assertThat(
+                ((BaseTestActivity) mFragment.requireActivity()).getOnBackPressedFlag()).isTrue();
+    }
+
+    private ProgressBar findProgressBar(Activity activity) {
+        return activity.findViewById(R.id.progress_bar);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPreferenceControllerTest.java
new file mode 100644
index 0000000..c58f6b4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothPreferenceControllerTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.util.ReflectionHelpers;
+
+/** Unit test for {@link BluetoothPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private BluetoothEventManager mEventManager;
+    private BluetoothEventManager mSaveRealEventManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private PreferenceControllerTestHelper<TestBluetoothPreferenceController> mControllerHelper;
+    private TestBluetoothPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+        mSaveRealEventManager = mLocalBluetoothManager.getEventManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mEventManager);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                TestBluetoothPreferenceController.class, new Preference(context));
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mSaveRealEventManager);
+    }
+
+    @Test
+    public void getAvailabilityStatus_bluetoothNotAvailable_unsupportedOnDevice() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_disallowBluetoothUserRestriction_disabledForUser() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_adapterDisabled_conditionallyUnavailable() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().disable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_OFF);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_available() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        // No user restrictions.
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void onStart_registersEventListener() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        verify(mEventManager).registerCallback(mController);
+    }
+
+    @Test
+    public void onStop_unregistersEventListener() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        verify(mEventManager).unregisterCallback(mController);
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+
+    /** Concrete impl of {@link BluetoothPreferenceController} for testing. */
+    private static class TestBluetoothPreferenceController extends
+            BluetoothPreferenceController<Preference> {
+
+        TestBluetoothPreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Class<Preference> getPreferenceType() {
+            return Preference.class;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragmentTest.java
new file mode 100644
index 0000000..e7b8bc2
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRenameDialogFragmentTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowDialog;
+
+/** Unit test for {@link BluetoothRenameDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class BluetoothRenameDialogFragmentTest {
+
+    private TestBluetoothRenameDialogFragment mFragment;
+    private AlertDialog mDialog;
+
+    @Before
+    public void setUp() {
+        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
+        mFragment = new TestBluetoothRenameDialogFragment();
+        activity.showDialog(mFragment, /* tag= */ null);
+        mDialog = (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+
+    @Test
+    public void initialTextIsCurrentDeviceName() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+
+        assertThat(editText.getText().toString()).isEqualTo(mFragment.getDeviceName());
+    }
+
+    @Test
+    public void softInputShown() {
+        InputMethodManager imm =
+                (InputMethodManager) RuntimeEnvironment.application.getSystemService(
+                        Context.INPUT_METHOD_SERVICE);
+        assertThat(Shadows.shadowOf(imm).isSoftInputVisible()).isTrue();
+    }
+
+    @Test
+    public void noUserInput_positiveButtonDisabled() {
+        assertThat(mDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void userInput_positiveButtonEnabled() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+        editText.append("1234");
+
+        assertThat(mDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void userInput_emptyName_positiveButtonDisabled() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+        editText.setText("");
+
+        assertThat(mDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void nameUpdatedByCode_positiveButtonDisabled() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+        editText.append("1234");
+
+        mFragment.updateDeviceName();
+
+        assertThat(mDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void editorDoneAction_dismissesDialog() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+
+        editText.onEditorAction(EditorInfo.IME_ACTION_DONE);
+
+        assertThat(mDialog.isShowing()).isFalse();
+    }
+
+    @Test
+    public void editorDoneAction_setsDeviceName() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+        String editStr = "1234";
+        String expectedName = mFragment.getDeviceName() + editStr;
+
+        editText.append(editStr);
+        editText.onEditorAction(EditorInfo.IME_ACTION_DONE);
+
+        assertThat(mFragment.getDeviceName()).isEqualTo(expectedName);
+    }
+
+    @Test
+    public void editorDoneAction_emptyName_doesNotSetDeviceName() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+        String expectedName = mFragment.getDeviceName();
+        String editStr = "";
+
+        editText.setText(editStr);
+        editText.onEditorAction(EditorInfo.IME_ACTION_DONE);
+
+        assertThat(mFragment.getDeviceName()).isEqualTo(expectedName);
+    }
+
+    @Test
+    public void positiveButtonClicked_setsDeviceName() {
+        EditText editText = mDialog.findViewById(android.R.id.edit);
+        String editStr = "1234";
+        String expectedName = mFragment.getDeviceName() + editStr;
+
+        editText.append(editStr);
+        mDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+
+        assertThat(mFragment.getDeviceName()).isEqualTo(expectedName);
+    }
+
+    /** Concrete impl of {@link BluetoothRenameDialogFragment} for testing. */
+    public static class TestBluetoothRenameDialogFragment extends BluetoothRenameDialogFragment {
+
+        private String mSetDeviceNameArg = "Device Name";
+
+        @Override
+        @StringRes
+        protected int getDialogTitle() {
+            return R.string.bt_rename_dialog_title;
+        }
+
+        @Nullable
+        @Override
+        protected String getDeviceName() {
+            return mSetDeviceNameArg;
+        }
+
+        @Override
+        protected void setDeviceName(String deviceName) {
+            mSetDeviceNameArg = deviceName;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivityTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivityTest.java
new file mode 100644
index 0000000..28477b3
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothRequestPermissionActivityTest.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowLocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLocalBluetoothAdapter.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothRequestPermissionActivityTest {
+
+    private Context mContext;
+    private ActivityController<BluetoothRequestPermissionActivity> mActivityController;
+    private BluetoothRequestPermissionActivity mActivity;
+    private LocalBluetoothAdapter mAdapter;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = RuntimeEnvironment.application;
+        mActivityController = ActivityController.of(new BluetoothRequestPermissionActivity());
+        mActivity = mActivityController.get();
+
+        mAdapter = LocalBluetoothManager.getInstance(mContext,
+                /* onInitCallback= */ null).getBluetoothAdapter();
+
+        // Make sure controller is available.
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+    }
+
+    @Test
+    public void onCreate_requestDisableIntent_hasDisableRequestType() {
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getRequestType()).isEqualTo(
+                BluetoothRequestPermissionActivity.REQUEST_DISABLE);
+    }
+
+    @Test
+    public void onCreate_requestDiscoverableIntent_hasDiscoverableRequestType() {
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getRequestType()).isEqualTo(
+                BluetoothRequestPermissionActivity.REQUEST_ENABLE_DISCOVERABLE);
+    }
+
+    @Test
+    public void onCreate_requestDiscoverableIntent_noTimeoutSpecified_hasDefaultTimeout() {
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getTimeout()).isEqualTo(
+                BluetoothRequestPermissionActivity.DEFAULT_DISCOVERABLE_TIMEOUT);
+    }
+
+    @Test
+    public void onCreate_requestDiscoverableIntent_timeoutSpecified_hasTimeout() {
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
+                BluetoothRequestPermissionActivity.MAX_DISCOVERABLE_TIMEOUT);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getTimeout()).isEqualTo(
+                BluetoothRequestPermissionActivity.MAX_DISCOVERABLE_TIMEOUT);
+    }
+
+    @Test
+    public void onCreate_requestEnableIntent_hasEnableRequestType() {
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getRequestType()).isEqualTo(
+                BluetoothRequestPermissionActivity.REQUEST_ENABLE);
+    }
+
+    @Test
+    public void onCreate_bluetoothOff_requestDisableIntent_noDialog() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_OFF);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getCurrentDialog()).isNull();
+    }
+
+    @Test
+    public void onCreate_bluetoothOn_requestDisableIntent_startsDialog() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getCurrentDialog()).isNotNull();
+        assertThat(mActivity.getCurrentDialog().isShowing()).isTrue();
+    }
+
+    @Test
+    public void onCreate_bluetoothOff_requestDiscoverableIntent_startsDialog() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_OFF);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getCurrentDialog()).isNotNull();
+        assertThat(mActivity.getCurrentDialog().isShowing()).isTrue();
+    }
+
+    @Test
+    public void onCreate_bluetoothOn_requestDiscoverableIntent_startsDialog() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getCurrentDialog()).isNotNull();
+        assertThat(mActivity.getCurrentDialog().isShowing()).isTrue();
+    }
+
+    @Test
+    public void onCreate_bluetoothOff_requestEnableIntent_startsDialog() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_OFF);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getCurrentDialog()).isNotNull();
+        assertThat(mActivity.getCurrentDialog().isShowing()).isTrue();
+    }
+
+    @Test
+    public void onCreate_bluetoothOn_requestEnableIntent_noDialog() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        assertThat(mActivity.getCurrentDialog()).isNull();
+    }
+
+    @Test
+    public void onPositiveClick_disableDialog_disables() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        mAdapter.enable();
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        Button button = mActivity.getCurrentDialog().getButton(DialogInterface.BUTTON_POSITIVE);
+        button.performClick();
+
+        assertThat(mAdapter.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onPositiveClick_discoverableDialog_scanModeSet() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+        mAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE);
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        Button button = mActivity.getCurrentDialog().getButton(DialogInterface.BUTTON_POSITIVE);
+        button.performClick();
+
+        assertThat(mAdapter.getScanMode()).isEqualTo(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+    }
+
+    @Test
+    public void onPositiveClick_enableDialog_enables() {
+        getShadowLocalBluetoothAdapter().setState(BluetoothAdapter.STATE_OFF);
+        mAdapter.disable();
+
+        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+        mActivity.setIntent(intent);
+        mActivityController.create();
+
+        Button button = mActivity.getCurrentDialog().getButton(DialogInterface.BUTTON_POSITIVE);
+        button.performClick();
+
+        assertThat(mAdapter.isEnabled()).isTrue();
+    }
+
+    private ShadowLocalBluetoothAdapter getShadowLocalBluetoothAdapter() {
+        return (ShadowLocalBluetoothAdapter) Shadow.extract(mAdapter);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceControllerTest.java
new file mode 100644
index 0000000..3f62452
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothScanningDevicesGroupPreferenceControllerTest.java
@@ -0,0 +1,344 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.Collections;
+
+/** Unit test for {@link BluetoothScanningDevicesGroupPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothScanningDevicesGroupPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    @Mock
+    private BluetoothDevice mDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<TestBluetoothScanningDevicesGroupPreferenceController>
+            mControllerHelper;
+    private TestBluetoothScanningDevicesGroupPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
+                null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        when(mCachedDevice.getDevice()).thenReturn(mDevice);
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Collections.singletonList(mCachedDevice));
+
+        // Make sure controller is available.
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestBluetoothScanningDevicesGroupPreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void disallowConfigBluetooth_doesNotStartScanning() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isFalse();
+        // User can't scan, but they can still see known devices.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onScanningStateChanged_scanningEnabled_receiveStopped_restartsScanning() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+
+        BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
+        mController.onScanningStateChanged(/* started= */ false);
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+    }
+
+    @Test
+    public void onScanningStateChanged_scanningDisabled_receiveStopped_doesNothing() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        // Set a device bonding to disable scanning.
+        when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
+        mController.refreshUi();
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isFalse();
+
+        mController.onScanningStateChanged(/* started= */ false);
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isFalse();
+    }
+
+    @Test
+    public void onDeviceBondStateChanged_refreshesUi() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+
+        // Change state to bonding to cancel scanning on refresh.
+        when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
+        when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
+        mController.onDeviceBondStateChanged(mCachedDevice, BluetoothDevice.BOND_BONDING);
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isFalse();
+    }
+
+    @Test
+    public void onDeviceClicked_callsInternal() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        assertThat(mController.getLastClickedDevice()).isEquivalentAccordingToCompareTo(
+                devicePreference.getCachedDevice());
+    }
+
+    @Test
+    public void onDeviceClicked_cancelsScanning() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+
+        devicePreference.performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_noDeviceBonding_startsScanning() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mController.refreshUi();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_noDeviceBonding_enablesGroup() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_noDeviceBonding_setsScanModeConnectableDiscoverable() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mController.refreshUi();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().getScanMode()).isEqualTo(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+    }
+
+    @Test
+    public void refreshUi_deviceBonding_stopsScanning() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
+
+        mController.refreshUi();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_deviceBonding_disablesGroup() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_deviceBonding_setsScanModeConnectable() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
+
+        mController.refreshUi();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().getScanMode()).isEqualTo(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+    }
+
+    @Test
+    public void onStop_stopsScanning() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isFalse();
+    }
+
+    @Test
+    public void onStop_clearsNonBondedDevices() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        verify(mCachedDeviceManager).clearNonBondedDevices();
+    }
+
+    @Test
+    public void onStop_clearsGroup() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isGreaterThan(0);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onStop_setsScanModeConnectable() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().getScanMode()).isEqualTo(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+    }
+
+    @Test
+    public void discoverableScanModeTimeout_controllerStarted_resetsDiscoverableScanMode() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        BluetoothAdapter.getDefaultAdapter().setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+        mContext.sendBroadcast(new Intent(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED));
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().getScanMode()).isEqualTo(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+    }
+
+    @Test
+    public void discoverableScanModeTimeout_controllerStopped_doesNotResetDiscoverableScanMode() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        BluetoothAdapter.getDefaultAdapter().setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+        mContext.sendBroadcast(new Intent(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED));
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().getScanMode()).isEqualTo(
+                BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+
+    private static final class TestBluetoothScanningDevicesGroupPreferenceController extends
+            BluetoothScanningDevicesGroupPreferenceController {
+
+        private CachedBluetoothDevice mLastClickedDevice;
+
+        TestBluetoothScanningDevicesGroupPreferenceController(Context context,
+                String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected void onDeviceClickedInternal(CachedBluetoothDevice cachedDevice) {
+            mLastClickedDevice = cachedDevice;
+        }
+
+        CachedBluetoothDevice getLastClickedDevice() {
+            return mLastClickedDevice;
+        }
+
+        @Override
+        protected BluetoothDeviceFilter.Filter getDeviceFilter() {
+            return BluetoothDeviceFilter.ALL_FILTER;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothSettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothSettingsFragmentTest.java
new file mode 100644
index 0000000..52c7078
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothSettingsFragmentTest.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.bluetooth.BluetoothAdapter.STATE_OFF;
+import static android.bluetooth.BluetoothAdapter.STATE_ON;
+import static android.bluetooth.BluetoothAdapter.STATE_TURNING_OFF;
+import static android.bluetooth.BluetoothAdapter.STATE_TURNING_ON;
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.widget.Switch;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link BluetoothSettingsFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothSettingsFragmentTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private Context mContext;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private FragmentController<BluetoothSettingsFragment> mFragmentController;
+    private BluetoothSettingsFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+
+        mContext = RuntimeEnvironment.application;
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
+                null);
+        mFragment = new BluetoothSettingsFragment();
+        mFragmentController = FragmentController.of(mFragment);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void onStart_setsBluetoothManagerForegroundActivity() {
+        mFragmentController.create().start();
+
+        assertThat(mLocalBluetoothManager.getForegroundActivity()).isEqualTo(
+                mFragment.requireActivity());
+    }
+
+    @Test
+    public void onStart_initializesSwitchState() {
+        getShadowBluetoothAdapter().setState(STATE_ON);
+
+        mFragmentController.create().start();
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isTrue();
+    }
+
+    @Test
+    public void onStop_clearsBluetoothManagerForegroundActivity() {
+        mFragmentController.create().start().resume().pause().stop();
+
+        assertThat(mLocalBluetoothManager.getForegroundActivity()).isNull();
+    }
+
+    @Test
+    public void switchCheckedOn_enablesAdapter() {
+        mFragmentController.setup();
+        assertThat(BluetoothAdapter.getDefaultAdapter().isEnabled()).isFalse();
+
+        findSwitch(mFragment.requireActivity()).performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isEnabled()).isTrue();
+    }
+
+    @Test
+    public void switchCheckedOff_disablesAdapter() {
+        getShadowBluetoothAdapter().setState(STATE_ON);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        mFragmentController.setup();
+        assertThat(BluetoothAdapter.getDefaultAdapter().isEnabled()).isTrue();
+
+        findSwitch(mFragment.requireActivity()).performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isEnabled()).isFalse();
+    }
+
+    @Test
+    public void stateChanged_turningOn_setsSwitchChecked() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_TURNING_ON);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isTrue();
+    }
+
+    @Test
+    public void stateChanged_turningOn_setsSwitchDisabled() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_TURNING_ON);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void stateChanged_on_setsSwitchChecked() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_ON);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isTrue();
+    }
+
+    @Test
+    public void stateChanged_on_setsSwitchEnabled() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_ON);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void stateChanged_on_userRestricted_setsSwitchDisabled() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(true);
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_ON);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void stateChanged_turningOff_setsSwitchUnchecked() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_TURNING_OFF);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
+    }
+
+    @Test
+    public void stateChanged_turningOff_setsSwitchDisabled() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_TURNING_OFF);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void stateChanged_off_setsSwitchUnchecked() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_OFF);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
+    }
+
+    @Test
+    public void stateChanged_off_setsSwitchEnabled() {
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_OFF);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void stateChanged_off_userRestricted_setsSwitchDisabled() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(true);
+        mFragmentController.setup();
+
+        sendStateChangedIntent(STATE_OFF);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void stateChanged_fragmentStopped_doesNothing() {
+        mFragmentController.setup();
+        mFragmentController.stop();
+
+        sendStateChangedIntent(STATE_TURNING_ON);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
+    }
+
+    private void sendStateChangedIntent(int state) {
+        Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
+        intent.putExtra(BluetoothAdapter.EXTRA_STATE, state);
+        mContext.sendBroadcast(intent);
+    }
+
+    private Switch findSwitch(Activity activity) {
+        return activity.findViewById(R.id.toggle_switch);
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceControllerTest.java
new file mode 100644
index 0000000..5113708
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/BluetoothUnbondedDevicesPreferenceControllerTest.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.Arrays;
+
+/** Unit test for {@link BluetoothUnbondedDevicesPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class BluetoothUnbondedDevicesPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private CachedBluetoothDevice mUnbondedCachedDevice;
+    @Mock
+    private BluetoothDevice mUnbondedDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<BluetoothUnbondedDevicesPreferenceController>
+            mControllerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(context, /* onInitCallback= */
+                null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        when(mUnbondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        when(mUnbondedCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+        when(mUnbondedCachedDevice.getDevice()).thenReturn(mUnbondedDevice);
+        BluetoothDevice bondedDevice = mock(BluetoothDevice.class);
+        when(bondedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+        CachedBluetoothDevice bondedCachedDevice = mock(CachedBluetoothDevice.class);
+        when(bondedCachedDevice.getDevice()).thenReturn(bondedDevice);
+        when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
+                Arrays.asList(mUnbondedCachedDevice, bondedCachedDevice));
+
+        // Make sure controller is available.
+        Shadows.shadowOf(context.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                BluetoothUnbondedDevicesPreferenceController.class, mPreferenceGroup);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void showsOnlyUnbondedDevices() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        assertThat(devicePreference.getCachedDevice()).isEqualTo(mUnbondedCachedDevice);
+    }
+
+    @Test
+    public void onDeviceClicked_startsPairing() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        verify(mUnbondedCachedDevice).startPairing();
+    }
+
+    @Test
+    public void onDeviceClicked_pairingStartFails_resumesScanning() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+        when(mUnbondedCachedDevice.startPairing()).thenReturn(false);
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+
+        devicePreference.performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isDiscovering()).isTrue();
+    }
+
+    @Test
+    public void onDeviceClicked_requestsPhonebookAccess() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        when(mUnbondedCachedDevice.startPairing()).thenReturn(true);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        verify(mUnbondedDevice).setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
+    }
+
+    @Test
+    public void onDeviceClicked_requestsMessageAccess() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        when(mUnbondedCachedDevice.startPairing()).thenReturn(true);
+        BluetoothDevicePreference devicePreference =
+                (BluetoothDevicePreference) mPreferenceGroup.getPreference(0);
+
+        devicePreference.performClick();
+
+        verify(mUnbondedDevice).setMessageAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
+    }
+
+    @Test
+    public void getAvailabilityStatus_disallowConfigBluetooth_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                DISABLED_FOR_USER);
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/LocalRenameDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/LocalRenameDialogFragmentTest.java
new file mode 100644
index 0000000..e994f3d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/LocalRenameDialogFragmentTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.bluetooth.BluetoothAdapter.EXTRA_LOCAL_NAME;
+import static android.bluetooth.BluetoothAdapter.STATE_ON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.bluetooth.BluetoothAdapter;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.widget.EditText;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowDialog;
+
+/** Unit test for {@link LocalRenameDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class})
+public class LocalRenameDialogFragmentTest {
+
+    private static final String NAME = "name";
+    private static final String NAME_UPDATED = "name updated";
+
+    private LocalRenameDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mFragment = new LocalRenameDialogFragment();
+        getShadowBluetoothAdapter().setState(STATE_ON);
+        BluetoothAdapter.getDefaultAdapter().enable();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void getDeviceName_adapterEnabled_returnsLocalAdapterName() {
+        BluetoothAdapter.getDefaultAdapter().setName(NAME);
+
+        assertThat(mFragment.getDeviceName()).isEqualTo(NAME);
+    }
+
+    @Test
+    public void getDeviceName_adapterDisabled_returnsNull() {
+        BluetoothAdapter.getDefaultAdapter().setName(NAME);
+        BluetoothAdapter.getDefaultAdapter().disable();
+
+        assertThat(mFragment.getDeviceName()).isNull();
+    }
+
+    @Test
+    public void localNameChangedBroadcast_updatesDeviceName() {
+        BluetoothAdapter.getDefaultAdapter().setName(NAME);
+        AlertDialog dialog = showDialog(mFragment);
+        EditText editText = dialog.findViewById(android.R.id.edit);
+        assertThat(editText.getText().toString()).isEqualTo(NAME);
+
+        BluetoothAdapter.getDefaultAdapter().setName(NAME_UPDATED);
+        Intent intent = new Intent(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
+        intent.putExtra(EXTRA_LOCAL_NAME, NAME_UPDATED);
+        RuntimeEnvironment.application.sendBroadcast(intent);
+
+        assertThat(editText.getText().toString()).isEqualTo(NAME_UPDATED);
+        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void setDeviceName_updatesLocalAdapterName() {
+        BluetoothAdapter.getDefaultAdapter().setName(NAME);
+        AlertDialog dialog = showDialog(mFragment);
+        EditText editText = dialog.findViewById(android.R.id.edit);
+
+        editText.setText(NAME_UPDATED);
+        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().getName()).isEqualTo(NAME_UPDATED);
+    }
+
+    private AlertDialog showDialog(LocalRenameDialogFragment fragment) {
+        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
+        activity.showDialog(fragment, /* tag= */ null);
+        return (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerTest.java
new file mode 100644
index 0000000..fb425f2
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/PairNewDevicePreferenceControllerTest.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.bluetooth.BluetoothAdapter;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+/** Unit test for {@link PairNewDevicePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowBluetoothAdapter.class,
+        ShadowBluetoothPan.class})
+public class PairNewDevicePreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private BluetoothEventManager mEventManager;
+    private BluetoothEventManager mSaveRealEventManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<PairNewDevicePreferenceController> mControllerHelper;
+    private PairNewDevicePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(mContext, /* onInitCallback= */
+                null);
+        mSaveRealEventManager = mLocalBluetoothManager.getEventManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mEventManager);
+
+        // Default to available.
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+
+        mPreference = new Preference(mContext);
+        mPreference.setIntent(new Intent());
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                PairNewDevicePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mEventManager", mSaveRealEventManager);
+    }
+
+    @Test
+    public void checkInitialized_noFragmentOrIntent_throwsIllegalStateException() {
+        assertThrows(IllegalStateException.class,
+                () -> new PreferenceControllerTestHelper<>(mContext,
+                        PairNewDevicePreferenceController.class, new Preference(mContext)));
+    }
+
+    @Test
+    public void getAvailabilityStatus_bluetoothNotAvailable_unsupportedOnDevice() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_disallowBluetoothUserRestriction_disabledForUser() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_disallowConfigBluetoothUserRestriction_disabledForUser() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_available() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        // No user restrictions.
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void refreshUi_bluetoothAdapterEnabled_setsEmptySummary() {
+        BluetoothAdapter.getDefaultAdapter().enable();
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary().toString()).isEmpty();
+    }
+
+    @Test
+    public void refreshUi_bluetoothAdapterDisabled_setsTurnOnToPairSummary() {
+        BluetoothAdapter.getDefaultAdapter().disable();
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.bluetooth_pair_new_device_summary));
+    }
+
+    @Test
+    public void bluetoothAdapterStateChangedBroadcast_refreshesUi() {
+        BluetoothAdapter.getDefaultAdapter().enable();
+        mController.refreshUi();
+        assertThat(mPreference.getSummary().toString()).isEmpty();
+
+        BluetoothAdapter.getDefaultAdapter().disable();
+        mContext.sendBroadcast(new Intent(BluetoothAdapter.ACTION_STATE_CHANGED));
+
+        assertThat(mPreference.getSummary().toString()).isNotEmpty();
+    }
+
+    @Test
+    public void preferenceClicked_enablesAdapter() {
+        BluetoothAdapter.getDefaultAdapter().disable();
+
+        mPreference.performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isEnabled()).isTrue();
+    }
+
+    @Test
+    public void preferenceClicked_notHandled() {
+        assertThat(mPreference.getOnPreferenceClickListener().onPreferenceClick(
+                mPreference)).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragmentTest.java
new file mode 100644
index 0000000..305842f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/RemoteRenameDialogFragmentTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.AlertDialog;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.DialogInterface;
+import android.widget.EditText;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.ReflectionHelpers;
+
+/** Unit test for {@link RemoteRenameDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class RemoteRenameDialogFragmentTest {
+
+    private static final String NAME = "name";
+    private static final String NAME_UPDATED = "name updated";
+
+    @Mock
+    private CachedBluetoothDevice mCachedDevice;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    private CachedBluetoothDeviceManager mSaveRealCachedDeviceManager;
+    private LocalBluetoothManager mLocalBluetoothManager;
+    private RemoteRenameDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mLocalBluetoothManager = LocalBluetoothManager.getInstance(
+                RuntimeEnvironment.application, /* onInitCallback= */ null);
+        mSaveRealCachedDeviceManager = mLocalBluetoothManager.getCachedDeviceManager();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mCachedDeviceManager);
+
+        String address = "00:11:22:33:AA:BB";
+        BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(address);
+        when(mCachedDeviceManager.findDevice(device)).thenReturn(mCachedDevice);
+        when(mCachedDevice.getAddress()).thenReturn(address);
+
+        mFragment = RemoteRenameDialogFragment.newInstance(mCachedDevice);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+        ReflectionHelpers.setField(mLocalBluetoothManager, "mCachedDeviceManager",
+                mSaveRealCachedDeviceManager);
+    }
+
+    @Test
+    public void getDeviceName_returnsCachedDeviceName() {
+        when(mCachedDevice.getName()).thenReturn(NAME);
+        showDialog(mFragment); // Attach the fragment.
+
+        assertThat(mFragment.getDeviceName()).isEqualTo(NAME);
+    }
+
+    @Test
+    public void setDeviceName_updatesCachedDeviceName() {
+        when(mCachedDevice.getName()).thenReturn(NAME);
+        AlertDialog dialog = showDialog(mFragment);
+        EditText editText = dialog.findViewById(android.R.id.edit);
+
+        editText.setText(NAME_UPDATED);
+        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        verify(mCachedDevice).setName(NAME_UPDATED);
+    }
+
+    private AlertDialog showDialog(RemoteRenameDialogFragment fragment) {
+        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
+        activity.showDialog(fragment, /* tag= */ null);
+        return (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilterTest.java b/tests/robotests/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilterTest.java
new file mode 100644
index 0000000..9449a01
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/bluetooth/Utf8ByteLengthFilterTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2018 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.car.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.text.InputFilter;
+import android.text.SpannableStringBuilder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** Unit test for {@link Utf8ByteLengthFilter}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class Utf8ByteLengthFilterTest {
+
+    @Test
+    public void filter_belowMaxBytes_returnsNull() {
+        CharSequence source = "1"; // 1 byte.
+        SpannableStringBuilder dest = new SpannableStringBuilder("abcdefgh"); // 8 bytes.
+        InputFilter lengthFilter = new Utf8ByteLengthFilter(10);
+
+        // Append source to dest.
+        CharSequence filtered = lengthFilter.filter(source, /* start= */ 0, source.length(), dest,
+                dest.length(), dest.length());
+
+        // Source is not filtered.
+        assertThat(filtered).isNull();
+    }
+
+    @Test
+    public void filter_maxBytes_returnsNull() {
+        CharSequence source = "1"; // 1 byte.
+        SpannableStringBuilder dest = new SpannableStringBuilder("abcdefghi"); // 9 bytes.
+        InputFilter lengthFilter = new Utf8ByteLengthFilter(10);
+
+        // Append source to dest.
+        CharSequence filtered = lengthFilter.filter(source, /* start= */ 0, source.length(), dest,
+                dest.length(), dest.length());
+
+        // Source is not filtered.
+        assertThat(filtered).isNull();
+    }
+
+    @Test
+    public void filter_aboveMaxBytes_returnsFilteredSource() {
+        CharSequence source = "12"; // 2 bytes.
+        SpannableStringBuilder dest = new SpannableStringBuilder("abcdefghi"); // 8 bytes.
+        InputFilter lengthFilter = new Utf8ByteLengthFilter(10);
+
+        // Append source to dest.
+        CharSequence filtered = lengthFilter.filter(source, /* start= */ 0, source.length(), dest,
+                dest.length(), dest.length());
+
+        // Source is filtered.
+        assertThat(filtered).isEqualTo("1");
+    }
+
+    // Borrowed from com.android.settings.bluetooth.Utf8ByteLengthFilterTest.
+    @Test
+    public void exerciseFilter() {
+        CharSequence source;
+        SpannableStringBuilder dest;
+        InputFilter lengthFilter = new Utf8ByteLengthFilter(10);
+        InputFilter[] filters = {lengthFilter};
+
+        source = "abc";
+        dest = new SpannableStringBuilder("abcdefgh");
+        dest.setFilters(filters);
+
+        dest.insert(1, source);
+        String expectedString1 = "aabbcdefgh";
+        assertThat(dest.toString()).isEqualTo(expectedString1);
+
+        dest.replace(5, 8, source);
+        String expectedString2 = "aabbcabcgh";
+        assertThat(dest.toString()).isEqualTo(expectedString2);
+
+        dest.insert(2, source);
+        assertThat(dest.toString()).isEqualTo(expectedString2);
+
+        dest.delete(1, 3);
+        String expectedString3 = "abcabcgh";
+        assertThat(dest.toString()).isEqualTo(expectedString3);
+
+        dest.append("12345");
+        String expectedString4 = "abcabcgh12";
+        assertThat(dest.toString()).isEqualTo(expectedString4);
+
+        source = "\u60a8\u597d";  // 2 Chinese chars == 6 bytes in UTF-8
+        dest.replace(8, 10, source);
+        assertThat(dest.toString()).isEqualTo(expectedString3);
+
+        dest.replace(0, 1, source);
+        String expectedString5 = "\u60a8bcabcgh";
+        assertThat(dest.toString()).isEqualTo(expectedString5);
+
+        dest.replace(0, 4, source);
+        String expectedString6 = "\u60a8\u597dbcgh";
+        assertThat(dest.toString()).isEqualTo(expectedString6);
+
+        source = "\u00a3\u00a5";  // 2 Latin-1 chars == 4 bytes in UTF-8
+        dest.delete(2, 6);
+        dest.insert(0, source);
+        String expectedString7 = "\u00a3\u00a5\u60a8\u597d";
+        assertThat(dest.toString()).isEqualTo(expectedString7);
+
+        dest.replace(2, 3, source);
+        String expectedString8 = "\u00a3\u00a5\u00a3\u597d";
+        assertThat(dest.toString()).isEqualTo(expectedString8);
+
+        dest.replace(3, 4, source);
+        String expectedString9 = "\u00a3\u00a5\u00a3\u00a3\u00a5";
+        assertThat(dest.toString()).isEqualTo(expectedString9);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/BaseCarSettingsActivityTest.java b/tests/robotests/src/com/android/car/settings/common/BaseCarSettingsActivityTest.java
new file mode 100644
index 0000000..8bae4a1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/BaseCarSettingsActivityTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.car.Car;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.ShadowCar;
+
+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.android.controller.ActivityController;
+
+/** Unit test for {@link BaseCarSettingsActivity}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class BaseCarSettingsActivityTest {
+
+    private static final String TEST_TAG = "test_tag";
+
+    private Context mContext;
+    private ActivityController<TestBaseCarSettingsActivity> mActivityController;
+    private TestBaseCarSettingsActivity mActivity;
+
+    @Mock
+    private CarUxRestrictionsManager mMockCarUxRestrictionsManager;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        CarUxRestrictions noSetupRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* time= */ 0).build();
+        when(mMockCarUxRestrictionsManager.getCurrentCarUxRestrictions())
+                .thenReturn(noSetupRestrictions);
+        ShadowCar.setCarManager(Car.CAR_UX_RESTRICTION_SERVICE, mMockCarUxRestrictionsManager);
+        mContext = RuntimeEnvironment.application;
+        mActivityController = ActivityController.of(new TestBaseCarSettingsActivity());
+        mActivity = mActivityController.get();
+        mActivityController.setup();
+    }
+
+    @Test
+    public void onPreferenceStartFragment_launchesFragment() {
+        Preference pref = new Preference(mContext);
+        pref.setFragment(TestFragment.class.getName());
+
+        mActivity.onPreferenceStartFragment(/* caller= */ null, pref);
+
+        assertThat(mActivity.getSupportFragmentManager().findFragmentById(
+                R.id.fragment_container)).isInstanceOf(TestFragment.class);
+    }
+
+    @Test
+    public void launchFragment_dialogFragment_throwsError() {
+        DialogFragment dialogFragment = new DialogFragment();
+
+        assertThrows(IllegalArgumentException.class,
+                () -> mActivity.launchFragment(dialogFragment));
+    }
+
+    @Test
+    public void showDialog_launchDialogFragment_noTag() {
+        DialogFragment dialogFragment = mock(DialogFragment.class);
+        mActivity.showDialog(dialogFragment, /* tag */ null);
+        verify(dialogFragment).show(mActivity.getSupportFragmentManager(), null);
+    }
+
+    @Test
+    public void showDialog_launchDialogFragment_withTag() {
+        DialogFragment dialogFragment = mock(DialogFragment.class);
+        mActivity.showDialog(dialogFragment, TEST_TAG);
+        verify(dialogFragment).show(mActivity.getSupportFragmentManager(), TEST_TAG);
+    }
+
+    @Test
+    public void findDialogByTag_retrieveOriginalDialog() {
+        DialogFragment dialogFragment = new DialogFragment();
+        mActivity.showDialog(dialogFragment, TEST_TAG);
+        assertThat(mActivity.findDialogByTag(TEST_TAG)).isEqualTo(dialogFragment);
+    }
+
+    @Test
+    public void findDialogByTag_notDialogFragment() {
+        TestFragment fragment = new TestFragment();
+        mActivity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
+                fragment, TEST_TAG).commit();
+        assertThat(mActivity.findDialogByTag(TEST_TAG)).isNull();
+    }
+
+    @Test
+    public void findDialogByTag_noSuchFragment() {
+        assertThat(mActivity.findDialogByTag(TEST_TAG)).isNull();
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_topFragmentInBackStackHasUpdatedUxRestrictions() {
+        TestFragment fragmentA = new TestFragment();
+        TestFragment fragmentB = new TestFragment();
+
+        CarUxRestrictions oldUxRestrictions = new CarUxRestrictions.Builder(
+                /* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_BASELINE,
+                /* timestamp= */ 0
+        ).build();
+
+        CarUxRestrictions newUxRestrictions = new CarUxRestrictions.Builder(
+                /* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP,
+                /* timestamp= */ 0
+        ).build();
+
+        mActivity.launchFragment(fragmentA);
+        mActivity.onUxRestrictionsChanged(oldUxRestrictions);
+        mActivity.launchFragment(fragmentB);
+        mActivity.onUxRestrictionsChanged(newUxRestrictions);
+
+        assertThat(fragmentB.getUxRestrictions().toString())
+                .isEqualTo(newUxRestrictions.toString());
+    }
+
+    @Test
+    public void onBackStackChanged_uxRestrictionsChanged_currentFragmentHasUpdatedUxRestrictions() {
+        TestFragment fragmentA = new TestFragment();
+        TestFragment fragmentB = new TestFragment();
+
+        CarUxRestrictions oldUxRestrictions = new CarUxRestrictions.Builder(
+                /* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_BASELINE,
+                /* timestamp= */ 0
+        ).build();
+
+        CarUxRestrictions newUxRestrictions = new CarUxRestrictions.Builder(
+                /* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP,
+                /* timestamp= */ 0
+        ).build();
+
+        mActivity.launchFragment(fragmentA);
+        mActivity.onUxRestrictionsChanged(oldUxRestrictions);
+        mActivity.launchFragment(fragmentB);
+        mActivity.onUxRestrictionsChanged(newUxRestrictions);
+        mActivity.goBack();
+
+        assertThat(fragmentA.getUxRestrictions().toString())
+                .isEqualTo(newUxRestrictions.toString());
+    }
+
+    /** Simple instance of {@link BaseCarSettingsActivity}. */
+    private static class TestBaseCarSettingsActivity extends BaseCarSettingsActivity {
+
+        @Nullable
+        @Override
+        protected Fragment getInitialFragment() {
+            return new TestFragment();
+        }
+    }
+
+    /** Simple Fragment for testing use. */
+    public static class TestFragment extends Fragment implements
+            CarUxRestrictionsManager.OnUxRestrictionsChangedListener {
+        private CarUxRestrictions mCarUxRestrictions;
+
+        @Override
+        public void onUxRestrictionsChanged(CarUxRestrictions restrictionInfo) {
+            mCarUxRestrictions = restrictionInfo;
+        }
+
+        public CarUxRestrictions getUxRestrictions() {
+            return mCarUxRestrictions;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/ButtonPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/ButtonPreferenceTest.java
new file mode 100644
index 0000000..f12036d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/ButtonPreferenceTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.view.ContextThemeWrapper;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ButtonPreference.OnButtonClickListener;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ButtonPreferenceTest {
+
+    private PreferenceViewHolder mViewHolder;
+    private ButtonPreference mButtonPreference;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        Context themedContext = new ContextThemeWrapper(context, R.style.CarSettingTheme);
+
+        View rootView = View.inflate(themedContext, R.layout.two_action_preference, null);
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+        mButtonPreference = new ButtonPreference(context);
+    }
+
+    @Test
+    public void buttonClicked_callsListener() {
+        mButtonPreference.onBindViewHolder(mViewHolder);
+        OnButtonClickListener listener = mock(OnButtonClickListener.class);
+        mButtonPreference.setOnButtonClickListener(listener);
+
+        mViewHolder.findViewById(android.R.id.widget_frame).performClick();
+
+        verify(listener).onButtonClick(mButtonPreference);
+    }
+
+    @Test
+    public void performButtonClick_listenerSetAndButtonVisible_listenerFired() {
+        ButtonPreference.OnButtonClickListener listener = mock(
+                ButtonPreference.OnButtonClickListener.class);
+        mButtonPreference.setOnButtonClickListener(listener);
+        mButtonPreference.showAction(true);
+
+        mButtonPreference.performButtonClick();
+        verify(listener).onButtonClick(mButtonPreference);
+    }
+
+    @Test
+    public void performButtonClick_listenerSetAndButtonInvisible_listenerNotFired() {
+        ButtonPreference.OnButtonClickListener listener = mock(
+                ButtonPreference.OnButtonClickListener.class);
+        mButtonPreference.setOnButtonClickListener(listener);
+        mButtonPreference.showAction(false);
+
+        mButtonPreference.performButtonClick();
+        verify(listener, never()).onButtonClick(mButtonPreference);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/CarSettingActivityTest.java b/tests/robotests/src/com/android/car/settings/common/CarSettingActivityTest.java
new file mode 100644
index 0000000..09c464b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/CarSettingActivityTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.Car;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Settings;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.datetime.DatetimeSettingsFragment;
+import com.android.car.settings.testutils.DummyFragment;
+import com.android.car.settings.testutils.ShadowCar;
+
+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.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+
+/** Unit test for {@link CarSettingActivity}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class CarSettingActivityTest {
+
+    private static final String TEST_TAG = "test_tag";
+
+    private Context mContext;
+    private ActivityController<CarSettingActivity> mActivityController;
+    private CarSettingActivity mActivity;
+
+    @Mock
+    private CarUxRestrictionsManager mMockCarUxRestrictionsManager;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        CarUxRestrictions noSetupRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* time= */ 0).build();
+        when(mMockCarUxRestrictionsManager.getCurrentCarUxRestrictions())
+                .thenReturn(noSetupRestrictions);
+        ShadowCar.setCarManager(Car.CAR_UX_RESTRICTION_SERVICE, mMockCarUxRestrictionsManager);
+        mContext = RuntimeEnvironment.application;
+        mActivityController = ActivityController.of(new CarSettingActivity());
+        mActivity = mActivityController.get();
+        mActivityController.create();
+    }
+
+    @Test
+    public void launchWithIntent_resolveToFragment() {
+        MockitoAnnotations.initMocks(this);
+        Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS);
+        CarSettingActivity activity =
+                Robolectric.buildActivity(CarSettingActivity.class, intent).setup().get();
+        assertThat(activity.getSupportFragmentManager().findFragmentById(R.id.fragment_container))
+                .isInstanceOf(DatetimeSettingsFragment.class);
+    }
+
+    @Test
+    public void launchWithEmptyIntent_resolveToDefaultFragment() {
+        CarSettingActivity activity =
+                Robolectric.buildActivity(CarSettingActivity.class).setup().get();
+        assertThat(activity.getSupportFragmentManager().findFragmentById(R.id.fragment_container))
+                .isInstanceOf(DummyFragment.class);
+    }
+
+    @Test
+    public void onResume_newIntent_launchesNewFragment() {
+        mActivityController.start().postCreate(null).resume();
+        TestFragment testFragment = new TestFragment();
+        mActivity.launchFragment(testFragment);
+        assertThat(mActivity.getCurrentFragment()).isEqualTo(testFragment);
+
+        mActivity.onNewIntent(new Intent(Settings.ACTION_DATE_SETTINGS));
+        mActivity.onResume();
+
+        assertThat(mActivity.getCurrentFragment()).isNotEqualTo(testFragment);
+    }
+
+    @Test
+    public void onResume_savedInstanceState_doesNotLaunchFragmentFromOldIntent() {
+        mActivityController.start().postCreate(null).resume();
+        Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS);
+        mActivity.onNewIntent(intent);
+        assertThat(mActivity.getCurrentFragment()).isNotInstanceOf(TestFragment.class);
+        mActivity.onResume(); // Showing date time settings (old intent)
+        mActivity.launchFragment(new TestFragment()); // Replace with test fragment.
+
+        // Recreate with saved state (e.g. during config change).
+        Bundle outState = new Bundle();
+        mActivityController.pause().saveInstanceState(outState);
+        mActivityController = ActivityController.of(new CarSettingActivity(), intent);
+        mActivityController.setup(outState);
+
+        // Should still display most recently launched fragment.
+        assertThat(mActivityController.get().getCurrentFragment()).isInstanceOf(TestFragment.class);
+    }
+
+    @Test
+    public void launchFragment_rootFragment_clearsBackStack() {
+        // Add fragment 1
+        TestFragment testFragment1 = new TestFragment();
+        mActivity.launchFragment(testFragment1);
+
+        // Add fragment 2
+        TestFragment testFragment2 = new TestFragment();
+        mActivity.launchFragment(testFragment2);
+
+        // Add root fragment
+        Fragment root = Fragment.instantiate(mContext,
+                mContext.getString(R.string.config_settings_hierarchy_root_fragment));
+        mActivity.launchFragment(root);
+
+        assertThat(mActivity.getSupportFragmentManager().getBackStackEntryCount())
+                .isEqualTo(1);
+    }
+
+    /** Simple Fragment for testing use. */
+    public static class TestFragment extends Fragment {
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
new file mode 100644
index 0000000..22ed78c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/ConfirmationDialogFragmentTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowDialog;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ConfirmationDialogFragmentTest {
+
+    private static final String TEST_ARG_KEY = "arg_key";
+    private static final String TEST_ARG_VALUE = "arg_value";
+    private static final String TEST_TITLE = "Test Title";
+    private static final String TEST_MESSAGE = "Test Message";
+
+    private ConfirmationDialogFragment.Builder mDialogFragmentBuilder;
+    private Fragment mFragment;
+    @Mock
+    private ConfirmationDialogFragment.ConfirmListener mConfirmListener;
+    @Mock
+    private ConfirmationDialogFragment.RejectListener mRejectListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mFragment = FragmentController.of(new Fragment()).setup();
+        mDialogFragmentBuilder = new ConfirmationDialogFragment.Builder(
+                RuntimeEnvironment.application);
+        mDialogFragmentBuilder.setTitle(TEST_TITLE);
+        mDialogFragmentBuilder.setMessage(TEST_MESSAGE);
+        mDialogFragmentBuilder.addArgumentString(TEST_ARG_KEY, TEST_ARG_VALUE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowDialog.reset();
+    }
+
+    @Test
+    public void buildDialogFragment_hasTitleAndMessage() {
+        ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
+        dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+
+        assertThat(getShadowAlertDialog().getTitle()).isEqualTo(TEST_TITLE);
+        assertThat(getShadowAlertDialog().getMessage()).isEqualTo(TEST_MESSAGE);
+    }
+
+    @Test
+    public void buildDialogFragment_negativeButtonNotSet_negativeButtonNotVisible() {
+        mDialogFragmentBuilder.setPositiveButton(R.string.test_positive_button_label, null);
+        ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
+        dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+
+        AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility()).isEqualTo(
+                View.GONE);
+    }
+
+    @Test
+    public void buildDialogFragment_positiveButtonNotSet_positiveButtonNotVisible() {
+        mDialogFragmentBuilder.setNegativeButton(R.string.test_negative_button_label, null);
+        ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
+        dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+
+        AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getVisibility()).isEqualTo(
+                View.GONE);
+        assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getVisibility()).isEqualTo(
+                View.VISIBLE);
+    }
+
+    @Test
+    public void clickPositiveButton_callsCallbackWithArgs() {
+        mDialogFragmentBuilder.setPositiveButton(R.string.test_positive_button_label,
+                mConfirmListener);
+        ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
+        dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+
+        AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+        ArgumentCaptor<Bundle> bundle = ArgumentCaptor.forClass(Bundle.class);
+        verify(mConfirmListener).onConfirm(bundle.capture());
+        assertThat(bundle.getValue().getString(TEST_ARG_KEY)).isEqualTo(TEST_ARG_VALUE);
+    }
+
+    @Test
+    public void clickNegativeButton_callsCallbackWithArgs() {
+        mDialogFragmentBuilder.setNegativeButton(R.string.test_negative_button_label,
+                mRejectListener);
+        ConfirmationDialogFragment dialogFragment = mDialogFragmentBuilder.build();
+        dialogFragment.show(mFragment.getFragmentManager(), ConfirmationDialogFragment.TAG);
+
+        AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+        ArgumentCaptor<Bundle> bundle = ArgumentCaptor.forClass(Bundle.class);
+        verify(mRejectListener).onReject(bundle.capture());
+        assertThat(bundle.getValue().getString(TEST_ARG_KEY)).isEqualTo(TEST_ARG_VALUE);
+    }
+
+    private ShadowAlertDialog getShadowAlertDialog() {
+        return ShadowApplication.getInstance().getLatestAlertDialog();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/EditTextPreferenceDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/EditTextPreferenceDialogFragmentTest.java
new file mode 100644
index 0000000..bad3d92
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/EditTextPreferenceDialogFragmentTest.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.WindowManager;
+import android.widget.EditText;
+
+import androidx.preference.EditTextPreference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowWindow;
+
+/** Unit test for {@link EditTextPreferenceDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class EditTextPreferenceDialogFragmentTest {
+
+    private Context mContext;
+    private ActivityController<BaseTestActivity> mTestActivityController;
+    private BaseTestActivity mTestActivity;
+    private EditTextPreference mPreference;
+    private EditTextPreferenceDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup();
+        TestTargetFragment targetFragment = new TestTargetFragment();
+        mTestActivity.launchFragment(targetFragment);
+        mPreference = new EditTextPreference(mContext);
+        mPreference.setDialogLayoutResource(R.layout.preference_dialog_edittext);
+        mPreference.setKey("key");
+        targetFragment.getPreferenceScreen().addPreference(mPreference);
+        mFragment = EditTextPreferenceDialogFragment
+                .newInstance(mPreference.getKey());
+
+        mFragment.setTargetFragment(targetFragment, /* requestCode= */ 0);
+    }
+
+    @Test
+    public void dialogPopulatedWithPreferenceText() {
+        mPreference.setText("text");
+
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        EditText editTextView = ShadowAlertDialog.getLatestAlertDialog().findViewById(
+                android.R.id.edit);
+
+        assertThat(editTextView.getText().toString()).isEqualTo(mPreference.getText());
+    }
+
+    @Test
+    public void softInputMethodSetOnWindow() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        assertThat(getShadowWindowFromDialog(
+                ShadowAlertDialog.getLatestAlertDialog()).getSoftInputMode()).isEqualTo(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+    }
+
+    @Test
+    public void editTextHasFocus() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        EditText editTextView = ShadowAlertDialog.getLatestAlertDialog().findViewById(
+                android.R.id.edit);
+
+        assertThat(editTextView.hasFocus()).isTrue();
+    }
+
+    @Test
+    public void onDialogClosed_positiveResult_updatesPreference() {
+        String text = "text";
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        EditText editTextView = dialog.findViewById(android.R.id.edit);
+        editTextView.setText(text);
+
+        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(mPreference.getText()).isEqualTo(text);
+    }
+
+    @Test
+    public void onDialogClosed_negativeResult_doesNothing() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        EditText editTextView = dialog.findViewById(android.R.id.edit);
+        editTextView.setText("text");
+
+        dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+
+        assertThat(mPreference.getText()).isNull();
+    }
+
+    @Test
+    public void instanceStateRetained() {
+        String text = "text";
+        mPreference.setText(text);
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        // Save instance state.
+        Bundle outState = new Bundle();
+        mTestActivityController.pause().saveInstanceState(outState).stop();
+
+        // Recreate everything with saved state.
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup(outState);
+
+        // Ensure saved text was applied.
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        EditText editTextView = dialog.findViewById(android.R.id.edit);
+        assertThat(editTextView.getText().toString()).isEqualTo(text);
+    }
+
+
+    private ShadowWindow getShadowWindowFromDialog(AlertDialog dialog) {
+        return (ShadowWindow) Shadow.extract(dialog.getWindow());
+    }
+
+    /** Simple {@link PreferenceFragmentCompat} implementation to serve as the target fragment. */
+    public static class TestTargetFragment extends PreferenceFragmentCompat {
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/ErrorDialogTest.java b/tests/robotests/src/com/android/car/settings/common/ErrorDialogTest.java
new file mode 100644
index 0000000..e7f7abb
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/ErrorDialogTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.RuntimeEnvironment.application;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.DialogTestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+
+/**
+ * Tests for ErrorDialog.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ErrorDialogTest {
+    private static final String ERROR_DIALOG_TAG = "ErrorDialogTag";
+    private BaseTestActivity mTestActivity;
+    private Fragment mTestFragment;
+
+    @Before
+    public void setUpTestActivity() {
+        MockitoAnnotations.initMocks(this);
+
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
+
+        mTestFragment = new Fragment();
+        mTestActivity.launchFragment(mTestFragment);
+    }
+
+    @Test
+    public void testOkDismissesDialog() {
+        ErrorDialog dialog = ErrorDialog.show(mTestFragment, R.string.delete_user_error_title);
+
+        assertThat(isDialogShown()).isTrue(); // Dialog is shown.
+
+        // Invoke cancel.
+        DialogTestUtils.clickPositiveButton(dialog);
+
+        assertThat(isDialogShown()).isFalse(); // Dialog is dismissed.
+    }
+
+    @Test
+    public void testErrorDialogSetsTitle() {
+        int testTitleId = R.string.add_user_error_title;
+        ErrorDialog dialog = ErrorDialog.show(mTestFragment, testTitleId);
+
+        assertThat(DialogTestUtils.getTitle(dialog)).isEqualTo(application.getString(testTitleId));
+    }
+
+    private boolean isDialogShown() {
+        return mTestActivity.getSupportFragmentManager()
+                .findFragmentByTag(ERROR_DIALOG_TAG) != null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/ExtraSettingsLoaderTest.java b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsLoaderTest.java
new file mode 100644
index 0000000..36f6b25
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsLoaderTest.java
@@ -0,0 +1,359 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.android.settingslib.drawer.CategoryKey.CATEGORY_DEVICE;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.Map;
+
+/** Unit test for {@link ExtraSettingsLoader}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
+public class ExtraSettingsLoaderTest {
+    private Context mContext;
+    private ExtraSettingsLoader mExtraSettingsLoader;
+    private static final String META_DATA_PREFERENCE_CATEGORY = "com.android.settings.category";
+    private static final String FAKE_CATEGORY = "fake_category";
+    private static final String FAKE_TITLE = "fake_title";
+    private static final String FAKE_SUMMARY = "fake_summary";
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        ShadowApplicationPackageManager.setResources(mContext.getResources());
+        mExtraSettingsLoader = new ExtraSettingsLoader(mContext);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void testLoadPreference_stringResources_shouldLoadResources() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_TITLE, FAKE_TITLE);
+        bundle.putString(META_DATA_PREFERENCE_SUMMARY, FAKE_SUMMARY);
+        bundle.putString(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem = new ResolveInfo();
+        resolveInfoSystem.system = true;
+        resolveInfoSystem.activityInfo = activityInfo;
+
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem);
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        assertThat(preferenceToBundleMap).hasSize(1);
+
+        for (Preference p : preferenceToBundleMap.keySet()) {
+            assertThat(p.getTitle()).isEqualTo(FAKE_TITLE);
+            assertThat(p.getSummary()).isEqualTo(FAKE_SUMMARY);
+        }
+    }
+
+    @Test
+    public void testLoadPreference_metadataBundleIsValue() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_TITLE, FAKE_TITLE);
+        bundle.putString(META_DATA_PREFERENCE_SUMMARY, FAKE_SUMMARY);
+        bundle.putString(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem = new ResolveInfo();
+        resolveInfoSystem.system = true;
+        resolveInfoSystem.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem);
+
+        ResolveInfo resolveInfoNonSystem = new ResolveInfo();
+        resolveInfoNonSystem.system = false;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoNonSystem);
+
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        assertThat(preferenceToBundleMap).hasSize(1);
+
+        for (Preference p : preferenceToBundleMap.keySet()) {
+            assertThat(p.getTitle()).isEqualTo(FAKE_TITLE);
+            assertThat(p.getSummary()).isEqualTo(FAKE_SUMMARY);
+
+            Bundle b = preferenceToBundleMap.get(p);
+            assertThat(b.getString(META_DATA_PREFERENCE_TITLE)).isEqualTo(FAKE_TITLE);
+            assertThat(b.getString(META_DATA_PREFERENCE_SUMMARY)).isEqualTo(FAKE_SUMMARY);
+            assertThat(b.getString(META_DATA_PREFERENCE_CATEGORY)).isEqualTo(FAKE_CATEGORY);
+            assertThat(b.getInt(META_DATA_PREFERENCE_ICON)).isNotNull();
+        }
+    }
+
+    @Test
+    public void testLoadPreference_integerResources_shouldLoadResources() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putInt(META_DATA_PREFERENCE_TITLE, R.string.fake_title);
+        bundle.putInt(META_DATA_PREFERENCE_SUMMARY, R.string.fake_summary);
+        bundle.putInt(META_DATA_PREFERENCE_CATEGORY, R.string.fake_category);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem = new ResolveInfo();
+        resolveInfoSystem.system = true;
+        resolveInfoSystem.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem);
+
+        ResolveInfo resolveInfoNonSystem = new ResolveInfo();
+        resolveInfoNonSystem.system = false;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoNonSystem);
+
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        assertThat(preferenceToBundleMap).hasSize(1);
+
+        for (Preference p : preferenceToBundleMap.keySet()) {
+            assertThat(p.getTitle()).isEqualTo(FAKE_TITLE);
+            assertThat(p.getSummary()).isEqualTo(FAKE_SUMMARY);
+            assertThat(p.getIcon()).isNotNull();
+
+        }
+    }
+
+    @Test
+    public void testLoadPreference_noDefaultSummary() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_TITLE, FAKE_TITLE);
+        bundle.putString(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem = new ResolveInfo();
+        resolveInfoSystem.system = true;
+        resolveInfoSystem.activityInfo = activityInfo;
+
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem);
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        for (Preference p : preferenceToBundleMap.keySet()) {
+            assertThat(p.getTitle()).isEqualTo(FAKE_TITLE);
+            assertThat(p.getSummary()).isNull();
+
+        }
+    }
+
+    @Test
+    public void testLoadPreference_noCategory_shouldSetToDeviceCategory() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, CATEGORY_DEVICE);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_TITLE, FAKE_TITLE);
+        bundle.putString(META_DATA_PREFERENCE_SUMMARY, FAKE_SUMMARY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem = new ResolveInfo();
+        resolveInfoSystem.system = true;
+        resolveInfoSystem.activityInfo = activityInfo;
+
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem);
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        assertThat(preferenceToBundleMap).hasSize(1);
+
+        for (Preference p : preferenceToBundleMap.keySet()) {
+            assertThat(p.getTitle()).isEqualTo(FAKE_TITLE);
+            assertThat(p.getSummary()).isEqualTo(FAKE_SUMMARY);
+        }
+    }
+
+    @Test
+    public void testLoadPreference_noCategoryMatched_shouldNotReturnPreferences() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_TITLE, FAKE_TITLE);
+        bundle.putString(META_DATA_PREFERENCE_SUMMARY, FAKE_SUMMARY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem = new ResolveInfo();
+        resolveInfoSystem.system = true;
+        resolveInfoSystem.activityInfo = activityInfo;
+
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem);
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        assertThat(preferenceToBundleMap).isEmpty();
+    }
+
+    @Test
+    public void testLoadPreference_shouldLoadDefaultIcon() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_TITLE, FAKE_TITLE);
+        bundle.putString(META_DATA_PREFERENCE_SUMMARY, FAKE_SUMMARY);
+        bundle.putString(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem = new ResolveInfo();
+        resolveInfoSystem.system = true;
+        resolveInfoSystem.activityInfo = activityInfo;
+
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem);
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        for (Preference p : preferenceToBundleMap.keySet()) {
+            assertThat(p.getTitle()).isEqualTo(FAKE_TITLE);
+            assertThat(p.getSummary()).isEqualTo(FAKE_SUMMARY);
+            assertThat(p.getIcon()).isNotNull();
+        }
+    }
+
+    @Test
+    public void testLoadPreference_noSystemApp_returnsNoPreferences() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+
+        ResolveInfo resolveInfoNonSystem1 = new ResolveInfo();
+        resolveInfoNonSystem1.system = false;
+        resolveInfoNonSystem1.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoNonSystem1);
+
+        ResolveInfo resolveInfoNonSystem2 = new ResolveInfo();
+        resolveInfoNonSystem2.system = false;
+        resolveInfoNonSystem2.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoNonSystem2);
+
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        assertThat(preferenceToBundleMap).isEmpty();
+    }
+
+    @Test
+    public void testLoadPreference_systemApp_returnsPreferences() {
+        Intent intent = new Intent();
+        intent.putExtra(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+        Bundle bundle = new Bundle();
+        bundle.putString(META_DATA_PREFERENCE_TITLE, FAKE_TITLE);
+        bundle.putString(META_DATA_PREFERENCE_SUMMARY, FAKE_SUMMARY);
+        bundle.putString(META_DATA_PREFERENCE_CATEGORY, FAKE_CATEGORY);
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.metaData = bundle;
+        activityInfo.packageName = "package_name";
+        activityInfo.name = "class_name";
+
+        ResolveInfo resolveInfoSystem1 = new ResolveInfo();
+        resolveInfoSystem1.system = true;
+        resolveInfoSystem1.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem1);
+
+        ResolveInfo resolveInfoNonSystem1 = new ResolveInfo();
+        resolveInfoNonSystem1.system = false;
+        resolveInfoNonSystem1.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoNonSystem1);
+
+        ResolveInfo resolveInfoSystem2 = new ResolveInfo();
+        resolveInfoSystem2.system = true;
+        resolveInfoSystem2.activityInfo = activityInfo;
+        getShadowPackageManager().addResolveInfoForIntent(intent, resolveInfoSystem2);
+
+        Map<Preference, Bundle> preferenceToBundleMap = mExtraSettingsLoader.loadPreferences(
+                intent);
+
+        assertThat(preferenceToBundleMap).hasSize(2);
+
+        for (Preference p : preferenceToBundleMap.keySet()) {
+            assertThat(p.getTitle()).isEqualTo(FAKE_TITLE);
+            assertThat(p.getSummary()).isEqualTo(FAKE_SUMMARY);
+        }
+    }
+
+    private ShadowApplicationPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
+
diff --git a/tests/robotests/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
new file mode 100644
index 0000000..0ea2ef5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+
+import org.junit.After;
+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 java.util.HashMap;
+import java.util.Map;
+
+/** Unit test for {@link ExtraSettingsPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
+public class ExtraSettingsPreferenceControllerTest {
+
+    private static final Intent FAKE_INTENT = new Intent();
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private ExtraSettingsPreferenceController mController;
+    private PreferenceControllerTestHelper<ExtraSettingsPreferenceController>
+            mPreferenceControllerHelper;
+    private Map<Preference, Bundle> mPreferenceBundleMapEmpty = new HashMap<>();
+    private Map<Preference, Bundle> mPreferenceBundleMap = new HashMap<>();
+
+    @Mock
+    private ExtraSettingsLoader mExtraSettingsLoaderMock;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mPreferenceGroup.setIntent(FAKE_INTENT);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                ExtraSettingsPreferenceController.class, mPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+        Preference preference = new Preference(mContext);
+
+        Bundle bundle = new Bundle();
+        mPreferenceBundleMap = new HashMap<>();
+        mPreferenceBundleMap.put(preference, bundle);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void testRefreshUi_notInitializedYet() {
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void testRefreshUi_initialized_noPreferenceAdded() {
+        when(mExtraSettingsLoaderMock.loadPreferences(FAKE_INTENT)).thenReturn(
+                mPreferenceBundleMapEmpty);
+
+        mController.setExtraSettingsLoader(mExtraSettingsLoaderMock);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+        assertThat(mPreferenceGroup.isVisible()).isEqualTo(false);
+    }
+
+    @Test
+    public void testRefreshUi_noPreferenceAdded_shouldNotBeVisible() {
+        when(mExtraSettingsLoaderMock.loadPreferences(FAKE_INTENT)).thenReturn(
+                mPreferenceBundleMapEmpty);
+
+        mController.setExtraSettingsLoader(mExtraSettingsLoaderMock);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isEqualTo(false);
+    }
+
+    @Test
+    public void testRefreshUi_initialized_preferenceAdded() {
+        when(mExtraSettingsLoaderMock.loadPreferences(FAKE_INTENT)).thenReturn(
+                mPreferenceBundleMap);
+
+        mController.setExtraSettingsLoader(mExtraSettingsLoaderMock);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testRefreshUi_preferenceAdded_shouldBeVisible() {
+        when(mExtraSettingsLoaderMock.loadPreferences(FAKE_INTENT)).thenReturn(
+                mPreferenceBundleMap);
+
+        mController.setExtraSettingsLoader(mExtraSettingsLoaderMock);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isEqualTo(true);
+    }
+
+    @Test
+    public void testRefreshUi_refreshedTwice_shouldOnlyAddPreferenceOnce() {
+        when(mExtraSettingsLoaderMock.loadPreferences(FAKE_INTENT)).thenReturn(
+                mPreferenceBundleMap);
+
+        mController.setExtraSettingsLoader(mExtraSettingsLoaderMock);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testRefreshUi_refreshedTwice_stillBeVisible() {
+        when(mExtraSettingsLoaderMock.loadPreferences(FAKE_INTENT)).thenReturn(
+                mPreferenceBundleMap);
+
+        mController.setExtraSettingsLoader(mExtraSettingsLoaderMock);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isEqualTo(true);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/FakePreferenceController.java b/tests/robotests/src/com/android/car/settings/common/FakePreferenceController.java
new file mode 100644
index 0000000..0762f26
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/FakePreferenceController.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Concrete {@link PreferenceController} with methods for verifying behavior in tests.
+ */
+public class FakePreferenceController extends PreferenceController<Preference> {
+
+    @AvailabilityStatus
+    private int mAvailabilityStatus;
+    private int mCheckInitializedCallCount;
+    private int mOnCreateInternalCallCount;
+    private int mOnStartInternalCallCount;
+    private int mOnResumeInternalCallCount;
+    private int mOnPauseInternalCallCount;
+    private int mOnStopInternalCallCount;
+    private int mOnDestroyInternalCallCount;
+    private int mUpdateStateCallCount;
+    private Preference mUpdateStateArg;
+    private int mHandlePreferenceChangedCallCount;
+    private Preference mHandlePreferenceChangedPreferenceArg;
+    private Object mHandlePreferenceChangedValueArg;
+    private int mHandlePreferenceClickedCallCount;
+    private Preference mHandlePreferenceClickedArg;
+    private boolean mAllIgnoresUxRestrictions = false;
+    private Set<String> mPreferencesIgnoringUxRestrictions = new HashSet<>();
+
+    public FakePreferenceController(Context context, String preferenceKey,
+            FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+        super(context, preferenceKey, fragmentController, uxRestrictions);
+        mAvailabilityStatus = super.getAvailabilityStatus();
+    }
+
+    @Override
+    protected Class<Preference> getPreferenceType() {
+        return Preference.class;
+    }
+
+    @Override
+    protected void checkInitialized() {
+        mCheckInitializedCallCount++;
+    }
+
+    int getCheckInitializedCallCount() {
+        return mCheckInitializedCallCount;
+    }
+
+    @Override
+    @AvailabilityStatus
+    protected int getAvailabilityStatus() {
+        return mAvailabilityStatus;
+    }
+
+    void setAvailabilityStatus(@AvailabilityStatus int availabilityStatus) {
+        mAvailabilityStatus = availabilityStatus;
+    }
+
+    @Override
+    protected void onCreateInternal() {
+        mOnCreateInternalCallCount++;
+    }
+
+    int getOnCreateInternalCallCount() {
+        return mOnCreateInternalCallCount;
+    }
+
+    @Override
+    protected void onStartInternal() {
+        mOnStartInternalCallCount++;
+    }
+
+    int getOnStartInternalCallCount() {
+        return mOnStartInternalCallCount;
+    }
+
+    @Override
+    protected void onResumeInternal() {
+        mOnResumeInternalCallCount++;
+    }
+
+    int getOnResumeInternalCallCount() {
+        return mOnResumeInternalCallCount;
+    }
+
+    @Override
+    protected void onPauseInternal() {
+        mOnPauseInternalCallCount++;
+    }
+
+    int getOnPauseInternalCallCount() {
+        return mOnPauseInternalCallCount;
+    }
+
+    @Override
+    protected void onStopInternal() {
+        mOnStopInternalCallCount++;
+    }
+
+    int getOnStopInternalCallCount() {
+        return mOnStopInternalCallCount;
+    }
+
+    @Override
+    protected void onDestroyInternal() {
+        mOnDestroyInternalCallCount++;
+    }
+
+    int getOnDestroyInternalCallCount() {
+        return mOnDestroyInternalCallCount;
+    }
+
+    @Override
+    protected void updateState(Preference preference) {
+        mUpdateStateArg = preference;
+        mUpdateStateCallCount++;
+    }
+
+    Preference getUpdateStateArg() {
+        return mUpdateStateArg;
+    }
+
+    int getUpdateStateCallCount() {
+        return mUpdateStateCallCount;
+    }
+
+    @Override
+    protected boolean handlePreferenceChanged(Preference preference, Object newValue) {
+        mHandlePreferenceChangedCallCount++;
+        mHandlePreferenceChangedPreferenceArg = preference;
+        mHandlePreferenceChangedValueArg = newValue;
+        return super.handlePreferenceChanged(preference, newValue);
+    }
+
+    int getHandlePreferenceChangedCallCount() {
+        return mHandlePreferenceChangedCallCount;
+    }
+
+    Preference getHandlePreferenceChangedPreferenceArg() {
+        return mHandlePreferenceChangedPreferenceArg;
+    }
+
+    Object getHandlePreferenceChangedValueArg() {
+        return mHandlePreferenceChangedValueArg;
+    }
+
+    @Override
+    protected boolean handlePreferenceClicked(Preference preference) {
+        mHandlePreferenceClickedCallCount++;
+        mHandlePreferenceClickedArg = preference;
+        return super.handlePreferenceClicked(preference);
+    }
+
+    int getHandlePreferenceClickedCallCount() {
+        return mHandlePreferenceClickedCallCount;
+    }
+
+    Preference getHandlePreferenceClickedArg() {
+        return mHandlePreferenceClickedArg;
+    }
+
+    @Override
+    protected boolean isUxRestrictionsIgnored(boolean allIgnores, Set preferencesThatIgnore) {
+        return super.isUxRestrictionsIgnored(mAllIgnoresUxRestrictions,
+                mPreferencesIgnoringUxRestrictions);
+    }
+
+    protected void setUxRestrictionsIgnoredConfig(boolean allIgnore, Set preferencesThatIgnore) {
+        mAllIgnoresUxRestrictions = allIgnore;
+        mPreferencesIgnoringUxRestrictions = preferencesThatIgnore;
+    }
+
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/MasterSwitchPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/MasterSwitchPreferenceTest.java
new file mode 100644
index 0000000..c39281c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/MasterSwitchPreferenceTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.view.View;
+
+import androidx.appcompat.view.ContextThemeWrapper;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class MasterSwitchPreferenceTest {
+
+    private PreferenceViewHolder mViewHolder;
+    private MasterSwitchPreference mMasterSwitchPreference;
+    @Mock
+    private MasterSwitchPreference.OnSwitchToggleListener mListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        Context themedContext = new ContextThemeWrapper(context, R.style.CarSettingTheme);
+        View rootView = View.inflate(themedContext, R.layout.two_action_preference, null);
+        View.inflate(themedContext, R.layout.master_switch_widget,
+                rootView.findViewById(android.R.id.widget_frame));
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+        mMasterSwitchPreference = new MasterSwitchPreference(context);
+
+        mMasterSwitchPreference.onBindViewHolder(mViewHolder);
+        mMasterSwitchPreference.setSwitchChecked(false);
+        mMasterSwitchPreference.setSwitchToggleListener(mListener);
+    }
+
+    @Test
+    public void widgetClicked_callsListener() {
+        mViewHolder.findViewById(android.R.id.widget_frame).performClick();
+
+        verify(mListener).onToggle(mMasterSwitchPreference, true);
+    }
+
+    @Test
+    public void widgetClicked_togglesSwitchState() {
+        mViewHolder.findViewById(android.R.id.widget_frame).performClick();
+
+        assertThat(mMasterSwitchPreference.isSwitchChecked()).isTrue();
+    }
+
+    @Test
+    public void setSwitchState_listenerSetAndButtonVisible_oppositeBool_callsListener() {
+        mMasterSwitchPreference.setSwitchChecked(true);
+        verify(mListener).onToggle(mMasterSwitchPreference, true);
+    }
+
+    @Test
+    public void setSwitchState_listenerSetAndButtonVisible_oppositeBool_togglesSwitchState() {
+        mMasterSwitchPreference.setSwitchChecked(true);
+        assertThat(mMasterSwitchPreference.isSwitchChecked()).isTrue();
+    }
+
+    @Test
+    public void setSwitchState_listenerSetAndButtonVisible_sameBool_listenerNotCalled() {
+        mMasterSwitchPreference.setSwitchChecked(false);
+        verify(mListener, never()).onToggle(eq(mMasterSwitchPreference), anyBoolean());
+    }
+
+    @Test
+    public void setSwitchState_listenerSetAndButtonInvisible_oppositeBool_listenerNotCalled() {
+        mMasterSwitchPreference.showAction(false);
+
+        mMasterSwitchPreference.setSwitchChecked(true);
+        verify(mListener, never()).onToggle(eq(mMasterSwitchPreference), anyBoolean());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragmentTest.java
new file mode 100644
index 0000000..647b641
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/PasswordEditTextPreferenceDialogFragmentTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.InputType;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.EditText;
+
+import androidx.preference.EditTextPreference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadows.ShadowAlertDialog;
+
+/** Unit test for {@link EditTextPreferenceDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class PasswordEditTextPreferenceDialogFragmentTest {
+
+    private Context mContext;
+    private ActivityController<BaseTestActivity> mTestActivityController;
+    private BaseTestActivity mTestActivity;
+    private EditTextPreference mPreference;
+    private PasswordEditTextPreferenceDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup();
+        TestTargetFragment targetFragment = new TestTargetFragment();
+        mTestActivity.launchFragment(targetFragment);
+        mPreference = new PasswordEditTextPreference(mContext);
+        mPreference.setDialogLayoutResource(R.layout.preference_dialog_password_edittext);
+        mPreference.setKey("key");
+        targetFragment.getPreferenceScreen().addPreference(mPreference);
+        mFragment = PasswordEditTextPreferenceDialogFragment.newInstance(mPreference.getKey());
+        mFragment.setTargetFragment(targetFragment, /* requestCode= */ 0);
+    }
+
+    @Test
+    public void onStart_inputTypeSetToPassword_shouldRevealShowPasswordCheckBoxUnchecked() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        CheckBox checkBox = dialog.findViewById(R.id.checkbox);
+
+        assertThat(checkBox.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(!checkBox.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onCheckBoxChecked_shouldRevealRawPassword() {
+        String testPassword = "TEST_PASSWORD";
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        CheckBox checkBox = dialog.findViewById(R.id.checkbox);
+        EditText editText = dialog.findViewById(android.R.id.edit);
+        editText.setText(testPassword);
+        checkBox.performClick();
+
+        assertThat(editText.getInputType()).isEqualTo(InputType.TYPE_CLASS_TEXT
+                | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
+        assertThat(editText.getText().toString()).isEqualTo(testPassword);
+    }
+
+    @Test
+    public void onCheckBoxUnchecked_shouldObscureRawPassword() {
+        String testPassword = "TEST_PASSWORD";
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        CheckBox checkBox = dialog.findViewById(R.id.checkbox);
+        EditText editText = dialog.findViewById(android.R.id.edit);
+        editText.setText(testPassword);
+        // Performing click twice to simulate uncheck
+        checkBox.performClick();
+        checkBox.performClick();
+
+        assertThat(editText.getInputType()).isEqualTo((InputType.TYPE_CLASS_TEXT
+                | InputType.TYPE_TEXT_VARIATION_PASSWORD));
+        assertThat(editText.getText().toString()).isEqualTo(testPassword);
+    }
+
+    /** Simple {@link PreferenceFragmentCompat} implementation to serve as the target fragment. */
+    public static class TestTargetFragment extends PreferenceFragmentCompat {
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerListHelperTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerListHelperTest.java
new file mode 100644
index 0000000..9871f28
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerListHelperTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Unit test for {@link PreferenceControllerListHelper}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class PreferenceControllerListHelperTest {
+
+    private static final CarUxRestrictions UX_RESTRICTIONS =
+            new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                    CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+    @Test
+    public void getControllers_returnsList() {
+        List<String> validKeys = Arrays.asList("key1", "key2");
+        List<PreferenceController> controllers =
+                PreferenceControllerListHelper.getPreferenceControllersFromXml(
+                        RuntimeEnvironment.application,
+                        R.xml.preference_controller_list_helper_success,
+                        mock(FragmentController.class),
+                        UX_RESTRICTIONS);
+
+        assertThat(controllers).hasSize(validKeys.size());
+        List<String> foundKeys = new ArrayList<>();
+        for (PreferenceController controller : controllers) {
+            assertThat(controller).isInstanceOf(DefaultRestrictionsPreferenceController.class);
+            foundKeys.add(controller.getPreferenceKey());
+        }
+        assertThat(foundKeys).containsAllIn(validKeys);
+    }
+
+    @Test
+    public void getControllers_invalidController_throwsIllegalArgumentException() {
+        assertThrows(IllegalArgumentException.class,
+                () -> PreferenceControllerListHelper.getPreferenceControllersFromXml(
+                        RuntimeEnvironment.application,
+                        R.xml.preference_controller_list_helper_fail_invalid_controller,
+                        mock(FragmentController.class), UX_RESTRICTIONS));
+    }
+
+    @Test
+    public void getControllers_missingKey_throwsIllegalArgumentException() {
+        assertThrows(IllegalArgumentException.class,
+                () -> PreferenceControllerListHelper.getPreferenceControllersFromXml(
+                        RuntimeEnvironment.application,
+                        R.xml.preference_controller_list_helper_fail_missing_key,
+                        mock(FragmentController.class), UX_RESTRICTIONS));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
new file mode 100644
index 0000000..b51db10
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTest.java
@@ -0,0 +1,396 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Unit test for {@link PreferenceController}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class PreferenceControllerTest {
+
+    private static final CarUxRestrictions LIMIT_STRINGS_UX_RESTRICTIONS =
+            new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                    CarUxRestrictions.UX_RESTRICTIONS_LIMIT_STRING_LENGTH, /* timestamp= */
+                    0).build();
+    private static final CarUxRestrictions NO_SETUP_UX_RESTRICTIONS =
+            new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                    CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP, /* timestamp= */ 0).build();
+
+    private static final CarUxRestrictions BASELINE_UX_RESTRICTIONS =
+            new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                    CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+    private PreferenceControllerTestHelper<FakePreferenceController> mControllerHelper;
+    private FakePreferenceController mController;
+    private Context mContext;
+
+    @Mock
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                FakePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @Test
+    public void setPreference_wrongType_throwsIllegalArgumentException() {
+        PreferenceControllerTestHelper<WrongTypePreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext, WrongTypePreferenceController.class);
+
+        assertThrows(IllegalArgumentException.class, () -> controllerHelper.setPreference(
+                new Preference(mContext)));
+    }
+
+    @Test
+    public void setPreference_correctType_setsPreference() {
+        assertThat(mController.getPreference()).isEqualTo(mPreference);
+    }
+
+    @Test
+    public void setPreference_callsCheckInitialized() {
+        assertThat(mController.getCheckInitializedCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void setPreference_registersOnPreferenceChangeListener() {
+        ArgumentCaptor<Preference.OnPreferenceChangeListener> listenerArgumentCaptor =
+                ArgumentCaptor.forClass(Preference.OnPreferenceChangeListener.class);
+        Object newValue = new Object();
+
+        verify(mPreference).setOnPreferenceChangeListener(listenerArgumentCaptor.capture());
+        listenerArgumentCaptor.getValue().onPreferenceChange(mPreference, newValue);
+
+        assertThat(mController.getHandlePreferenceChangedCallCount()).isEqualTo(1);
+        assertThat(mController.getHandlePreferenceChangedPreferenceArg()).isEqualTo(mPreference);
+        assertThat(mController.getHandlePreferenceChangedValueArg()).isEqualTo(newValue);
+    }
+
+    @Test
+    public void setPreference_registersOnPreferenceClickListener() {
+        ArgumentCaptor<Preference.OnPreferenceClickListener> listenerArgumentCaptor =
+                ArgumentCaptor.forClass(Preference.OnPreferenceClickListener.class);
+
+        verify(mPreference).setOnPreferenceClickListener(listenerArgumentCaptor.capture());
+        listenerArgumentCaptor.getValue().onPreferenceClick(mPreference);
+
+        assertThat(mController.getHandlePreferenceClickedCallCount()).isEqualTo(1);
+        assertThat(mController.getHandlePreferenceClickedArg()).isEqualTo(mPreference);
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_updatesUxRestrictions() {
+        mController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+
+        assertThat(mController.getUxRestrictions()).isEqualTo(NO_SETUP_UX_RESTRICTIONS);
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_created_available_updatesState() {
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        mController.onUxRestrictionsChanged(LIMIT_STRINGS_UX_RESTRICTIONS);
+
+        // onCreate, onUxRestrictionsChanged.
+        assertThat(mController.getUpdateStateCallCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_notCreated_available_doesNotUpdateState() {
+        mController.onUxRestrictionsChanged(LIMIT_STRINGS_UX_RESTRICTIONS);
+
+        assertThat(mController.getUpdateStateCallCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_created_restricted_preferenceDisabled() {
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        mController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+
+        verify(mPreference).setEnabled(false);
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_created_restricted_unrestricted_preferenceEnabled() {
+        InOrder orderVerifier = inOrder(mPreference);
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+        mController.onUxRestrictionsChanged(BASELINE_UX_RESTRICTIONS);
+
+        // setEnabled(true) called on Create.
+        orderVerifier.verify(mPreference).setEnabled(true);
+
+        // setEnabled(false) called with the first UXR change event.
+        orderVerifier.verify(mPreference).setEnabled(false);
+
+        // setEnabled(true) called with the second UXR change event.
+        orderVerifier.verify(mPreference).setEnabled(true);
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_restricted_allPreferencesIgnore_preferenceEnabled() {
+        // mPreference cannot be a Mock here because its real methods need to be invoked.
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                FakePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+
+        Set preferencesIgnoringUxRestrictions = new HashSet();
+        mController.setUxRestrictionsIgnoredConfig(/* allIgnores= */ true,
+                preferencesIgnoringUxRestrictions);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_restricted_thisPreferenceIgnores_preferenceEnabled() {
+        // mPreference cannot be a Mock here because its real methods need to be invoked.
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                FakePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+
+        Set preferencesIgnoringUxRestrictions = new HashSet();
+        preferencesIgnoringUxRestrictions.add(PreferenceControllerTestHelper.getKey());
+        mController.setUxRestrictionsIgnoredConfig(/* allIgnores= */ false,
+                preferencesIgnoringUxRestrictions);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_restricted_uxRestrictionsNotIgnored_preferenceDisabled() {
+        // mPreference cannot be a Mock here because its real methods need to be invoked.
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                FakePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+
+        Set preferencesIgnoringUxRestrictions = new HashSet();
+        mController.setUxRestrictionsIgnoredConfig(/* allIgnores= */ false,
+                preferencesIgnoringUxRestrictions);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void getAvailabilityStatus_defaultsToAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void refreshUi_notCreated_doesNothing() {
+        mController.refreshUi();
+
+        verify(mPreference, never()).setVisible(anyBoolean());
+        assertThat(mController.getUpdateStateCallCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_created_available_preferenceShown() {
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        mController.refreshUi();
+
+        // onCreate, refreshUi.
+        verify(mPreference, times(2)).setVisible(true);
+    }
+
+    @Test
+    public void refreshUi_created_notAvailable_preferenceHidden() {
+        mController.setAvailabilityStatus(CONDITIONALLY_UNAVAILABLE);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        mController.refreshUi();
+
+        // onCreate, refreshUi.
+        verify(mPreference, times(2)).setVisible(false);
+    }
+
+    @Test
+    public void refreshUi_created_available_updatesState() {
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        mController.refreshUi();
+
+        // onCreate, refreshUi.
+        assertThat(mController.getUpdateStateCallCount()).isEqualTo(2);
+        assertThat(mController.getUpdateStateArg()).isEqualTo(mPreference);
+    }
+
+    @Test
+    public void refreshUi_created_notAvailable_doesNotUpdateState() {
+        mController.setAvailabilityStatus(CONDITIONALLY_UNAVAILABLE);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        mController.refreshUi();
+
+        assertThat(mController.getUpdateStateCallCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void lifecycle_unsupportedOnDevice_doesNotCallSubclassHooks() {
+        mController.setAvailabilityStatus(UNSUPPORTED_ON_DEVICE);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.markState(Lifecycle.State.DESTROYED);
+
+        assertThat(mController.getOnCreateInternalCallCount()).isEqualTo(0);
+        assertThat(mController.getOnStartInternalCallCount()).isEqualTo(0);
+        assertThat(mController.getOnResumeInternalCallCount()).isEqualTo(0);
+        assertThat(mController.getOnPauseInternalCallCount()).isEqualTo(0);
+        assertThat(mController.getOnStopInternalCallCount()).isEqualTo(0);
+        assertThat(mController.getOnDestroyInternalCallCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onCreate_unsupportedOnDevice_hidesPreference() {
+        mController.setAvailabilityStatus(UNSUPPORTED_ON_DEVICE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        verify(mPreference).setVisible(false);
+    }
+
+    @Test
+    public void onCreate_callsSubclassHook() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mController.getOnCreateInternalCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onCreate_available_updatesState() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mController.getUpdateStateCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onStart_callsSubclassHook() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mController.getOnStartInternalCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onStart_available_updatesState() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        // onCreate, onStart.
+        assertThat(mController.getUpdateStateCallCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void onResume_callsSubclassHook() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mController.getOnResumeInternalCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onPause_callsSubclassHook() {
+        mControllerHelper.markState(Lifecycle.State.RESUMED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+
+        assertThat(mController.getOnPauseInternalCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onStop_callsSubclassHook() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(mController.getOnStopInternalCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onDestroy_callsSubclassHook() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        assertThat(mController.getOnDestroyInternalCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void handlePreferenceChanged_defaultReturnsTrue() {
+        assertThat(mController.handlePreferenceChanged(mPreference, new Object())).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceClicked_defaultReturnsFalse() {
+        assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
+    }
+
+    /** For testing passing the wrong type of preference to the controller. */
+    private static class WrongTypePreferenceController extends
+            PreferenceController<PreferenceGroup> {
+
+        WrongTypePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Class<PreferenceGroup> getPreferenceType() {
+            return PreferenceGroup.class;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTestHelper.java b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTestHelper.java
new file mode 100644
index 0000000..3ed36af
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceControllerTestHelper.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import static androidx.lifecycle.Lifecycle.Event.ON_CREATE;
+import static androidx.lifecycle.Lifecycle.Event.ON_DESTROY;
+import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
+import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+import static androidx.lifecycle.Lifecycle.State.CREATED;
+import static androidx.lifecycle.Lifecycle.State.DESTROYED;
+import static androidx.lifecycle.Lifecycle.State.INITIALIZED;
+import static androidx.lifecycle.Lifecycle.State.RESUMED;
+import static androidx.lifecycle.Lifecycle.State.STARTED;
+
+import static org.mockito.Mockito.mock;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+
+import org.robolectric.util.ReflectionHelpers;
+import org.robolectric.util.ReflectionHelpers.ClassParameter;
+
+/**
+ * Helper for testing {@link PreferenceController} classes.
+ *
+ * @param <T> the type of preference controller under test.
+ */
+public class PreferenceControllerTestHelper<T extends PreferenceController> {
+
+    private static final String PREFERENCE_KEY = "preference_key";
+
+    private static final CarUxRestrictions UX_RESTRICTIONS =
+            new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                    CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
+
+    private Lifecycle.State mState = INITIALIZED;
+
+    private final FragmentController mMockFragmentController;
+    private final T mPreferenceController;
+    private final PreferenceScreen mScreen;
+    private boolean mSetPreferenceCalled;
+
+    /**
+     * Constructs a new helper. Call {@link #setPreference(Preference)} once initialization on the
+     * controller is complete to associate the controller with a preference.
+     *
+     * @param context                  the {@link Context} to use to instantiate the preference
+     *                                 controller.
+     * @param preferenceControllerType the class type under test.
+     */
+    public PreferenceControllerTestHelper(Context context, Class<T> preferenceControllerType) {
+        mMockFragmentController = mock(FragmentController.class);
+        mPreferenceController = ReflectionHelpers.callConstructor(preferenceControllerType,
+                ClassParameter.from(Context.class, context),
+                ClassParameter.from(String.class, PREFERENCE_KEY),
+                ClassParameter.from(FragmentController.class, mMockFragmentController),
+                ClassParameter.from(CarUxRestrictions.class, UX_RESTRICTIONS));
+        mScreen = new PreferenceManager(context).createPreferenceScreen(context);
+    }
+
+    /**
+     * Convenience constructor for a new helper for controllers which do not need to do additional
+     * initialization before a preference is set.
+     *
+     * @param preference the {@link Preference} to associate with the controller.
+     */
+    public PreferenceControllerTestHelper(Context context, Class<T> preferenceControllerType,
+            Preference preference) {
+        this(context, preferenceControllerType);
+        setPreference(preference);
+    }
+
+    /**
+     * Associates the controller with the given preference. This should only be called once.
+     */
+    public void setPreference(Preference preference) {
+        if (mSetPreferenceCalled) {
+            throw new IllegalStateException(
+                    "setPreference should only be called once. Create a new helper if needed.");
+        }
+        preference.setKey(PREFERENCE_KEY);
+        mScreen.addPreference(preference);
+        mPreferenceController.setPreference(preference);
+        mSetPreferenceCalled = true;
+    }
+
+    /**
+     * Returns the {@link PreferenceController} of this helper.
+     */
+    public T getController() {
+        return mPreferenceController;
+    }
+
+    /**
+     * Returns a mock {@link FragmentController} that can be used to verify controller navigation
+     * and stub finding dialog fragments.
+     */
+    public FragmentController getMockFragmentController() {
+        return mMockFragmentController;
+    }
+
+    /**
+     * Sends a {@link Lifecycle.Event} to the controller. This is preferred over calling the
+     * controller's lifecycle methods directly as it ensures intermediate events are dispatched.
+     * For example, sending {@link Lifecycle.Event#ON_START} to an
+     * {@link Lifecycle.State#INITIALIZED} controller will dispatch
+     * {@link Lifecycle.Event#ON_CREATE} and {@link Lifecycle.Event#ON_START} while moving the
+     * controller to the {@link Lifecycle.State#STARTED} state.
+     */
+    public void sendLifecycleEvent(Lifecycle.Event event) {
+        markState(getStateAfter(event));
+    }
+
+    /**
+     * Move the {@link PreferenceController} to the given {@code state}. This is preferred over
+     * calling the controller's lifecycle methods directly as it ensures intermediate events are
+     * dispatched. For example, marking the {@link Lifecycle.State#STARTED} state on an
+     * {@link Lifecycle.State#INITIALIZED} controller will also send the
+     * {@link Lifecycle.Event#ON_CREATE} and {@link Lifecycle.Event#ON_START} events.
+     */
+    public void markState(Lifecycle.State state) {
+        while (mState != state) {
+            while (mState.compareTo(state) > 0) {
+                dispatchEvent(downEvent(mState));
+            }
+            while (mState.compareTo(state) < 0) {
+                dispatchEvent(upEvent(mState));
+            }
+        }
+    }
+
+    public static String getKey() {
+        return PREFERENCE_KEY;
+    }
+
+    /*
+     * Ideally we would use androidx.lifecycle.LifecycleRegistry to drive the lifecycle changes.
+     * However, doing so led to test flakiness with an unknown root cause. We dispatch state
+     * changes manually for now, borrowing from LifecycleRegistry's implementation, pending
+     * further investigation.
+     */
+
+    @NonNull
+    private Lifecycle getLifecycle() {
+        throw new UnsupportedOperationException();
+    }
+
+    private void dispatchEvent(Lifecycle.Event event) {
+        switch (event) {
+            case ON_CREATE:
+                mScreen.onAttached();
+                mPreferenceController.onCreate(this::getLifecycle);
+                break;
+            case ON_START:
+                mPreferenceController.onStart(this::getLifecycle);
+                break;
+            case ON_RESUME:
+                mPreferenceController.onResume(this::getLifecycle);
+                break;
+            case ON_PAUSE:
+                mPreferenceController.onPause(this::getLifecycle);
+                break;
+            case ON_STOP:
+                mPreferenceController.onStop(this::getLifecycle);
+                break;
+            case ON_DESTROY:
+                mScreen.onDetached();
+                mPreferenceController.onDestroy(this::getLifecycle);
+                break;
+            case ON_ANY:
+                throw new IllegalArgumentException();
+        }
+
+        mState = getStateAfter(event);
+    }
+
+    private static Lifecycle.State getStateAfter(Lifecycle.Event event) {
+        switch (event) {
+            case ON_CREATE:
+            case ON_STOP:
+                return CREATED;
+            case ON_START:
+            case ON_PAUSE:
+                return STARTED;
+            case ON_RESUME:
+                return RESUMED;
+            case ON_DESTROY:
+                return DESTROYED;
+            case ON_ANY:
+                break;
+        }
+        throw new IllegalArgumentException("Unexpected event value " + event);
+    }
+
+    private static Lifecycle.Event downEvent(Lifecycle.State state) {
+        switch (state) {
+            case INITIALIZED:
+                throw new IllegalArgumentException();
+            case CREATED:
+                return ON_DESTROY;
+            case STARTED:
+                return ON_STOP;
+            case RESUMED:
+                return ON_PAUSE;
+            case DESTROYED:
+                throw new IllegalArgumentException();
+        }
+        throw new IllegalArgumentException("Unexpected state value " + state);
+    }
+
+    private static Lifecycle.Event upEvent(Lifecycle.State state) {
+        switch (state) {
+            case INITIALIZED:
+            case DESTROYED:
+                return ON_CREATE;
+            case CREATED:
+                return ON_START;
+            case STARTED:
+                return ON_RESUME;
+            case RESUMED:
+                throw new IllegalArgumentException();
+        }
+        throw new IllegalArgumentException("Unexpected state value " + state);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceUtilTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceUtilTest.java
new file mode 100644
index 0000000..d95e631
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceUtilTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.testng.Assert.assertThrows;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class PreferenceUtilTest {
+
+    @Test
+    public void testCheckPreferenceType_true() {
+        Preference preference = new SwitchPreference(RuntimeEnvironment.application);
+        assertThat(PreferenceUtil.checkPreferenceType(preference, SwitchPreference.class)).isTrue();
+    }
+
+    @Test
+    public void testCheckPreferenceType_superclass_true() {
+        Preference preference = new SwitchPreference(RuntimeEnvironment.application);
+        assertThat(
+                PreferenceUtil.checkPreferenceType(preference, TwoStatePreference.class)).isTrue();
+    }
+
+    @Test
+    public void testCheckPreferenceType_false() {
+        Preference preference = new ListPreference(RuntimeEnvironment.application);
+        assertThat(
+                PreferenceUtil.checkPreferenceType(preference, TwoStatePreference.class)).isFalse();
+    }
+
+    // Test should succeed without throwing an exception.
+    @Test
+    public void testRequirePreferenceType_true() {
+        Preference preference = new SwitchPreference(RuntimeEnvironment.application);
+        PreferenceUtil.requirePreferenceType(preference, SwitchPreference.class);
+    }
+
+    // Test should succeed without throwing an exception.
+    @Test
+    public void testRequirePreferenceType_superclass_true() {
+        Preference preference = new SwitchPreference(RuntimeEnvironment.application);
+        PreferenceUtil.requirePreferenceType(preference, TwoStatePreference.class);
+    }
+
+    @Test
+    public void testRequirePreferenceType_false() {
+        Preference preference = new ListPreference(RuntimeEnvironment.application);
+        assertThrows(IllegalArgumentException.class,
+                () -> PreferenceUtil.requirePreferenceType(preference, TwoStatePreference.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/PreferenceXmlParserTest.java b/tests/robotests/src/com/android/car/settings/common/PreferenceXmlParserTest.java
new file mode 100644
index 0000000..e989e74
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/PreferenceXmlParserTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Bundle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Unit test for {@link PreferenceXmlParser}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class PreferenceXmlParserTest {
+
+    @Test
+    public void extractMetadata_keyAndControllerName() throws IOException, XmlPullParserException {
+        List<Bundle> metadata = PreferenceXmlParser.extractMetadata(
+                RuntimeEnvironment.application, R.xml.preference_parser,
+                PreferenceXmlParser.MetadataFlag.FLAG_NEED_KEY
+                        | PreferenceXmlParser.MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
+
+        assertThat(metadata).hasSize(4);
+        for (Bundle bundle : metadata) {
+            assertThat(bundle.getString(PreferenceXmlParser.METADATA_KEY)).isNotNull();
+            assertThat(bundle.getString(PreferenceXmlParser.METADATA_CONTROLLER)).isNotNull();
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/ProgressBarPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/ProgressBarPreferenceTest.java
new file mode 100644
index 0000000..171d622
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/ProgressBarPreferenceTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ProgressBarPreferenceTest {
+
+    private static final String TEST_LABEL = "TEST_LABEL";
+
+    private Context mContext;
+    private PreferenceViewHolder mViewHolder;
+    private ProgressBarPreference mProgressBarPreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        View rootView = View.inflate(mContext, R.layout.progress_bar_preference,
+                /* root= */ null);
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+        mProgressBarPreference = new ProgressBarPreference(mContext);
+    }
+
+    @Test
+    public void setMinLabel_setsText() {
+        mProgressBarPreference.setMinLabel(TEST_LABEL);
+        mProgressBarPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getMinLabel().getText()).isEqualTo(TEST_LABEL);
+    }
+
+    @Test
+    public void setMaxLabel_setsText() {
+        mProgressBarPreference.setMaxLabel(TEST_LABEL);
+        mProgressBarPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getMaxLabel().getText()).isEqualTo(TEST_LABEL);
+    }
+
+    @Test
+    public void setMin_setsMin() {
+        mProgressBarPreference.setMin(10);
+        mProgressBarPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getProgressBar().getMin()).isEqualTo(10);
+    }
+
+    @Test
+    public void setMax_setsMax() {
+        mProgressBarPreference.setMax(1000);
+        mProgressBarPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getProgressBar().getMax()).isEqualTo(1000);
+    }
+
+    @Test
+    public void setProgress_setsProgress() {
+        mProgressBarPreference.setProgress(40);
+        mProgressBarPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getProgressBar().getProgress()).isEqualTo(40);
+    }
+
+    private ProgressBar getProgressBar() {
+        return (ProgressBar) mViewHolder.findViewById(android.R.id.progress);
+    }
+
+    private TextView getMinLabel() {
+        return (TextView) mViewHolder.findViewById(android.R.id.text1);
+    }
+
+    private TextView getMaxLabel() {
+        return (TextView) mViewHolder.findViewById(android.R.id.text2);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/SettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/SettingsFragmentTest.java
new file mode 100644
index 0000000..a19e3dd
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/SettingsFragmentTest.java
@@ -0,0 +1,310 @@
+/*
+ * Copyright 2018 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.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.widget.FrameLayout;
+
+import androidx.fragment.app.DialogFragment;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.DummyFragment;
+import com.android.car.settings.testutils.FragmentController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+/** Unit test for {@link SettingsFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class SettingsFragmentTest {
+
+    private static final String TEST_TAG = "test_tag";
+
+    private Context mContext;
+    private FragmentController<TestSettingsFragment> mFragmentController;
+    private SettingsFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mFragmentController = FragmentController.of(new TestSettingsFragment());
+        mFragment = mFragmentController.get();
+    }
+
+    @Test
+    public void use_returnsController() {
+        mFragmentController.setup();
+        assertThat(mFragment.use(FakePreferenceController.class,
+                R.string.tpk_fake_controller)).isNotNull();
+    }
+
+    @Test
+    public void onAttach_registersLifecycleObservers() {
+        mFragmentController.create();
+        FakePreferenceController controller = mFragment.use(FakePreferenceController.class,
+                R.string.tpk_fake_controller);
+        assertThat(controller.getOnCreateInternalCallCount()).isEqualTo(1);
+        mFragmentController.destroy();
+        assertThat(controller.getOnDestroyInternalCallCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_propagatesToControllers() {
+        mFragmentController.setup();
+        FakePreferenceController controller = mFragment.use(FakePreferenceController.class,
+                R.string.tpk_fake_controller);
+        CarUxRestrictions uxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_NO_KEYBOARD, /* timestamp= */ 0).build();
+        mFragment.onUxRestrictionsChanged(uxRestrictions);
+        assertThat(controller.getUxRestrictions()).isEqualTo(uxRestrictions);
+    }
+
+    @Test
+    public void onDisplayPreferenceDialog_editTextPreference_showsDialog() {
+        mFragmentController.setup();
+
+        mFragment.getPreferenceScreen().findPreference(
+                mContext.getString(R.string.tpk_edit_text_preference)).performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentByTag(
+                SettingsFragment.DIALOG_FRAGMENT_TAG)).isInstanceOf(
+                EditTextPreferenceDialogFragment.class);
+    }
+
+    @Test
+    public void onDisplayPreferenceDialog_listPreference_showsDialog() {
+        mFragmentController.setup();
+
+        mFragment.getPreferenceScreen().findPreference(
+                mContext.getString(R.string.tpk_list_preference)).performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentByTag(
+                SettingsFragment.DIALOG_FRAGMENT_TAG)).isInstanceOf(
+                SettingsListPreferenceDialogFragment.class);
+    }
+
+    @Test
+    public void onDisplayPreferenceDialog_unknownPreferenceType_throwsIllegalArgumentException() {
+        mFragmentController.setup();
+
+        assertThrows(IllegalArgumentException.class,
+                () -> mFragment.onDisplayPreferenceDialog(new Preference(mContext)));
+    }
+
+    @Test
+    public void onDisplayPreferenceDialog_alreadyShowing_doesNothing() {
+        mFragmentController.setup();
+
+        // Show a dialog.
+        mFragment.getPreferenceScreen().findPreference(
+                mContext.getString(R.string.tpk_edit_text_preference)).performClick();
+        assertThat(mFragment.getFragmentManager().findFragmentByTag(
+                SettingsFragment.DIALOG_FRAGMENT_TAG)).isInstanceOf(
+                EditTextPreferenceDialogFragment.class);
+
+        // Attempt to show another.
+        mFragment.getPreferenceScreen().findPreference(
+                mContext.getString(R.string.tpk_list_preference)).performClick();
+
+        // Assert only one shown at a time.
+        assertThat(mFragment.getFragmentManager().findFragmentByTag(
+                SettingsFragment.DIALOG_FRAGMENT_TAG)).isInstanceOf(
+                EditTextPreferenceDialogFragment.class);
+    }
+
+    @Test
+    public void launchFragment_otherFragment_opensFragment() {
+        mFragmentController.setup();
+        TestSettingsFragment otherFragment = new TestSettingsFragment();
+        mFragment.launchFragment(otherFragment);
+        assertThat(
+                mFragment.getFragmentManager().findFragmentById(R.id.fragment_container)).isEqualTo(
+                otherFragment);
+    }
+
+    @Test
+    public void launchFragment_dialogFragment_throwsError() {
+        mFragmentController.setup();
+        DialogFragment dialogFragment = new DialogFragment();
+        assertThrows(IllegalArgumentException.class,
+                () -> mFragment.launchFragment(dialogFragment));
+    }
+
+    @Test
+    public void showDialog_noTag_launchesDialogFragment() {
+        mFragmentController.setup();
+        DialogFragment dialogFragment = mock(DialogFragment.class);
+        mFragment.showDialog(dialogFragment, /* tag */ null);
+        verify(dialogFragment).show(mFragment.getFragmentManager(), null);
+    }
+
+    @Test
+    public void showDialog_withTag_launchesDialogFragment() {
+        mFragmentController.setup();
+        DialogFragment dialogFragment = mock(DialogFragment.class);
+        mFragment.showDialog(dialogFragment, TEST_TAG);
+        verify(dialogFragment).show(mFragment.getFragmentManager(), TEST_TAG);
+    }
+
+    @Test
+    public void findDialogByTag_retrieveOriginalDialog_returnsDialog() {
+        mFragmentController.setup();
+        DialogFragment dialogFragment = new DialogFragment();
+        mFragment.showDialog(dialogFragment, TEST_TAG);
+        assertThat(mFragment.findDialogByTag(TEST_TAG)).isEqualTo(dialogFragment);
+    }
+
+    @Test
+    public void findDialogByTag_notDialogFragment_returnsNull() {
+        mFragmentController.setup();
+        TestSettingsFragment fragment = new TestSettingsFragment();
+        mFragment.getFragmentManager().beginTransaction().add(fragment, TEST_TAG).commit();
+        assertThat(mFragment.findDialogByTag(TEST_TAG)).isNull();
+    }
+
+    @Test
+    public void findDialogByTag_noSuchFragment_returnsNull() {
+        mFragmentController.setup();
+        assertThat(mFragment.findDialogByTag(TEST_TAG)).isNull();
+    }
+
+    @Test
+    public void startActivityForResult_largeRequestCode_throwsError() {
+        mFragmentController.setup();
+        assertThrows(() -> mFragment.startActivityForResult(new Intent(), 0xffff,
+                mock(ActivityResultCallback.class)));
+    }
+
+    @Test
+    public void startActivityForResult_tooManyRequests_throwsError() {
+        mFragmentController.setup();
+        assertThrows(() -> {
+            for (int i = 0; i < 0xff; i++) {
+                mFragment.startActivityForResult(new Intent(), i,
+                        mock(ActivityResultCallback.class));
+            }
+        });
+    }
+
+    @Test
+    public void startIntentSenderForResult_largeRequestCode_throwsError() {
+        mFragmentController.setup();
+        assertThrows(
+                () -> mFragment.startIntentSenderForResult(
+                        mock(IntentSender.class), /* requestCode= */ 0xffff,
+                        /* fillInIntent= */null, /* flagsMask= */ 0,
+                        /* flagsValues= */0, /* options= */ null,
+                        mock(ActivityResultCallback.class)));
+    }
+
+    @Test
+    public void startIntentSenderForResult_tooManyRequests_throwsError() {
+        mFragmentController.setup();
+        assertThrows(() -> {
+            for (int i = 0; i < 0xff; i++) {
+                mFragment.startIntentSenderForResult(
+                        mock(IntentSender.class), /* requestCode= */ 0xffff,
+                        /* fillInIntent= */null, /* flagsMask= */ 0,
+                        /* flagsValues= */0, /* options= */ null,
+                        mock(ActivityResultCallback.class));
+            }
+        });
+    }
+
+    @Test
+    public void onActivityResult_hasValidRequestCode_triggersOnActivityResult() {
+        mFragmentController.setup();
+        ActivityResultCallback callback = mock(ActivityResultCallback.class);
+
+        int reqCode = 100;
+        int resCode = -1;
+        mFragment.startActivityForResult(new Intent(), reqCode, callback);
+        int fragmentReqCode = (1 << 8) + reqCode;
+        mFragment.onActivityResult(fragmentReqCode, resCode, new Intent());
+        verify(callback).processActivityResult(eq(reqCode), eq(resCode), any(Intent.class));
+    }
+
+    @Test
+    public void onActivityResult_wrongRequestCode_doesntTriggerOnActivityResult() {
+        mFragmentController.setup();
+        ActivityResultCallback callback = mock(ActivityResultCallback.class);
+
+        int reqCode = 100;
+        int resCode = -1;
+        mFragment.startActivityForResult(new Intent(), reqCode,
+                callback);
+        int fragmentReqCode = (2 << 8) + reqCode;
+        mFragment.onActivityResult(fragmentReqCode, resCode, new Intent());
+        verify(callback, never()).processActivityResult(anyInt(), anyInt(),
+                any(Intent.class));
+    }
+
+    @Test
+    public void onActivityCreated_hasAppIconIfRoot() {
+        mFragmentController.setup();
+        DummyFragment otherFragment = new DummyFragment();
+        mFragment.launchFragment(otherFragment);
+
+        FrameLayout actionBarContainer =
+                otherFragment.requireActivity().findViewById(R.id.action_bar);
+
+        assertThat(actionBarContainer.requireViewById(R.id.back_button).getTag(R.id.back_button))
+                .isEqualTo(R.drawable.ic_launcher_settings);
+    }
+
+    @Test
+    public void onActivityCreated_hasBackArrowIconIfNotRoot() {
+        mFragmentController.setup();
+
+        TestSettingsFragment otherFragment1 = new TestSettingsFragment();
+        mFragment.launchFragment(otherFragment1);
+
+        TestSettingsFragment otherFragment2 = new TestSettingsFragment();
+        mFragment.launchFragment(otherFragment2);
+
+        FrameLayout actionBarContainer =
+                otherFragment2.requireActivity().findViewById(R.id.action_bar);
+
+        assertThat(actionBarContainer.requireViewById(R.id.back_button).getTag(R.id.back_button))
+                .isEqualTo(R.drawable.ic_arrow_back);
+    }
+
+    /** Concrete {@link SettingsFragment} for testing. */
+    public static class TestSettingsFragment extends SettingsFragment {
+        @Override
+        protected int getPreferenceScreenResId() {
+            return R.xml.settings_fragment;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/SettingsListPreferenceDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/SettingsListPreferenceDialogFragmentTest.java
new file mode 100644
index 0000000..88310de
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/SettingsListPreferenceDialogFragmentTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowApplication;
+
+/** Unit test for {@link SettingsListPreferenceDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class SettingsListPreferenceDialogFragmentTest {
+
+    private ActivityController<BaseTestActivity> mTestActivityController;
+    private BaseTestActivity mTestActivity;
+    private ListPreference mPreference;
+    private SettingsListPreferenceDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup();
+
+        EditTextPreferenceDialogFragmentTest.TestTargetFragment targetFragment =
+                new EditTextPreferenceDialogFragmentTest.TestTargetFragment();
+        mTestActivity.launchFragment(targetFragment);
+        mPreference = new ListPreference(context);
+        mPreference.setDialogLayoutResource(R.layout.preference_dialog_edittext);
+        mPreference.setKey("key");
+        mPreference.setEntries(R.array.entries);
+        mPreference.setEntryValues(R.array.entry_values);
+        targetFragment.getPreferenceScreen().addPreference(mPreference);
+
+        mFragment = SettingsListPreferenceDialogFragment.newInstance(mPreference.getKey());
+        mFragment.setTargetFragment(targetFragment, /* requestCode= */ 0);
+    }
+
+    @Test
+    public void dialogPopulatedWithPreferenceEntries() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        assertThat(getShadowAlertDialog().getItems()).isEqualTo(mPreference.getEntries());
+    }
+
+    @Test
+    public void itemSelected_dismissesDialog() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        getShadowAlertDialog().clickOnItem(1);
+
+        assertThat(getShadowAlertDialog().hasBeenDismissed()).isTrue();
+    }
+
+    @Test
+    public void itemSelected_setsPreferenceValue() {
+        mPreference.setValueIndex(0);
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        getShadowAlertDialog().clickOnItem(1);
+
+        assertThat(mPreference.getValue()).isEqualTo(mPreference.getEntryValues()[1]);
+    }
+
+    @Test
+    public void onDialogClosed_negativeResult_doesNothing() {
+        mPreference.setValueIndex(0);
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+
+        dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+
+        assertThat(mPreference.getValue()).isEqualTo(mPreference.getEntryValues()[0]);
+    }
+
+    @Test
+    public void instanceStateRetained() {
+        mPreference.setValueIndex(0);
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        // Save instance state.
+        Bundle outState = new Bundle();
+        mTestActivityController.pause().saveInstanceState(outState).stop();
+
+        // Recreate everything with saved state.
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup(outState);
+
+        // Ensure saved entries were applied.
+        assertThat(getShadowAlertDialog().getItems()).isEqualTo(mPreference.getEntries());
+    }
+
+    private ShadowAlertDialog getShadowAlertDialog() {
+        return ShadowApplication.getInstance().getLatestAlertDialog();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/SettingsPreferenceDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/SettingsPreferenceDialogFragmentTest.java
new file mode 100644
index 0000000..3de4496
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/SettingsPreferenceDialogFragmentTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+
+import androidx.preference.DialogPreference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowWindow;
+
+/** Unit test for {@link SettingsPreferenceDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class SettingsPreferenceDialogFragmentTest {
+
+    private ActivityController<BaseTestActivity> mTestActivityController;
+    private BaseTestActivity mTestActivity;
+    private DialogPreference mPreference;
+    private TestSettingsPreferenceDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup();
+
+        TestTargetFragment targetFragment = new TestTargetFragment();
+        mTestActivity.launchFragment(targetFragment);
+        mPreference = new TestDialogPreference(context);
+        mPreference.setKey("key");
+        targetFragment.getPreferenceScreen().addPreference(mPreference);
+
+        mFragment = TestSettingsPreferenceDialogFragment.newInstance(mPreference.getKey());
+        mFragment.setTargetFragment(targetFragment, /* requestCode= */ 0);
+    }
+
+    @Test
+    public void dialogFieldsPopulatedWithPreferenceFields() {
+        mPreference.setDialogTitle("title");
+        mPreference.setPositiveButtonText("positive button text");
+        mPreference.setNegativeButtonText("negative button text");
+        mPreference.setDialogMessage("dialog message");
+
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        assertThat(getShadowAlertDialog().getTitle()).isEqualTo(mPreference.getDialogTitle());
+        assertThat(ShadowAlertDialog.getLatestAlertDialog().getButton(
+                DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(
+                mPreference.getPositiveButtonText());
+        assertThat(ShadowAlertDialog.getLatestAlertDialog().getButton(
+                DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(
+                mPreference.getNegativeButtonText());
+        assertThat(getShadowAlertDialog().getMessage()).isEqualTo(mPreference.getDialogMessage());
+    }
+
+    @Test
+    public void dialogMessage_messageViewShown() {
+        mPreference.setDialogTitle("title");
+        mPreference.setPositiveButtonText("positive button text");
+        mPreference.setNegativeButtonText("negative button text");
+        mPreference.setDialogMessage("dialog message");
+
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        View messageView = ShadowAlertDialog.getLatestAlertDialog().findViewById(
+                android.R.id.message);
+
+        assertThat(messageView.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void noDialogMessage_messageViewHidden() {
+        mPreference.setDialogTitle("title");
+        mPreference.setPositiveButtonText("positive button text");
+        mPreference.setNegativeButtonText("negative button text");
+
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        View messageView = ShadowAlertDialog.getLatestAlertDialog().findViewById(
+                android.R.id.message);
+
+        assertThat(messageView.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void getPreference_returnsDialogRequestingPreference() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        assertThat(mFragment.getPreference()).isEqualTo(mPreference);
+    }
+
+    @Test
+    public void dialogClosed_positiveButton_callsOnDialogClosed() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+
+        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(mFragment.getDialogClosedResult()).isEqualTo(Boolean.TRUE);
+    }
+
+    @Test
+    public void dialogClosed_negativeButton_callsOnDialogClosed() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+
+        dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+
+        assertThat(mFragment.getDialogClosedResult()).isEqualTo(Boolean.FALSE);
+    }
+
+    @Test
+    public void subclassNeedsInputMethod_softInputModeSetOnWindow() {
+        mFragment.setNeedsInputMethod(true);
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        assertThat(getShadowWindowFromDialog(
+                ShadowAlertDialog.getLatestAlertDialog()).getSoftInputMode()).isEqualTo(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+    }
+
+    @Test
+    public void subclassDoesNotNeedInputMethod_noWindowSoftInputMode() {
+        mFragment.setNeedsInputMethod(false);
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        assertThat(getShadowWindowFromDialog(
+                ShadowAlertDialog.getLatestAlertDialog()).getSoftInputMode()).isEqualTo(0);
+    }
+
+    @Test
+    public void instanceStateRetained() {
+        String dialogTitle = "dialog title";
+        String positiveButtonText = "positive button text";
+        String negativeButtonText = "negative button text";
+        String dialogMessage = "dialog message";
+        mPreference.setDialogTitle(dialogTitle);
+        mPreference.setPositiveButtonText(positiveButtonText);
+        mPreference.setNegativeButtonText(negativeButtonText);
+        mPreference.setDialogMessage(dialogMessage);
+
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        // Save instance state.
+        Bundle outState = new Bundle();
+        mTestActivityController.pause().saveInstanceState(outState).stop();
+
+        // Recreate everything with saved state.
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup(outState);
+
+        // Ensure saved fields were applied.
+        assertThat(getShadowAlertDialog().getTitle()).isEqualTo(dialogTitle);
+        assertThat(ShadowAlertDialog.getLatestAlertDialog().getButton(
+                DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(positiveButtonText);
+        assertThat(ShadowAlertDialog.getLatestAlertDialog().getButton(
+                DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(negativeButtonText);
+        assertThat(getShadowAlertDialog().getMessage()).isEqualTo(dialogMessage);
+    }
+
+    private ShadowAlertDialog getShadowAlertDialog() {
+        return ShadowApplication.getInstance().getLatestAlertDialog();
+    }
+
+    private ShadowWindow getShadowWindowFromDialog(AlertDialog dialog) {
+        return (ShadowWindow) Shadow.extract(dialog.getWindow());
+    }
+
+    /** Concrete implementation of the fragment under test. */
+    public static class TestSettingsPreferenceDialogFragment extends
+            SettingsPreferenceDialogFragment {
+
+        private Boolean mDialogClosedResult;
+        private boolean mNeedsInputMethod;
+
+        static TestSettingsPreferenceDialogFragment newInstance(String key) {
+            TestSettingsPreferenceDialogFragment fragment =
+                    new TestSettingsPreferenceDialogFragment();
+            Bundle b = new Bundle(/* capacity= */ 1);
+            b.putString(ARG_KEY, key);
+            fragment.setArguments(b);
+            return fragment;
+        }
+
+        @Override
+        protected boolean needInputMethod() {
+            return mNeedsInputMethod;
+        }
+
+        void setNeedsInputMethod(boolean needsInputMethod) {
+            mNeedsInputMethod = needsInputMethod;
+        }
+
+        @Override
+        protected void onDialogClosed(boolean positiveResult) {
+            mDialogClosedResult = positiveResult;
+        }
+
+        Boolean getDialogClosedResult() {
+            return mDialogClosedResult;
+        }
+    }
+
+    /** Concrete implementation of {@link DialogPreference} for testing use. */
+    private static class TestDialogPreference extends DialogPreference {
+        TestDialogPreference(Context context) {
+            super(context);
+        }
+    }
+
+    /** Simple {@link PreferenceFragmentCompat} implementation to serve as the target fragment. */
+    public static class TestTargetFragment extends PreferenceFragmentCompat {
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/TwoActionPreferenceTest.java b/tests/robotests/src/com/android/car/settings/common/TwoActionPreferenceTest.java
new file mode 100644
index 0000000..5cce802
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/TwoActionPreferenceTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.ContextThemeWrapper;
+import android.view.View;
+
+import androidx.annotation.XmlRes;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class TwoActionPreferenceTest {
+
+    private static class TestTwoActionPreference extends TwoActionPreference {
+
+        TestTwoActionPreference(Context context) {
+            super(context);
+        }
+
+        @Override
+        protected void onBindWidgetFrame(View actionContainer) {
+            // Intentionally empty.
+        }
+    }
+
+    private Context mContext;
+    private PreferenceViewHolder mViewHolder;
+    private TestTwoActionPreference mTestTwoActionPreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        Context themedContext = new ContextThemeWrapper(mContext, R.style.CarSettingTheme);
+        View rootView = View.inflate(themedContext, R.layout.two_action_preference,
+                null);
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+        mTestTwoActionPreference = new TestTwoActionPreference(mContext);
+    }
+
+    @Test
+    public void showAction_true_buttonVisible() {
+        mTestTwoActionPreference.showAction(true);
+        mTestTwoActionPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(mViewHolder.findViewById(
+                R.id.action_widget_container).getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void showAction_false_buttonGone() {
+        mTestTwoActionPreference.showAction(false);
+        mTestTwoActionPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(mViewHolder.findViewById(
+                R.id.action_widget_container).getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void isActionShown_true() {
+        mTestTwoActionPreference.showAction(true);
+        assertThat(mTestTwoActionPreference.isActionShown()).isTrue();
+    }
+
+    @Test
+    public void isActionShown_false() {
+        mTestTwoActionPreference.showAction(false);
+        assertThat(mTestTwoActionPreference.isActionShown()).isFalse();
+    }
+
+    @Test
+    public void preferenceConstructed_attrDefined_actionShown() {
+        TestSettingsFragment fragment = TestSettingsFragment.newInstance(
+                R.xml.two_action_preference_shown);
+        FragmentController.of(fragment).setup();
+
+        TwoActionPreference preference =
+                (TwoActionPreference) fragment.getPreferenceScreen().findPreference(
+                        mContext.getString(R.string.tpk_two_action_preference));
+
+        assertThat(preference.isActionShown()).isTrue();
+    }
+
+    @Test
+    public void preferenceConstructed_defaultValue_actionShown() {
+        TestSettingsFragment fragment = TestSettingsFragment.newInstance(
+                R.xml.two_action_preference_action_shown_not_specified);
+        FragmentController.of(fragment).setup();
+
+        TwoActionPreference preference =
+                (TwoActionPreference) fragment.getPreferenceScreen().findPreference(
+                        mContext.getString(R.string.tpk_two_action_preference));
+
+        assertThat(preference.isActionShown()).isTrue();
+    }
+
+    @Test
+    public void preferenceConstructed_attrDefined_actionHidden() {
+        TestSettingsFragment fragment = TestSettingsFragment.newInstance(
+                R.xml.two_action_preference_hidden);
+        FragmentController.of(fragment).setup();
+
+        TwoActionPreference preference =
+                (TwoActionPreference) fragment.getPreferenceScreen().findPreference(
+                        mContext.getString(R.string.tpk_two_action_preference));
+
+        assertThat(preference.isActionShown()).isFalse();
+    }
+
+    /**
+     * Test settings fragment which creates the xml screen provided via {@link #newInstance(int)}.
+     */
+    public static class TestSettingsFragment extends SettingsFragment {
+
+        private static final String ARG_SCREEN_RES = "arg_screen_res";
+
+        @XmlRes
+        private int mScreenResId;
+
+        public static TestSettingsFragment newInstance(@XmlRes int screenResId) {
+            Bundle arguments = new Bundle();
+            arguments.putInt(ARG_SCREEN_RES, screenResId);
+
+            TestSettingsFragment fragment = new TestSettingsFragment();
+            fragment.setArguments(arguments);
+            return fragment;
+        }
+
+        @Override
+        public void onAttach(Context context) {
+            super.onAttach(context);
+            mScreenResId = getArguments().getInt(ARG_SCREEN_RES);
+        }
+
+        @Override
+        @XmlRes
+        protected int getPreferenceScreenResId() {
+            return mScreenResId;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragmentTest.java
new file mode 100644
index 0000000..59c0130
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/common/ValidatedEditTextPreferenceDialogFragmentTest.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.widget.Button;
+import android.widget.EditText;
+
+import androidx.preference.EditTextPreference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowWindow;
+
+/** Unit test for {@link EditTextPreferenceDialogFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ValidatedEditTextPreferenceDialogFragmentTest {
+
+    private Context mContext;
+    private ActivityController<BaseTestActivity> mTestActivityController;
+    private BaseTestActivity mTestActivity;
+    private EditTextPreference mPreference;
+    private ValidatedEditTextPreferenceDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mTestActivityController = ActivityController.of(new BaseTestActivity());
+        mTestActivity = mTestActivityController.get();
+        mTestActivityController.setup();
+        TestTargetFragment targetFragment = new TestTargetFragment();
+        mTestActivity.launchFragment(targetFragment);
+        mPreference = new ValidatedEditTextPreference(mContext);
+        mPreference.setDialogLayoutResource(R.layout.preference_dialog_edittext);
+        mPreference.setKey("key");
+        targetFragment.getPreferenceScreen().addPreference(mPreference);
+        mFragment = ValidatedEditTextPreferenceDialogFragment
+                .newInstance(mPreference.getKey());
+
+        mFragment.setTargetFragment(targetFragment, /* requestCode= */ 0);
+    }
+
+    @Test
+    public void noValidatorSet_shouldEnablePositiveButton_and_allowEnterToSubmit() {
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        Button positiveButton = ShadowAlertDialog.getLatestAlertDialog().getButton(
+                DialogInterface.BUTTON_POSITIVE);
+        EditText editText = ShadowAlertDialog.getLatestAlertDialog().findViewById(
+                android.R.id.edit);
+
+        assertThat(positiveButton.isEnabled()).isTrue();
+        assertThat(mFragment.getAllowEnterToSubmit()).isTrue();
+
+        editText.setText("any text");
+        assertThat(positiveButton.isEnabled()).isTrue();
+        assertThat(mFragment.getAllowEnterToSubmit()).isTrue();
+    }
+
+    @Test
+    public void onInvalidInput_shouldDisablePositiveButton_and_disallowEnterToSubmit() {
+        ((ValidatedEditTextPreference) mPreference).setValidator(
+                new ValidatedEditTextPreference.Validator() {
+                    @Override
+                    public boolean isTextValid(String value) {
+                        return value.length() > 100;
+                    }
+                });
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        Button positiveButton = ShadowAlertDialog.getLatestAlertDialog().getButton(
+                DialogInterface.BUTTON_POSITIVE);
+        EditText editText = ShadowAlertDialog.getLatestAlertDialog().findViewById(
+                android.R.id.edit);
+        editText.setText("shorter than 100");
+
+        assertThat(positiveButton.isEnabled()).isFalse();
+        assertThat(mFragment.getAllowEnterToSubmit()).isFalse();
+    }
+
+    @Test
+    public void onValidInput_shouldEnablePositiveButton_and_allowEnterToSubmit() {
+        ((ValidatedEditTextPreference) mPreference).setValidator(
+                new ValidatedEditTextPreference.Validator() {
+                    @Override
+                    public boolean isTextValid(String value) {
+                        return value.length() > 1;
+                    }
+                });
+        mTestActivity.showDialog(mFragment, /* tag= */ null);
+
+        Button positiveButton = ShadowAlertDialog.getLatestAlertDialog().getButton(
+                DialogInterface.BUTTON_POSITIVE);
+        EditText editText = ShadowAlertDialog.getLatestAlertDialog().findViewById(
+                android.R.id.edit);
+        editText.setText("longer than 1");
+
+        assertThat(positiveButton.isEnabled()).isTrue();
+        assertThat(mFragment.getAllowEnterToSubmit()).isTrue();
+    }
+
+    private ShadowWindow getShadowWindowFromDialog(AlertDialog dialog) {
+        return (ShadowWindow) Shadow.extract(dialog.getWindow());
+    }
+
+    /** Simple {@link PreferenceFragmentCompat} implementation to serve as the target fragment. */
+    public static class TestTargetFragment extends PreferenceFragmentCompat {
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
new file mode 100644
index 0000000..c94cfa8
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsageFragmentTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.net.INetworkStatsService;
+import android.net.NetworkPolicy;
+import android.net.NetworkPolicyManager;
+import android.os.Bundle;
+import android.text.format.DateUtils;
+import android.util.Pair;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowINetworkStatsServiceStub;
+import com.android.car.settings.testutils.ShadowNetworkPolicyEditor;
+import com.android.car.settings.testutils.ShadowNetworkPolicyManager;
+
+import org.junit.After;
+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 java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/** Unit test for {@link AppDataUsageFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowNetworkPolicyEditor.class, ShadowNetworkPolicyManager.class,
+        ShadowINetworkStatsServiceStub.class})
+public class AppDataUsageFragmentTest {
+
+    private static final String KEY_START = "start";
+    private static final String KEY_END = "end";
+
+    private AppDataUsageFragment mFragment;
+    private FragmentController<AppDataUsageFragment> mFragmentController;
+
+    @Mock
+    private NetworkPolicy mNetworkPolicy;
+
+    @Mock
+    private NetworkPolicyManager mNetworkPolicyManager;
+
+    @Mock
+    private INetworkStatsService mINetworkStatsService;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mFragment = new AppDataUsageFragment();
+        mFragmentController = FragmentController.of(mFragment);
+
+        ShadowNetworkPolicyManager.setNetworkPolicyManager(mNetworkPolicyManager);
+        ShadowINetworkStatsServiceStub.setINetworkStatsSession(mINetworkStatsService);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowNetworkPolicyEditor.reset();
+        ShadowINetworkStatsServiceStub.reset();
+        ShadowNetworkPolicyManager.reset();
+    }
+
+    @Test
+    public void onActivityCreated_policyIsNull_startAndEndDateShouldHaveFourWeeksDifference() {
+        mFragmentController.create();
+
+        Bundle bundle = mFragment.getBundle();
+        long start = bundle.getLong(KEY_START);
+        long end = bundle.getLong(KEY_END);
+        long timeDiff = end - start;
+
+        assertThat(timeDiff).isEqualTo(DateUtils.WEEK_IN_MILLIS * 4);
+    }
+
+    @Test
+    public void onActivityCreated_iteratorIsEmpty_startAndEndDateShouldHaveFourWeeksDifference() {
+        ShadowNetworkPolicyEditor.setNetworkPolicy(mNetworkPolicy);
+
+        ArrayList<Pair<ZonedDateTime, ZonedDateTime>> list = new ArrayList<>();
+        Iterator iterator = list.iterator();
+        ShadowNetworkPolicyManager.setCycleIterator(iterator);
+        mFragmentController.create();
+
+        Bundle bundle = mFragment.getBundle();
+        long start = bundle.getLong(KEY_START);
+        long end = bundle.getLong(KEY_END);
+        long timeDiff = end - start;
+
+        assertThat(timeDiff).isEqualTo(DateUtils.WEEK_IN_MILLIS * 4);
+    }
+
+    @Test
+    public void onActivityCreated_iteratorIsNotEmpty_startAndEndDateShouldBeLastOneInIterator() {
+        ShadowNetworkPolicyEditor.setNetworkPolicy(mNetworkPolicy);
+
+        ZonedDateTime start1 = ZonedDateTime.now();
+        ZonedDateTime end1 = ZonedDateTime.now();
+        ZonedDateTime start2 = ZonedDateTime.now();
+        ZonedDateTime end2 = ZonedDateTime.now();
+
+        Pair pair1 = new Pair(start1, end1);
+        Pair pair2 = new Pair(start2, end2);
+
+        ArrayList<Pair<ZonedDateTime, ZonedDateTime>> list = new ArrayList<>();
+        list.add(pair1);
+        list.add(pair2);
+
+        Iterator iterator = list.iterator();
+        ShadowNetworkPolicyManager.setCycleIterator(iterator);
+        mFragmentController.create();
+
+        Bundle bundle = mFragment.getBundle();
+        long start = bundle.getLong(KEY_START);
+        long end = bundle.getLong(KEY_END);
+
+        assertThat(start).isEqualTo(start2.toInstant().toEpochMilli());
+        assertThat(end).isEqualTo(end2.toInstant().toEpochMilli());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
new file mode 100644
index 0000000..202b093
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/AppDataUsagePreferenceControllerTest.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.TrafficStats.UID_TETHERING;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.net.NetworkStats;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUidDetailProvider;
+import com.android.settingslib.net.UidDetail;
+
+import org.junit.After;
+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;
+
+/** Unit test for {@link AppDataUsagePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUidDetailProvider.class})
+public class AppDataUsagePreferenceControllerTest {
+
+    private static final int USER_ID = 10;
+
+    private Context mContext;
+    private LogicalPreferenceGroup mLogicalPreferenceGroup;
+    private AppDataUsagePreferenceController mController;
+    private PreferenceControllerTestHelper<AppDataUsagePreferenceController>
+            mPreferenceControllerHelper;
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Mock
+    private UidDetail mUidDetail;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AppDataUsagePreferenceController.class, mLogicalPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
+
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowUidDetailProvider.reset();
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void defaultInitialize_hasNoPreference() {
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onDataLoaded_dataNotLoaded_hasNoPreference() {
+        mController.onDataLoaded(null, new int[0]);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onDataLoaded_statsSizeZero_hasNoPreference() {
+        NetworkStats networkStats = new NetworkStats(0, 0);
+
+        mController.onDataLoaded(networkStats, new int[0]);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onDataLoaded_statsLoaded_hasTwoPreference() {
+        NetworkStats networkStats = new NetworkStats(0, 0);
+        NetworkStats.Entry entry1 = new NetworkStats.Entry();
+        entry1.rxBytes = 100;
+        networkStats.addValues(entry1);
+
+        NetworkStats.Entry entry2 = new NetworkStats.Entry();
+        entry2.uid = UID_TETHERING;
+        entry2.rxBytes = 200;
+        networkStats.addValues(entry2);
+
+        mController.onDataLoaded(networkStats, new int[0]);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void onDataLoaded_statsLoaded_hasOnePreference() {
+        ShadowUidDetailProvider.setUidDetail(mUidDetail);
+        NetworkStats networkStats = new NetworkStats(0, 0);
+        NetworkStats.Entry entry1 = new NetworkStats.Entry();
+        entry1.rxBytes = 100;
+        networkStats.addValues(entry1);
+
+        NetworkStats.Entry entry2 = new NetworkStats.Entry();
+        entry2.uid = UID_TETHERING;
+        entry2.rxBytes = 200;
+        networkStats.addValues(entry2);
+
+        mController.onDataLoaded(networkStats, new int[0]);
+
+        ProgressBarPreference preference1 =
+                (ProgressBarPreference) mLogicalPreferenceGroup.getPreference(0);
+        ProgressBarPreference preference2 =
+                (ProgressBarPreference) mLogicalPreferenceGroup.getPreference(1);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+        assertThat(preference1.getProgress()).isEqualTo(100);
+        assertThat(preference2.getProgress()).isEqualTo(50);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java b/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
new file mode 100644
index 0000000..0b4d124
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/AppsNetworkStatsManagerTest.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.INetworkStatsService;
+import android.net.INetworkStatsSession;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkStats;
+import android.os.Bundle;
+
+import androidx.loader.app.LoaderManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowINetworkStatsServiceStub;
+import com.android.car.settings.testutils.ShadowNetworkPolicyManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+/** Unit test for {@link AppsNetworkStatsManager}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowINetworkStatsServiceStub.class, ShadowNetworkPolicyManager.class})
+public class AppsNetworkStatsManagerTest {
+
+    private Context mContext;
+    private AppsNetworkStatsManager mAppsNetworkStatsManager;
+
+    @Captor
+    private ArgumentCaptor<LoaderManager.LoaderCallbacks<NetworkStats>>
+            mCallbacksArgumentCaptor;
+
+    @Mock
+    private AppsNetworkStatsManager.Callback mCallback1;
+
+    @Mock
+    private AppsNetworkStatsManager.Callback mCallback2;
+
+    @Mock
+    private LoaderManager mLoaderManager;
+
+    @Mock
+    private INetworkStatsService mINetworkStatsService;
+
+    @Mock
+    private INetworkStatsSession mINetworkStatsSession;
+
+    @Mock
+    private NetworkPolicyManager mNetworkPolicyManager;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        when(mINetworkStatsService.openSession()).thenReturn(mINetworkStatsSession);
+        ShadowINetworkStatsServiceStub.setINetworkStatsSession(mINetworkStatsService);
+
+        when(mNetworkPolicyManager.getUidsWithPolicy(anyInt())).thenReturn(new int[0]);
+        ShadowNetworkPolicyManager.setNetworkPolicyManager(mNetworkPolicyManager);
+
+        mAppsNetworkStatsManager = new AppsNetworkStatsManager(mContext);
+        mAppsNetworkStatsManager.startLoading(mLoaderManager, Bundle.EMPTY);
+
+        verify(mLoaderManager).restartLoader(eq(1), eq(Bundle.EMPTY),
+                mCallbacksArgumentCaptor.capture());
+    }
+
+    @After
+    public void tearDown() {
+        ShadowINetworkStatsServiceStub.reset();
+        ShadowNetworkPolicyManager.reset();
+    }
+
+    @Test
+    public void callback_onLoadFinished_listenerOnDataLoadedCalled() throws Exception {
+        mAppsNetworkStatsManager.registerListener(mCallback1);
+        mAppsNetworkStatsManager.registerListener(mCallback2);
+
+        NetworkStats networkStats = new NetworkStats(0, 0);
+
+        mCallbacksArgumentCaptor.getValue().onLoadFinished(null, networkStats);
+
+        verify(mCallback1).onDataLoaded(eq(networkStats), any());
+        verify(mCallback2).onDataLoaded(eq(networkStats), any());
+    }
+
+    @Test
+    public void callback_unregisterListener_onlyOneListenerOnDataLoadedCalled() throws Exception {
+        mAppsNetworkStatsManager.registerListener(mCallback1);
+        mAppsNetworkStatsManager.registerListener(mCallback2);
+        mAppsNetworkStatsManager.unregisterListener(mCallback2);
+
+        NetworkStats networkStats = new NetworkStats(0, 0);
+
+        mCallbacksArgumentCaptor.getValue().onLoadFinished(null, networkStats);
+
+        verify(mCallback1).onDataLoaded(eq(networkStats), any());
+        verify(mCallback2, never()).onDataLoaded(eq(networkStats), any());
+    }
+
+    @Test
+    public void callback_notLoaded_listenerOnDataLoadedNotCalled() throws Exception {
+        mAppsNetworkStatsManager.registerListener(mCallback1);
+        mAppsNetworkStatsManager.registerListener(mCallback2);
+        mAppsNetworkStatsManager.unregisterListener(mCallback2);
+
+        NetworkStats networkStats = new NetworkStats(0, 0);
+
+        verify(mCallback1, never()).onDataLoaded(eq(networkStats), any());
+        verify(mCallback2, never()).onDataLoaded(eq(networkStats), any());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
new file mode 100644
index 0000000..7caec12
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/CycleResetDayOfMonthPickerPreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.settingslib.NetworkPolicyEditor;
+
+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.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class CycleResetDayOfMonthPickerPreferenceControllerTest {
+
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<CycleResetDayOfMonthPickerPreferenceController>
+            mControllerHelper;
+    @Mock
+    private NetworkPolicyEditor mPolicyEditor;
+    @Mock
+    private NetworkTemplate mNetworkTemplate;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+
+        mPreference = new Preference(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                CycleResetDayOfMonthPickerPreferenceController.class, mPreference);
+
+        mControllerHelper.getController().setNetworkPolicyEditor(mPolicyEditor);
+        mControllerHelper.getController().setNetworkTemplate(mNetworkTemplate);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void performClick_startsDialogWithStartingValue() {
+        int startingValue = 15;
+        when(mPolicyEditor.getPolicyCycleDay(mNetworkTemplate)).thenReturn(startingValue);
+        mControllerHelper.getController().refreshUi();
+        mPreference.performClick();
+
+        ArgumentCaptor<UsageCycleResetDayOfMonthPickerDialog> dialogCaptor =
+                ArgumentCaptor.forClass(UsageCycleResetDayOfMonthPickerDialog.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                dialogCaptor.capture(), anyString());
+
+        UsageCycleResetDayOfMonthPickerDialog dialog = dialogCaptor.getValue();
+
+        // Dialog was never started because FragmentController is mocked.
+        FragmentController<Fragment> fragmentController = FragmentController.of(new Fragment());
+        Fragment testFragment = fragmentController.setup();
+        dialog.show(testFragment.getFragmentManager(), null);
+
+        assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(startingValue);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
new file mode 100644
index 0000000..2106e02
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataLimitPreferenceControllerTest.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.NetworkPolicy.LIMIT_DISABLED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.NetworkPolicyEditor;
+
+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.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DataLimitPreferenceControllerTest {
+
+    private static final long GIB_IN_BYTES = 1024 * 1024 * 1024;
+    private static final long EPSILON = 100;
+
+    private TwoStatePreference mEnablePreference;
+    private Preference mLimitPreference;
+    private DataLimitPreferenceController mController;
+    private FragmentController mFragmentController;
+    @Mock
+    private NetworkPolicyEditor mPolicyEditor;
+    @Mock
+    private NetworkTemplate mNetworkTemplate;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+
+        PreferenceGroup preferenceGroup = new LogicalPreferenceGroup(context);
+        PreferenceControllerTestHelper<DataLimitPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(context,
+                        DataLimitPreferenceController.class, preferenceGroup);
+        mController = controllerHelper.getController();
+        mFragmentController = controllerHelper.getMockFragmentController();
+
+        mEnablePreference = new SwitchPreference(context);
+        mEnablePreference.setKey(context.getString(R.string.pk_data_set_limit));
+        preferenceGroup.addPreference(mEnablePreference);
+        mLimitPreference = new Preference(context);
+        mLimitPreference.setKey(context.getString(R.string.pk_data_limit));
+        preferenceGroup.addPreference(mLimitPreference);
+
+        mController.setNetworkPolicyEditor(mPolicyEditor);
+        mController.setNetworkTemplate(mNetworkTemplate);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void refreshUi_limitDisabled_summaryEmpty() {
+        when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(LIMIT_DISABLED);
+        mController.refreshUi();
+
+        assertThat(mLimitPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void refreshUi_limitDisabled_preferenceDisabled() {
+        when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(LIMIT_DISABLED);
+        mController.refreshUi();
+
+        assertThat(mLimitPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_limitDisabled_switchUnchecked() {
+        when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(LIMIT_DISABLED);
+        mController.refreshUi();
+
+        assertThat(mEnablePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_limitEnabled_summaryPopulated() {
+        when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
+        mController.refreshUi();
+
+        assertThat(mLimitPreference.getSummary().toString()).isNotEmpty();
+    }
+
+    @Test
+    public void refreshUi_limitEnabled_preferenceEnabled() {
+        when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
+        mController.refreshUi();
+
+        assertThat(mLimitPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_limitEnabled_switchChecked() {
+        when(mPolicyEditor.getPolicyLimitBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
+        mController.refreshUi();
+
+        assertThat(mEnablePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onPreferenceChanged_toggleFalse_limitBytesDisabled() {
+        mEnablePreference.callChangeListener(false);
+        verify(mPolicyEditor).setPolicyLimitBytes(mNetworkTemplate, LIMIT_DISABLED);
+    }
+
+    @Test
+    public void onPreferenceChanged_toggleTrue_showsDialog() {
+        mEnablePreference.callChangeListener(true);
+
+        verify(mFragmentController).showDialog(any(ConfirmationDialogFragment.class),
+                eq(ConfirmationDialogFragment.TAG));
+    }
+
+    @Test
+    public void onDialogConfirm_noWarningThreshold_setsLimitTo5GB() {
+        mController.onConfirm(null);
+
+        verify(mPolicyEditor).setPolicyLimitBytes(mNetworkTemplate, 5 * GIB_IN_BYTES);
+    }
+
+    @Test
+    public void onDialogConfirm_hasWarningThreshold_setsLimitToWithMultiplier() {
+        when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(5 * GIB_IN_BYTES);
+        mController.onConfirm(null);
+
+        ArgumentCaptor<Long> setLimit = ArgumentCaptor.forClass(Long.class);
+        verify(mPolicyEditor).setPolicyLimitBytes(eq(mNetworkTemplate), setLimit.capture());
+
+        long setValue = setLimit.getValue();
+        // Due to precision errors, add and subtract a small epsilon.
+        assertThat(setValue).isGreaterThan(
+                (long) (5 * GIB_IN_BYTES * DataLimitPreferenceController.LIMIT_BYTES_MULTIPLIER)
+                        - EPSILON);
+        assertThat(setValue).isLessThan(
+                (long) (5 * GIB_IN_BYTES * DataLimitPreferenceController.LIMIT_BYTES_MULTIPLIER)
+                        + EPSILON);
+    }
+
+    @Test
+    public void onPreferenceClicked_showsPickerDialog() {
+        mLimitPreference.performClick();
+
+        verify(mFragmentController).showDialog(any(UsageBytesThresholdPickerDialog.class),
+                eq(UsageBytesThresholdPickerDialog.TAG));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..79187d5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageEntryPreferenceControllerTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.robolectric.shadow.api.Shadow.extract;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkCapabilities;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.util.RecurrenceRule;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowConnectivityManager;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+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 org.robolectric.shadows.ShadowNetwork;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowConnectivityManager.class, ShadowSubscriptionManager.class})
+public class DataUsageEntryPreferenceControllerTest {
+
+    private static final int SUBSCRIPTION_ID = 1;
+
+    private Context mContext;
+    private Preference mPreference;
+    private DataUsageEntryPreferenceController mController;
+    @Mock
+    private NetworkCapabilities mNetworkCapabilities;
+    @Mock
+    private SubscriptionPlan mSubscriptionPlan;
+    @Mock
+    private RecurrenceRule mRecurrenceRule;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        PreferenceControllerTestHelper<DataUsageEntryPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        DataUsageEntryPreferenceController.class, mPreference);
+        mController = controllerHelper.getController();
+
+        // Setup to always make preference available.
+        getShadowConnectivityManager().clearAllNetworks();
+        getShadowConnectivityManager().addNetworkCapabilities(
+                ShadowNetwork.newInstance(ConnectivityManager.TYPE_MOBILE), mNetworkCapabilities);
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                true);
+
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowConnectivityManager.reset();
+        ShadowSubscriptionManager.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_noMobileNetwork_isUnsupported() {
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasMobileNetwork_isAvailable() {
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void refreshUi_noDefaultSubscriptionId_noSummarySet() {
+        ShadowSubscriptionManager.setDefaultSubscriptionId(
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+
+        mController.refreshUi();
+        assertThat(mPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void refreshUi_noPrimaryPlan_noSummarySet() {
+        ShadowSubscriptionManager.setDefaultSubscriptionId(SUBSCRIPTION_ID);
+        getShadowSubscriptionManager().setSubscriptionPlans(Lists.newArrayList());
+
+        mController.refreshUi();
+        assertThat(mPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void refreshUi_hasPrimaryPlan_setsSummary() {
+        ShadowSubscriptionManager.setDefaultSubscriptionId(SUBSCRIPTION_ID);
+        getShadowSubscriptionManager().setSubscriptionPlans(Lists.newArrayList(mSubscriptionPlan));
+        when(mSubscriptionPlan.getDataLimitBytes()).thenReturn(100L);
+        when(mSubscriptionPlan.getDataUsageBytes()).thenReturn(10L);
+        when(mSubscriptionPlan.getCycleRule()).thenReturn(mRecurrenceRule);
+
+        mController.refreshUi();
+        assertThat(mPreference.getSummary().length()).isGreaterThan(0);
+    }
+
+    private ShadowConnectivityManager getShadowConnectivityManager() {
+        return (ShadowConnectivityManager) extract(
+                mContext.getSystemService(ConnectivityManager.class));
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return (ShadowSubscriptionManager) extract(
+                mContext.getSystemService(SubscriptionManager.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
new file mode 100644
index 0000000..d0c5abc
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.robolectric.shadow.api.Shadow.extract;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.text.format.Formatter;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowDataUsageController;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+import com.android.car.settings.testutils.ShadowTelephonyManager;
+import com.android.settingslib.net.DataUsageController;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+import java.time.Period;
+import java.time.ZonedDateTime;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowTelephonyManager.class, ShadowSubscriptionManager.class,
+        ShadowDataUsageController.class})
+public class DataUsageSummaryPreferenceControllerTest {
+
+    private static final CharSequence TEST_CARRIER_NAME = "TEST_CARRIER_NAME";
+
+    private Context mContext;
+    private DataUsageSummaryPreference mDataUsageSummaryPreference;
+    private DataUsageSummaryPreferenceController mController;
+    private PreferenceControllerTestHelper<DataUsageSummaryPreferenceController> mControllerHelper;
+    private NetworkTemplate mNetworkTemplate;
+    @Mock
+    private DataUsageController mDataUsageController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        SubscriptionInfo info = mock(SubscriptionInfo.class);
+        when(info.getSubscriptionId()).thenReturn(1);
+        ShadowSubscriptionManager.setDefaultDataSubscriptionInfo(info);
+        ShadowDataUsageController.setInstance(mDataUsageController);
+
+        mContext = RuntimeEnvironment.application;
+        mDataUsageSummaryPreference = new DataUsageSummaryPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DataUsageSummaryPreferenceController.class, mDataUsageSummaryPreference);
+        mController = mControllerHelper.getController();
+
+        mNetworkTemplate = DataUsageUtils.getMobileNetworkTemplate(
+                mContext.getSystemService(TelephonyManager.class),
+                DataUsageUtils.getDefaultSubscriptionId(
+                        mContext.getSystemService(SubscriptionManager.class)));
+    }
+
+    @After
+    public void tearDown() {
+        ShadowTelephonyManager.reset();
+        ShadowSubscriptionManager.reset();
+        ShadowDataUsageController.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasSim_isAvailable() {
+        getShadowTelephonyManager().setSimState(TelephonyManager.SIM_STATE_LOADED);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_noSim_isConditionallyUnavailable() {
+        getShadowTelephonyManager().setSimState(TelephonyManager.SIM_STATE_UNKNOWN);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void refreshUi_hasUsage_titleSet() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        String usedValueString = Formatter.formatBytes(mContext.getResources(), info.usageLevel,
+                Formatter.FLAG_CALCULATE_ROUNDED | Formatter.FLAG_IEC_UNITS).value;
+        assertThat(mDataUsageSummaryPreference.getTitle().toString()).contains(usedValueString);
+    }
+
+    @Test
+    public void refreshUi_noLimits_doesntSetDataLimitText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        info.limitLevel = -1;
+        info.warningLevel = -1;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getDataLimitText()).isNull();
+    }
+
+    @Test
+    public void refreshUi_hasLimit_setsDataLimitText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        info.limitLevel = 100000;
+        info.warningLevel = -1;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(
+                TextUtils.expandTemplate(mContext.getText(R.string.cell_data_limit),
+                        DataUsageUtils.bytesToIecUnits(mContext, info.limitLevel)).toString());
+    }
+
+    @Test
+    public void refreshUi_hasWarning_setsDataLimitText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        info.limitLevel = -1;
+        info.warningLevel = 50000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(
+                TextUtils.expandTemplate(mContext.getText(R.string.cell_data_warning),
+                        DataUsageUtils.bytesToIecUnits(mContext, info.warningLevel)).toString());
+    }
+
+    @Test
+    public void refreshUi_hasWarningAndLimit_setsDataLimitText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        info.limitLevel = 100000;
+        info.warningLevel = 50000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(
+                TextUtils.expandTemplate(mContext.getText(R.string.cell_data_warning_and_limit),
+                        DataUsageUtils.bytesToIecUnits(mContext, info.warningLevel),
+                        DataUsageUtils.bytesToIecUnits(mContext, info.limitLevel)).toString());
+    }
+
+    @Test
+    public void refreshUi_endTimeIsGreaterThanOneDay_setsBillingCycleText() {
+        int numDays = 20;
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        // Add an extra hour to account for the difference in time when the test calls
+        // System.currentTimeMillis() vs when the code calls it.
+        info.cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(numDays)
+                + TimeUnit.HOURS.toMillis(1);
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString())
+                .isEqualTo(
+                        mContext.getResources().getQuantityString(R.plurals.billing_cycle_days_left,
+                                numDays, numDays));
+    }
+
+    @Test
+    public void refreshUi_endTimeIsLessThanOneDay_setsBillingCycleText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.cycleEnd = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(22);
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString())
+                .isEqualTo(
+                        mContext.getString(R.string.billing_cycle_less_than_one_day_left));
+    }
+
+    @Test
+    public void refreshUi_endTimeIsNow_setsBillingCycleText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.cycleEnd = System.currentTimeMillis();
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString())
+                .isEqualTo(
+                        mContext.getString(R.string.billing_cycle_none_left));
+    }
+
+    @Test
+    public void refreshUi_hasCarrierName_hasRecentUpdate_setsCarrierInfoText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        setCarrierName(TEST_CARRIER_NAME);
+        setSubscriptionPlan(/* usageBytes= */ 1000L, System.currentTimeMillis());
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
+                TextUtils.expandTemplate(mContext.getText(R.string.carrier_and_update_now_text),
+                        TEST_CARRIER_NAME));
+    }
+
+    @Test
+    public void refreshUi_hasCarrierName_hasOldUpdate_setsCarrierInfoText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        int numDays = 15;
+        setCarrierName(TEST_CARRIER_NAME);
+        setSubscriptionPlan(/* usageBytes= */ 1000L,
+                System.currentTimeMillis() - TimeUnit.DAYS.toMillis(numDays));
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
+                TextUtils.expandTemplate(mContext.getText(R.string.carrier_and_update_text),
+                        TEST_CARRIER_NAME, numDays + " days"));
+    }
+
+    @Test
+    public void refreshUi_noCarrierName_hasRecentUpdate_setsCarrierInfoText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        setSubscriptionPlan(/* usageBytes= */ 1000L, System.currentTimeMillis());
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getCarrierInfoText().toString()).isEqualTo(
+                mContext.getString(R.string.no_carrier_update_now_text));
+    }
+
+    @Test
+    public void refreshUi_noCarrierName_hasOldUpdate_setsCarrierInfoText() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        int numDays = 15;
+        setSubscriptionPlan(/* usageBytes= */ 1000L,
+                System.currentTimeMillis() - TimeUnit.DAYS.toMillis(numDays));
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getCarrierInfoText()).isEqualTo(
+                TextUtils.expandTemplate(mContext.getText(R.string.no_carrier_update_text),
+                        null, numDays + " days"));
+    }
+
+    @Test
+    public void refreshUi_hasUpdateTimeOlderThanWarning_setsCarrierInfoStyle() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+
+        // Subtract an extra hour to account fo the difference in calls to
+        // System.currentTimeMillis().
+        setSubscriptionPlan(/* usageBytes= */ 1000L,
+                System.currentTimeMillis() - DataUsageSummaryPreferenceController.WARNING_AGE
+                        - TimeUnit.HOURS.toMillis(1));
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getCarrierInfoTextStyle()).isEqualTo(
+                R.style.DataUsageSummaryCarrierInfoWarningTextAppearance);
+    }
+
+    @Test
+    public void refreshUi_hasUpdateTimeYoungerThanWarning_setsCarrierInfoStyle() {
+        DataUsageController.DataUsageInfo info = new DataUsageController.DataUsageInfo();
+        info.usageLevel = 10000;
+        when(mDataUsageController.getDataUsageInfo(mNetworkTemplate)).thenReturn(info);
+
+        // Subtract an extra hour to account fo the difference in calls to
+        // System.currentTimeMillis().
+        setSubscriptionPlan(/* usageBytes= */ 1000L,
+                System.currentTimeMillis() - DataUsageSummaryPreferenceController.WARNING_AGE
+                        + TimeUnit.HOURS.toMillis(1));
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mDataUsageSummaryPreference.getCarrierInfoTextStyle()).isEqualTo(
+                R.style.DataUsageSummaryCarrierInfoTextAppearance);
+    }
+
+    private ShadowTelephonyManager getShadowTelephonyManager() {
+        return (ShadowTelephonyManager) extract(
+                mContext.getSystemService(TelephonyManager.class));
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return Shadow.extract(mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE));
+    }
+
+    private void setCarrierName(CharSequence name) {
+        SubscriptionInfo subInfo = new SubscriptionInfo(/* id= */ 0, /* iccId= */ "",
+                /* simSlotIndex= */ 0, /* displayName= */ "", name,
+                /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+                /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
+                /* countryIso= */ "", /* isEmbedded= */ false,
+                /* accessRules= */ null, /* cardString= */ "");
+        ShadowSubscriptionManager.setDefaultDataSubscriptionInfo(subInfo);
+    }
+
+    private void setSubscriptionPlan(long usageBytes, long snapshotMillis) {
+        ZonedDateTime start = ZonedDateTime.now();
+        ZonedDateTime end = ZonedDateTime.now().plusDays(30);
+        SubscriptionPlan plan = new SubscriptionPlan.Builder(start, end, Period.ofMonths(1))
+                .setDataLimit(/* dataLimitBytes= */ 5000000000L,
+                        SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED)
+                .setDataUsage(usageBytes, snapshotMillis)
+                .build();
+        getShadowSubscriptionManager().setSubscriptionPlans(Lists.newArrayList(plan));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
new file mode 100644
index 0000000..560614a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DataUsageSummaryPreferenceTest {
+    private static final String TEST_LABEL = "TEST_LABEL";
+    private static final Intent TEST_INTENT = new Intent("test_action");
+
+    private Context mContext;
+    private PreferenceViewHolder mViewHolder;
+    private DataUsageSummaryPreference mDataUsageSummaryPreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        View rootView = View.inflate(mContext, R.layout.data_usage_summary_preference,
+                /* root= */ null);
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+        mDataUsageSummaryPreference = new DataUsageSummaryPreference(mContext);
+    }
+
+    @Test
+    public void onBindViewHolder_noDataUsageText_isGone() {
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getDataUsageText().getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void onBindViewHolder_hasDataUsageText_isVisible() {
+        mDataUsageSummaryPreference.setDataLimitText(TEST_LABEL);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getDataUsageText().getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onBindViewHolder_hasDataUsageText_setsText() {
+        mDataUsageSummaryPreference.setDataLimitText(TEST_LABEL);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(mDataUsageSummaryPreference.getDataLimitText().toString()).isEqualTo(TEST_LABEL);
+    }
+
+    @Test
+    public void onBindViewHolder_noRemainingBillingCycleText_isGone() {
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getRemainingBillingCycleText().getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void onBindViewHolder_hasRemainingBillingCycleText_isVisible() {
+        mDataUsageSummaryPreference.setRemainingBillingCycleText(TEST_LABEL);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getRemainingBillingCycleText().getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onBindViewHolder_hasRemainingBillingCycleText_setsText() {
+        mDataUsageSummaryPreference.setRemainingBillingCycleText(TEST_LABEL);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(mDataUsageSummaryPreference.getRemainingBillingCycleText().toString()).isEqualTo(
+                TEST_LABEL);
+    }
+
+    @Test
+    public void onBindViewHolder_noCarrierInfoText_isGone() {
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getCarrierInfoText().getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void onBindViewHolder_hasCarrierInfoText_isVisible() {
+        mDataUsageSummaryPreference.setCarrierInfoText(TEST_LABEL);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getCarrierInfoText().getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onBindViewHolder_hasCarrierInfoText_setsText() {
+        mDataUsageSummaryPreference.setCarrierInfoText(TEST_LABEL);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(mDataUsageSummaryPreference.getCarrierInfoText().toString()).isEqualTo(
+                TEST_LABEL);
+    }
+
+    @Test
+    public void onBindViewHolder_noManagePlanIntent_isGone() {
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getManageSubscriptionButton().getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void onBindViewHolder_hasManagePlanIntent_isVisible() {
+        mDataUsageSummaryPreference.setManageSubscriptionIntent(TEST_INTENT);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+
+        assertThat(getManageSubscriptionButton().getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void onButtonClick_hasManagePlanIntent_startsActivity() {
+        mDataUsageSummaryPreference.setManageSubscriptionIntent(TEST_INTENT);
+        mDataUsageSummaryPreference.onBindViewHolder(mViewHolder);
+        getManageSubscriptionButton().performClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getAction()).isEqualTo(TEST_INTENT.getAction());
+    }
+
+    private TextView getDataUsageText() {
+        return (TextView) mViewHolder.findViewById(R.id.data_limit_text);
+    }
+
+    private TextView getRemainingBillingCycleText() {
+        return (TextView) mViewHolder.findViewById(R.id.remaining_billing_cycle_time_text);
+    }
+
+    private TextView getCarrierInfoText() {
+        return (TextView) mViewHolder.findViewById(R.id.carrier_info_text);
+    }
+
+    private Button getManageSubscriptionButton() {
+        return (Button) mViewHolder.findViewById(R.id.manage_subscription_button);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
new file mode 100644
index 0000000..57a083a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataUsageUtilsTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionPlan;
+import android.util.RecurrenceRule;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import com.google.android.collect.Lists;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Collections;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DataUsageUtilsTest {
+
+    private static final int SUBSCRIPTION_ID = 1;
+
+    @Test
+    public void getDefaultSubscriptionId_nullSubscriptionManager_returnsInvalidId() {
+        assertThat(DataUsageUtils.getDefaultSubscriptionId(null)).isEqualTo(
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+    }
+
+    @Test
+    public void getDefaultSubscriptionId_noSubscriptions_returnsInvalidId() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        when(subscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(null);
+        when(subscriptionManager.getAllSubscriptionInfoList()).thenReturn(Collections.emptyList());
+
+        assertThat(DataUsageUtils.getDefaultSubscriptionId(subscriptionManager)).isEqualTo(
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+    }
+
+    @Test
+    public void getDefaultSubscriptionId_noDefaultSubscription_returnsFirstSubscription() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        when(subscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(null);
+
+        SubscriptionInfo info1 = mock(SubscriptionInfo.class);
+        SubscriptionInfo info2 = mock(SubscriptionInfo.class);
+        when(info1.getSubscriptionId()).thenReturn(1);
+        when(info2.getSubscriptionId()).thenReturn(2);
+        when(subscriptionManager.getAllSubscriptionInfoList()).thenReturn(
+                Lists.newArrayList(info1, info2));
+
+        assertThat(DataUsageUtils.getDefaultSubscriptionId(subscriptionManager)).isEqualTo(1);
+    }
+
+    @Test
+    public void getDefaultSubscriptionId_hasDefaultSubscription_returnsDefaultSubscription() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        SubscriptionInfo info = mock(SubscriptionInfo.class);
+        when(info.getSubscriptionId()).thenReturn(1);
+        when(subscriptionManager.getDefaultDataSubscriptionInfo()).thenReturn(info);
+
+        assertThat(DataUsageUtils.getDefaultSubscriptionId(subscriptionManager)).isEqualTo(1);
+    }
+
+    @Test
+    public void getPrimaryPlan_noSubscriptions_returnsNull() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        when(subscriptionManager.getSubscriptionPlans(SUBSCRIPTION_ID)).thenReturn(
+                Lists.newArrayList());
+
+        assertThat(DataUsageUtils.getPrimaryPlan(subscriptionManager, SUBSCRIPTION_ID)).isNull();
+    }
+
+    @Test
+    public void getPrimaryPlan_dataLimitBytesIsZero_returnsNull() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        SubscriptionPlan subscriptionPlan = mock(SubscriptionPlan.class);
+        when(subscriptionManager.getSubscriptionPlans(SUBSCRIPTION_ID)).thenReturn(
+                Lists.newArrayList(subscriptionPlan));
+        when(subscriptionPlan.getDataLimitBytes()).thenReturn(0L);
+
+        assertThat(DataUsageUtils.getPrimaryPlan(subscriptionManager, SUBSCRIPTION_ID)).isNull();
+
+    }
+
+    @Test
+    public void getPrimaryPlan_dataUsageBytesIsHuge_returnsNull() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        SubscriptionPlan subscriptionPlan = mock(SubscriptionPlan.class);
+        when(subscriptionManager.getSubscriptionPlans(SUBSCRIPTION_ID)).thenReturn(
+                Lists.newArrayList(subscriptionPlan));
+        when(subscriptionPlan.getDataLimitBytes()).thenReturn(100L);
+        when(subscriptionPlan.getDataUsageBytes()).thenReturn(2 * DataUsageUtils.PETA);
+
+        assertThat(DataUsageUtils.getPrimaryPlan(subscriptionManager, SUBSCRIPTION_ID)).isNull();
+    }
+
+    @Test
+    public void getPrimaryPlan_cycleRuleIsNull_returnsNull() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        SubscriptionPlan subscriptionPlan = mock(SubscriptionPlan.class);
+        when(subscriptionManager.getSubscriptionPlans(SUBSCRIPTION_ID)).thenReturn(
+                Lists.newArrayList(subscriptionPlan));
+        when(subscriptionPlan.getDataLimitBytes()).thenReturn(100L);
+        when(subscriptionPlan.getDataUsageBytes()).thenReturn(10L);
+        when(subscriptionPlan.getCycleRule()).thenReturn(null);
+
+        assertThat(DataUsageUtils.getPrimaryPlan(subscriptionManager, SUBSCRIPTION_ID)).isNull();
+    }
+
+    @Test
+    public void getPrimaryPlan_cycleRuleIsValid_returnsSubscriptionPlan() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        SubscriptionPlan subscriptionPlan = mock(SubscriptionPlan.class);
+        RecurrenceRule recurrenceRule = mock(RecurrenceRule.class);
+        when(subscriptionManager.getSubscriptionPlans(SUBSCRIPTION_ID)).thenReturn(
+                Lists.newArrayList(subscriptionPlan));
+        when(subscriptionPlan.getDataLimitBytes()).thenReturn(100L);
+        when(subscriptionPlan.getDataUsageBytes()).thenReturn(10L);
+        when(subscriptionPlan.getCycleRule()).thenReturn(recurrenceRule);
+
+        assertThat(DataUsageUtils.getPrimaryPlan(subscriptionManager, SUBSCRIPTION_ID)).isEqualTo(
+                subscriptionPlan);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
new file mode 100644
index 0000000..244c557
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/DataWarningPreferenceControllerTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static android.net.NetworkPolicy.WARNING_DISABLED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.NetworkTemplate;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.NetworkPolicyEditor;
+
+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.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DataWarningPreferenceControllerTest {
+
+    private static final long BYTES_IN_GIGABYTE = 1024 * 1024 * 1024;
+
+    private TwoStatePreference mEnablePreference;
+    private Preference mWarningPreference;
+    private DataWarningPreferenceController mController;
+    private FragmentController mFragmentController;
+    @Mock
+    private NetworkPolicyEditor mPolicyEditor;
+    @Mock
+    private NetworkTemplate mNetworkTemplate;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+
+        PreferenceGroup preferenceGroup = new LogicalPreferenceGroup(context);
+        PreferenceControllerTestHelper<DataWarningPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(context,
+                        DataWarningPreferenceController.class, preferenceGroup);
+        mController = controllerHelper.getController();
+        mFragmentController = controllerHelper.getMockFragmentController();
+
+        mEnablePreference = new SwitchPreference(context);
+        mEnablePreference.setKey(context.getString(R.string.pk_data_set_warning));
+        preferenceGroup.addPreference(mEnablePreference);
+        mWarningPreference = new Preference(context);
+        mWarningPreference.setKey(context.getString(R.string.pk_data_warning));
+        preferenceGroup.addPreference(mWarningPreference);
+
+        mController.setNetworkPolicyEditor(mPolicyEditor);
+        mController.setNetworkTemplate(mNetworkTemplate);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void refreshUi_warningDisabled_summaryEmpty() {
+        when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(WARNING_DISABLED);
+        mController.refreshUi();
+
+        assertThat(mWarningPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void refreshUi_warningDisabled_preferenceDisabled() {
+        when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(WARNING_DISABLED);
+        mController.refreshUi();
+
+        assertThat(mWarningPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_warningDisabled_switchUnchecked() {
+        when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(WARNING_DISABLED);
+        mController.refreshUi();
+
+        assertThat(mEnablePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_warningEnabled_summaryPopulated() {
+        when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(
+                3 * BYTES_IN_GIGABYTE);
+        mController.refreshUi();
+
+        assertThat(mWarningPreference.getSummary().toString()).isNotEmpty();
+    }
+
+    @Test
+    public void refreshUi_warningEnabled_preferenceEnabled() {
+        when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(
+                3 * BYTES_IN_GIGABYTE);
+        mController.refreshUi();
+
+        assertThat(mWarningPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_warningEnabled_switchChecked() {
+        when(mPolicyEditor.getPolicyWarningBytes(mNetworkTemplate)).thenReturn(
+                3 * BYTES_IN_GIGABYTE);
+        mController.refreshUi();
+
+        assertThat(mEnablePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onPreferenceChanged_toggleFalse_warningBytesDisabled() {
+        mEnablePreference.callChangeListener(false);
+        verify(mPolicyEditor).setPolicyWarningBytes(mNetworkTemplate, WARNING_DISABLED);
+    }
+
+    @Test
+    public void onPreferenceChanged_toggleTrue_warningBytesNotDisabled() {
+        mEnablePreference.callChangeListener(true);
+
+        ArgumentCaptor<Long> setWarning = ArgumentCaptor.forClass(Long.class);
+        verify(mPolicyEditor).setPolicyWarningBytes(eq(mNetworkTemplate), setWarning.capture());
+        assertThat(setWarning.getValue()).isNotEqualTo(WARNING_DISABLED);
+    }
+
+    @Test
+    public void onPreferenceClicked_showsPickerDialog() {
+        mWarningPreference.performClick();
+
+        verify(mFragmentController).showDialog(any(UsageBytesThresholdPickerDialog.class),
+                eq(UsageBytesThresholdPickerDialog.TAG));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java b/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
new file mode 100644
index 0000000..52f05ec
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/UsageBytesThresholdPickerDialogTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.shadows.ShadowDialog;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class UsageBytesThresholdPickerDialogTest {
+
+    private Fragment mFragment;
+    @Mock
+    private UsageBytesThresholdPickerDialog.BytesThresholdPickedListener
+            mBytesThresholdPickedListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mFragment = FragmentController.of(new Fragment()).setup();
+    }
+
+    @Test
+    public void dialogInit_validValue_showsCurrentValue() {
+        long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+        UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+                R.string.data_usage_limit_editor_title, twoGB);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+        assertThat(dialog.getCurrentThreshold()).isEqualTo(twoGB);
+    }
+
+    @Test
+    public void dialogInit_lowInvalidValue_showsLowestPossibleValue() {
+        UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+                R.string.data_usage_limit_editor_title, -1);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+        assertThat(dialog.getCurrentThreshold()).isEqualTo(0);
+    }
+
+    @Test
+    public void positiveButtonClick_noChangeInValue_dialogListenerNotCalled() {
+        long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+        UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+                R.string.data_usage_limit_editor_title, twoGB);
+        dialog.setBytesThresholdPickedListener(mBytesThresholdPickedListener);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+
+        AlertDialog alertDialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        verify(mBytesThresholdPickedListener, never()).onThresholdPicked(anyLong());
+    }
+
+    @Test
+    public void positiveButtonClick_changeInValue_dialogListenerCalled() {
+        long twoGB = 2 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+        UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+                R.string.data_usage_limit_editor_title, twoGB);
+        dialog.setBytesThresholdPickedListener(mBytesThresholdPickedListener);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+
+        long threeGB = 3 * UsageBytesThresholdPickerDialog.GIB_IN_BYTES;
+        dialog.setThresholdEditor(threeGB);
+
+        AlertDialog alertDialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        verify(mBytesThresholdPickedListener).onThresholdPicked(threeGB);
+    }
+
+    @Test
+    public void getCurrentThreshold_aboveLimit_returnLimit() {
+        long limitGBTimesTwo = 2 * UsageBytesThresholdPickerDialog.MAX_DATA_LIMIT_BYTES;
+        UsageBytesThresholdPickerDialog dialog = UsageBytesThresholdPickerDialog.newInstance(
+                R.string.data_usage_limit_editor_title, limitGBTimesTwo);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+
+        assertThat(dialog.getCurrentThreshold()).isEqualTo(
+                UsageBytesThresholdPickerDialog.MAX_DATA_LIMIT_BYTES);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java b/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java
new file mode 100644
index 0000000..14b741a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datausage/UsageCycleResetDayOfMonthPickerDialogTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.datausage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.FragmentController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.shadows.ShadowDialog;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class UsageCycleResetDayOfMonthPickerDialogTest {
+
+    private Fragment mFragment;
+    @Mock
+    private UsageCycleResetDayOfMonthPickerDialog.ResetDayOfMonthPickedListener
+            mResetDayOfMonthPickedListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mFragment = FragmentController.of(new Fragment()).setup();
+    }
+
+    @Test
+    public void dialogInit_validValue_showsCurrentValue() {
+        int setDate = 15;
+        UsageCycleResetDayOfMonthPickerDialog dialog =
+                UsageCycleResetDayOfMonthPickerDialog.newInstance(setDate);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+        assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(setDate);
+    }
+
+    @Test
+    public void dialogInit_lowInvalidValue_showsLowestPossibleValue() {
+        UsageCycleResetDayOfMonthPickerDialog dialog =
+                UsageCycleResetDayOfMonthPickerDialog.newInstance(0);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+        assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(1);
+    }
+
+    @Test
+    public void dialogInit_highInvalidValue_showsHighestPossibleValue() {
+        UsageCycleResetDayOfMonthPickerDialog dialog =
+                UsageCycleResetDayOfMonthPickerDialog.newInstance(32);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+        assertThat(dialog.getSelectedDayOfMonth()).isEqualTo(31);
+    }
+
+    @Test
+    public void dialogListenerCalled() {
+        int setDate = 15;
+        UsageCycleResetDayOfMonthPickerDialog dialog =
+                UsageCycleResetDayOfMonthPickerDialog.newInstance(setDate);
+        dialog.setResetDayOfMonthPickedListener(mResetDayOfMonthPickedListener);
+        dialog.show(mFragment.getFragmentManager(), /* tag= */ null);
+
+        AlertDialog alertDialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        verify(mResetDayOfMonthPickedListener).onDayOfMonthPicked(setDate);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..62b74a6
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datetime/AutoDatetimeTogglePreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AutoDatetimeTogglePreferenceControllerTest {
+
+    private Context mContext;
+    private SwitchPreference mPreference;
+    private PreferenceControllerTestHelper<AutoDatetimeTogglePreferenceController>
+            mPreferenceControllerHelper;
+    private AutoDatetimeTogglePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AutoDatetimeTogglePreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void testRefreshUi_unchecked() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0);
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_checked() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 1);
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceChange_autoTimeZoneSet_shouldSendIntent() {
+        mPreference.setChecked(true);
+        mPreference.callChangeListener(true);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired.size()).isEqualTo(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
+    }
+
+    @Test
+    public void testOnPreferenceChange_autoTimeZoneUnset_shouldSendIntent() {
+        mPreference.setChecked(false);
+        mPreference.callChangeListener(false);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired.size()).isEqualTo(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..cd0464f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datetime/AutoTimeZoneTogglePreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AutoTimeZoneTogglePreferenceControllerTest {
+
+    private Context mContext;
+    private SwitchPreference mPreference;
+    private PreferenceControllerTestHelper<AutoTimeZoneTogglePreferenceController>
+            mPreferenceControllerHelper;
+    private AutoTimeZoneTogglePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AutoTimeZoneTogglePreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void testRefreshUi_unchecked() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 0);
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_checked() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 1);
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceChange_autoTimeZoneSet_shouldSendIntent() {
+        mPreference.setChecked(true);
+        mController.handlePreferenceChanged(mPreference, true);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired.size()).isEqualTo(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
+    }
+
+    @Test
+    public void testOnPreferenceChange_autoTimeZoneUnset_shouldSendIntent() {
+        mPreference.setChecked(false);
+        mController.handlePreferenceChanged(mPreference, false);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired.size()).isEqualTo(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datetime/DatePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/DatePickerPreferenceControllerTest.java
new file mode 100644
index 0000000..463c83a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datetime/DatePickerPreferenceControllerTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class DatePickerPreferenceControllerTest {
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<DatePickerPreferenceController>
+            mPreferenceControllerHelper;
+    private DatePickerPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                DatePickerPreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void testRefreshUi_disabled() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 1);
+        mController.refreshUi();
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_enabled() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0);
+        mController.refreshUi();
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void testRefreshUi_fromBroadcastReceiver_disabled() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.STARTED);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 1);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_fromBroadcastReceiver_enabled() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.STARTED);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..b89eee6
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimeFormatTogglePreferenceControllerTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class TimeFormatTogglePreferenceControllerTest {
+
+    private Context mContext;
+    private TwoStatePreference mPreference;
+    private PreferenceControllerTestHelper<TimeFormatTogglePreferenceController>
+            mPreferenceControllerHelper;
+    private TimeFormatTogglePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TimeFormatTogglePreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void testRefreshUi_24HourSet_shouldCheckPreference() {
+        Settings.System.putString(mContext.getContentResolver(), Settings.System.TIME_12_24,
+                TimeFormatTogglePreferenceController.HOURS_24);
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void testRefreshUi_12HourSet_shouldUncheckPreference() {
+        Settings.System.putString(mContext.getContentResolver(), Settings.System.TIME_12_24,
+                TimeFormatTogglePreferenceController.HOURS_12);
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void testOnPreferenceChange_24HourSet_shouldSendIntent() {
+        mPreference.setChecked(true);
+        mPreference.callChangeListener(true);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired.size()).isEqualTo(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
+        assertThat(intentFired.getIntExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, -1))
+                .isEqualTo(Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR);
+    }
+
+    @Test
+    public void testOnPreferenceChange_12HourSet_shouldSendIntent() {
+        mPreference.setChecked(false);
+        mPreference.callChangeListener(false);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired.size()).isEqualTo(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
+        assertThat(intentFired.getIntExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, -1))
+                .isEqualTo(Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimePickerPreferenceControllerTest.java
new file mode 100644
index 0000000..accc5e1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimePickerPreferenceControllerTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class TimePickerPreferenceControllerTest {
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<TimePickerPreferenceController>
+            mPreferenceControllerHelper;
+    private TimePickerPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TimePickerPreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void testRefreshUi_disabled() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 1);
+        mController.refreshUi();
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_enabled() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0);
+        mController.refreshUi();
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void testRefreshUi_fromBroadcastReceiver_disabled() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.STARTED);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 1);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_fromBroadcastReceiver_enabled() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.STARTED);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME, 0);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerPreferenceControllerTest.java
new file mode 100644
index 0000000..ed84a8c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerPreferenceControllerTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class TimeZonePickerPreferenceControllerTest {
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<TimeZonePickerPreferenceController>
+            mPreferenceControllerHelper;
+    private TimeZonePickerPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TimeZonePickerPreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void testRefreshUi_disabled() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 1);
+        mController.refreshUi();
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_enabled() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 0);
+        mController.refreshUi();
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void testRefreshUi_fromBroadcastReceiver_disabled() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.STARTED);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 1);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_fromBroadcastReceiver_enabled() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.STARTED);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AUTO_TIME_ZONE, 0);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_TIME_CHANGED));
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceControllerTest.java
new file mode 100644
index 0000000..c07ed5f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/datetime/TimeZonePickerScreenPreferenceControllerTest.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2018 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.car.settings.datetime;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.app.AlarmManager;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.datetime.ZoneGetter;
+
+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.shadows.ShadowApplication;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class TimeZonePickerScreenPreferenceControllerTest {
+
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<TimeZonePickerScreenPreferenceController>
+            mPreferenceControllerHelper;
+    private TimeZonePickerScreenPreferenceController mController;
+    @Mock
+    private AlarmManager mAlarmManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                TimeZonePickerScreenPreferenceController.class, mPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+
+        // Test setup.
+        mController.mAlarmManager = mAlarmManager;
+    }
+
+    @Test
+    public void testOnCreate_hasElements() {
+        List<Map<String, Object>> testTimeZones = new ArrayList<>();
+        testTimeZones.add(
+                createTimeZoneMap("testKey1", "Midway", "GMT-11:00", -1100));
+        testTimeZones.add(
+                createTimeZoneMap("testKey2", "Tijuana", "GMT-07:00", -700));
+        testTimeZones.add(
+                createTimeZoneMap("testKey3", "Coordinated Universal Time", "GMT+00:00", 0));
+        testTimeZones.add(
+                createTimeZoneMap("testKey4", "Kabul", "GMT+04:30", 430));
+        mController.setZonesList(testTimeZones);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4);
+    }
+
+    @Test
+    public void testOnPreferenceClick_setTimeZoneCalled() {
+        List<Map<String, Object>> testTimeZone = new ArrayList<>();
+        testTimeZone.add(createTimeZoneMap("testKey", "London", "GMT+01:00", 100));
+        mController.setZonesList(testTimeZone);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        Preference preference = mPreferenceGroup.findPreference("testKey");
+        preference.performClick();
+        verify(mAlarmManager).setTimeZone("testKey");
+    }
+
+    @Test
+    public void testOnPreferenceClick_fragmentControllerGoBack() {
+        List<Map<String, Object>> testTimeZone = new ArrayList<>();
+        testTimeZone.add(createTimeZoneMap("testKey", "London", "GMT+01:00", 100));
+        mController.setZonesList(testTimeZone);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        Preference preference = mPreferenceGroup.findPreference("testKey");
+        preference.performClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).goBack();
+    }
+
+    @Test
+    public void testOnPreferenceClick_broadcastFired() {
+        List<Map<String, Object>> testTimeZone = new ArrayList<>();
+        testTimeZone.add(createTimeZoneMap("testKey", "London", "GMT+01:00", 100));
+        mController.setZonesList(testTimeZone);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        Preference preference = mPreferenceGroup.findPreference("testKey");
+        preference.performClick();
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired.size()).isEqualTo(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(Intent.ACTION_TIME_CHANGED);
+    }
+
+    @Test
+    public void testTimeZonesComparator() {
+        List<Map<String, Object>> testTimeZones = new ArrayList<>();
+        testTimeZones.add(createTimeZoneMap("testKey1", "Oral",
+                "GMT+05:00", 500));
+        testTimeZones.add(createTimeZoneMap("testKey2", "Kathmandu",
+                "GMT+05:45", 545));
+        testTimeZones.add(createTimeZoneMap("testKey3", "Brazzaville",
+                "GMT+01:00", 100));
+        testTimeZones.add(createTimeZoneMap("testKey4", "Casablanca",
+                "GMT+01:00", 100));
+        testTimeZones.add(createTimeZoneMap("testKey5", "Nuuk",
+                "GMT-02:00", -200));
+        testTimeZones.add(createTimeZoneMap("testKey6", "St. John's",
+                "GMT-02:30", -230));
+        mController.setZonesList(testTimeZones);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+
+        List<String> computedOrder = new ArrayList<>();
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            computedOrder.add(mPreferenceGroup.getPreference(i).getTitle().toString());
+        }
+
+        assertThat(computedOrder).containsExactly("St. John's", "Nuuk", "Brazzaville", "Casablanca",
+                "Oral", "Kathmandu");
+    }
+
+    private Map<String, Object> createTimeZoneMap(String key, String timeZone, String offset,
+            int offsetValue) {
+        Map<String, Object> map = new HashMap<>();
+        map.put(ZoneGetter.KEY_ID, key);
+        map.put(ZoneGetter.KEY_DISPLAY_LABEL, timeZone);
+        map.put(ZoneGetter.KEY_OFFSET_LABEL, offset);
+        map.put(ZoneGetter.KEY_OFFSET, offsetValue);
+        return map;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
new file mode 100644
index 0000000..55eb9bf
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2018 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.car.settings.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLocalBroadcastManager.class})
+public class DevelopmentSettingsUtilTest {
+
+    private Context mContext;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowLocalBroadcastManager.reset();
+    }
+
+    @Test
+    public void isEnabled_settingsOff_isAdmin_notDemo_shouldReturnFalse() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
+
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+                mCarUserManagerHelper)).isFalse();
+    }
+
+    @Test
+    public void isEnabled_settingsOn_isAdmin_notDemo_shouldReturnTrue() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+                mCarUserManagerHelper)).isTrue();
+    }
+
+    @Test
+    public void isEnabled_settingsOn_notAdmin_notDemo_shouldReturnFalse() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+                mCarUserManagerHelper)).isFalse();
+    }
+
+    @Test
+    public void isEnabled_settingsOn_notAdmin_isDemo_shouldReturnTrue() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+                mCarUserManagerHelper)).isTrue();
+    }
+
+    @Test
+    public void isEnabled_settingsOff_notAdmin_isDemo_shouldReturnFalse() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+                mCarUserManagerHelper)).isFalse();
+    }
+
+    @Test
+    public void setDevelopmentSettingsEnabled_setTrue() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
+
+        DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(mContext, true);
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0)).isEqualTo(1);
+    }
+
+    @Test
+    public void setDevelopmentSettingsEnabled_setFalse() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+
+        DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(mContext, false);
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1)).isEqualTo(0);
+    }
+
+    @Test
+    public void isDeviceProvisioned_true() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+                1);
+        assertThat(DevelopmentSettingsUtil.isDeviceProvisioned(mContext)).isTrue();
+    }
+
+    @Test
+    public void isDeviceProvisioned_false() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+                0);
+        assertThat(DevelopmentSettingsUtil.isDeviceProvisioned(mContext)).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..a965262
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/display/AdaptiveBrightnessTogglePreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2018 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.car.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AdaptiveBrightnessTogglePreferenceControllerTest {
+
+    private Context mContext;
+    private AdaptiveBrightnessTogglePreferenceController mController;
+    private TwoStatePreference mTwoStatePreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mTwoStatePreference = new SwitchPreference(mContext);
+        PreferenceControllerTestHelper<AdaptiveBrightnessTogglePreferenceController>
+                preferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AdaptiveBrightnessTogglePreferenceController.class, mTwoStatePreference);
+        mController = preferenceControllerHelper.getController();
+        preferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void testRefreshUi_manualMode_isNotChecked() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+
+        mController.refreshUi();
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_automaticMode_isChecked() {
+        Settings.System.putInt(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+
+        mController.refreshUi();
+        assertThat(mTwoStatePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void testHandlePreferenceChanged_setFalse() {
+        mTwoStatePreference.callChangeListener(false);
+        int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+        assertThat(brightnessMode).isEqualTo(Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+    }
+
+    @Test
+    public void testHandlePreferenceChanged_setTrue() {
+        mTwoStatePreference.callChangeListener(true);
+        int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+        assertThat(brightnessMode).isEqualTo(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
new file mode 100644
index 0000000..d501e79
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/display/BrightnessLevelPreferenceControllerTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2018 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.car.settings.display;
+
+import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
+import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.SeekBarPreference;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class BrightnessLevelPreferenceControllerTest {
+
+    private static final int CURRENT_USER = 10;
+    private Context mContext;
+    private BrightnessLevelPreferenceController mController;
+    private SeekBarPreference mSeekBarPreference;
+    private int mMin;
+    private int mMax;
+    private int mMid;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        mMin = mContext.getResources().getInteger(
+                com.android.internal.R.integer.config_screenBrightnessSettingMinimum);
+        mMax = mContext.getResources().getInteger(
+                com.android.internal.R.integer.config_screenBrightnessSettingMaximum);
+        mMid = (mMax + mMin) / 2;
+
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(CURRENT_USER);
+
+        mSeekBarPreference = new SeekBarPreference(mContext);
+        PreferenceControllerTestHelper<BrightnessLevelPreferenceController>
+                preferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                BrightnessLevelPreferenceController.class, mSeekBarPreference);
+        mController = preferenceControllerHelper.getController();
+        preferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testRefreshUi_maxSet() {
+        mController.refreshUi();
+        assertThat(mSeekBarPreference.getMax()).isEqualTo(GAMMA_SPACE_MAX);
+    }
+
+    @Test
+    public void testRefreshUi_minValue() {
+        Settings.System.putIntForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS, mMin,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+
+        mController.refreshUi();
+        assertThat(mSeekBarPreference.getValue()).isEqualTo(0);
+    }
+
+    @Test
+    public void testRefreshUi_maxValue() {
+        Settings.System.putIntForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS, mMax,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+
+        mController.refreshUi();
+        assertThat(mSeekBarPreference.getValue()).isEqualTo(GAMMA_SPACE_MAX);
+    }
+
+    @Test
+    public void testRefreshUi_midValue() {
+        Settings.System.putIntForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS, mMid,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+
+        mController.refreshUi();
+        assertThat(mSeekBarPreference.getValue()).isEqualTo(
+                convertLinearToGamma(mMid,
+                        mMin, mMax));
+    }
+
+    @Test
+    public void testHandlePreferenceChanged_minValue() throws Settings.SettingNotFoundException {
+        mSeekBarPreference.callChangeListener(0);
+        int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+        assertThat(currentSettingsVal).isEqualTo(mMin);
+    }
+
+    @Test
+    public void testHandlePreferenceChanged_maxValue() throws Settings.SettingNotFoundException {
+        mSeekBarPreference.callChangeListener(GAMMA_SPACE_MAX);
+        int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+        assertThat(currentSettingsVal).isEqualTo(mMax);
+    }
+
+    @Test
+    public void testHandlePreferenceChanged_midValue() throws Settings.SettingNotFoundException {
+        mSeekBarPreference.callChangeListener(convertLinearToGamma(mMid, mMin, mMax));
+        int currentSettingsVal = Settings.System.getIntForUser(mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+        assertThat(currentSettingsVal).isEqualTo(mMid);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceControllerTest.java
new file mode 100644
index 0000000..e82f461
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/EnabledKeyboardPreferenceControllerTest.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowDevicePolicyManager;
+import com.android.car.settings.testutils.ShadowInputMethodManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowInputMethodManager.class, ShadowDevicePolicyManager.class})
+public class EnabledKeyboardPreferenceControllerTest {
+    private static final String DUMMY_LABEL = "dummy label";
+    private static final String DUMMY_ID = "dummy id";
+    private static final String DUMMY_SETTINGS_ACTIVITY = "dummy settings activity";
+    private static final String DUMMY_PACKAGE_NAME = "dummy package name";
+    private static final String ALLOWED_PACKAGE_NAME = "allowed package name";
+    private static final String DISALLOWED_PACKAGE_NAME = "disallowed package name";
+    private List<String> mPermittedList;
+    private PreferenceControllerTestHelper<EnabledKeyboardPreferenceController> mControllerHelper;
+    private PreferenceGroup mPreferenceGroup;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                EnabledKeyboardPreferenceController.class, mPreferenceGroup);
+
+        mPermittedList = new ArrayList<>();
+        mPermittedList.add(DUMMY_PACKAGE_NAME);
+        mPermittedList.add(ALLOWED_PACKAGE_NAME);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @After
+    public void tearDown() {
+        getShadowInputMethodManager(mContext).reset();
+        getShadowDevicePolicyManager(mContext).reset();
+    }
+
+    @Test
+    public void refreshUi_permitAllInputMethods() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(DUMMY_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void refreshUi_hasAllowedImeByOrganization() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void refreshUi_disallowedByOrganization() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+        List<InputMethodInfo> infos = createInputMethodInfoList(DISALLOWED_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_verifyPreferenceIcon() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        assertThat(preference.getIcon()).isEqualTo(
+                InputMethodUtil.getPackageIcon(mContext.getPackageManager(), infos.get(0)));
+    }
+
+    @Test
+    public void refreshUi_verifyPreferenceTitle() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        assertThat(preference.getTitle()).isEqualTo(
+                InputMethodUtil.getPackageLabel(mContext.getPackageManager(), infos.get(0)));
+    }
+
+    @Test
+    public void refreshUi_verifyPreferenceSummary() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        InputMethodManager inputMethodManager =
+                (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
+        Preference preference = mPreferenceGroup.getPreference(0);
+        assertThat(preference.getSummary()).isEqualTo(
+                InputMethodUtil.getSummaryString(mContext, inputMethodManager, infos.get(0)));
+    }
+
+    @Test
+    public void performClick_launchSettingsActivity() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(DISALLOWED_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        Intent intent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(intent).isNotNull();
+        assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
+        assertThat(intent.getComponent().getClassName()).isEqualTo(DUMMY_SETTINGS_ACTIVITY);
+        assertThat(intent.getComponent().getPackageName()).isEqualTo(DISALLOWED_PACKAGE_NAME);
+    }
+
+    @Test
+    public void performClick_noSettingsActivity_noCrash() {
+        // Set to true if you'd like Robolectric to strictly simulate the real Android behavior when
+        // calling {@link Context#startActivity(android.content.Intent)}. Real Android throws a
+        // {@link android.content.ActivityNotFoundException} if given an {@link Intent} that is not
+        // known to the {@link android.content.pm.PackageManager.
+        // DUMMY_SETTINGS_ACTIVITY shouldn't exist, so it throws ActivityNotFoundException.
+        ShadowApplication.getInstance().checkActivities(true);
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(DISALLOWED_PACKAGE_NAME);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        Intent intent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(intent).isNull();
+    }
+
+    private List<InputMethodInfo> createInputMethodInfoList(String packageName) {
+        List<InputMethodInfo> infos = new ArrayList<>();
+        PackageManager packageManager = mContext.getPackageManager();
+        infos.add(createMockInputMethodInfoWithSubtypes(
+                packageManager, getShadowInputMethodManager(mContext), packageName));
+        return infos;
+    }
+
+    private static InputMethodInfo createMockInputMethodInfoWithSubtypes(
+            PackageManager packageManager, ShadowInputMethodManager inputMethodManager,
+            String packageName) {
+        InputMethodInfo mockInfo = createMockInputMethodInfo(packageManager, packageName);
+        List<InputMethodSubtype> subtypes = createSubtypes();
+        inputMethodManager.setEnabledInputMethodSubtypeList(subtypes);
+
+        return mockInfo;
+    }
+
+    private static InputMethodInfo createMockInputMethodInfo(
+            PackageManager packageManager, String packageName) {
+        InputMethodInfo mockInfo = mock(InputMethodInfo.class);
+        when(mockInfo.getPackageName()).thenReturn(packageName);
+        when(mockInfo.getId()).thenReturn(DUMMY_ID);
+        when(mockInfo.loadLabel(packageManager)).thenReturn(DUMMY_LABEL);
+        when(mockInfo.getServiceInfo()).thenReturn(new ServiceInfo());
+        when(mockInfo.getSettingsActivity()).thenReturn(DUMMY_SETTINGS_ACTIVITY);
+        return mockInfo;
+    }
+
+    private static List<InputMethodSubtype> createSubtypes() {
+        List<InputMethodSubtype> subtypes = new ArrayList<>();
+        subtypes.add(createSubtype(1, "en_US"));
+        subtypes.add(createSubtype(2, "de_BE"));
+        subtypes.add(createSubtype(3, "oc-FR"));
+        return subtypes;
+    }
+
+    private static InputMethodSubtype createSubtype(int id, String locale) {
+        return new InputMethodSubtypeBuilder().setSubtypeId(id).setSubtypeLocale(locale)
+                .setIsAuxiliary(false).setIsAsciiCapable(true).build();
+    }
+
+    private static ShadowInputMethodManager getShadowInputMethodManager(Context context) {
+        return Shadow.extract(context.getSystemService(Context.INPUT_METHOD_SERVICE));
+    }
+
+    private static ShadowDevicePolicyManager getShadowDevicePolicyManager(Context context) {
+        return Shadow.extract(context.getSystemService(Context.DEVICE_POLICY_SERVICE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/InputMethodUtilTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/InputMethodUtilTest.java
new file mode 100644
index 0000000..2067089
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/InputMethodUtilTest.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ServiceInfo;
+import android.graphics.drawable.Drawable;
+import android.provider.Settings;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+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 java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class InputMethodUtilTest {
+    private static final String DUMMY_PACKAGE_NAME = "dummy package name";
+    private static final String DUMMY_LABEL = "dummy label";
+    private static final String DUMMY_SETTINGS_ACTIVITY = "dummy settings activity";
+    private static final String SUBTYPES_STRING =
+            "English (United States), German (Belgium), and Occitan (France)";
+    private static final String DUMMY_ENABLED_INPUT_METHODS =
+            "com.google.android.googlequicksearchbox/com.google.android.voicesearch.ime"
+                    + ".VoiceInputMethodService:com.google.android.apps.automotive.inputmethod/"
+                    + ".InputMethodService";
+    private static final String DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT =
+            "com.google.android.apps.automotive.inputmethod/.InputMethodService";
+    private static final String DUMMY_ENABLED_INPUT_METHOD_ID =
+            "com.google.android.googlequicksearchbox/com.google.android.voicesearch.ime"
+                    + ".VoiceInputMethodService";
+    private static final String DUMMY_DISABLED_INPUT_METHOD_ID = "disabled input method id";
+    private Context mContext;
+    private List<InputMethodInfo> mDummyEnabledInputMethodsListAllDefaultable;
+    private List<InputMethodInfo> mDummyEnabledInputMethodsListOneDefaultable;
+
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private InputMethodManager mInputMethodManager;
+    @Mock
+    private Drawable mIcon;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS, DUMMY_ENABLED_INPUT_METHODS);
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD, DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+
+        mDummyEnabledInputMethodsListOneDefaultable = Arrays
+                .stream(DUMMY_ENABLED_INPUT_METHODS.split(String.valueOf(InputMethodUtil
+                        .INPUT_METHOD_DELIMITER))).collect(Collectors.toList()).stream().map(
+                            result -> {
+                                InputMethodInfo info = createMockInputMethodInfo(
+                                        mPackageManager, DUMMY_PACKAGE_NAME);
+                                when(info.getId()).thenReturn(result);
+                                when(info.isDefault(mContext)).thenReturn(result.equals(
+                                        DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT));
+                                return info;
+                            }).collect(Collectors.toList());
+        mDummyEnabledInputMethodsListAllDefaultable = Arrays
+                .stream(DUMMY_ENABLED_INPUT_METHODS.split(String.valueOf(InputMethodUtil
+                        .INPUT_METHOD_DELIMITER))).collect(Collectors.toList()).stream().map(
+                                result -> {
+                                    InputMethodInfo info = createMockInputMethodInfo(
+                                            mPackageManager, DUMMY_PACKAGE_NAME);
+                                    when(info.getId()).thenReturn(result);
+                                    when(info.isDefault(mContext)).thenReturn(true);
+                                    return info;
+                                }).collect(Collectors.toList());
+    }
+
+    @Test
+    public void getPackageIcon_hasApplicationIcon() throws NameNotFoundException {
+        InputMethodInfo info = createMockInputMethodInfoWithSubtypes(mPackageManager,
+                mInputMethodManager, DUMMY_PACKAGE_NAME);
+        when(mPackageManager.getApplicationIcon(eq(info.getPackageName()))).thenReturn(mIcon);
+        assertThat(InputMethodUtil.getPackageIcon(mPackageManager, info)).isEqualTo(mIcon);
+    }
+
+    @Test
+    public void getPackageIcon_noApplicationIcon() throws NameNotFoundException {
+        InputMethodInfo info = createMockInputMethodInfoWithSubtypes(mPackageManager,
+                mInputMethodManager, DUMMY_PACKAGE_NAME);
+        when(mPackageManager.getApplicationIcon(DUMMY_PACKAGE_NAME)).thenThrow(
+                new NameNotFoundException());
+        assertThat(InputMethodUtil.getPackageIcon(mPackageManager, info)).isEqualTo(
+                InputMethodUtil.NO_ICON);
+    }
+
+    @Test
+    public void getPackageLabel() {
+        InputMethodInfo info = createMockInputMethodInfoWithSubtypes(mPackageManager,
+                mInputMethodManager, DUMMY_PACKAGE_NAME);
+        assertThat(InputMethodUtil.getPackageLabel(mPackageManager, info)).isEqualTo(
+                DUMMY_LABEL);
+    }
+
+    @Test
+    public void getSummaryString() {
+        InputMethodInfo info = createMockInputMethodInfoWithSubtypes(mPackageManager,
+                mInputMethodManager, DUMMY_PACKAGE_NAME);
+        assertThat(InputMethodUtil.getSummaryString(mContext, mInputMethodManager, info)).isEqualTo(
+                SUBTYPES_STRING);
+    }
+
+    @Test
+    public void isInputMethodEnabled_isDisabled_returnsFalse() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_DISABLED_INPUT_METHOD_ID);
+
+        assertThat(InputMethodUtil.isInputMethodEnabled(mContext.getContentResolver(), info))
+                .isFalse();
+    }
+
+    @Test
+    public void isInputMethodEnabled_isEnabled_returnsTrue() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+
+        assertThat(InputMethodUtil.isInputMethodEnabled(mContext.getContentResolver(), info))
+                .isTrue();
+    }
+
+    @Test
+    public void enableInputMethod_alreadyEnabled_remainsUnchanged() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+
+        InputMethodUtil.enableInputMethod(mContext.getContentResolver(), info);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS)).isEqualTo(DUMMY_ENABLED_INPUT_METHODS);
+    }
+
+    @Test
+    public void enableInputMethod_noEnabledInputMethods_addsIME() {
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS, "");
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+
+        InputMethodUtil.enableInputMethod(mContext.getContentResolver(), info);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS)).isEqualTo(
+                DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+    }
+
+    @Test
+    public void enableInputMethod_someEnabledInputMethods_addsIME() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_DISABLED_INPUT_METHOD_ID);
+
+        InputMethodUtil.enableInputMethod(mContext.getContentResolver(), info);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS)).isEqualTo(
+                DUMMY_ENABLED_INPUT_METHODS + ":"
+                        + DUMMY_DISABLED_INPUT_METHOD_ID);
+    }
+
+    @Test
+    public void disableInputMethod_notEnabled_remainsUnchanged() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_DISABLED_INPUT_METHOD_ID);
+        when(mInputMethodManager.getEnabledInputMethodList())
+                .thenReturn(mDummyEnabledInputMethodsListAllDefaultable);
+
+        InputMethodUtil.disableInputMethod(mContext, mInputMethodManager, info);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS)).isEqualTo(DUMMY_ENABLED_INPUT_METHODS);
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD)).isEqualTo(
+                DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+    }
+
+    @Test
+    public void disableInputMethod_notDefault_removesIMEWhileDefaultRemainsSame() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_ENABLED_INPUT_METHOD_ID);
+        when(mInputMethodManager.getEnabledInputMethodList())
+                .thenReturn(mDummyEnabledInputMethodsListAllDefaultable);
+
+        InputMethodUtil.disableInputMethod(mContext, mInputMethodManager, info);
+
+        assertThat(splitConcatenatedIdsIntoSet(Settings.Secure.getString(mContext
+                .getContentResolver(), Settings.Secure.ENABLED_INPUT_METHODS))).isEqualTo(
+                splitConcatenatedIdsIntoSet(DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT));
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD)).isEqualTo(
+                DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+    }
+
+    @Test
+    public void disableInputMethod_twoDefaultableIMEsEnabled_removesIMEAndChangesDefault() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+        when(mInputMethodManager.getEnabledInputMethodList())
+                .thenReturn(mDummyEnabledInputMethodsListAllDefaultable);
+
+        InputMethodUtil.disableInputMethod(mContext, mInputMethodManager, info);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS)).isEqualTo(
+                DUMMY_ENABLED_INPUT_METHOD_ID);
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD)).isEqualTo(
+                DUMMY_ENABLED_INPUT_METHOD_ID);
+    }
+
+    @Test
+    public void disableInputMethod_isDefaultWithNoOtherDefaultableEnabled_remainsUnchanged() {
+        InputMethodInfo info = createMockInputMethodInfo(mPackageManager, DUMMY_PACKAGE_NAME);
+        when(info.getId()).thenReturn(DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+        when(mInputMethodManager.getEnabledInputMethodList())
+                .thenReturn(mDummyEnabledInputMethodsListOneDefaultable);
+
+        InputMethodUtil.disableInputMethod(mContext, mInputMethodManager, info);
+
+        assertThat(splitConcatenatedIdsIntoSet(Settings.Secure.getString(mContext
+                .getContentResolver(), Settings.Secure.ENABLED_INPUT_METHODS))).isEqualTo(
+                splitConcatenatedIdsIntoSet(DUMMY_ENABLED_INPUT_METHODS));
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD)).isEqualTo(
+                DUMMY_ENABLED_INPUT_METHOD_ID_DEFAULT);
+    }
+
+    private static InputMethodInfo createMockInputMethodInfoWithSubtypes(
+            PackageManager packageManager, InputMethodManager inputMethodManager,
+            String packageName) {
+        InputMethodInfo mockInfo = createMockInputMethodInfo(packageManager, packageName);
+        List<InputMethodSubtype> subtypes = createSubtypes();
+        when(inputMethodManager.getEnabledInputMethodSubtypeList(
+                eq(mockInfo), anyBoolean())).thenReturn(subtypes);
+        return mockInfo;
+    }
+
+    private static InputMethodInfo createMockInputMethodInfo(
+            PackageManager packageManager, String packageName) {
+        InputMethodInfo mockInfo = mock(InputMethodInfo.class);
+        when(mockInfo.getPackageName()).thenReturn(packageName);
+        when(mockInfo.loadLabel(packageManager)).thenReturn(DUMMY_LABEL);
+        when(mockInfo.getServiceInfo()).thenReturn(new ServiceInfo());
+        when(mockInfo.getSettingsActivity()).thenReturn(DUMMY_SETTINGS_ACTIVITY);
+        return mockInfo;
+    }
+
+    private static List<InputMethodSubtype> createSubtypes() {
+        List<InputMethodSubtype> subtypes = new ArrayList<>();
+        subtypes.add(createSubtype(1, "en_US"));
+        subtypes.add(createSubtype(2, "de_BE"));
+        subtypes.add(createSubtype(3, "oc-FR"));
+        return subtypes;
+    }
+
+    private static InputMethodSubtype createSubtype(int id, String locale) {
+        return new InputMethodSubtypeBuilder().setSubtypeId(id).setSubtypeLocale(locale)
+                .setIsAuxiliary(false).setIsAsciiCapable(true).build();
+    }
+
+    private Set<String> splitConcatenatedIdsIntoSet(String ids) {
+        Set<String> result = new HashSet<>();
+
+        if (ids == null || ids.isEmpty()) {
+            return result;
+        }
+
+        InputMethodUtil.sInputMethodSplitter.setString(ids);
+        while (InputMethodUtil.sInputMethodSplitter.hasNext()) {
+            result.add(InputMethodUtil.sInputMethodSplitter.next());
+        }
+
+        return result;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
new file mode 100644
index 0000000..5c794cf
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceControllerTest.java
@@ -0,0 +1,1069 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowDevicePolicyManager;
+import com.android.car.settings.testutils.ShadowInputMethodManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowInputMethodManager.class, ShadowDevicePolicyManager.class})
+public class KeyboardManagementPreferenceControllerTest {
+    private static final String DUMMY_LABEL = "dummy label";
+    private static final String DUMMY_SETTINGS_ACTIVITY = "dummy settings activity";
+    private static final String DUMMY_PACKAGE_NAME = "dummy package name";
+    private static final String DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE =
+            "dummy id defaultable direct boot aware";
+    private static final String DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE =
+            "dummy id defaultable not direct boot aware";
+    private static final String DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE =
+            "dummy id not defaultable direct boot aware";
+    private static final String DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE =
+            "dummy id not defaultable not direct boot aware";
+    private static final String DISALLOWED_PACKAGE_NAME = "disallowed package name";
+    private static final String ALLOWED_PACKAGE_NAME = "allowed package name";
+    private List<String> mPermittedList;
+    private PreferenceControllerTestHelper<KeyboardManagementPreferenceController>
+            mControllerHelper;
+    private PreferenceGroup mPreferenceGroup;
+    private Context mContext;
+    private InputMethodManager mInputMethodManager;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                KeyboardManagementPreferenceController.class, mPreferenceGroup);
+        mInputMethodManager = (InputMethodManager) mContext.getSystemService(Context
+                .INPUT_METHOD_SERVICE);
+
+        mPermittedList = new ArrayList<>();
+        mPermittedList.add(DUMMY_PACKAGE_NAME);
+        mPermittedList.add(ALLOWED_PACKAGE_NAME);
+
+        getShadowInputMethodManager(mContext).setInputMethodList(new ArrayList<>());
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void refreshUi_permitAllInputMethods_preferenceCountIs4() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4);
+    }
+
+    @Test
+    public void refreshUi_multiplteAllowedImeByOrganization_allPreferencesVisible() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            assertThat(mPreferenceGroup.getPreference(i).isVisible()).isTrue();
+        }
+    }
+
+    @Test
+    public void refreshUi_multipleEnabledInputMethods_allPreferencesEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            assertThat(mPreferenceGroup.getPreference(i).isEnabled()).isTrue();
+        }
+    }
+
+    @Test
+    public void refreshUi_multipleEnabledInputMethods_allPreferencesChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            assertThat(((SwitchPreference) mPreferenceGroup.getPreference(i)).isChecked())
+                    .isTrue();
+        }
+    }
+
+    @Test
+    public void refreshUi_disallowedByOrganization_noPreferencesShown() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+        List<InputMethodInfo> infos = createInputMethodInfoList(DISALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void refreshUi_verifyPreferenceIcon() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        assertThat(preference.getIcon()).isEqualTo(
+                InputMethodUtil.getPackageIcon(mContext.getPackageManager(), infos.get(0)));
+    }
+
+    @Test
+    public void refreshUi_verifyPreferenceTitle() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        Preference preference = mPreferenceGroup.getPreference(0);
+        assertThat(preference.getTitle()).isEqualTo(
+                InputMethodUtil.getPackageLabel(mContext.getPackageManager(), infos.get(0)));
+    }
+
+    @Test
+    public void refreshUi_verifyPreferenceSummary() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        List<InputMethodInfo> infos = createInputMethodInfoList(ALLOWED_PACKAGE_NAME,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+        getShadowInputMethodManager(mContext).setInputMethodList(infos);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+
+        InputMethodManager inputMethodManager =
+                (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
+        Preference preference = mPreferenceGroup.getPreference(0);
+        assertThat(preference.getSummary()).isEqualTo(
+                InputMethodUtil.getSummaryString(mContext, inputMethodManager, infos.get(0)));
+    }
+
+    @Test
+    public void refreshUi_oneInputMethod_noneEnabled_oneInputMethodPreferenceInView() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void refreshUi_oneInputMethod_noneEnabled_preferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreference(0).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_oneInputMethod_noneEnabled_preferenceNotChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(((SwitchPreference) mPreferenceGroup.getPreference(0)).isChecked())
+                .isFalse();
+    }
+
+    @Test
+    public void performClick_toggleTrue_securityDialogShown() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+    }
+
+    @Test
+    public void performClick_toggleTrue_showSecurityDialog_positive_noOtherPreferenceAdded() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getKey()).isEqualTo(
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE);
+    }
+
+    @Test
+    public void performClick_toggleTrue_showSecurityDialog_positive_preferenceChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(((SwitchPreference) mPreferenceGroup.getPreference(0)).isChecked())
+                .isTrue();
+    }
+
+    @Test
+    public void performClick_toggleTrue_showSecurityDialog_positive_preferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(mPreferenceGroup.getPreference(0).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleTrue_showSecurityDialog_positive_inputMethodEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(mInputMethodManager.getEnabledInputMethodList().get(0).getId())
+                .isEqualTo(DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE);
+    }
+
+    @Test
+    public void performClick_toggleTrue_showSecurityDialog_negative_noOtherPreferenceAdded() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getKey()).isEqualTo(
+                DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE);
+    }
+
+    @Test
+    public void performClick_toggleTrue_showSecurityDialog_negative_preferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+        assertThat(mPreferenceGroup.getPreference(0).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleTrue_showSecurityDialog_negative_inputMethodDisabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+        assertThat(((SwitchPreference) mPreferenceGroup.getPreference(0)).isChecked())
+                .isFalse();
+    }
+
+    @Test
+    public void performClick_toggleTrue_directBootWarningShown() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_positive_noOtherPreferenceAdded() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getKey()).isEqualTo(
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_positive_preferenceChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(((SwitchPreference) mPreferenceGroup.getPreference(0)).isChecked())
+                .isTrue();
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_positive_preferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(mPreferenceGroup.getPreference(0).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_positive_inputMethodEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        assertThat(mInputMethodManager.getEnabledInputMethodList().get(0).getId())
+                .isEqualTo(DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_negative_noOtherPreferenceAdded() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getKey()).isEqualTo(
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_negative_preferenceNotChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+
+        assertThat(((SwitchPreference) mPreferenceGroup.getPreference(0)).isChecked())
+                .isFalse();
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_negative_preferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+        assertThat(mPreferenceGroup.getPreference(0).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleTrue_showDirectBootDialog_negative_inputMethodDisabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(new ArrayList<>());
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> securityDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                securityDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = securityDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        ArgumentCaptor<ConfirmationDialogFragment> bootDialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(bootDialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.DIRECT_BOOT_WARN_DIALOG_TAG));
+        dialogFragment = bootDialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_NEGATIVE);
+
+        assertThat(mInputMethodManager.getEnabledInputMethodList().size())
+                .isEqualTo(0);
+    }
+
+    @Test
+    public void performClick_toggleFalse_noOtherPreferenceAdded() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getKey()).isEqualTo(
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE);
+    }
+
+    @Test
+    public void performClick_toggleFalse_preferenceNotChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        assertThat(((SwitchPreference) mPreferenceGroup.getPreference(0)).isChecked())
+                .isFalse();
+    }
+
+    @Test
+    public void performClick_toggleFalse_preferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        assertThat((mPreferenceGroup.getPreference(0)).isEnabled())
+                .isTrue();
+    }
+
+    @Test
+    public void performClick_toggleFalse_inputMethodDisabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+
+        mControllerHelper.getController().refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+
+        assertThat(mInputMethodManager.getEnabledInputMethodList().size())
+                .isEqualTo(0);
+    }
+
+    @Test
+    public void performClick_toggleFalse_twoDefaultable_notClickDefaultablePreferenceDisabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup, DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE)
+                .performClick();
+
+        assertThat(getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void performClick_toggleFalse_twoDefaultable_clickedDefaultablePreferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).performClick();
+
+        assertThat(getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleFalse_twoDefaultable_nonDefaultablePreferenceEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).performClick();
+
+        assertThat(getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleFalse_twoDefaultable_clickedDefaultablePreferenceNotChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).performClick();
+
+        assertThat(((SwitchPreference) getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE)).isChecked()).isFalse();
+    }
+
+    @Test
+    public void performClick_toggleFalse_twoDefaultable_notClickedDefaultablePreferenceChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).performClick();
+
+        assertThat(((SwitchPreference) getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)).isChecked()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleFalse_twoDefaultable_nonDefaultablePreferenceChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).performClick();
+
+        assertThat(((SwitchPreference) getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)).isChecked()).isTrue();
+    }
+
+    @Test
+    public void performClick_toggleTrue_twoDefaultable_allPreferencesEnabled() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            assertThat(mPreferenceGroup.getPreference(i).isEnabled()).isTrue();
+        }
+    }
+
+    @Test
+    public void performClick_toggleTrue_twoDefaultable_allPreferencesChecked() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE, DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE)
+        );
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(createInputMethodInfoList(
+                ALLOWED_PACKAGE_NAME, DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE,
+                DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE));
+
+        mControllerHelper.getController().refreshUi();
+
+        getPreferenceFromGroupByKey(mPreferenceGroup,
+                DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE).performClick();
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(dialogCaptor.capture(),
+                eq(KeyboardManagementPreferenceController.SECURITY_WARN_DIALOG_TAG));
+        ConfirmationDialogFragment dialogFragment = dialogCaptor.getValue();
+
+        dialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
+
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            assertThat(((SwitchPreference) mPreferenceGroup.getPreference(i)).isChecked())
+                    .isTrue();
+        }
+    }
+
+    private static InputMethodInfo createMockInputMethodInfo(
+            Context context, PackageManager packageManager,
+            ShadowInputMethodManager inputMethodManager, String packageName, String id,
+            boolean isDefaultable, boolean directBootAware) {
+        ServiceInfo mockServiceInfo = mock(ServiceInfo.class);
+        mockServiceInfo.directBootAware = directBootAware;
+
+        InputMethodInfo mockInfo = mock(InputMethodInfo.class);
+        when(mockInfo.getPackageName()).thenReturn(packageName);
+        when(mockInfo.loadLabel(packageManager)).thenReturn(DUMMY_LABEL);
+        when(mockInfo.getServiceInfo()).thenReturn(mockServiceInfo);
+        when(mockInfo.getSettingsActivity()).thenReturn(DUMMY_SETTINGS_ACTIVITY);
+        when(mockInfo.getId()).thenReturn(id);
+        when(mockInfo.isDefault(context)).thenReturn(isDefaultable);
+        List<InputMethodSubtype> subtypes = createSubtypes();
+        inputMethodManager.setEnabledInputMethodSubtypeList(subtypes);
+        return mockInfo;
+    }
+
+    private static Preference getPreferenceFromGroupByKey(PreferenceGroup prefGroup, String key) {
+        for (int i = 0; i < prefGroup.getPreferenceCount(); i++) {
+            Preference pref = prefGroup.getPreference(i);
+            if (pref.getKey().equals(key)) {
+                return pref;
+            }
+        }
+        return null;
+    }
+
+    private static List<InputMethodSubtype> createSubtypes() {
+        List<InputMethodSubtype> subtypes = new ArrayList<>();
+        subtypes.add(createSubtype(1, "en_US"));
+        subtypes.add(createSubtype(2, "de_BE"));
+        subtypes.add(createSubtype(3, "oc-FR"));
+        return subtypes;
+    }
+
+    private static InputMethodSubtype createSubtype(int id, String locale) {
+        return new InputMethodSubtype.InputMethodSubtypeBuilder().setSubtypeId(id)
+                .setSubtypeLocale(locale).setIsAuxiliary(false).setIsAsciiCapable(true).build();
+    }
+
+    private static ShadowInputMethodManager getShadowInputMethodManager(Context context) {
+        return Shadow.extract(context.getSystemService(Context.INPUT_METHOD_SERVICE));
+    }
+
+    private static ShadowDevicePolicyManager getShadowDevicePolicyManager(Context context) {
+        return Shadow.extract(context.getSystemService(Context.DEVICE_POLICY_SERVICE));
+    }
+
+    private List<InputMethodInfo> createInputMethodInfoList(String packageName, String... ids) {
+        List<InputMethodInfo> infos = new ArrayList<>();
+        PackageManager packageManager = mContext.getPackageManager();
+        List<String> idsList = Arrays.asList(ids);
+        idsList.forEach(id -> {
+            boolean defaultable;
+            boolean directBootAware;
+            switch (id) {
+                case DUMMY_ID_DEFAULTABLE_DIRECT_BOOT_AWARE:
+                    defaultable = true;
+                    directBootAware = true;
+                    break;
+                case DUMMY_ID_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE:
+                    defaultable = true;
+                    directBootAware = false;
+                    break;
+                case DUMMY_ID_NOT_DEFAULTABLE_DIRECT_BOOT_AWARE:
+                    defaultable = false;
+                    directBootAware = true;
+                    break;
+                default: //case DUMMY_ID_NOT_DEFAULTABLE_NOT_DIRECT_BOOT_AWARE:
+                    defaultable = false;
+                    directBootAware = false;
+                    break;
+            }
+            infos.add(createMockInputMethodInfo(mContext, packageManager,
+                    getShadowInputMethodManager(mContext), packageName, id, defaultable,
+                    directBootAware));
+        });
+        return infos;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardPreferenceControllerTest.java
new file mode 100644
index 0000000..d51e9b1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/inputmethod/KeyboardPreferenceControllerTest.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.inputmethod;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.view.inputmethod.InputMethodInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowDevicePolicyManager;
+import com.android.car.settings.testutils.ShadowInputMethodManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowInputMethodManager.class, ShadowDevicePolicyManager.class})
+public class KeyboardPreferenceControllerTest {
+    private static final String EMPTY = "";
+    private static final String DUMMY_LABEL = "dummy label";
+    private static final String DUMMY_LABEL_1 = "dummy label 1";
+    private static final String DUMMY_LABEL_2 = "dummy label 2";
+    private static final String DUMMY_SETTINGS_ACTIVITY = "dummy settings activity";
+    private static final String DUMMY_PACKAGE_NAME = "dummy package name";
+    private static final String ALLOWED_PACKAGE_NAME = "allowed package name";
+    private static final String DISALLOWED_PACKAGE_NAME = "disallowed package name";
+    private List<String> mPermittedList;
+    private PreferenceControllerTestHelper<KeyboardPreferenceController> mControllerHelper;
+    private Preference mPreference;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                KeyboardPreferenceController.class, mPreference);
+
+        mPermittedList = new ArrayList<>();
+        mPermittedList.add(DUMMY_PACKAGE_NAME);
+        mPermittedList.add(ALLOWED_PACKAGE_NAME);
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowInputMethodManager.reset();
+        ShadowDevicePolicyManager.reset();
+    }
+
+    @Test
+    public void refreshUi_noInputMethodInfo() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(Collections.emptyList());
+
+        mControllerHelper.getController().refreshUi();
+        assertThat(mPreference.getSummary()).isEqualTo(EMPTY);
+    }
+
+    @Test
+    public void refreshUi_permitAllInputMethods_hasOneInputMethodInfo() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+
+        List<InputMethodInfo> infos = new ArrayList<>();
+        PackageManager packageManager = mContext.getPackageManager();
+        infos.add(createInputMethodInfo(packageManager, DUMMY_PACKAGE_NAME, DUMMY_LABEL));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+        assertThat(mPreference.getSummary()).isNotNull();
+        assertThat(mPreference.getSummary().toString().contains(DUMMY_LABEL)).isTrue();
+    }
+
+    @Test
+    public void refreshUi_permitAllInputMethods_hasTwoInputMethodInfo() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+
+        List<InputMethodInfo> infos = new ArrayList<>();
+        PackageManager packageManager = mContext.getPackageManager();
+        infos.add(createInputMethodInfo(packageManager, DUMMY_PACKAGE_NAME, DUMMY_LABEL));
+        infos.add(createInputMethodInfo(packageManager, DUMMY_PACKAGE_NAME, DUMMY_LABEL_1));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+        assertThat(mPreference.getSummary()).isNotNull();
+        assertThat(mPreference.getSummary().toString().contains(DUMMY_LABEL)).isTrue();
+        assertThat(mPreference.getSummary().toString().contains(DUMMY_LABEL_1)).isTrue();
+    }
+
+    @Test
+    public void refreshUi_permitAllInputMethods_hasThreeInputMethodInfo() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(null);
+
+        List<InputMethodInfo> infos = new ArrayList<>();
+        PackageManager packageManager = mContext.getPackageManager();
+        infos.add(createInputMethodInfo(packageManager, DUMMY_PACKAGE_NAME, DUMMY_LABEL));
+        infos.add(createInputMethodInfo(packageManager, DUMMY_PACKAGE_NAME, DUMMY_LABEL_1));
+        infos.add(createInputMethodInfo(packageManager, DUMMY_PACKAGE_NAME, DUMMY_LABEL_2));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+        assertThat(mPreference.getSummary()).isNotNull();
+        assertThat(mPreference.getSummary().toString().contains(DUMMY_LABEL)).isTrue();
+        assertThat(mPreference.getSummary().toString().contains(DUMMY_LABEL_1)).isTrue();
+        assertThat(mPreference.getSummary().toString().contains(DUMMY_LABEL_2)).isTrue();
+    }
+
+    @Test
+    public void refreshUi_hasAllowedImeByOrganization() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+
+        List<InputMethodInfo> infos = new ArrayList<>();
+        PackageManager packageManager = mContext.getPackageManager();
+        infos.add(createInputMethodInfo(packageManager, ALLOWED_PACKAGE_NAME, DUMMY_LABEL));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+        assertThat(mPreference.getSummary()).isEqualTo(DUMMY_LABEL);
+    }
+
+    @Test
+    public void refreshUi_disallowedByOrganization() {
+        getShadowDevicePolicyManager(mContext).setPermittedInputMethodsForCurrentUser(
+                mPermittedList);
+
+        List<InputMethodInfo> infos = new ArrayList<>();
+        PackageManager packageManager = mContext.getPackageManager();
+        infos.add(createInputMethodInfo(packageManager, DISALLOWED_PACKAGE_NAME, DUMMY_LABEL));
+        getShadowInputMethodManager(mContext).setEnabledInputMethodList(infos);
+
+        mControllerHelper.getController().refreshUi();
+        assertThat(mPreference.getSummary()).isEqualTo(EMPTY);
+    }
+
+    private static InputMethodInfo createInputMethodInfo(
+            PackageManager packageManager, String packageName, String label) {
+        ResolveInfo resolveInfo = mock(ResolveInfo.class);
+        ServiceInfo serviceInfo = new ServiceInfo();
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.packageName = packageName;
+        applicationInfo.enabled = true;
+        applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        serviceInfo.applicationInfo = applicationInfo;
+        serviceInfo.enabled = true;
+        serviceInfo.packageName = packageName;
+        serviceInfo.name = label;
+        serviceInfo.exported = true;
+        serviceInfo.nonLocalizedLabel = label;
+        resolveInfo.serviceInfo = serviceInfo;
+        resolveInfo.nonLocalizedLabel = label;
+        when(resolveInfo.loadLabel(packageManager)).thenReturn(label);
+        return new InputMethodInfo(resolveInfo, /* isAuxIme */false,
+                DUMMY_SETTINGS_ACTIVITY,  /* subtypes */null, /* isDefaultResId */
+                1, /*forceDefault*/false);
+    }
+
+    private static ShadowInputMethodManager getShadowInputMethodManager(Context context) {
+        return Shadow.extract(context.getSystemService(Context.INPUT_METHOD_SERVICE));
+    }
+
+    private static ShadowDevicePolicyManager getShadowDevicePolicyManager(Context context) {
+        return Shadow.extract(context.getSystemService(Context.DEVICE_POLICY_SERVICE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
new file mode 100644
index 0000000..8ce0c68
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/language/LanguageBasePreferenceControllerTest.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowLocalePicker;
+import com.android.car.settings.testutils.ShadowLocaleStore;
+import com.android.internal.app.LocaleStore;
+import com.android.internal.app.SuggestedLocaleAdapter;
+
+import org.junit.After;
+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 java.util.Locale;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLocalePicker.class, ShadowLocaleStore.class})
+public class LanguageBasePreferenceControllerTest {
+
+    private static final LocaleStore.LocaleInfo TEST_LOCALE_INFO = LocaleStore.getLocaleInfo(
+            Locale.FRENCH);
+    private static final Locale HAS_MULTIPLE_CHILD_LOCALE = Locale.ENGLISH;
+    private static final Locale HAS_CHILD_LOCALE = Locale.KOREAN;
+    private static final Locale NO_CHILD_LOCALE = Locale.FRANCE;
+
+    private static class TestLanguageBasePreferenceController extends
+            LanguageBasePreferenceController {
+
+        private SuggestedLocaleAdapter mAdapter;
+
+        TestLanguageBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        public void setAdapter(SuggestedLocaleAdapter adapter) {
+            mAdapter = adapter;
+        }
+
+        @Override
+        protected LocalePreferenceProvider defineLocaleProvider() {
+            return new LocalePreferenceProvider(getContext(), mAdapter);
+        }
+    }
+
+    private TestLanguageBasePreferenceController mController;
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private FragmentController mFragmentController;
+    @Mock
+    private SuggestedLocaleAdapter mSuggestedLocaleAdapter;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        PreferenceControllerTestHelper<TestLanguageBasePreferenceController>
+                preferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestLanguageBasePreferenceController.class, mPreferenceGroup);
+        mController = preferenceControllerHelper.getController();
+        mController.setAdapter(mSuggestedLocaleAdapter);
+        mFragmentController = preferenceControllerHelper.getMockFragmentController();
+        preferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        // Note that ENGLISH has 2 child locales.
+        ShadowLocaleStore.addLocaleRelationship(Locale.ENGLISH, Locale.CANADA);
+        ShadowLocaleStore.addLocaleRelationship(Locale.ENGLISH, Locale.US);
+
+        // Note that KOREAN has 1 child locale.
+        ShadowLocaleStore.addLocaleRelationship(Locale.KOREAN, Locale.KOREA);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowLocaleStore.reset();
+        ShadowLocalePicker.reset();
+    }
+
+    @Test
+    public void testRefreshUi_groupConstructed() {
+        when(mSuggestedLocaleAdapter.getCount()).thenReturn(1);
+        when(mSuggestedLocaleAdapter.getItemViewType(0)).thenReturn(
+                LocalePreferenceProvider.TYPE_LOCALE);
+        when(mSuggestedLocaleAdapter.getItem(0)).thenReturn(TEST_LOCALE_INFO);
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testOnPreferenceClick_noLocale_returnsFalse() {
+        assertThat(mController.onPreferenceClick(new Preference(mContext))).isFalse();
+    }
+
+    @Test
+    public void testOnPreferenceClick_hasMultipleChildLocales_returnsTrue() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_MULTIPLE_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        assertThat(mController.onPreferenceClick(preference)).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceClick_hasMultipleChildLocales_localeNotUpdated() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_MULTIPLE_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        mController.onPreferenceClick(preference);
+        assertThat(ShadowLocalePicker.localeWasUpdated()).isFalse();
+    }
+
+    @Test
+    public void testOnPreferenceClick_hasMultipleChildLocales_neverCallsGoBack() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_MULTIPLE_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        mController.onPreferenceClick(preference);
+        verify(mFragmentController, never()).goBack();
+    }
+
+    @Test
+    public void testOnPreferenceClick_hasSingleChildLocale_returnsTrue() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        assertThat(mController.onPreferenceClick(preference)).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceClick_hasSingleChildLocale_localeUpdated() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        mController.onPreferenceClick(preference);
+        assertThat(ShadowLocalePicker.localeWasUpdated()).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceClick_hasSingleChildLocale_callsGoBack() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(HAS_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        mController.onPreferenceClick(preference);
+        verify(mFragmentController).goBack();
+    }
+
+    @Test
+    public void testOnPreferenceClick_noChildLocale_returnsTrue() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(NO_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        assertThat(mController.onPreferenceClick(preference)).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceClick_noChildLocale_localeUpdated() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(NO_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        mController.onPreferenceClick(preference);
+        assertThat(ShadowLocalePicker.localeWasUpdated()).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceClick_noChildLocale_callsGoBack() {
+        LocaleStore.LocaleInfo localeInfo = LocaleStore.getLocaleInfo(NO_CHILD_LOCALE);
+        Preference preference = new Preference(mContext);
+        LocaleUtil.setLocaleArgument(preference, localeInfo);
+        mController.onPreferenceClick(preference);
+        verify(mFragmentController).goBack();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java b/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
new file mode 100644
index 0000000..5847603
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/language/LocalePreferenceProviderTest.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2018 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.car.settings.language;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settingslib.R;
+import com.android.internal.app.LocaleStore;
+import com.android.internal.app.SuggestedLocaleAdapter;
+
+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 java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class LocalePreferenceProviderTest {
+
+    private static class Pair {
+        int mItemType;
+        LocaleStore.LocaleInfo mLocaleInfo;
+
+        Pair(int itemType, LocaleStore.LocaleInfo localeInfo) {
+            mItemType = itemType;
+            mLocaleInfo = localeInfo;
+        }
+    }
+
+    private Context mContext;
+    private LocalePreferenceProvider mLocalePreferenceProvider;
+    private LogicalPreferenceGroup mPreferenceGroup;
+    // This list includes the expected values that should be returned by the SuggestedLocaleAdapter.
+    // The index i in this list represents position, the itemType represents the return value for
+    // getItemViewType given the index i, and mLocaleInfo represents the return value for getItem
+    // given the index i.
+    private List<Pair> mLocaleAdapterExpectedValues;
+    @Mock
+    private SuggestedLocaleAdapter mSuggestedLocaleAdapter;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mLocalePreferenceProvider = new LocalePreferenceProvider(mContext, mSuggestedLocaleAdapter);
+        mLocaleAdapterExpectedValues = new ArrayList<>();
+
+        // LogicalPreferenceGroup needs to be part of a PreferenceScreen in order for it to add
+        // additional preferences.
+        PreferenceScreen screen = new PreferenceManager(mContext).createPreferenceScreen(mContext);
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        screen.addPreference(mPreferenceGroup);
+    }
+
+    @Test
+    public void testPopulateBasePreference_noSubSections() {
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.US)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.UK)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.CANADA)));
+        prepareSuggestedLocaleAdapterMock();
+
+        mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, mock(
+                Preference.OnPreferenceClickListener.class));
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+    }
+
+    @Test
+    public void testPopulateBasePreference_withSubSections() {
+        mLocaleAdapterExpectedValues.add(
+                new Pair(LocalePreferenceProvider.TYPE_HEADER_SUGGESTED, null));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.US)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.FRANCE)));
+        mLocaleAdapterExpectedValues.add(
+                new Pair(LocalePreferenceProvider.TYPE_HEADER_ALL_OTHERS, null));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.UK)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.CANADA)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.KOREA)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.CHINA)));
+        prepareSuggestedLocaleAdapterMock();
+
+        mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, mock(
+                Preference.OnPreferenceClickListener.class));
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        PreferenceCategory firstCategory = (PreferenceCategory) mPreferenceGroup.getPreference(0);
+        assertThat(firstCategory.getTitle()).isEqualTo(
+                mContext.getString(R.string.language_picker_list_suggested_header));
+        assertThat(firstCategory.getPreferenceCount()).isEqualTo(2);
+
+        PreferenceCategory secondCategory = (PreferenceCategory) mPreferenceGroup.getPreference(1);
+        assertThat(secondCategory.getTitle()).isEqualTo(
+                mContext.getString(R.string.language_picker_list_all_header));
+        assertThat(secondCategory.getPreferenceCount()).isEqualTo(4);
+    }
+
+    @Test
+    public void testClickListenerTriggered() {
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.US)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.UK)));
+        mLocaleAdapterExpectedValues.add(new Pair(LocalePreferenceProvider.TYPE_LOCALE,
+                LocaleStore.getLocaleInfo(Locale.CANADA)));
+        prepareSuggestedLocaleAdapterMock();
+
+        Preference.OnPreferenceClickListener listener = mock(
+                Preference.OnPreferenceClickListener.class);
+        mLocalePreferenceProvider.populateBasePreference(mPreferenceGroup, listener);
+
+        mPreferenceGroup.getPreference(0).performClick();
+        verify(listener).onPreferenceClick(mPreferenceGroup.getPreference(0));
+        mPreferenceGroup.getPreference(1).performClick();
+        verify(listener).onPreferenceClick(mPreferenceGroup.getPreference(1));
+        mPreferenceGroup.getPreference(2).performClick();
+        verify(listener).onPreferenceClick(mPreferenceGroup.getPreference(2));
+    }
+
+    private void prepareSuggestedLocaleAdapterMock() {
+        for (int i = 0; i < mLocaleAdapterExpectedValues.size(); i++) {
+            Pair entry = mLocaleAdapterExpectedValues.get(i);
+            int itemType = entry.mItemType;
+            LocaleStore.LocaleInfo localeInfo = entry.mLocaleInfo;
+
+            when(mSuggestedLocaleAdapter.getItemViewType(i)).thenReturn(itemType);
+            when(mSuggestedLocaleAdapter.getItem(i)).thenReturn(localeInfo);
+        }
+
+        when(mSuggestedLocaleAdapter.getCount()).thenReturn(mLocaleAdapterExpectedValues.size());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/BluetoothScanningPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/BluetoothScanningPreferenceControllerTest.java
new file mode 100644
index 0000000..abb822b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/BluetoothScanningPreferenceControllerTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class BluetoothScanningPreferenceControllerTest {
+
+    private Context mContext;
+    private SwitchPreference mPreference;
+    private BluetoothScanningPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        PreferenceControllerTestHelper<BluetoothScanningPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        BluetoothScanningPreferenceController.class, mPreference);
+        mController = controllerHelper.getController();
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_BLUETOOTH_LE, /* supported= */ true);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasBluetoothFeature_available() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_BLUETOOTH_LE, /* supported= */ true);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_noBluetoothFeature_unsupported() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_BLUETOOTH_LE, /* supported= */ false);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void refreshUi_bluetoothScanningEnabled_shouldCheckPreference() {
+        mPreference.setChecked(false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 1);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_bluetoothScanningDisabled_shouldUncheckPreference() {
+        mPreference.setChecked(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void handlePreferenceChanged_preferenceChecked_shouldEnableBluetoothScanning() {
+        mPreference.callChangeListener(true);
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0)).isEqualTo(1);
+    }
+
+    @Test
+    public void handlePreferenceChanged_preferenceUnchecked_shouldDisableBluetoothScanning() {
+        mPreference.callChangeListener(false);
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 1)).isEqualTo(0);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/LocationFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/LocationFooterPreferenceControllerTest.java
new file mode 100644
index 0000000..344df59
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/LocationFooterPreferenceControllerTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.location.LocationManager;
+import android.os.Bundle;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+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.shadows.ShadowApplication;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class LocationFooterPreferenceControllerTest {
+    private static final String TEST_TEXT = "sample text";
+    private static final int TEST_RES_ID = 1024;
+
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private Resources mResources;
+
+    private PreferenceControllerTestHelper<LocationFooterPreferenceController> mControllerHelper;
+    private LocationFooterPreferenceController mController;
+    private PreferenceGroup mGroup;
+    private List<ResolveInfo> mResolveInfos;
+
+    @Before
+    public void setUp() throws PackageManager.NameNotFoundException {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        mGroup = new LogicalPreferenceGroup(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                LocationFooterPreferenceController.class, mGroup);
+        mController = mControllerHelper.getController();
+        mController.setPackageManager(mPackageManager);
+
+        mResolveInfos = new ArrayList<>();
+        when(mPackageManager.queryBroadcastReceivers(any(Intent.class), anyInt()))
+                .thenReturn(mResolveInfos);
+        when(mPackageManager.getResourcesForApplication(any(ApplicationInfo.class)))
+                .thenReturn(mResources);
+        when(mResources.getString(TEST_RES_ID)).thenReturn(TEST_TEXT);
+    }
+
+    // Visibility Tests.
+    @Test
+    public void footer_isVisibleWhenThereAreValidInjections() {
+        mResolveInfos.add(
+                getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ true));
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mGroup.isVisible()).isTrue();
+    }
+
+    @Test
+    public void footer_isHiddenWhenThereAreNoValidInjections_notSystemApp() {
+        mResolveInfos.add(
+                getTestResolveInfo(/* isSystemApp= */ false, /* hasRequiredMetadata= */ true));
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void footer_isHiddenWhenThereAreNoValidInjections_noMetaData() {
+        mResolveInfos.add(
+                getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ false));
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mGroup.isVisible()).isFalse();
+    }
+
+    // Correctness Tests.
+    @Test
+    public void onCreate_addsInjectedFooterToGroup() {
+        int numFooters = 3;
+        for (int i = 0; i < numFooters; i++) {
+            mResolveInfos.add(
+                    getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ true));
+        }
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(numFooters);
+    }
+
+    @Test
+    public void onCreate_injectedFooterHasCorrectText() {
+        mResolveInfos.add(
+                getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ true));
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mGroup.getPreference(0).getSummary()).isEqualTo(TEST_TEXT);
+    }
+
+    // Broadcast Tests.
+    @Test
+    public void onCreate_broadcastsFooterDisplayedIntentForValidInjections() {
+        ResolveInfo testResolveInfo =
+                getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ true);
+        mResolveInfos.add(testResolveInfo);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired).hasSize(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(
+                LocationManager.SETTINGS_FOOTER_DISPLAYED_ACTION);
+        assertThat(intentFired.getComponent()).isEqualTo(testResolveInfo
+                .getComponentInfo().getComponentName());
+    }
+
+    @Test
+    public void onCreate_doesNotBroadcastFooterDisplayedIntentIfNoValidInjections() {
+        mResolveInfos.add(
+                getTestResolveInfo(/* isSystemApp= */ false, /* hasRequiredMetadata= */ true));
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired).isEmpty();
+    }
+
+    @Test
+    public void onStop_broadcastsFooterRemovedIntent() {
+        mResolveInfos.add(
+                getTestResolveInfo(/* isSystemApp= */ true, /* hasRequiredMetadata= */ true));
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired).hasSize(2);
+        Intent intentFired = intentsFired.get(1);
+        assertThat(intentFired.getAction()).isEqualTo(
+                LocationManager.SETTINGS_FOOTER_REMOVED_ACTION);
+    }
+
+    /**
+     * Returns a ResolveInfo object for testing.
+     *
+     * <p>Injections are only valid if they are both a system app, and have the required METADATA.
+     *
+     * @param isSystemApp         true if the application is a system app.
+     * @param hasRequiredMetaData true if the broadcast receiver has a valid value for
+     *                            {@link LocationManager#METADATA_SETTINGS_FOOTER_STRING}
+     */
+    private ResolveInfo getTestResolveInfo(boolean isSystemApp, boolean hasRequiredMetaData) {
+        ResolveInfo testResolveInfo = new ResolveInfo();
+        ApplicationInfo testAppInfo = new ApplicationInfo();
+        if (isSystemApp) {
+            testAppInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+        }
+        ActivityInfo testActivityInfo = new ActivityInfo();
+        testActivityInfo.name = "TestActivityName";
+        testActivityInfo.packageName = "TestPackageName";
+        testActivityInfo.applicationInfo = testAppInfo;
+        if (hasRequiredMetaData) {
+            testActivityInfo.metaData = new Bundle();
+            testActivityInfo.metaData.putInt(
+                    LocationManager.METADATA_SETTINGS_FOOTER_STRING, TEST_RES_ID);
+        }
+        testResolveInfo.activityInfo = testActivityInfo;
+        return testResolveInfo;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/LocationScanningPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/LocationScanningPreferenceControllerTest.java
new file mode 100644
index 0000000..15a9716
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/LocationScanningPreferenceControllerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowPackageManager;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class LocationScanningPreferenceControllerTest {
+
+    private ShadowPackageManager mShadowPackageManager;
+    private LocationScanningPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        PreferenceControllerTestHelper<LocationScanningPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(context,
+                        LocationScanningPreferenceController.class, new Preference(context));
+        mController = controllerHelper.getController();
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mShadowPackageManager = Shadows.shadowOf(context.getPackageManager());
+    }
+
+    @Test
+    public void getAvailabilityStatus_available_wifiOrBluetooth() {
+        mShadowPackageManager.setSystemFeature(PackageManager.FEATURE_WIFI, /* supported= */ true);
+        mShadowPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE,
+                /* supported= */ false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+
+        mShadowPackageManager.setSystemFeature(PackageManager.FEATURE_WIFI, /* supported= */ false);
+        mShadowPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE,
+                /* supported= */ true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_notAvailable_noWifiNoBluetooth() {
+        mShadowPackageManager.setSystemFeature(PackageManager.FEATURE_WIFI, /* supported= */ false);
+        mShadowPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE,
+                /* supported= */ false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/LocationServicesPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/LocationServicesPreferenceControllerTest.java
new file mode 100644
index 0000000..65e8527
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/LocationServicesPreferenceControllerTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+import android.location.SettingInjectorService;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.location.SettingsInjector;
+
+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 java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class LocationServicesPreferenceControllerTest {
+
+    private static final int PROFILE_ID = UserHandle.USER_CURRENT;
+
+    @Mock
+    private SettingsInjector mSettingsInjector;
+    private Context mContext;
+    private PreferenceControllerTestHelper<LocationServicesPreferenceController> mControllerHelper;
+    private LocationServicesPreferenceController mController;
+    private PreferenceGroup mCategory;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mCategory = new PreferenceCategory(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                LocationServicesPreferenceController.class, mCategory);
+        mController = mControllerHelper.getController();
+        mController.setSettingsInjector(mSettingsInjector);
+    }
+
+    @Test
+    public void onCreate_addsInjectedSettingsToPreferenceCategory() {
+        Map<Integer, List<Preference>> samplePrefs = getSamplePreferences();
+        doReturn(samplePrefs).when(mSettingsInjector)
+                .getInjectedSettings(any(Context.class), anyInt());
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mCategory.getPreferenceCount()).isEqualTo(samplePrefs.get(PROFILE_ID).size());
+    }
+
+    @Test
+    public void onStart_registersBroadcastReceiver() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mContext.sendBroadcast(new Intent(SettingInjectorService.ACTION_INJECTED_SETTING_CHANGED));
+        verify(mSettingsInjector).reloadStatusMessages();
+    }
+
+    @Test
+    public void onStop_unregistersBroadcastReceiver() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mContext.sendBroadcast(new Intent(SettingInjectorService.ACTION_INJECTED_SETTING_CHANGED));
+        verify(mSettingsInjector).reloadStatusMessages();
+
+        clearInvocations(mSettingsInjector);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+        mContext.sendBroadcast(new Intent(SettingInjectorService.ACTION_INJECTED_SETTING_CHANGED));
+        verify(mSettingsInjector, never()).reloadStatusMessages();
+    }
+
+    @Test
+    public void preferenceCategory_isVisibleIfThereAreInjectedSettings() {
+        doReturn(getSamplePreferences()).when(mSettingsInjector)
+                .getInjectedSettings(any(Context.class), anyInt());
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mCategory.isVisible()).isTrue();
+    }
+
+    @Test
+    public void preferenceCategory_isHiddenIfThereAreNoInjectedSettings() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mCategory.isVisible()).isFalse();
+    }
+
+    private Map<Integer, List<Preference>> getSamplePreferences() {
+        Map<Integer, List<Preference>> preferences = new ArrayMap<>();
+        preferences.put(PROFILE_ID,
+                Arrays.asList(new Preference(mContext), new Preference(mContext),
+                        new Preference(mContext)));
+        return preferences;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/LocationSettingsFragmentTest.java b/tests/robotests/src/com/android/car/settings/location/LocationSettingsFragmentTest.java
new file mode 100644
index 0000000..3739852
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/LocationSettingsFragmentTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Service;
+import android.content.Intent;
+import android.location.LocationManager;
+import android.widget.Switch;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowLocationManager;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowLocationManager.class})
+public class LocationSettingsFragmentTest {
+    private BaseTestActivity mActivity;
+    private LocationManager mLocationManager;
+    private Switch mLocationSwitch;
+
+    @Before
+    public void setUp() {
+        mLocationManager = (LocationManager) RuntimeEnvironment.application
+                .getSystemService(Service.LOCATION_SERVICE);
+
+        mActivity = Robolectric.setupActivity(BaseTestActivity.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void locationSwitch_toggle_shouldBroadcastLocationModeChangedIntent() {
+        initFragment();
+        mLocationSwitch.setChecked(!mLocationSwitch.isChecked());
+
+        List<Intent> intentsFired = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(intentsFired).hasSize(1);
+        Intent intentFired = intentsFired.get(0);
+        assertThat(intentFired.getAction()).isEqualTo(LocationManager.MODE_CHANGED_ACTION);
+    }
+
+    @Test
+    public void locationSwitch_checked_enablesLocation() {
+        initFragment();
+        mLocationSwitch.setChecked(true);
+
+        assertThat(mLocationManager.isLocationEnabled()).isTrue();
+    }
+
+    @Test
+    public void locationSwitch_unchecked_disablesLocation() {
+        initFragment();
+        mLocationSwitch.setChecked(false);
+
+        assertThat(mLocationManager.isLocationEnabled()).isFalse();
+    }
+
+    private void initFragment() {
+        mActivity.launchFragment(new LocationSettingsFragment());
+        mLocationSwitch = (Switch) mActivity.findViewById(R.id.toggle_switch);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..6888f0d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsEntryPreferenceControllerTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowLocationManager;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+import com.android.settingslib.Utils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowLocationManager.class})
+public class RecentLocationRequestsEntryPreferenceControllerTest {
+
+    private RecentLocationRequestsEntryPreferenceController mController;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        mPreference = new Preference(context);
+        PreferenceControllerTestHelper<RecentLocationRequestsEntryPreferenceController>
+                controllerHelper = new PreferenceControllerTestHelper<>(context,
+                RecentLocationRequestsEntryPreferenceController.class, mPreference);
+        mController = controllerHelper.getController();
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void refreshUi_locationOn_preferenceIsEnabled() {
+        setLocationEnabled(true);
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_locationOff_preferenceIsDisabled() {
+        setLocationEnabled(false);
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void locationModeChangedBroadcastSent_locationOff_preferenceIsDisabled() {
+        setLocationEnabled(true);
+        mController.refreshUi();
+        setLocationEnabled(false);
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void locationModeChangedBroadcastSent_locationOn_preferenceIsEnabled() {
+        setLocationEnabled(false);
+        mController.refreshUi();
+        setLocationEnabled(true);
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    private void setLocationEnabled(boolean enabled) {
+        Utils.updateLocationEnabled(RuntimeEnvironment.application, enabled, UserHandle.myUserId(),
+                Settings.Secure.LOCATION_CHANGER_SYSTEM_SETTINGS);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsPreferenceControllerTest.java
new file mode 100644
index 0000000..de03da8
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/RecentLocationRequestsPreferenceControllerTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.location.RecentLocationApps;
+
+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 java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class RecentLocationRequestsPreferenceControllerTest {
+
+    @Mock
+    private RecentLocationApps mRecentLocationApps;
+
+    private RecentLocationRequestsPreferenceController mController;
+    private PreferenceScreen mScreen;
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mScreen = new PreferenceManager(mContext).createPreferenceScreen(mContext);
+        PreferenceControllerTestHelper<RecentLocationRequestsPreferenceController>
+                controllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                RecentLocationRequestsPreferenceController.class, mScreen);
+        mController = controllerHelper.getController();
+        mController.setRecentLocationApps(mRecentLocationApps);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void refreshUi_noRecentRequests_messageDisplayed() {
+        when(mRecentLocationApps.getAppListSorted(true)).thenReturn(Collections.emptyList());
+        mController.refreshUi();
+
+        assertThat(mScreen.getPreference(0).getTitle()).isEqualTo(
+                mContext.getString(R.string.location_settings_recent_requests_empty_message));
+    }
+
+    @Test
+    public void refreshUi_someRecentRequests_preferencesAddedToScreen() {
+        List<RecentLocationApps.Request> list = Arrays.asList(
+                mock(RecentLocationApps.Request.class),
+                mock(RecentLocationApps.Request.class),
+                mock(RecentLocationApps.Request.class));
+        when(mRecentLocationApps.getAppListSorted(true)).thenReturn(list);
+        mController.refreshUi();
+
+        assertThat(mScreen.getPreferenceCount()).isEqualTo(list.size());
+    }
+
+    @Test
+    public void refreshUi_newRecentRequests_listIsUpdated() {
+        List<RecentLocationApps.Request> list1 = Arrays.asList(
+                mock(RecentLocationApps.Request.class),
+                mock(RecentLocationApps.Request.class),
+                mock(RecentLocationApps.Request.class));
+        when(mRecentLocationApps.getAppListSorted(true)).thenReturn(list1);
+
+        List<RecentLocationApps.Request> list2 = new ArrayList<>(list1);
+        list2.add(mock(RecentLocationApps.Request.class));
+
+        mController.refreshUi();
+        assertThat(mScreen.getPreferenceCount()).isEqualTo(list1.size());
+
+        when(mRecentLocationApps.getAppListSorted(true)).thenReturn(list2);
+        mController.refreshUi();
+
+        assertThat(mScreen.getPreferenceCount()).isEqualTo(list2.size());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/location/WifiScanningPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/location/WifiScanningPreferenceControllerTest.java
new file mode 100644
index 0000000..b97887d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/location/WifiScanningPreferenceControllerTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2018 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.car.settings.location;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiScanningPreferenceControllerTest {
+
+    private Context mContext;
+    private SwitchPreference mPreference;
+    private WifiScanningPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new SwitchPreference(mContext);
+        PreferenceControllerTestHelper<WifiScanningPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        WifiScanningPreferenceController.class, mPreference);
+        mController = controllerHelper.getController();
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasWifiFeature_available() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_noWifiFeature_unsupported() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ false);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void refreshUi_wifiScanningEnabled_shouldCheckPreference() {
+        mPreference.setChecked(false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_wifiScanningDisabled_shouldUncheckPreference() {
+        mPreference.setChecked(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void handlePreferenceChanged_preferenceChecked_shouldEnableWifiScanning() {
+        mPreference.callChangeListener(true);
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0)).isEqualTo(1);
+    }
+
+    @Test
+    public void handlePreferenceChanged_preferenceUnchecked_shouldDisableWifiScanning() {
+        mPreference.callChangeListener(false);
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1)).isEqualTo(0);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/AddMobileNetworkPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/AddMobileNetworkPreferenceControllerTest.java
new file mode 100644
index 0000000..14e32d0
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/AddMobileNetworkPreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.ResolveInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowEuiccManager;
+import org.robolectric.shadows.ShadowPackageManager;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AddMobileNetworkPreferenceControllerTest {
+
+    private Context mContext;
+    private AddMobileNetworkPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        PreferenceControllerTestHelper<AddMobileNetworkPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        AddMobileNetworkPreferenceController.class, new Preference(mContext));
+        mController = controllerHelper.getController();
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowPackageManager.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_euiccDisabled_isUnsupported() {
+        getShadowEuiccManager().setIsEnabled(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_euiccEnabled_intentResolves_isAvailable() {
+        getShadowEuiccManager().setIsEnabled(true);
+        getShadowPackageManager().addResolveInfoForIntent(
+                AddMobileNetworkPreferenceController.ADD_NETWORK_INTENT, new ResolveInfo());
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_euiccEnabled_intentFailsToResolve_isUnsupported() {
+        getShadowEuiccManager().setIsEnabled(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    private ShadowPackageManager getShadowPackageManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+
+    private ShadowEuiccManager getShadowEuiccManager() {
+        return Shadow.extract(mContext.getSystemService(Context.EUICC_SERVICE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..676e2db
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/MobileDataTogglePreferenceControllerTest.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.provider.Settings;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+import com.android.car.settings.testutils.ShadowTelephonyManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowContentResolver;
+import org.robolectric.shadows.ShadowDialog;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowTelephonyManager.class, ShadowSubscriptionManager.class})
+public class MobileDataTogglePreferenceControllerTest {
+
+    private static final int SUB_ID = 1;
+
+    private Context mContext;
+    private TwoStatePreference mPreference;
+    private PreferenceControllerTestHelper<MobileDataTogglePreferenceController>
+            mControllerHelper;
+    private MobileDataTogglePreferenceController mController;
+    private TelephonyManager mTelephonyManager;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                MobileDataTogglePreferenceController.class);
+        mController = mControllerHelper.getController();
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+        mTelephonyManager.setDataEnabled(false);
+
+        getShadowTelephonyManager().setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyManager);
+        mController.setSubId(SUB_ID);
+
+        mPreference = new SwitchPreference(mContext);
+        mControllerHelper.setPreference(mPreference);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowTelephonyManager.reset();
+        ShadowSubscriptionManager.reset();
+    }
+
+    @Test
+    public void onStart_singleSim_registersObserver() {
+        ShadowTelephonyManager.setSimCount(1);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Global.getUriFor(Settings.Global.MOBILE_DATA))).isNotEmpty();
+    }
+
+    @Test
+    public void onStart_multiSim_registersObserver() {
+        ShadowTelephonyManager.setSimCount(2);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + SUB_ID))).isNotEmpty();
+    }
+
+    @Test
+    public void onStop_singleSim_unregistersObserver() {
+        ShadowTelephonyManager.setSimCount(1);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Global.getUriFor(Settings.Global.MOBILE_DATA))).isEmpty();
+    }
+
+    @Test
+    public void refreshUi_isOpportunistic_isDisabled() {
+        getShadowSubscriptionManager().setActiveSubscriptionInfos(
+                createSubscriptionInfo(SUB_ID, /* isOpportunistic= */ true));
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_isNotOpportunistic_isEnabled() {
+        getShadowSubscriptionManager().setActiveSubscriptionInfos(
+                createSubscriptionInfo(SUB_ID, /* isOpportunistic= */ false));
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_dataEnabled_setChecked() {
+        mTelephonyManager.setDataEnabled(true);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_dataDisabled_setUnchecked() {
+        mTelephonyManager.setDataEnabled(false);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void handlePreferenceChanged_setFalse_isSingleSim_opensDialog() {
+        ShadowTelephonyManager.setSimCount(1);
+        mPreference.callChangeListener(false);
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class),
+                eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
+    }
+
+    @Test
+    public void handlePreferenceChanged_setFalse_isMultiSim_disablesData() {
+        mPreference.setChecked(true);
+        mTelephonyManager.setDataEnabled(true);
+        ShadowTelephonyManager.setSimCount(2);
+        mPreference.callChangeListener(false);
+
+        assertThat(mTelephonyManager.isDataEnabled()).isFalse();
+    }
+
+    @Test
+    public void handlePreferenceChanged_setFalse_isMultiSim_setsUnchecked() {
+        mPreference.setChecked(true);
+        mTelephonyManager.setDataEnabled(true);
+        ShadowTelephonyManager.setSimCount(2);
+        mPreference.callChangeListener(false);
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void handlePreferenceChanged_setTrue_isSingleSim_enablesData() {
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataEnabled(false);
+        ShadowTelephonyManager.setSimCount(1);
+        mPreference.callChangeListener(true);
+
+        assertThat(mTelephonyManager.isDataEnabled()).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceChanged_setTrue_isSingleSim_setsChecked() {
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataEnabled(false);
+        ShadowTelephonyManager.setSimCount(1);
+        mPreference.callChangeListener(true);
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceChanged_setTrue_isMultiSim_noOtherSimActive_enablesData() {
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataEnabled(false);
+        ShadowTelephonyManager.setSimCount(2);
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
+        getShadowSubscriptionManager().setCurrentActiveSubscriptionId(SUB_ID);
+        mPreference.callChangeListener(true);
+
+        assertThat(mTelephonyManager.isDataEnabled()).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceChanged_setTrue_isMultiSim_noOtherSimActive_setsChecked() {
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataEnabled(false);
+        ShadowTelephonyManager.setSimCount(2);
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
+        getShadowSubscriptionManager().setCurrentActiveSubscriptionId(SUB_ID);
+        mPreference.callChangeListener(true);
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceChanged_setTrue_isMultiSim_otherSimActive_opensDialog() {
+        int otherSubId = SUB_ID + 1;
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataEnabled(false);
+        ShadowTelephonyManager.setSimCount(2);
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(otherSubId);
+        getShadowSubscriptionManager().setCurrentActiveSubscriptionId(otherSubId);
+        mPreference.callChangeListener(true);
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class),
+                eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
+    }
+
+    @Test
+    public void disableSingleSimDialog_onConfirm_disablesData() {
+        mPreference.setChecked(true);
+        mTelephonyManager.setDataEnabled(true);
+        ShadowTelephonyManager.setSimCount(1);
+        mPreference.callChangeListener(false);
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                dialogCaptor.capture(),
+                eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
+
+        ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+        assertThat(dialogCaptor).isNotNull();
+        AlertDialog alertDialog = showDialog(dialog);
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(mTelephonyManager.isDataEnabled()).isFalse();
+    }
+
+    @Test
+    public void disableSingleSimDialog_onConfirm_setsUnchecked() {
+        mPreference.setChecked(true);
+        mTelephonyManager.setDataEnabled(true);
+        ShadowTelephonyManager.setSimCount(1);
+        mPreference.callChangeListener(false);
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                dialogCaptor.capture(),
+                eq(MobileDataTogglePreferenceController.DISABLE_DIALOG_TAG));
+
+        ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+        assertThat(dialogCaptor).isNotNull();
+        AlertDialog alertDialog = showDialog(dialog);
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void enableMutliSimDialog_onConfirm_enablesData() {
+        int otherSubId = SUB_ID + 1;
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataEnabled(false);
+        ShadowTelephonyManager.setSimCount(2);
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(otherSubId);
+        getShadowSubscriptionManager().setCurrentActiveSubscriptionId(otherSubId);
+        mPreference.callChangeListener(true);
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                dialogCaptor.capture(),
+                eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
+
+        ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+        assertThat(dialogCaptor).isNotNull();
+        AlertDialog alertDialog = showDialog(dialog);
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(mTelephonyManager.isDataEnabled()).isTrue();
+    }
+
+    @Test
+    public void enableMutliSimDialog_onConfirm_setsChecked() {
+        int otherSubId = SUB_ID + 1;
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataEnabled(false);
+        ShadowTelephonyManager.setSimCount(2);
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(otherSubId);
+        getShadowSubscriptionManager().setCurrentActiveSubscriptionId(otherSubId);
+        mPreference.callChangeListener(true);
+
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                dialogCaptor.capture(),
+                eq(MobileDataTogglePreferenceController.ENABLE_MULTISIM_DIALOG_TAG));
+
+        ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+        assertThat(dialogCaptor).isNotNull();
+        AlertDialog alertDialog = showDialog(dialog);
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    private ShadowTelephonyManager getShadowTelephonyManager() {
+        return (ShadowTelephonyManager) Shadows.shadowOf(mTelephonyManager);
+    }
+
+    private ShadowContentResolver getShadowContentResolver() {
+        return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
+    }
+
+    private SubscriptionInfo createSubscriptionInfo(int subId, boolean isOpportunistic) {
+        SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
+                /* simSlotIndex= */ 0, /* displayName= */ "", /* carrierName= */ "",
+                /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+                /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
+                /* countryIso= */ "", /* isEmbedded= */ false,
+                /* accessRules= */ null, /* cardString= */ "", isOpportunistic,
+                /* groupUUID= */ null, /* carrierId= */ 0, /* profileClass= */ 0);
+        return subInfo;
+    }
+
+    private AlertDialog showDialog(ConfirmationDialogFragment dialog) {
+        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
+        activity.showDialog(dialog, /* tag= */ null);
+        return (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..917a41f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkEntryPreferenceControllerTest.java
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.shadow.api.Shadow.extract;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.net.ConnectivityManager;
+import android.net.NetworkCapabilities;
+import android.os.UserManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowConnectivityManager;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+import com.android.car.settings.testutils.ShadowTelephonyManager;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowNetwork;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowConnectivityManager.class,
+        ShadowTelephonyManager.class, ShadowSubscriptionManager.class})
+public class MobileNetworkEntryPreferenceControllerTest {
+
+    private static final String TEST_NETWORK_NAME = "test network name";
+    private static final UserInfo TEST_ADMIN_USER = new UserInfo(10, "test_name",
+            UserInfo.FLAG_ADMIN);
+    private static final UserInfo TEST_NON_ADMIN_USER = new UserInfo(10, "test_name",
+            /* flags= */ 0);
+
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<MobileNetworkEntryPreferenceController>
+            mControllerHelper;
+    private MobileNetworkEntryPreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private NetworkCapabilities mNetworkCapabilities;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                MobileNetworkEntryPreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+
+        // Setup to always make preference available.
+        getShadowConnectivityManager().clearAllNetworks();
+        getShadowConnectivityManager().addNetworkCapabilities(
+                ShadowNetwork.newInstance(ConnectivityManager.TYPE_MOBILE), mNetworkCapabilities);
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                true);
+        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_ADMIN_USER);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(false);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowConnectivityManager.reset();
+        ShadowTelephonyManager.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_noMobileNetwork_unsupported() {
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_notAdmin_disabledForUser() {
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                true);
+        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_NON_ADMIN_USER);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasRestriction_disabledForUser() {
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                true);
+        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_ADMIN_USER);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_hasMobileNetwork_isAdmin_noRestriction_available() {
+        when(mNetworkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(
+                true);
+        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_ADMIN_USER);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void refreshUi_noSims_disabled() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_oneSim_enabled() {
+        SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_oneSim_summaryIsDisplayName() {
+        SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_NETWORK_NAME);
+    }
+
+    @Test
+    public void refreshUi_multiSim_enabled() {
+        SubscriptionInfo info1 = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
+        SubscriptionInfo info2 = createSubscriptionInfo(/* subId= */ 2,
+                /* simSlotIndex= */ 2, TEST_NETWORK_NAME);
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info1, info2);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_multiSim_summaryShowsCount() {
+        SubscriptionInfo info1 = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
+        SubscriptionInfo info2 = createSubscriptionInfo(/* subId= */ 2,
+                /* simSlotIndex= */ 2, TEST_NETWORK_NAME);
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info1, info2);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(mContext.getResources().getQuantityString(
+                R.plurals.mobile_network_summary_count, 2, 2));
+    }
+
+    @Test
+    public void performClick_noSim_noFragmentStarted() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mPreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController(), never()).launchFragment(
+                any(Fragment.class));
+    }
+
+    @Test
+    public void performClick_oneSim_startsMobileNetworkFragment() {
+        int subId = 1;
+        SubscriptionInfo info = createSubscriptionInfo(subId, /* simSlotIndex= */ 1,
+                TEST_NETWORK_NAME);
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mPreference.performClick();
+
+        ArgumentCaptor<MobileNetworkFragment> captor = ArgumentCaptor.forClass(
+                MobileNetworkFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(captor.capture());
+
+        assertThat(captor.getValue().getArguments().getInt(MobileNetworkFragment.ARG_NETWORK_SUB_ID,
+                -1)).isEqualTo(subId);
+    }
+
+    @Test
+    public void performClick_multiSim_startsMobileNetworkListFragment() {
+        SubscriptionInfo info1 = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, TEST_NETWORK_NAME);
+        SubscriptionInfo info2 = createSubscriptionInfo(/* subId= */ 2,
+                /* simSlotIndex= */ 2, TEST_NETWORK_NAME);
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info1, info2);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mPreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(
+                any(MobileNetworkListFragment.class));
+    }
+
+    private ShadowTelephonyManager getShadowTelephonyManager() {
+        return (ShadowTelephonyManager) extract(mContext.getSystemService(TelephonyManager.class));
+    }
+
+    private ShadowConnectivityManager getShadowConnectivityManager() {
+        return (ShadowConnectivityManager) extract(
+                mContext.getSystemService(ConnectivityManager.class));
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
+    }
+
+    private SubscriptionInfo createSubscriptionInfo(int subId, int simSlotIndex,
+            String displayName) {
+        SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
+                simSlotIndex, displayName, /* carrierName= */ "",
+                /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+                /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", "mncString",
+                /* countryIso= */ "", /* isEmbedded= */ false,
+                /* accessRules= */ null, /* cardString= */ "");
+        return subInfo;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkFragmentTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
new file mode 100644
index 0000000..aee5ac6
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkFragmentTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.widget.TextView;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.Collections;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSubscriptionManager.class})
+public class MobileNetworkFragmentTest {
+
+    private static final int SUB_ID = 1;
+    private static final String TEST_NAME = "Test Name";
+
+    private Context mContext;
+    private FragmentController<MobileNetworkFragment> mFragmentController;
+    private MobileNetworkFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSubscriptionManager.reset();
+    }
+
+    @Test
+    public void onMobileNetworkUpdated_startWithArgument_updateTitle() {
+        setUpFragmentWithSubId(SUB_ID, TEST_NAME);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(
+                Collections.singletonList(createSubscriptionInfo(SUB_ID, TEST_NAME)));
+        getShadowSubscriptionManager().setActiveSubscriptionInfos(
+                createSubscriptionInfo(SUB_ID + 1, TEST_NAME + "_1"),
+                createSubscriptionInfo(SUB_ID + 2, TEST_NAME + "_2"));
+        mFragmentController.setup();
+
+        TextView textView = mFragment.requireActivity().findViewById(R.id.title);
+        assertThat(textView.getText()).isEqualTo(TEST_NAME);
+    }
+
+    @Test
+    public void onMobileNetworkUpdated_noArgumentProvided_updateTitle() {
+        mFragment = new MobileNetworkFragment();
+        mFragmentController = FragmentController.of(mFragment);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(
+                Collections.singletonList(createSubscriptionInfo(SUB_ID, TEST_NAME)));
+        getShadowSubscriptionManager().setActiveSubscriptionInfos(
+                createSubscriptionInfo(SUB_ID + 1, TEST_NAME + "_1"),
+                createSubscriptionInfo(SUB_ID + 2, TEST_NAME + "_2"));
+        mFragmentController.setup();
+
+        TextView textView = mFragment.requireActivity().findViewById(R.id.title);
+        assertThat(textView.getText()).isEqualTo(TEST_NAME + "_1");
+    }
+
+    private void setUpFragmentWithSubId(int subId, String name) {
+        SubscriptionInfo info = createSubscriptionInfo(subId, name);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(
+                Collections.singletonList(info));
+
+        mFragment = MobileNetworkFragment.newInstance(subId);
+        mFragmentController = FragmentController.of(mFragment);
+    }
+
+    private SubscriptionInfo createSubscriptionInfo(int subId, String name) {
+        SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
+                /* simSlotIndex= */ 0, /* displayName= */ name, /* carrierName= */ "",
+                /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+                /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
+                /* countryIso= */ "", /* isEmbedded= */ false,
+                /* accessRules= */ null, /* cardString= */ "");
+        return subInfo;
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkListPreferenceControllerTest.java
new file mode 100644
index 0000000..34b8d5c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkListPreferenceControllerTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSubscriptionManager.class})
+public class MobileNetworkListPreferenceControllerTest {
+
+    private static final int SUB_ID = 1;
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<MobileNetworkListPreferenceController> mControllerHelper;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                MobileNetworkListPreferenceController.class, mPreferenceGroup);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSubscriptionManager.reset();
+    }
+
+    @Test
+    public void refreshUi_containsElements() {
+        SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, /* cardString= */"", "mncString");
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void onPreferenceClicked_launchesFragment() {
+        SubscriptionInfo info = createSubscriptionInfo(SUB_ID, /* simSlotIndex= */ 1,
+                /* cardString= */"", "mncString");
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(selectable);
+
+        mControllerHelper.getController().refreshUi();
+        Preference preference = mPreferenceGroup.getPreference(0);
+        preference.performClick();
+
+        ArgumentCaptor<MobileNetworkFragment> captor = ArgumentCaptor.forClass(
+                MobileNetworkFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(captor.capture());
+
+        assertThat(captor.getValue().getArguments().getInt(MobileNetworkFragment.ARG_NETWORK_SUB_ID,
+                -1)).isEqualTo(SUB_ID);
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
+    }
+
+    private SubscriptionInfo createSubscriptionInfo(int subId, int simSlotIndex,
+            String cardString, String mncString) {
+        SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
+                simSlotIndex, /* displayName= */ "", /* carrierName= */ "",
+                /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+                /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", mncString,
+                /* countryIso= */ "", /* isEmbedded= */ false,
+                /* accessRules= */ null, cardString);
+        return subInfo;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java b/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
new file mode 100644
index 0000000..a495de2
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/MobileNetworkUpdateManagerTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+import com.android.internal.telephony.TelephonyIntents;
+
+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.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.Collections;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSubscriptionManager.class})
+public class MobileNetworkUpdateManagerTest {
+
+    private static final int SUB_ID = 1;
+
+    private Context mContext;
+    private ActivityController<BaseTestActivity> mActivityController;
+    private BaseTestActivity mActivity;
+    private MobileNetworkUpdateManager mMobileNetworkUpdateManager;
+
+    @Mock
+    private MobileNetworkUpdateManager.MobileNetworkUpdateListener mMobileNetworkUpdateListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mActivity = new BaseTestActivity();
+        mActivityController = ActivityController.of(mActivity);
+    }
+
+    @Test
+    public void onStart_receiverRegistered() {
+        setupMobileNetworkUpdateManager(SUB_ID);
+        mActivityController.create().start().visible();
+
+        assertThat(ShadowApplication.getInstance().getRegisteredReceivers().size()).isGreaterThan(
+                0);
+
+        boolean hasMatch = false;
+        for (ShadowApplication.Wrapper wrapper :
+                ShadowApplication.getInstance().getRegisteredReceivers()) {
+            if (wrapper.getIntentFilter().getAction(0)
+                    == TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED) {
+                hasMatch = true;
+            }
+        }
+        assertThat(hasMatch).isTrue();
+    }
+
+    @Test
+    public void onStop_receiverUnregistered() {
+        setupMobileNetworkUpdateManager(SUB_ID);
+        mActivityController.create().start().visible();
+        int prevSize = ShadowApplication.getInstance().getRegisteredReceivers().size();
+
+        mActivityController.stop();
+        assertThat(ShadowApplication.getInstance().getRegisteredReceivers().size()).isLessThan(
+                prevSize);
+
+        boolean hasMatch = false;
+        for (ShadowApplication.Wrapper wrapper :
+                ShadowApplication.getInstance().getRegisteredReceivers()) {
+            if (wrapper.getIntentFilter().getAction(0)
+                    == TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED) {
+                hasMatch = true;
+            }
+        }
+        assertThat(hasMatch).isFalse();
+    }
+
+    @Test
+    public void onStart_subscriptionListenerRegistered() {
+        setupMobileNetworkUpdateManager(SUB_ID);
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
+        mActivityController.create().start().visible();
+
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isNotEmpty();
+    }
+
+    @Test
+    public void onStop_subscriptionListenerUnregistered() {
+        setupMobileNetworkUpdateManager(SUB_ID);
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
+        mActivityController.create().start().visible();
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isNotEmpty();
+        mActivityController.stop();
+
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
+    }
+
+    @Test
+    public void onMobileNetworkUpdated_withInitialSubId_pickSubId() {
+        setupMobileNetworkUpdateManager(SUB_ID);
+        getShadowSubscriptionManager().setActiveSubscriptionInfos(
+                createSubscriptionInfo(SUB_ID + 1), createSubscriptionInfo(SUB_ID + 2));
+        mActivityController.setup();
+
+        verify(mMobileNetworkUpdateListener).onMobileNetworkUpdated(SUB_ID);
+    }
+
+    @Test
+    public void onMobileNetworkUpdated_withoutInitialSubId_pickDefaultSubId() {
+        setupMobileNetworkUpdateManager(MobileNetworkUpdateManager.SUB_ID_NULL);
+        getShadowSubscriptionManager().setActiveSubscriptionInfos(
+                createSubscriptionInfo(SUB_ID + 1), createSubscriptionInfo(SUB_ID + 2));
+        mActivityController.setup();
+
+        verify(mMobileNetworkUpdateListener).onMobileNetworkUpdated(SUB_ID + 1);
+    }
+
+    private void setupMobileNetworkUpdateManager(int subId) {
+        mMobileNetworkUpdateManager = new MobileNetworkUpdateManager(mContext, subId);
+        mActivity.getLifecycle().addObserver(mMobileNetworkUpdateManager);
+        mMobileNetworkUpdateManager.registerListener(mMobileNetworkUpdateListener);
+
+        getShadowSubscriptionManager().setSelectableSubscriptionInfoList(
+                Collections.singletonList(createSubscriptionInfo(subId)));
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
+    }
+
+    private SubscriptionInfo createSubscriptionInfo(int subId) {
+        SubscriptionInfo subInfo = new SubscriptionInfo(/* id= */ subId, /* iccId= */ "",
+                /* simSlotIndex= */ 0, /* displayName= */ "", /* carrierName= */ "",
+                /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+                /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", /* mnc= */ "",
+                /* countryIso= */ "", /* isEmbedded= */ false,
+                /* accessRules= */ null, /* cardString= */ "");
+        return subInfo;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java b/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java
new file mode 100644
index 0000000..99687b9
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/NetworkUtilsTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.telephony.TelephonyManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class NetworkUtilsTest {
+
+    @Test
+    public void hasMobileNetwork_hasCellularCapabilities_returnsTrue() {
+        ConnectivityManager connectivityManager = mock(ConnectivityManager.class);
+        Network network = mock(Network.class);
+        NetworkCapabilities capabilities = mock(NetworkCapabilities.class);
+
+        when(connectivityManager.getAllNetworks()).thenReturn(new Network[]{network});
+        when(connectivityManager.getNetworkCapabilities(network)).thenReturn(capabilities);
+        when(capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(true);
+
+        assertThat(NetworkUtils.hasMobileNetwork(connectivityManager)).isTrue();
+    }
+
+    @Test
+    public void hasMobileNetwork_hasNoCellularCapabilities_returnsFalse() {
+        ConnectivityManager connectivityManager = mock(ConnectivityManager.class);
+        Network network = mock(Network.class);
+        NetworkCapabilities capabilities = mock(NetworkCapabilities.class);
+
+        when(connectivityManager.getAllNetworks()).thenReturn(new Network[]{network});
+        when(connectivityManager.getNetworkCapabilities(network)).thenReturn(capabilities);
+        when(capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)).thenReturn(false);
+
+        assertThat(NetworkUtils.hasMobileNetwork(connectivityManager)).isFalse();
+    }
+
+    @Test
+    public void hasSim_simAbsent_returnsFalse() {
+        TelephonyManager telephonyManager = mock(TelephonyManager.class);
+        when(telephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_ABSENT);
+
+        assertThat(NetworkUtils.hasSim(telephonyManager)).isFalse();
+    }
+
+    @Test
+    public void hasSim_simUnknown_returnsFalse() {
+        TelephonyManager telephonyManager = mock(TelephonyManager.class);
+        when(telephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_UNKNOWN);
+
+        assertThat(NetworkUtils.hasSim(telephonyManager)).isFalse();
+    }
+
+    @Test
+    public void hasSim_otherStatus_returnsTrue() {
+        TelephonyManager telephonyManager = mock(TelephonyManager.class);
+        when(telephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_LOADED);
+
+        assertThat(NetworkUtils.hasSim(telephonyManager)).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
new file mode 100644
index 0000000..414c93e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/RoamingPreferenceControllerTest.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.PersistableBundle;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowCarrierConfigManager;
+import com.android.car.settings.testutils.ShadowTelephonyManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowContentResolver;
+import org.robolectric.shadows.ShadowDialog;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowTelephonyManager.class, ShadowCarrierConfigManager.class})
+public class RoamingPreferenceControllerTest {
+
+    private static final int SUB_ID = 1;
+
+    private Context mContext;
+    private TwoStatePreference mPreference;
+    private PreferenceControllerTestHelper<RoamingPreferenceController> mControllerHelper;
+    private RoamingPreferenceController mController;
+    private TelephonyManager mTelephonyManager;
+    private CarrierConfigManager mCarrierConfigManager;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                RoamingPreferenceController.class);
+        mController = mControllerHelper.getController();
+        mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+        getShadowTelephonyManager().setTelephonyManagerForSubscriptionId(SUB_ID, mTelephonyManager);
+        mController.setSubId(SUB_ID);
+
+        mPreference = new SwitchPreference(mContext);
+        mControllerHelper.setPreference(mPreference);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowTelephonyManager.reset();
+    }
+
+    @Test
+    public void onStart_registerObserver() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Global.getUriFor(Settings.Global.DATA_ROAMING))).isNotEmpty();
+    }
+
+    @Test
+    public void onStart_registerObserver_additionalSubId() {
+        ShadowTelephonyManager.setSimCount(2);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Global.getUriFor(Settings.Global.DATA_ROAMING + SUB_ID))).isNotEmpty();
+    }
+
+    @Test
+    public void onStop_unregisterObserver() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(getShadowContentResolver().getContentObservers(
+                Settings.Global.getUriFor(Settings.Global.DATA_ROAMING))).isEmpty();
+    }
+
+    @Test
+    public void refreshUi_invalidSubId_isDisabled() {
+        getShadowTelephonyManager().setTelephonyManagerForSubscriptionId(
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID, mTelephonyManager);
+        mController.setSubId(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_validSubId_isEnabled() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_roamingEnabled_setChecked() {
+        mTelephonyManager.setDataRoamingEnabled(true);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_roamingDisabled_setUnchecked() {
+        mTelephonyManager.setDataRoamingEnabled(false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.refreshUi();
+
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void callChangeListener_toggleFalse_turnOffRoaming() {
+        mPreference.setChecked(true);
+        mTelephonyManager.setDataRoamingEnabled(true);
+
+        mPreference.callChangeListener(false);
+
+        assertThat(mTelephonyManager.isDataRoamingEnabled()).isFalse();
+    }
+
+    @Test
+    public void callChangeListener_toggleTrue_needsDialog_showDialog() {
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataRoamingEnabled(false);
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
+        getShadowCarrierConfigManager().setConfigForSubId(SUB_ID, bundle);
+
+        mPreference.callChangeListener(true);
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class), eq(ConfirmationDialogFragment.TAG));
+    }
+
+    @Test
+    public void confirmDialog_turnOnRoaming() {
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataRoamingEnabled(false);
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
+        getShadowCarrierConfigManager().setConfigForSubId(SUB_ID, bundle);
+
+        mPreference.callChangeListener(true);
+
+        // Capture the dialog that is shown on toggle.
+        ArgumentCaptor<ConfirmationDialogFragment> dialogCaptor = ArgumentCaptor.forClass(
+                ConfirmationDialogFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                dialogCaptor.capture(), eq(ConfirmationDialogFragment.TAG));
+
+        // Show the captured dialog on press the confirmation button.
+        ConfirmationDialogFragment dialog = dialogCaptor.getValue();
+        assertThat(dialogCaptor).isNotNull();
+        AlertDialog alertDialog = showDialog(dialog);
+        alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        assertThat(mTelephonyManager.isDataRoamingEnabled()).isTrue();
+    }
+
+    @Test
+    public void callChangeListener_toggleTrue_doesntNeedDialog_turnOnRoaming() {
+        mPreference.setChecked(false);
+        mTelephonyManager.setDataRoamingEnabled(false);
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL, true);
+        getShadowCarrierConfigManager().setConfigForSubId(SUB_ID, bundle);
+
+        mPreference.callChangeListener(true);
+
+        assertThat(mTelephonyManager.isDataRoamingEnabled()).isTrue();
+    }
+
+    private ShadowContentResolver getShadowContentResolver() {
+        return (ShadowContentResolver) Shadows.shadowOf(mContext.getContentResolver());
+    }
+
+    private ShadowTelephonyManager getShadowTelephonyManager() {
+        return (ShadowTelephonyManager) Shadows.shadowOf(mTelephonyManager);
+    }
+
+    private ShadowCarrierConfigManager getShadowCarrierConfigManager() {
+        return (ShadowCarrierConfigManager) Shadow.extract(mCarrierConfigManager);
+    }
+
+    private AlertDialog showDialog(ConfirmationDialogFragment dialog) {
+        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
+        activity.showDialog(dialog, /* tag= */ null);
+        return (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java b/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java
new file mode 100644
index 0000000..73eff14
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/SubscriptionUtilsTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.UiccSlotInfo;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import com.google.android.collect.Lists;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class SubscriptionUtilsTest {
+
+    @Test
+    public void getAvailableSubscriptions_hasSubscriptionsFromSubscriptionManager_valueReturned() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        TelephonyManager telephonyManager = mock(TelephonyManager.class);
+
+        SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, /* cardString= */"", "mncString");
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+        when(subscriptionManager.getSelectableSubscriptionInfoList()).thenReturn(selectable);
+        when(telephonyManager.getUiccSlotsInfo()).thenReturn(new UiccSlotInfo[0]);
+
+        List<SubscriptionInfo> infos = SubscriptionUtils.getAvailableSubscriptions(
+                subscriptionManager, telephonyManager);
+
+        assertThat(infos).contains(info);
+    }
+
+    @Test
+    public void getAvailableSubscriptions_hasSimSlotNotInSubscriptionManager_valueReturned() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        TelephonyManager telephonyManager = mock(TelephonyManager.class);
+
+        int simSlotIdx = 1;
+        String cardString = "testString";
+        SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1, simSlotIdx, cardString,
+                "mncString");
+        UiccSlotInfo slotInfo = createUuicSlotInfo(/* isActive= */ false, /* isEsim= */ false,
+                simSlotIdx, cardString, UiccSlotInfo.CARD_STATE_INFO_PRESENT);
+        List<SubscriptionInfo> allSims = Lists.newArrayList(info);
+        when(subscriptionManager.getAllSubscriptionInfoList()).thenReturn(allSims);
+        when(telephonyManager.getUiccSlotsInfo()).thenReturn(new UiccSlotInfo[]{slotInfo});
+
+        List<SubscriptionInfo> infos = SubscriptionUtils.getAvailableSubscriptions(
+                subscriptionManager, telephonyManager);
+
+        assertThat(infos).contains(info);
+    }
+
+    @Test
+    public void getAvailableSubscriptions_hasInactiveInsertedPSim_valueRemoved() {
+        SubscriptionManager subscriptionManager = mock(SubscriptionManager.class);
+        TelephonyManager telephonyManager = mock(TelephonyManager.class);
+
+        SubscriptionInfo info = createSubscriptionInfo(/* subId= */ 1,
+                /* simSlotIndex= */ 1, /* cardString= */"", "");
+        List<SubscriptionInfo> selectable = Lists.newArrayList(info);
+        when(subscriptionManager.getSelectableSubscriptionInfoList()).thenReturn(selectable);
+        when(telephonyManager.getUiccSlotsInfo()).thenReturn(new UiccSlotInfo[0]);
+
+        List<SubscriptionInfo> infos = SubscriptionUtils.getAvailableSubscriptions(
+                subscriptionManager, telephonyManager);
+
+        assertThat(infos).doesNotContain(info);
+    }
+
+    private SubscriptionInfo createSubscriptionInfo(int subId, int simSlotIndex,
+            String cardString, String mncString) {
+        SubscriptionInfo subInfo = new SubscriptionInfo(subId, /* iccId= */ "",
+                simSlotIndex, /* displayName= */ "", /* carrierName= */ "",
+                /* nameSource= */ 0, /* iconTint= */ 0, /* number= */ "",
+                /* roaming= */ 0, /* icon= */ null, /* mcc= */ "", mncString,
+                /* countryIso= */ "", /* isEmbedded= */ false,
+                /* accessRules= */ null, cardString);
+        return subInfo;
+    }
+
+    private UiccSlotInfo createUuicSlotInfo(boolean isActive, boolean isEsim, int simSlotIndex,
+            String cardId, int cardStateInfo) {
+        return new UiccSlotInfo(isActive, isEsim, cardId, cardStateInfo, simSlotIndex,
+                /* isExtendedApduSupported= */ false, /* isRemoveable= */ true);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java b/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
new file mode 100644
index 0000000..e907501
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/network/SubscriptionsChangeListenerTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.SubscriptionManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowSubscriptionManager;
+import com.android.internal.telephony.TelephonyIntents;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSubscriptionManager.class})
+public class SubscriptionsChangeListenerTest {
+
+    private Context mContext;
+    private SubscriptionsChangeListener mSubscriptionsChangeListener;
+    @Mock
+    private SubscriptionsChangeListener.SubscriptionsChangeAction mSubscriptionsChangeAction;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        mSubscriptionsChangeListener = new SubscriptionsChangeListener(mContext,
+                mSubscriptionsChangeAction);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSubscriptionManager.reset();
+    }
+
+    @Test
+    public void start_registersListener() {
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
+        mSubscriptionsChangeListener.start();
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isNotEmpty();
+    }
+
+    @Test
+    public void onSubscriptionChange_triggersAction() {
+        mSubscriptionsChangeListener.start();
+        // This is a way to trigger subscription change on the shadows.
+        getShadowSubscriptionManager().setActiveSubscriptionInfoList(null);
+
+        verify(mSubscriptionsChangeAction).onSubscriptionsChanged();
+    }
+
+    @Test
+    public void stop_unregistersListener() {
+        mSubscriptionsChangeListener.start();
+        mSubscriptionsChangeListener.stop();
+        assertThat(getShadowSubscriptionManager().getOnSubscriptionChangedListeners()).isEmpty();
+    }
+
+    @Test
+    public void start_registersReceiver() {
+        mSubscriptionsChangeListener.start();
+
+        boolean hasMatch = false;
+        for (ShadowApplication.Wrapper wrapper :
+                ShadowApplication.getInstance().getRegisteredReceivers()) {
+            if (wrapper.getIntentFilter().getAction(0)
+                    == TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED) {
+                hasMatch = true;
+            }
+        }
+        assertThat(hasMatch).isTrue();
+    }
+
+    @Test
+    public void onReceive_triggersAction() {
+        mSubscriptionsChangeListener.start();
+        mContext.sendBroadcast(new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED));
+
+        verify(mSubscriptionsChangeAction).onSubscriptionsChanged();
+    }
+
+    @Test
+    public void stop_unregistersReceiver() {
+        mSubscriptionsChangeListener.start();
+        mSubscriptionsChangeListener.stop();
+
+        boolean hasMatch = false;
+        for (ShadowApplication.Wrapper wrapper :
+                ShadowApplication.getInstance().getRegisteredReceivers()) {
+            if (wrapper.getIntentFilter().getAction(0)
+                    == TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED) {
+                hasMatch = true;
+            }
+        }
+        assertThat(hasMatch).isFalse();
+    }
+
+    private ShadowSubscriptionManager getShadowSubscriptionManager() {
+        return Shadow.extract(mContext.getSystemService(SubscriptionManager.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/AddTrustedDeviceActivityTest.java b/tests/robotests/src/com/android/car/settings/security/AddTrustedDeviceActivityTest.java
new file mode 100644
index 0000000..bf3c9af
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/AddTrustedDeviceActivityTest.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.car.Car;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager;
+import android.car.trust.CarTrustAgentEnrollmentManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.ShadowCar;
+import com.android.car.settings.testutils.ShadowLockPatternUtils;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+
+/**
+ * Unit tests for {@link AddTrustedDeviceActivity}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCar.class, ShadowLockPatternUtils.class})
+public class AddTrustedDeviceActivityTest {
+    private static final String ADDRESS = "00:11:22:33:AA:BB";
+    private static final String BLUETOOTH_DEVICE_KEY = "bluetoothDevice";
+    private static final String CURRENT_HANDLE_KEY = "currentHandle";
+    private Context mContext;
+    private ActivityController<AddTrustedDeviceActivity> mActivityController;
+    private AddTrustedDeviceActivity mActivity;
+    @Mock
+    private CarTrustAgentEnrollmentManager mMockCarTrustAgentEnrollmentManager;
+    @Mock
+    private CarUxRestrictionsManager mMockCarUxRestrictionsManager;
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private BluetoothDevice mBluetoothDevice;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        CarUxRestrictions noSetupRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+                CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* time= */ 0).build();
+        when(mMockCarUxRestrictionsManager.getCurrentCarUxRestrictions())
+                .thenReturn(noSetupRestrictions);
+        ShadowCar.setCarManager(Car.CAR_UX_RESTRICTION_SERVICE, mMockCarUxRestrictionsManager);
+        mContext = RuntimeEnvironment.application;
+        ShadowCar.setCarManager(Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE,
+                mMockCarTrustAgentEnrollmentManager);
+        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+        mBluetoothDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(ADDRESS);
+        mActivityController = ActivityController.of(new AddTrustedDeviceActivity());
+        mActivity = mActivityController.get();
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
+        mActivityController.create();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCar.reset();
+        ShadowLockPatternUtils.reset();
+    }
+
+    @Test
+    public void onStart_no_saveInstanceState_startAdvertising() {
+        mActivityController.start();
+        verify(mMockCarTrustAgentEnrollmentManager).startEnrollmentAdvertising();
+    }
+
+    @Test
+    public void onStart_saveInstanceState_deviceConnected_doNotStartAdvertising() {
+        // Recreate with saved state (e.g. during config change).
+        Bundle outState = new Bundle();
+        outState.putParcelable(BLUETOOTH_DEVICE_KEY, mBluetoothDevice);
+        mActivityController = ActivityController.of(new AddTrustedDeviceActivity());
+        mActivityController.setup(outState);
+        verify(mMockCarTrustAgentEnrollmentManager, never()).startEnrollmentAdvertising();
+    }
+
+    @Test
+    public void onStart_saveInstanceState_deviceNotConnected_startAdvertising() {
+        // Recreate with saved state (e.g. during config change).
+        Bundle outState = new Bundle();
+        outState.putParcelable(BLUETOOTH_DEVICE_KEY, null);
+        mActivityController = ActivityController.of(new AddTrustedDeviceActivity());
+        mActivityController.setup(outState);
+        verify(mMockCarTrustAgentEnrollmentManager).startEnrollmentAdvertising();
+    }
+
+    @Test
+    public void onStart_has_activated_handle_finish() {
+        mActivityController.start().postCreate(null).resume();
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback> callBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(callBack.capture());
+
+        callBack.getValue().onEscrowTokenAdded(1);
+        mActivityController.stop();
+
+        when(mMockCarTrustAgentEnrollmentManager.isEscrowTokenActive(1,
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(true);
+        Bundle outState = new Bundle();
+        outState.putLong(CURRENT_HANDLE_KEY, 1);
+        outState.putParcelable(BLUETOOTH_DEVICE_KEY, mBluetoothDevice);
+        mActivityController = ActivityController.of(new AddTrustedDeviceActivity());
+        mActivityController.setup(outState).start();
+
+        assertThat(mActivityController.get().isFinishing()).isTrue();
+    }
+
+    @Test
+    public void onAuthStringAvailable_createDialog() {
+        mActivityController.start().postCreate(null).resume();
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback>
+                enrollmentCallBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(
+                enrollmentCallBack.capture());
+        enrollmentCallBack.getValue().onAuthStringAvailable(mBluetoothDevice, "123");
+
+        assertThat(mActivity.findDialogByTag(ConfirmPairingCodeDialog.TAG)).isNotNull();
+    }
+
+    @Test
+    public void onLockVerified_showAddTrustedDeviceProgressFragment() {
+        mActivityController.start().postCreate(null).resume();
+
+        mActivity.launchFragment(ConfirmLockPinPasswordFragment.newPinInstance());
+        mActivity.onLockVerified("lock".getBytes());
+
+        assertThat(mActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_container))
+                .isInstanceOf(AddTrustedDeviceProgressFragment.class);
+    }
+
+    @Test
+    public void onEscrowTokenAdded_showCheckLockFragment() {
+        mActivityController.start().postCreate(null).resume();
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback> callBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(callBack.capture());
+
+        callBack.getValue().onEscrowTokenAdded(1);
+
+        assertThat(mActivityController.get().getInitialFragment()).isInstanceOf(
+                ConfirmLockPinPasswordFragment.class);
+    }
+
+    @Test
+    public void onBluetoothDeviceDisconnected_finish() {
+        mActivityController.start().postCreate(null).resume();
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback>
+                bleCallBack = ArgumentCaptor.forClass(
+                CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setBleCallback(bleCallBack.capture());
+
+        bleCallBack.getValue().onBleEnrollmentDeviceDisconnected(mBluetoothDevice);
+
+        assertThat(mActivity.isFinishing()).isTrue();
+    }
+
+    @Test
+    public void onPairingCodeDialogConfirmed_handshakeAccepted() {
+        mActivityController.start().postCreate(null).resume();
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback> bleCallBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setBleCallback(bleCallBack.capture());
+
+        bleCallBack.getValue().onBleEnrollmentDeviceConnected(mBluetoothDevice);
+        mActivity.mConfirmParingCodeListener.onConfirmPairingCode();
+        verify(mMockCarTrustAgentEnrollmentManager).enrollmentHandshakeAccepted(mBluetoothDevice);
+
+    }
+
+    @Test
+    public void onStart_onEscrowTokenActiveStateChanged_activated_finish() {
+        mActivityController.start().postCreate(null).resume();
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback> callBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(callBack.capture());
+
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback> bleCallBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setBleCallback(bleCallBack.capture());
+
+        bleCallBack.getValue().onBleEnrollmentDeviceConnected(mBluetoothDevice);
+        callBack.getValue().onEscrowTokenActiveStateChanged(1, true);
+
+        assertThat(mActivity.isFinishing()).isTrue();
+    }
+
+    @Test
+    public void configurationNotChanged_terminateEnrollmentHandshake() {
+        mActivityController.start();
+
+        mActivityController.pause();
+
+        verify(mMockCarTrustAgentEnrollmentManager).terminateEnrollmentHandshake();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/AddTrustedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/AddTrustedDevicePreferenceControllerTest.java
new file mode 100644
index 0000000..4373d13
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/AddTrustedDevicePreferenceControllerTest.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.bluetooth.BluetoothAdapter;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowLockPatternUtils;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+
+
+/**
+ * Unit tests for {@link AddTrustedDevicePreferenceController}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLockPatternUtils.class, ShadowBluetoothAdapter.class,
+        ShadowCarUserManagerHelper.class})
+public class AddTrustedDevicePreferenceControllerTest {
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<AddTrustedDevicePreferenceController>
+            mPreferenceControllerHelper;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private Preference mPreference;
+    private AddTrustedDevicePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mPreference = new Preference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                AddTrustedDevicePreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowLockPatternUtils.reset();
+        ShadowBluetoothAdapter.reset();
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void refreshUi_hasPassword_preferenceEnabled() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(false);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_noPassword_preferenceDisabled() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(false);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_bluetoothAdapterEnabled_setsEmptySummary() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(false);
+        BluetoothAdapter.getDefaultAdapter().enable();
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary().toString()).isEmpty();
+    }
+
+    @Test
+    public void refreshUi_bluetoothAdapterDisabled_setsTurnOnToAddSummary() {
+        BluetoothAdapter.getDefaultAdapter().disable();
+
+        mController.refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.add_device_summary));
+    }
+
+    @Test
+    public void onPreferenceClicked_hasPassword_enableBluetooth() {
+        BluetoothAdapter.getDefaultAdapter().disable();
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        mController.refreshUi();
+
+        mPreference.performClick();
+
+        assertThat(BluetoothAdapter.getDefaultAdapter().isEnabled()).isTrue();
+    }
+
+    @Test
+    public void getAvailabilityStatus_bluetoothNotAvailable_unsupportedOnDevice() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_disallowBluetoothUserRestriction_disabledForUser() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_disallowConfigBluetoothUserRestriction_disabledForUser() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_CONFIG_BLUETOOTH)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_available() {
+        Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+        // No user restrictions.
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java b/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java
index 295c040..db8bf9c 100644
--- a/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/ChooseLockPatternFragmentTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.Mockito.verify;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.FragmentController;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -36,7 +37,7 @@
 
     @Before
     public void initFragment() {
-        mFragment = new ChooseLockPatternFragment();
+        mFragment = FragmentController.of(new ChooseLockPatternFragment()).setup();
     }
 
     /**
diff --git a/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java b/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java
index 1ecd784..de68c94 100644
--- a/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/ChooseLockPinPasswordFragmentTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.Mockito.verify;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.FragmentController;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -36,7 +37,8 @@
 
     @Before
     public void initFragment() {
-        mFragment = ChooseLockPinPasswordFragment.newPasswordInstance(/* isInSetupWizard= */ false);
+        mFragment = FragmentController.of(
+                ChooseLockPinPasswordFragment.newPasswordInstance()).setup();
     }
 
     /**
diff --git a/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java b/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java
index 5126a18..e8ac043 100644
--- a/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/ConfirmLockPinPasswordFragmentTest.java
@@ -22,7 +22,7 @@
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
+import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.testutils.BaseTestActivity;
 
 import org.junit.Before;
@@ -41,13 +41,8 @@
 
     @Before
     public void initFragment() {
-        mTestActivity = Robolectric.buildActivity(TestSettingsScreenLockActivity.class)
-                .create()
-                .start()
-                .resume()
-                .get();
-
-        mPinFragment = ConfirmLockPinPasswordFragment.newPinInstance(/* isInSetupWizard= */ false);
+        mTestActivity = Robolectric.setupActivity(TestSettingsScreenLockActivity.class);
+        mPinFragment = ConfirmLockPinPasswordFragment.newPinInstance();
         mTestActivity.launchFragment(mPinFragment);
     }
 
@@ -68,15 +63,18 @@
      * The containing activity of ConfirmLockPinPasswordFragment must implement two interfaces
      */
     private static class TestSettingsScreenLockActivity extends BaseTestActivity implements
-            CheckLockListener, BaseFragment.FragmentController {
+            CheckLockListener, FragmentController {
 
         @Override
-        public void onLockVerified(String lock) {}
+        public void onLockVerified(byte[] lock) {
+        }
 
         @Override
-        public void goBack() {}
+        public void goBack() {
+        }
 
         @Override
-        public void showDOBlockingMessage() {}
+        public void showBlockingMessage() {
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialogTest.java b/tests/robotests/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialogTest.java
new file mode 100644
index 0000000..21e760a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/ConfirmRemoveScreenLockDialogTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.DialogTestUtils;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ConfirmRemoveScreenLockDialogTest {
+
+    private static final String TEST_TAG = "test_dialog_tag";
+
+    private BaseTestActivity mTestActivity;
+    private ConfirmRemoveScreenLockDialog mDialog;
+    @Mock
+    private ConfirmRemoveScreenLockDialog.ConfirmRemoveScreenLockListener mListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mDialog = new ConfirmRemoveScreenLockDialog();
+        mDialog.setConfirmRemoveScreenLockListener(mListener);
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
+        mTestActivity.showDialog(mDialog, TEST_TAG);
+    }
+
+    @Test
+    public void testInitialState_dialogShown() {
+        assertThat(isDialogShown()).isTrue();
+    }
+
+    @Test
+    public void testConfirmRemoveScreenLockListenerCalled_listenerCalled() {
+        DialogTestUtils.clickPositiveButton(mDialog);
+        verify(mListener).onConfirmRemoveScreenLock();
+    }
+
+    @Test
+    public void testConfirmRemoveScreenLockListenerCalled_dialogDismissed() {
+        DialogTestUtils.clickPositiveButton(mDialog);
+        assertThat(isDialogShown()).isFalse();
+    }
+
+    private boolean isDialogShown() {
+        return mTestActivity.findDialogByTag(TEST_TAG) != null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/InitialLockSetupServiceTest.java b/tests/robotests/src/com/android/car/settings/security/InitialLockSetupServiceTest.java
new file mode 100644
index 0000000..73ab223
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/InitialLockSetupServiceTest.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.os.RemoteException;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.setupservice.InitialLockSetupService;
+import com.android.car.settings.testutils.ShadowLockPatternUtils;
+import com.android.car.setupwizardlib.IInitialLockSetupService;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.LockTypes;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.SetLockCodes;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.ValidateLockFlags;
+import com.android.car.setupwizardlib.InitialLockSetupHelper;
+import com.android.car.setupwizardlib.LockConfig;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockPatternView;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowContextWrapper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Tests that the {@link InitialLockSetupService} properly handles connections and lock requests.
+ */
+@Config(shadows = ShadowLockPatternUtils.class)
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class InitialLockSetupServiceTest {
+
+    private static final String LOCK_PERMISSION = "com.android.car.settings.SET_INITIAL_LOCK";
+
+    private InitialLockSetupService mInitialLockSetupService;
+    private Context mContext;
+
+    @Before
+    public void setupService() {
+        ShadowLockPatternUtils.reset();
+        mInitialLockSetupService = Robolectric.buildService(InitialLockSetupService.class)
+                .create()
+                .get();
+        mContext = RuntimeEnvironment.application;
+        ShadowContextWrapper shadowContextWrapper = Shadows.shadowOf((ContextWrapper) mContext);
+        shadowContextWrapper.grantPermissions(LOCK_PERMISSION);
+    }
+
+    @Test
+    public void testBindReturnsNull_ifLockSet() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
+        assertThat(mInitialLockSetupService.onBind(new Intent())).isNull();
+    }
+
+    @Test
+    public void testBindReturnsInstanceOfServiceInterface_ifLockNotSet() throws RemoteException {
+        assertThat(mInitialLockSetupService.onBind(
+                new Intent()) instanceof IInitialLockSetupService.Stub).isTrue();
+    }
+
+    @Test
+    public void testGetLockConfig_returnsCorrectConfig() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        LockConfig pinConfig = service.getLockConfig(LockTypes.PIN);
+        assertThat(pinConfig.enabled).isTrue();
+        assertThat(pinConfig.minLockLength).isEqualTo(LockPatternUtils.MIN_LOCK_PASSWORD_SIZE);
+        LockConfig patternConfig = service.getLockConfig(LockTypes.PATTERN);
+        assertThat(patternConfig.enabled).isTrue();
+        assertThat(patternConfig.minLockLength).isEqualTo(LockPatternUtils.MIN_LOCK_PATTERN_SIZE);
+        LockConfig passwordConfig = service.getLockConfig(LockTypes.PASSWORD);
+        assertThat(passwordConfig.enabled).isTrue();
+        assertThat(passwordConfig.minLockLength).isEqualTo(LockPatternUtils.MIN_LOCK_PASSWORD_SIZE);
+    }
+
+    @Test
+    public void testCheckValidLock_tooShort() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        int result = service.checkValidLock(LockTypes.PASSWORD, "hi".getBytes());
+        assertThat(result & ValidateLockFlags.INVALID_LENGTH)
+                .isEqualTo(ValidateLockFlags.INVALID_LENGTH);
+    }
+
+    @Test
+    public void testCheckValidLock_longEnough() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        int result = service.checkValidLock(LockTypes.PASSWORD, "password".getBytes());
+        assertThat(result & ValidateLockFlags.INVALID_LENGTH)
+                .isNotEqualTo(ValidateLockFlags.INVALID_LENGTH);
+    }
+
+    @Test
+    public void testCheckValidLockPin_withLetters() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        int result = service.checkValidLock(LockTypes.PIN, "12a3".getBytes());
+        assertThat(result & ValidateLockFlags.INVALID_BAD_SYMBOLS)
+                .isEqualTo(ValidateLockFlags.INVALID_BAD_SYMBOLS);
+    }
+
+    @Test
+    public void testCheckValidLockPattern_tooShort() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        byte[] pattern = new byte[LockPatternUtils.MIN_LOCK_PATTERN_SIZE - 1];
+        for (int i = 0; i < pattern.length; i++) {
+            pattern[i] = (byte) i;
+        }
+        int result = service.checkValidLock(LockTypes.PATTERN, pattern);
+        assertThat(result & ValidateLockFlags.INVALID_LENGTH)
+                .isEqualTo(ValidateLockFlags.INVALID_LENGTH);
+    }
+
+    @Test
+    public void testCheckValidLockPattern_longEnough() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        byte[] pattern = new byte[LockPatternUtils.MIN_LOCK_PATTERN_SIZE + 1];
+        for (int i = 0; i < pattern.length; i++) {
+            pattern[i] = (byte) i;
+        }
+        int result = service.checkValidLock(LockTypes.PATTERN, pattern);
+        assertThat(result & ValidateLockFlags.INVALID_LENGTH)
+                .isNotEqualTo(ValidateLockFlags.INVALID_LENGTH);
+    }
+
+    @Test
+    public void testSetLockPassword_doesNotWorkWithExistingPassword() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
+        int result = service.setLock(LockTypes.PASSWORD, "password".getBytes());
+        assertThat(result).isEqualTo(SetLockCodes.FAIL_LOCK_EXISTS);
+    }
+
+    @Test
+    public void testSetLockPassword_doesNotWorkWithInvalidPassword() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        int result = service.setLock(LockTypes.PASSWORD, "hi".getBytes());
+        assertThat(result).isEqualTo(SetLockCodes.FAIL_LOCK_INVALID);
+    }
+
+    @Test
+    public void testSetLockPassword_setsDevicePassword() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        byte[] password = "password".getBytes();
+        // Need copy since password is cleared.
+        byte[] expectedPassword = Arrays.copyOf(password, password.length);
+        int result = service.setLock(LockTypes.PASSWORD, password);
+        assertThat(result).isEqualTo(SetLockCodes.SUCCESS);
+        assertThat(Arrays.equals(ShadowLockPatternUtils.getSavedPassword(),
+                expectedPassword)).isTrue();
+    }
+
+    @Test
+    public void testSetLockPin_setsDevicePin() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        byte[] password = "1580".getBytes();
+        byte[] expectedPassword = Arrays.copyOf(password, password.length);
+        int result = service.setLock(LockTypes.PIN, password);
+        assertThat(result).isEqualTo(SetLockCodes.SUCCESS);
+        assertThat(Arrays.equals(ShadowLockPatternUtils.getSavedPassword(),
+                expectedPassword)).isTrue();
+    }
+
+    @Test
+    public void testSetLockPattern_setsDevicePattern() throws RemoteException {
+        IInitialLockSetupService service = IInitialLockSetupService.Stub.asInterface(
+                mInitialLockSetupService.onBind(new Intent()));
+        List<LockPatternView.Cell> pattern = new ArrayList<>();
+        pattern.add(LockPatternView.Cell.of(0, 0));
+        pattern.add(LockPatternView.Cell.of(1, 0));
+        pattern.add(LockPatternView.Cell.of(2, 0));
+        pattern.add(LockPatternView.Cell.of(0, 1));
+        byte[] patternBytes = new byte[pattern.size()];
+        for (int i = 0; i < patternBytes.length; i++) {
+            LockPatternView.Cell cell = pattern.get(i);
+            patternBytes[i] = InitialLockSetupHelper.getByteFromPatternCell(cell.getRow(),
+                    cell.getColumn());
+        }
+        int result = service.setLock(LockTypes.PATTERN, patternBytes);
+        assertThat(result).isEqualTo(SetLockCodes.SUCCESS);
+        List<LockPatternView.Cell> savedPattern = ShadowLockPatternUtils.getSavedPattern();
+        assertThat(savedPattern).containsExactlyElementsIn(pattern);
+    }
+
+    @Test
+    public void testBindFails_ifNoPermissionGranted() {
+        ShadowContextWrapper shadowContextWrapper = Shadows.shadowOf((ContextWrapper) mContext);
+        shadowContextWrapper.denyPermissions(LOCK_PERMISSION);
+        assertThat(mInitialLockSetupService.onBind(new Intent())).isNull();
+    }
+
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/LockTypeBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/LockTypeBasePreferenceControllerTest.java
new file mode 100644
index 0000000..8272345
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/LockTypeBasePreferenceControllerTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class LockTypeBasePreferenceControllerTest {
+
+    // Test classes used to test LockTypeBasePreferenceController.
+    private static class TestFragment extends Fragment {
+    }
+
+    private static class TestLockPreferenceController extends LockTypeBasePreferenceController {
+
+        TestLockPreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Fragment fragmentToOpen() {
+            return new TestFragment();
+        }
+
+        @Override
+        protected int[] allowedPasswordQualities() {
+            return new int[]{MATCHING_PASSWORD_QUALITY};
+        }
+    }
+
+    private static final int MATCHING_PASSWORD_QUALITY =
+            DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
+    private static final int NON_MATCHING_PASSWORD_QUALITY =
+            DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<TestLockPreferenceController>
+            mPreferenceControllerHelper;
+    private TestLockPreferenceController mController;
+    private Preference mPreference;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestLockPreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_returnsTrue() {
+        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_goesToNextFragment() {
+        mPreference.performClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).launchFragment(
+                any(TestFragment.class));
+    }
+
+    @Test
+    public void testRefreshUi_isCurrentLock() {
+        mController.setCurrentPasswordQuality(MATCHING_PASSWORD_QUALITY);
+        mController.refreshUi();
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.current_screen_lock));
+    }
+
+    @Test
+    public void testRefreshUi_isNotCurrentLock() {
+        mController.setCurrentPasswordQuality(NON_MATCHING_PASSWORD_QUALITY);
+        mController.refreshUi();
+        assertThat(mPreference.getSummary()).isNotEqualTo(
+                mContext.getString(R.string.current_screen_lock));
+    }
+
+    @Test
+    public void testGetAvailabilityStatus_guestUser() {
+        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(true);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void testGetAvailabilityStatus_otherUser() {
+        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(false);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/NoLockPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/NoLockPreferenceControllerTest.java
new file mode 100644
index 0000000..8206fda
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/NoLockPreferenceControllerTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowLockPatternUtils;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLockPatternUtils.class})
+public class NoLockPreferenceControllerTest {
+
+    private static final byte[] TEST_CURRENT_PASSWORD = "test_password".getBytes();
+    private static final int TEST_USER = 10;
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<NoLockPreferenceController> mPreferenceControllerHelper;
+    private NoLockPreferenceController mController;
+    private Preference mPreference;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                NoLockPreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowLockPatternUtils.reset();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_returnsTrue() {
+        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_goesToNextFragment() {
+        mPreference.performClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmRemoveScreenLockDialog.class), anyString());
+    }
+
+    @Test
+    public void testConfirmRemoveScreenLockListener_removesLock() {
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER);
+        mController.setCurrentPassword(TEST_CURRENT_PASSWORD);
+        mController.mRemoveLockListener.onConfirmRemoveScreenLock();
+        assertThat(ShadowLockPatternUtils.getClearLockCredential()).isEqualTo(
+                TEST_CURRENT_PASSWORD);
+        assertThat(ShadowLockPatternUtils.getClearLockUser()).isEqualTo(TEST_USER);
+    }
+
+    @Test
+    public void testConfirmRemoveScreenLockListener_goesBack() {
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER);
+        mController.setCurrentPassword(TEST_CURRENT_PASSWORD);
+        mController.mRemoveLockListener.onConfirmRemoveScreenLock();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).goBack();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java b/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java
index 3a6c646..567a009 100644
--- a/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java
+++ b/tests/robotests/src/com/android/car/settings/security/PasswordHelperTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.setupwizardlib.InitialLockSetupConstants.ValidateLockFlags;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -31,12 +32,12 @@
 public class PasswordHelperTest {
 
     private PasswordHelper mPasswordHelper;
-    private PasswordHelper mPinPresenter;
+    private PasswordHelper mPinHelper;
 
     @Before
     public void initObjects() {
-        mPasswordHelper = new PasswordHelper(false);
-        mPinPresenter = new PasswordHelper(true);
+        mPasswordHelper = new PasswordHelper(/* isPin= */ false);
+        mPinHelper = new PasswordHelper(/* isPin= */ true);
     }
 
     /**
@@ -45,17 +46,17 @@
      */
     @Test
     public void testValidatePasswordTooShort() {
-        String password = "lov";
+        byte[] password = "lov".getBytes();
         assertThat(mPasswordHelper.validate(password))
                 .isEqualTo(PasswordHelper.TOO_SHORT);
     }
 
     /**
-     * A test to check validate works when alphanumeric passwor contains white space.
+     * A test to check validate works when alphanumeric password contains white space.
      */
     @Test
     public void testValidatePasswordWhiteSpace() {
-        String password = "pass wd";
+        byte[] password = "pass wd".getBytes();
         assertThat(mPasswordHelper.validate(password))
                 .isEqualTo(PasswordHelper.NO_ERROR);
     }
@@ -66,7 +67,7 @@
      */
     @Test
     public void testValidatePasswordNonAscii() {
-        String password = "1passwýd";
+        byte[] password = "1passwýd".getBytes();
         assertThat(mPasswordHelper.validate(password))
                 .isEqualTo(PasswordHelper.CONTAINS_INVALID_CHARACTERS);
     }
@@ -76,8 +77,8 @@
      */
     @Test
     public void testValidatePinContainingNonDigits() {
-        String password = "1a34";
-        assertThat(mPinPresenter.validate(password))
+        byte[] password = "1a34".getBytes();
+        assertThat(mPinHelper.validate(password))
                 .isEqualTo(PasswordHelper.CONTAINS_NON_DIGITS);
     }
 
@@ -86,8 +87,72 @@
      */
     @Test
     public void testValidatePinWithTooFewDigits() {
-        String password = "12";
-        assertThat(mPinPresenter.validate(password))
+        byte[] password = "12".getBytes();
+        assertThat(mPinHelper.validate(password))
                 .isEqualTo(PasswordHelper.TOO_SHORT);
     }
+
+    /**
+     * A test to check that validate will work as expected for setup wizard passwords that are
+     * too short.
+     */
+    @Test
+    public void testValidatePasswordTooShort_setupWizard() {
+        byte[] password = "lov".getBytes();
+        assertThat(mPasswordHelper.validateSetupWizard(password) & ValidateLockFlags.INVALID_LENGTH)
+                .isEqualTo(ValidateLockFlags.INVALID_LENGTH);
+    }
+
+    /**
+     * A test to check that validate works when setup wizard alphanumeric passwords contain white
+     * space.
+     */
+    @Test
+    public void testValidatePasswordWhiteSpace_setupWizard() {
+        byte[] password = "pass wd".getBytes();
+        assertThat(mPasswordHelper.validateSetupWizard(password)).isEqualTo(0);
+    }
+
+    /**
+     * A test to check validate works as expected for setup wizard alphanumeric password
+     * that contains an invalid character.
+     */
+    @Test
+    public void testValidatePasswordNonAscii_setupWizard() {
+        byte[] password = "1passwýd".getBytes();
+        assertThat(mPasswordHelper.validateSetupWizard(password)
+                & ValidateLockFlags.INVALID_BAD_SYMBOLS)
+                .isEqualTo(ValidateLockFlags.INVALID_BAD_SYMBOLS);
+    }
+
+    /**
+     * A test to check validate works as expected for setup wizard pin that contains non digits.
+     */
+    @Test
+    public void testValidatePinContainingNonDigits_setupWizard() {
+        byte[] password = "1a34".getBytes();
+        assertThat(mPinHelper.validateSetupWizard(password)
+                & ValidateLockFlags.INVALID_BAD_SYMBOLS)
+                .isEqualTo(ValidateLockFlags.INVALID_BAD_SYMBOLS);
+    }
+
+    /**
+     * A test to check validate works as expected for setup wizard pin with too few digits.
+     */
+    @Test
+    public void testValidatePinWithTooFewDigits_setupWizard() {
+        byte[] password = "12".getBytes();
+        assertThat(mPinHelper.validateSetupWizard(password) & ValidateLockFlags.INVALID_LENGTH)
+                .isEqualTo(ValidateLockFlags.INVALID_LENGTH);
+    }
+
+    /**
+     * A test to check that validate works as expected for a valid setup wizard pin.
+     */
+    @Test
+    public void testValidatePinWithValidPin_setupWizard() {
+        byte[] password = "1234".getBytes();
+        assertThat(mPinHelper.validateSetupWizard(password)).isEqualTo(0);
+    }
+
 }
diff --git a/tests/robotests/src/com/android/car/settings/security/SecurityEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/SecurityEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..e7509d7
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/SecurityEntryPreferenceControllerTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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;
+
+/** Unit test for {@link SecurityEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class SecurityEntryPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private SecurityEntryPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+
+        mController = new PreferenceControllerTestHelper<>(RuntimeEnvironment.application,
+                SecurityEntryPreferenceController.class).getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_guestUser_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_nonGuestUser_available() {
+        when(mCarUserManagerHelper.isCurrentProcessGuestUser()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..a91bb5d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceEntryPreferenceControllerTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 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.car.settings.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.trust.CarTrustAgentEnrollmentManager;
+import android.car.trust.TrustedDeviceInfo;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCar;
+
+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 java.util.ArrayList;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCar.class})
+public class TrustedDeviceEntryPreferenceControllerTest {
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<TrustedDeviceEntryPreferenceController>
+            mPreferenceControllerHelper;
+    private Preference mTrustedDevicePreference;
+    @Mock
+    private CarTrustAgentEnrollmentManager mMockCarTrustAgentEnrollmentManager;
+    private TrustedDeviceEntryPreferenceController mController;
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mTrustedDevicePreference = new Preference(mContext);
+        ShadowCar.setCarManager(Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE,
+                mMockCarTrustAgentEnrollmentManager);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TrustedDeviceEntryPreferenceController.class, mTrustedDevicePreference);
+        mController = mPreferenceControllerHelper.getController();
+        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_listenerTriggered() {
+        mTrustedDevicePreference.performClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).launchFragment(
+                any(ChooseTrustedDeviceFragment.class));
+    }
+
+    @Test
+    public void testUpdateState() throws CarNotConnectedException {
+        List<TrustedDeviceInfo> devices = new ArrayList<>();
+        devices.add(new TrustedDeviceInfo(1, "", ""));
+        devices.add(new TrustedDeviceInfo(2, "", ""));
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId()))
+                .thenReturn(devices);
+        mController.refreshUi();
+        assertThat(mTrustedDevicePreference.getSummary()).isEqualTo("2 devices");
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/security/TrustedDeviceListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceListPreferenceControllerTest.java
new file mode 100644
index 0000000..be4d6cb
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/security/TrustedDeviceListPreferenceControllerTest.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.security;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.car.Car;
+import android.car.trust.CarTrustAgentEnrollmentManager;
+import android.car.trust.TrustedDeviceInfo;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCar;
+import com.android.car.settings.testutils.ShadowLockPatternUtils;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Unit tests for {@link TrustedDeviceListPreferenceController}.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCar.class, ShadowLockPatternUtils.class})
+public class TrustedDeviceListPreferenceControllerTest {
+
+    List<TrustedDeviceInfo> mUpdatedDevices = new ArrayList<>();
+    List<TrustedDeviceInfo> mDevices = new ArrayList<>();
+    private Context mContext;
+    private PreferenceControllerTestHelper<TrustedDeviceListPreferenceController>
+            mPreferenceControllerHelper;
+    @Mock
+    private CarTrustAgentEnrollmentManager mMockCarTrustAgentEnrollmentManager;
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private PreferenceGroup mPreferenceGroup;
+    private TrustedDeviceListPreferenceController mController;
+    private TrustedDeviceInfo mTestDevice1 = new TrustedDeviceInfo(1, "", "");
+    private TrustedDeviceInfo mTestDevice2 = new TrustedDeviceInfo(2, "", "");
+    private TrustedDeviceInfo mTestDevice3 = new TrustedDeviceInfo(3, "", "");
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        ShadowCar.setCarManager(Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE,
+                mMockCarTrustAgentEnrollmentManager);
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TrustedDeviceListPreferenceController.class, mPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+        mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+        mDevices.add(mTestDevice1);
+        mDevices.add(mTestDevice2);
+        mUpdatedDevices.add(mTestDevice1);
+        mUpdatedDevices.add(mTestDevice2);
+        mUpdatedDevices.add(mTestDevice3);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCar.reset();
+        ShadowLockPatternUtils.reset();
+    }
+
+    @Test
+    public void onDeviceRemoved_refreshUi() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback> callBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback.class);
+        verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(callBack.capture());
+        mUpdatedDevices.remove(0);
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+        callBack.getValue().onEscrowTokenRemoved(mUpdatedDevices.get(0).getHandle());
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void onDeviceAdded_refreshUi() {
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mDevices);
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        ArgumentCaptor<CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback> callBack =
+                ArgumentCaptor.forClass(
+                        CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback.class);
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+        verify(mMockCarTrustAgentEnrollmentManager).setEnrollmentCallback(callBack.capture());
+
+        callBack.getValue().onEscrowTokenActiveStateChanged(mUpdatedDevices.get(0).getHandle(),
+                true);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+    }
+
+    @Test
+    public void refreshUi_noDevices_hasPassword_hidesGroup() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(
+                Collections.emptyList());
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+        assertThat(mPreferenceGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_devices_hasPassword_showsGroup() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mUpdatedDevices);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+        assertThat(mPreferenceGroup.isVisible()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_noPassword_showAuthenticationReminderPreference() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
+
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getSummary()).isEqualTo(
+                mContext.getString(R.string.trusted_device_set_authentication_reminder));
+    }
+
+    @Test
+    public void onPreferenceClicked_hasPassword_showDialog() {
+        ShadowLockPatternUtils.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        when(mMockCarTrustAgentEnrollmentManager.getEnrolledDeviceInfoForUser(
+                mCarUserManagerHelper.getCurrentProcessUserId())).thenReturn(mDevices);
+        mController.refreshUi();
+        Preference p = mPreferenceGroup.getPreference(0);
+
+        p.performClick();
+
+        verify(mPreferenceControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmRemoveDeviceDialog.class), anyString());
+    }
+
+    @Test
+    public void onRemoveDeviceDialogConfirmed_remoeEscrwoToken() {
+        mController.mConfirmRemoveDeviceListener.onConfirmRemoveDevice(1);
+
+        verify(mMockCarTrustAgentEnrollmentManager).removeEscrowToken(1,
+                mCarUserManagerHelper.getCurrentProcessUserId());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/sound/RingtonePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/sound/RingtonePreferenceControllerTest.java
new file mode 100644
index 0000000..967361a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/sound/RingtonePreferenceControllerTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.net.Uri;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowRingtone;
+import com.android.car.settings.testutils.ShadowRingtoneManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowRingtoneManager.class, ShadowRingtone.class})
+public class RingtonePreferenceControllerTest {
+
+    private static final int TEST_RINGTONE_TYPE = RingtoneManager.TYPE_RINGTONE;
+    private static final String TEST_PATH = "/test/path/uri";
+    private static final Uri TEST_URI = new Uri.Builder().appendPath(TEST_PATH).build();
+    private static final String TEST_TITLE = "Test Preference Title";
+    private static final String TEST_RINGTONE_TITLE = "Test Ringtone Title";
+
+    // These are copied from android.app.Activity. That class is not accessible from this test
+    // because there is another test Activity with the same package.
+    private static final int ACTIVITY_RESULT_OK = -1;
+    private static final int ACTIVITY_RESULT_CANCELLED = 0;
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<RingtonePreferenceController>
+            mPreferenceControllerHelper;
+    private RingtonePreferenceController mController;
+    private RingtonePreference mRingtonePreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mRingtonePreference = new RingtonePreference(mContext, null);
+        mRingtonePreference.setTitle(TEST_TITLE);
+        mRingtonePreference.setRingtoneType(TEST_RINGTONE_TYPE);
+        mRingtonePreference.setShowSilent(true);  // Default value when instantiated via xml.
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                RingtonePreferenceController.class, mRingtonePreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        // Set the Uri to be null at the beginning of each test.
+        ShadowRingtoneManager.setActualDefaultRingtoneUri(mContext, TEST_RINGTONE_TYPE,
+                /* ringtoneUri= */ null);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowRingtoneManager.reset();
+        ShadowRingtone.reset();
+    }
+
+    @Test
+    public void testRefreshUi_ringtoneTitleSet() {
+        ShadowRingtoneManager.setActualDefaultRingtoneUri(mContext, TEST_RINGTONE_TYPE, TEST_URI);
+        ShadowRingtone.setExpectedTitleForUri(TEST_URI, TEST_RINGTONE_TITLE);
+        mController.refreshUi();
+        assertThat(mRingtonePreference.getSummary()).isEqualTo(TEST_RINGTONE_TITLE);
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_listenerTriggered() {
+        mRingtonePreference.performClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).startActivityForResult(
+                any(Intent.class), anyInt(), any(ActivityResultCallback.class));
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_captureIntent_checkDefaultUri() {
+        ShadowRingtoneManager.setActualDefaultRingtoneUri(mContext, TEST_RINGTONE_TYPE, TEST_URI);
+        mRingtonePreference.performClick();
+        ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+        verify(mPreferenceControllerHelper.getMockFragmentController()).startActivityForResult(
+                intent.capture(), anyInt(), any(ActivityResultCallback.class));
+        assertThat((Uri) intent.getValue().getParcelableExtra(
+                RingtoneManager.EXTRA_RINGTONE_EXISTING_URI)).isEqualTo(TEST_URI);
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_captureIntent_checkDialogTitle() {
+        mRingtonePreference.performClick();
+        ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+        verify(mPreferenceControllerHelper.getMockFragmentController()).startActivityForResult(
+                intent.capture(), anyInt(), any(ActivityResultCallback.class));
+        assertThat(
+                intent.getValue().getStringExtra(RingtoneManager.EXTRA_RINGTONE_TITLE)).isEqualTo(
+                TEST_TITLE);
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_captureIntent_checkRingtoneType() {
+        mRingtonePreference.performClick();
+        ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+        verify(mPreferenceControllerHelper.getMockFragmentController()).startActivityForResult(
+                intent.capture(), anyInt(), any(ActivityResultCallback.class));
+        assertThat(
+                intent.getValue().getIntExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, -1)).isEqualTo(
+                TEST_RINGTONE_TYPE);
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_captureIntent_checkShowSilent() {
+        mRingtonePreference.performClick();
+        ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+        verify(mPreferenceControllerHelper.getMockFragmentController()).startActivityForResult(
+                intent.capture(), anyInt(), any(ActivityResultCallback.class));
+        assertThat(intent.getValue().getBooleanExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT,
+                false)).isTrue();
+    }
+
+    @Test
+    public void testProcessActivityResult_wrongResult_defaultRingtoneNotSet() {
+        mController.processActivityResult(RingtonePreferenceController.REQUEST_CODE,
+                ACTIVITY_RESULT_CANCELLED, new Intent());
+        assertThat(ShadowRingtoneManager.getActualDefaultRingtoneUri(mContext,
+                TEST_RINGTONE_TYPE)).isNull();
+    }
+
+    @Test
+    public void testProcessActivityResult_correctResult_nullIntent_defaultRingtoneNotSet() {
+        mController.processActivityResult(RingtonePreferenceController.REQUEST_CODE,
+                ACTIVITY_RESULT_OK, null);
+        assertThat(ShadowRingtoneManager.getActualDefaultRingtoneUri(mContext,
+                TEST_RINGTONE_TYPE)).isNull();
+    }
+
+    @Test
+    public void testProcessActivityResult_correctResult_validIntent_defaultRingtoneSet() {
+        Intent data = new Intent();
+        data.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, TEST_URI);
+        mController.processActivityResult(RingtonePreferenceController.REQUEST_CODE,
+                ACTIVITY_RESULT_OK, data);
+        assertThat(ShadowRingtoneManager.getActualDefaultRingtoneUri(mContext,
+                TEST_RINGTONE_TYPE)).isEqualTo(TEST_URI);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
new file mode 100644
index 0000000..c5d83fd
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsPreferenceControllerTest.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.media.Ringtone;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.SeekBarPreference;
+import com.android.car.settings.testutils.ShadowCar;
+import com.android.car.settings.testutils.ShadowRingtoneManager;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowRingtoneManager.class})
+public class VolumeSettingsPreferenceControllerTest {
+
+    private static final int GROUP_ID = 0;
+    private static final int TEST_MIN_VOLUME = 0;
+    private static final int TEST_VOLUME = 40;
+    private static final int TEST_NEW_VOLUME = 80;
+    private static final int TEST_MAX_VOLUME = 100;
+
+    private PreferenceControllerTestHelper<TestVolumeSettingsPreferenceController>
+            mPreferenceControllerHelper;
+    private TestVolumeSettingsPreferenceController mController;
+    private PreferenceGroup mPreferenceGroup;
+    @Mock
+    private CarAudioManager mCarAudioManager;
+    @Mock
+    private Ringtone mRingtone;
+
+    /** Extend class to provide test resource which doesn't require internal android resources. */
+    public static class TestVolumeSettingsPreferenceController extends
+            VolumeSettingsPreferenceController {
+
+        public TestVolumeSettingsPreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        public int carVolumeItemsXml() {
+            return R.xml.test_car_volume_items;
+        }
+    }
+
+    @Before
+    public void setUp() throws CarNotConnectedException {
+        MockitoAnnotations.initMocks(this);
+        ShadowCar.setCarManager(Car.AUDIO_SERVICE, mCarAudioManager);
+        ShadowRingtoneManager.setRingtone(mRingtone);
+
+        Context context = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                TestVolumeSettingsPreferenceController.class, mPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+
+        when(mCarAudioManager.getVolumeGroupCount()).thenReturn(1);
+        when(mCarAudioManager.getUsagesForVolumeGroupId(GROUP_ID)).thenReturn(new int[]{1, 2});
+        when(mCarAudioManager.getGroupMinVolume(GROUP_ID)).thenReturn(TEST_MIN_VOLUME);
+        when(mCarAudioManager.getGroupVolume(GROUP_ID)).thenReturn(TEST_VOLUME);
+        when(mCarAudioManager.getGroupMaxVolume(GROUP_ID)).thenReturn(TEST_MAX_VOLUME);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCar.reset();
+        ShadowRingtoneManager.reset();
+    }
+
+    @Test
+    public void testRefreshUi_serviceNotStarted() {
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void testRefreshUi_serviceStarted() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testRefreshUi_serviceStarted_multipleCalls() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+
+        // Calling this multiple times shouldn't increase the number of elements.
+        mController.refreshUi();
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+    }
+
+    @Test
+    public void testRefreshUi_createdPreferenceHasMinMax() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        SeekBarPreference preference = (SeekBarPreference) mPreferenceGroup.getPreference(0);
+        assertThat(preference.getMin()).isEqualTo(TEST_MIN_VOLUME);
+        assertThat(preference.getValue()).isEqualTo(TEST_VOLUME);
+        assertThat(preference.getMax()).isEqualTo(TEST_MAX_VOLUME);
+    }
+
+    @Test
+    public void testOnPreferenceChange_ringtonePlays() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        SeekBarPreference preference = (SeekBarPreference) mPreferenceGroup.getPreference(0);
+        preference.getOnPreferenceChangeListener().onPreferenceChange(preference, TEST_NEW_VOLUME);
+        verify(mRingtone).play();
+    }
+
+    @Test
+    public void testOnPreferenceChange_audioManagerSet() throws CarNotConnectedException {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        mController.refreshUi();
+        SeekBarPreference preference = (SeekBarPreference) mPreferenceGroup.getPreference(0);
+        preference.getOnPreferenceChangeListener().onPreferenceChange(preference, TEST_NEW_VOLUME);
+        verify(mCarAudioManager).setGroupVolume(GROUP_ID, TEST_NEW_VOLUME, 0);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsRingtoneManagerTest.java b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsRingtoneManagerTest.java
new file mode 100644
index 0000000..b6e3f85
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/sound/VolumeSettingsRingtoneManagerTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 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.car.settings.sound;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.media.Ringtone;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowRingtoneManager;
+
+import org.junit.After;
+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 org.robolectric.shadows.ShadowLooper;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowRingtoneManager.class})
+public class VolumeSettingsRingtoneManagerTest {
+
+    private static final int TEST_GROUP_ID = 1;
+    private static final int TEST_USAGE_ID = 18;
+
+    private Context mContext;
+    private VolumeSettingsRingtoneManager mRingtoneManager;
+    @Mock
+    private Ringtone mRingtone;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowRingtoneManager.setRingtone(mRingtone);
+        mContext = RuntimeEnvironment.application;
+        mRingtoneManager = new VolumeSettingsRingtoneManager(mContext);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowRingtoneManager.reset();
+        when(mRingtone.isPlaying()).thenReturn(false);
+    }
+
+    @Test
+    public void testPlayAudioFeedback_play_playUntilTimeout() {
+        mRingtoneManager.playAudioFeedback(TEST_GROUP_ID, TEST_USAGE_ID);
+        verify(mRingtone).play();
+        when(mRingtone.isPlaying()).thenReturn(true);
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        verify(mRingtone).stop();
+    }
+
+    @Test
+    public void testPlayAudioFeedback_play_stoppedBeforeTimeout() {
+        mRingtoneManager.playAudioFeedback(TEST_GROUP_ID, TEST_USAGE_ID);
+        verify(mRingtone).play();
+        when(mRingtone.isPlaying()).thenReturn(false);
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        verify(mRingtone, never()).stop();
+    }
+
+    @Test
+    public void testStopCurrentRingtone_stop() {
+        mRingtoneManager.playAudioFeedback(TEST_GROUP_ID, TEST_USAGE_ID);
+        mRingtoneManager.stopCurrentRingtone();
+        verify(mRingtone).stop();
+    }
+
+    @Test
+    public void testStopCurrentRingtone_noCurrentRingtone() {
+        mRingtoneManager.stopCurrentRingtone();
+        verify(mRingtone, never()).stop();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragmentTest.java
new file mode 100644
index 0000000..7146cb5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/AppStorageSettingsDetailsFragmentTest.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.android.car.settings.storage.AppStorageSettingsDetailsFragment.EXTRA_PACKAGE_NAME;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.app.usage.StorageStats;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowActivityManager;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.car.settings.testutils.ShadowApplicationsState;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowRestrictedLockUtilsInternal;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import org.junit.After;
+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;
+
+/** Unit test for {@link AppStorageSettingsDetailsFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationsState.class, ShadowCarUserManagerHelper.class,
+        ShadowRestrictedLockUtilsInternal.class, ShadowApplicationPackageManager.class,
+        ShadowActivityManager.class})
+public class AppStorageSettingsDetailsFragmentTest {
+
+    private static final String PACKAGE_NAME = "com.google.packageName";
+    private static final String SOURCE = "source";
+    private static final int UID = 12;
+    private static final String LABEL = "label";
+    private static final String SIZE_STR = "12.34 MB";
+    private static final int TEST_USER_ID = 10;
+
+    private Context mContext;
+    private AppStorageSettingsDetailsFragment mFragment;
+    private FragmentController<AppStorageSettingsDetailsFragment> mFragmentController;
+
+    @Mock
+    private ApplicationsState mApplicationsState;
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Mock
+    private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin;
+
+    @Mock
+    private PackageManager mPackageManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mFragment = new AppStorageSettingsDetailsFragment();
+        Bundle bundle = new Bundle();
+        bundle.putString(EXTRA_PACKAGE_NAME, PACKAGE_NAME);
+        mFragment.setArguments(bundle);
+        mFragmentController = FragmentController.of(mFragment);
+
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        appEntry.info.packageName = PACKAGE_NAME;
+        when(mApplicationsState.getEntry(eq(PACKAGE_NAME), anyInt())).thenReturn(appEntry);
+        // Set user.
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER_ID);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowApplicationsState.setInstance(mApplicationsState);
+        mFragmentController.create();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationsState.reset();
+        ShadowCarUserManagerHelper.reset();
+        ShadowRestrictedLockUtilsInternal.reset();
+        ShadowApplicationPackageManager.reset();
+        ShadowActivityManager.reset();
+    }
+
+    @Test
+    public void onActivityCreated_defaultStatus_shouldShowCacheButtons() {
+        mFragment.onActivityCreated(null);
+
+        assertThat(findClearCacheButton(mFragment.requireActivity())).isNotNull();
+        assertThat(findClearCacheButton(mFragment.requireActivity()).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(findClearCacheButton(mFragment.requireActivity()).getText()).isEqualTo(
+                mContext.getString(R.string.storage_clear_cache_btn_text));
+
+        assertThat(findClearStorageButton(mFragment.requireActivity())).isNotNull();
+        assertThat(findClearStorageButton(mFragment.requireActivity()).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(findClearStorageButton(mFragment.requireActivity()).getText()).isEqualTo(
+                mContext.getString(R.string.storage_clear_user_data_text));
+    }
+
+    @Test
+    public void onActivityCreated_defaultStatus_shouldShowClearStorageButtons() {
+        mFragment.onActivityCreated(null);
+
+        assertThat(findClearStorageButton(mFragment.requireActivity())).isNotNull();
+        assertThat(findClearStorageButton(mFragment.requireActivity()).getVisibility()).isEqualTo(
+                View.VISIBLE);
+        assertThat(findClearStorageButton(mFragment.requireActivity()).getText()).isEqualTo(
+                mContext.getString(R.string.storage_clear_user_data_text));
+    }
+
+    @Test
+    public void handleClearCacheClick_disallowedBySystem_shouldNotDeleteApplicationCache() {
+        ShadowRestrictedLockUtilsInternal.setEnforcedAdmin(mEnforcedAdmin);
+        ShadowApplicationPackageManager.setPackageManager(mPackageManager);
+
+        doNothing().when(mPackageManager).deleteApplicationCacheFiles(anyString(), any());
+
+        mFragmentController.resume();
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 50;
+        stats.cacheBytes = 0;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+        findClearCacheButton(mFragment.requireActivity()).performClick();
+
+        verify(mPackageManager, never()).deleteApplicationCacheFiles(anyString(), any());
+    }
+
+    @Test
+    public void handleClearCacheClick_allowedBySystem_shouldNotDeleteApplicationCache() {
+        ShadowRestrictedLockUtilsInternal.setEnforcedAdmin(mEnforcedAdmin);
+        ShadowRestrictedLockUtilsInternal.setHasBaseUserRestriction(true);
+        ShadowApplicationPackageManager.setPackageManager(mPackageManager);
+
+        doNothing().when(mPackageManager).deleteApplicationCacheFiles(anyString(), any());
+
+        mFragmentController.resume();
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 50;
+        stats.cacheBytes = 10;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+        findClearCacheButton(mFragment.requireActivity()).performClick();
+
+        verify(mPackageManager).deleteApplicationCacheFiles(anyString(), any());
+    }
+
+    @Test
+    public void handleClearDataClick_disallowedBySystem_shouldNotShowDialogToClear() {
+        ShadowRestrictedLockUtilsInternal.setEnforcedAdmin(mEnforcedAdmin);
+        ShadowApplicationPackageManager.setPackageManager(mPackageManager);
+
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 10;
+        stats.cacheBytes = 10;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+        findClearStorageButton(mFragment.requireActivity()).performClick();
+
+        assertThat(mFragment.getFragmentManager().findFragmentByTag(
+                AppStorageSettingsDetailsFragment.CONFIRM_CLEAR_STORAGE_DIALOG_TAG)).isNull();
+    }
+
+    @Test
+    public void handleClearDataClick_allowedBySystem_shouldShowDialogToClear() {
+        ShadowRestrictedLockUtilsInternal.setEnforcedAdmin(mEnforcedAdmin);
+        ShadowRestrictedLockUtilsInternal.setHasBaseUserRestriction(true);
+        ShadowApplicationPackageManager.setPackageManager(mPackageManager);
+
+        mFragmentController.resume();
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 50;
+        stats.cacheBytes = 10;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+        findClearStorageButton(mFragment.requireActivity()).performClick();
+
+        assertThat(mFragment.getFragmentManager()).isNotNull();
+    }
+
+    @Test
+    public void onDataLoaded_noResult_buttonsShouldBeDisabled() {
+        mFragment.onActivityCreated(null);
+
+        mFragment.onDataLoaded(null, false, false);
+
+        assertThat(findClearCacheButton(mFragment.requireActivity()).isEnabled()).isFalse();
+        assertThat(findClearStorageButton(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onDataLoaded_resultLoaded_cacheButtonsShouldBeEnabled() {
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 50;
+        stats.cacheBytes = 10;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+
+        assertThat(findClearCacheButton(mFragment.requireActivity()).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onDataLoaded_resultLoaded_dataButtonsShouldBeEnabled() {
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 50;
+        stats.cacheBytes = 10;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+
+        assertThat(findClearStorageButton(mFragment.requireActivity()).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void updateUiWithSize_resultLoaded_cacheButtonDisabledAndDataButtonsEnabled() {
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 50;
+        stats.cacheBytes = 0;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+
+        assertThat(findClearCacheButton(mFragment.requireActivity()).isEnabled()).isFalse();
+        assertThat(findClearStorageButton(mFragment.requireActivity()).isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onDataLoaded_resultLoaded_cacheButtonEnabledAndDataButtonDisabled() {
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = 100;
+        stats.dataBytes = 10;
+        stats.cacheBytes = 10;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mFragment.onActivityCreated(null);
+        mFragment.onDataLoaded(storageStats, false, false);
+
+        assertThat(findClearCacheButton(mFragment.requireActivity()).isEnabled()).isTrue();
+        assertThat(findClearStorageButton(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    private Button findClearCacheButton(Activity activity) {
+        return activity.findViewById(R.id.action_button2);
+    }
+
+    private Button findClearStorageButton(Activity activity) {
+        return activity.findViewById(R.id.action_button1);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java b/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
new file mode 100644
index 0000000..b6da6c6
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/AppsStorageStatsManagerTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.app.usage.StorageStats;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Bundle;
+
+import androidx.loader.app.LoaderManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+/** Unit test for {@link AppsStorageStatsManager}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AppsStorageStatsManagerTest {
+
+    private static final int USER_ID = 10;
+
+    private Context mContext;
+    private AppsStorageStatsManager mAppsStorageStatsManager;
+
+    @Captor
+    private ArgumentCaptor<LoaderManager.LoaderCallbacks<StorageStatsSource.AppStorageStats>>
+            mCallbacksArgumentCaptor;
+
+    @Mock
+    private AppsStorageStatsManager.Callback mCallback1;
+
+    @Mock
+    private AppsStorageStatsManager.Callback mCallback2;
+
+    @Mock
+    private LoaderManager mLoaderManager;
+
+    @Mock
+    private ApplicationInfo mApplicationInfo;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mAppsStorageStatsManager = new AppsStorageStatsManager(mContext);
+        mAppsStorageStatsManager.startLoading(mLoaderManager, mApplicationInfo, USER_ID, false,
+                false);
+        verify(mLoaderManager).restartLoader(eq(1), eq(Bundle.EMPTY),
+                mCallbacksArgumentCaptor.capture());
+    }
+
+    @Test
+    public void callback_onLoadFinished_listenerOnDataLoadedCalled() throws Exception {
+        mAppsStorageStatsManager.registerListener(mCallback1);
+        mAppsStorageStatsManager.registerListener(mCallback2);
+
+        StorageStats stats = new StorageStats();
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mCallbacksArgumentCaptor.getValue().onLoadFinished(null, storageStats);
+
+        verify(mCallback1).onDataLoaded(storageStats, false, false);
+        verify(mCallback2).onDataLoaded(storageStats, false, false);
+    }
+
+    @Test
+    public void callback_unregisterListener_onlyOneListenerOnDataLoadedCalled() throws Exception {
+        mAppsStorageStatsManager.registerListener(mCallback1);
+        mAppsStorageStatsManager.registerListener(mCallback2);
+        mAppsStorageStatsManager.unregisterListener(mCallback2);
+        StorageStats stats = new StorageStats();
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        mCallbacksArgumentCaptor.getValue().onLoadFinished(null, storageStats);
+
+        verify(mCallback1).onDataLoaded(storageStats, false, false);
+        verify(mCallback2, never()).onDataLoaded(storageStats, false, false);
+    }
+
+    @Test
+    public void callback_notLoaded_listenerOnDataLoadedCalled() throws Exception {
+        mAppsStorageStatsManager.registerListener(mCallback1);
+        mAppsStorageStatsManager.registerListener(mCallback2);
+
+        StorageStats stats = new StorageStats();
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        verify(mCallback1, never()).onDataLoaded(storageStats, false, false);
+        verify(mCallback2, never()).onDataLoaded(storageStats, false, false);
+    }
+
+    @Test
+    public void callback_cachedCleared_listenerOnDataLoadedCalled() throws Exception {
+        mAppsStorageStatsManager = new AppsStorageStatsManager(mContext);
+        mAppsStorageStatsManager.startLoading(mLoaderManager, mApplicationInfo, USER_ID, true,
+                false);
+
+        mAppsStorageStatsManager.registerListener(mCallback1);
+        mAppsStorageStatsManager.registerListener(mCallback2);
+
+        StorageStats stats = new StorageStats();
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        verify(mCallback1, never()).onDataLoaded(storageStats, true, false);
+        verify(mCallback2, never()).onDataLoaded(storageStats, true, false);
+    }
+
+    @Test
+    public void callback_userDataCleared_listenerOnDataLoadedCalled() throws Exception {
+        mAppsStorageStatsManager = new AppsStorageStatsManager(mContext);
+        mAppsStorageStatsManager.startLoading(mLoaderManager, mApplicationInfo, USER_ID, false,
+                true);
+
+        mAppsStorageStatsManager.registerListener(mCallback1);
+        mAppsStorageStatsManager.registerListener(mCallback2);
+
+        StorageStats stats = new StorageStats();
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        verify(mCallback1, never()).onDataLoaded(storageStats, false, true);
+        verify(mCallback2, never()).onDataLoaded(storageStats, false, true);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java b/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java
new file mode 100644
index 0000000..8b64456
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/FileSizeFormatterTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.android.car.settings.storage.FileSizeFormatter.GIGABYTE_IN_BYTES;
+import static com.android.car.settings.storage.FileSizeFormatter.MEGABYTE_IN_BYTES;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+
+/** Unit test for {@link FileSizeFormatter}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class FileSizeFormatterTest {
+    private Context mContext;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @Test
+    public void formatFileSize_zero() throws Exception {
+        assertThat(
+                FileSizeFormatter.formatFileSize(
+                        mContext,
+                        0 /* size */,
+                        com.android.internal.R.string.gigabyteShort,
+                        GIGABYTE_IN_BYTES))
+                .isEqualTo("0.00 GB");
+    }
+
+    @Test
+    public void formatFileSize_smallSize() throws Exception {
+        assertThat(
+                FileSizeFormatter.formatFileSize(
+                        mContext,
+                        MEGABYTE_IN_BYTES * 11 /* size */,
+                        com.android.internal.R.string.gigabyteShort,
+                        GIGABYTE_IN_BYTES))
+                .isEqualTo("0.01 GB");
+    }
+
+    @Test
+    public void formatFileSize_lessThanOneSize() throws Exception {
+        assertThat(
+                FileSizeFormatter.formatFileSize(
+                        mContext,
+                        MEGABYTE_IN_BYTES * 155 /* size */,
+                        com.android.internal.R.string.gigabyteShort,
+                        GIGABYTE_IN_BYTES))
+                .isEqualTo("0.16 GB");
+    }
+
+    @Test
+    public void formatFileSize_greaterThanOneSize() throws Exception {
+        assertThat(
+                FileSizeFormatter.formatFileSize(
+                        mContext,
+                        MEGABYTE_IN_BYTES * 1551 /* size */,
+                        com.android.internal.R.string.gigabyteShort,
+                        GIGABYTE_IN_BYTES))
+                .isEqualTo("1.6 GB");
+    }
+
+    @Test
+    public void formatFileSize_greaterThanTen() throws Exception {
+        // Should round down due to truncation
+        assertThat(
+                FileSizeFormatter.formatFileSize(
+                        mContext,
+                        GIGABYTE_IN_BYTES * 15 + MEGABYTE_IN_BYTES * 50 /* size */,
+                        com.android.internal.R.string.gigabyteShort,
+                        GIGABYTE_IN_BYTES))
+                .isEqualTo("15 GB");
+    }
+
+    @Test
+    public void formatFileSize_handlesNegativeFileSizes() throws Exception {
+        assertThat(
+                FileSizeFormatter.formatFileSize(
+                        mContext,
+                        MEGABYTE_IN_BYTES * -155 /* size */,
+                        com.android.internal.R.string.gigabyteShort,
+                        GIGABYTE_IN_BYTES))
+                .isEqualTo("-0.16 GB");
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
new file mode 100644
index 0000000..04cd87d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageApplicationListPreferenceControllerTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+
+/** Unit test for {@link StorageApplicationListPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageApplicationListPreferenceControllerTest {
+
+    private static final String SOURCE = "source";
+    private static final int UID = 12;
+    private static final String LABEL = "label";
+    private static final String SIZE_STR = "12.34 MB";
+    private static final String UPDATED_SIZE_STR = "15.34 MB";
+    private static final String PACKAGE_NAME = "com.google.packageName";
+
+    private Context mContext;
+    private LogicalPreferenceGroup mLogicalPreferenceGroup;
+    private StorageApplicationListPreferenceController mController;
+    private PreferenceControllerTestHelper<StorageApplicationListPreferenceController>
+            mPreferenceControllerHelper;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                StorageApplicationListPreferenceController.class, mLogicalPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void defaultInitialize_hasNoPreference() {
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onDataLoaded_addPreference_hasOnePreference() {
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        appEntry.info.packageName = PACKAGE_NAME;
+        apps.add(appEntry);
+
+        mController.onDataLoaded(apps);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getTitle()).isEqualTo(LABEL);
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getSummary()).isEqualTo(SIZE_STR);
+    }
+
+    @Test
+    public void onDataLoaded_updatePreference_hasOnePreferenceWithUpdatedValues() {
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        appEntry.info.packageName = PACKAGE_NAME;
+        apps.add(appEntry);
+
+        mController.onDataLoaded(apps);
+
+        apps.clear();
+        appEntry = new ApplicationsState.AppEntry(mContext, appInfo, 1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = UPDATED_SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        appEntry.info.packageName = PACKAGE_NAME;
+        apps.add(appEntry);
+
+        mController.onDataLoaded(apps);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getTitle()).isEqualTo(LABEL);
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getSummary()).isEqualTo(
+                UPDATED_SIZE_STR);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
new file mode 100644
index 0000000..a02e44a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageAsyncLoaderTest.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.app.usage.StorageStats;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.UserInfo;
+import android.net.TrafficStats;
+import android.os.UserHandle;
+import android.util.SparseArray;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowApplicationPackageManager;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Unit test for {@link StorageAsyncLoader}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowApplicationPackageManager.class})
+public class StorageAsyncLoaderTest {
+    private static final int PRIMARY_USER_ID = 0;
+    private static final int SECONDARY_USER_ID = 10;
+    private static final String PACKAGE_NAME_1 = "com.blah.test";
+    private static final String PACKAGE_NAME_2 = "com.blah.test2";
+    private static final String DEFAULT_PACKAGE_NAME = "com.android.car.settings";
+    private static final long DEFAULT_QUOTA = 64 * TrafficStats.MB_IN_BYTES;
+
+    @Mock
+    private StorageStatsSource mSource;
+
+    private Context mContext;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private List<ApplicationInfo> mInfo = new ArrayList<>();
+    private List<UserInfo> mUsers;
+
+    private StorageAsyncLoader mLoader;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mInfo = new ArrayList<>();
+        mLoader = new StorageAsyncLoader(mContext, mCarUserManagerHelper, mSource);
+        UserInfo info = new UserInfo();
+        mUsers = new ArrayList<>();
+        mUsers.add(info);
+        when(mCarUserManagerHelper.getAllUsers()).thenReturn(mUsers);
+        when(mSource.getCacheQuotaBytes(any(), anyInt())).thenReturn(DEFAULT_QUOTA);
+        // there is always a "com.android.car.settings" package added by default with category
+        // otherAppsSize lets remove it first for testing.
+        getShadowApplicationManager().removePackage(DEFAULT_PACKAGE_NAME);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowApplicationPackageManager.reset();
+    }
+
+    @Test
+    public void testLoadingApps() throws Exception {
+        addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+        addPackage(PACKAGE_NAME_2, 0, 100, 1000, ApplicationInfo.CATEGORY_UNDEFINED);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(0L);
+        assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(2200L);
+    }
+
+    @Test
+    public void testGamesAreFiltered() throws Exception {
+        addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_GAME);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(11L);
+        assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
+    }
+
+    @Test
+    public void testLegacyGamesAreFiltered() throws Exception {
+        ApplicationInfo info =
+                addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+        info.flags = ApplicationInfo.FLAG_IS_GAME;
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).getGamesSize()).isEqualTo(11L);
+        assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
+    }
+
+    @Test
+    public void testCacheIsNotIgnored() throws Exception {
+        addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(111L);
+    }
+
+    @Test
+    public void testMultipleUsers() throws Exception {
+        UserInfo info = new UserInfo();
+        info.id = SECONDARY_USER_ID;
+        mUsers.add(info);
+        when(mSource.getExternalStorageStats(any(), eq(UserHandle.SYSTEM)))
+                .thenReturn(new StorageStatsSource.ExternalStorageStats(9, 2, 3, 4, 0));
+        when(mSource.getExternalStorageStats(any(), eq(new UserHandle(SECONDARY_USER_ID))))
+                .thenReturn(new StorageStatsSource.ExternalStorageStats(10, 3, 3, 4, 0));
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(2);
+        assertThat(result.get(PRIMARY_USER_ID).getExternalStats().totalBytes).isEqualTo(9L);
+        assertThat(result.get(SECONDARY_USER_ID).getExternalStats().totalBytes).isEqualTo(10L);
+    }
+
+    @Test
+    public void testUpdatedSystemAppCodeSizeIsCounted() throws Exception {
+        ApplicationInfo systemApp =
+                addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+        systemApp.flags = ApplicationInfo.FLAG_SYSTEM & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(111L);
+    }
+
+    @Test
+    public void testVideoAppsAreFiltered() throws Exception {
+        addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_VIDEO);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).getVideoAppsSize()).isEqualTo(11L);
+        assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(0L);
+    }
+
+    @Test
+    public void testRemovedPackageDoesNotCrash() throws Exception {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = PACKAGE_NAME_1;
+        info.category = ApplicationInfo.CATEGORY_UNDEFINED;
+        mInfo.add(info);
+        when(mSource.getStatsForPackage(any(), anyString(), any(UserHandle.class)))
+                .thenThrow(new NameNotFoundException());
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        // Should not crash.
+    }
+
+    @Test
+    public void testPackageIsNotDoubleCounted() throws Exception {
+        UserInfo info = new UserInfo();
+        info.id = SECONDARY_USER_ID;
+        mUsers.add(info);
+        when(mSource.getExternalStorageStats(anyString(), eq(UserHandle.SYSTEM)))
+                .thenReturn(new StorageStatsSource.ExternalStorageStats(9, 2, 3, 4, 0));
+        when(mSource.getExternalStorageStats(anyString(), eq(new UserHandle(SECONDARY_USER_ID))))
+                .thenReturn(new StorageStatsSource.ExternalStorageStats(10, 3, 3, 4, 0));
+        addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_VIDEO);
+        ArrayList<ApplicationInfo> secondaryUserApps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.packageName = PACKAGE_NAME_1;
+        appInfo.category = ApplicationInfo.CATEGORY_VIDEO;
+        secondaryUserApps.add(appInfo);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(2);
+        assertThat(result.get(PRIMARY_USER_ID).getVideoAppsSize()).isEqualTo(11L);
+        // No code size for the second user.
+        assertThat(result.get(SECONDARY_USER_ID).getVideoAppsSize()).isEqualTo(10L);
+    }
+
+    @Test
+    public void testCacheOveragesAreCountedAsFree() throws Exception {
+        addPackage(PACKAGE_NAME_1, DEFAULT_QUOTA + 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).getOtherAppsSize()).isEqualTo(DEFAULT_QUOTA + 11);
+    }
+
+    private ApplicationInfo addPackage(String packageName, long cacheSize, long codeSize,
+            long dataSize, int category) throws Exception {
+        StorageStats stats = new StorageStats();
+        stats.codeBytes = codeSize;
+        stats.dataBytes = dataSize + cacheSize;
+        stats.cacheBytes = cacheSize;
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+
+        when(mSource.getStatsForPackage(any(), anyString(), any(UserHandle.class)))
+                .thenReturn(storageStats);
+
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = packageName;
+        info.category = category;
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.applicationInfo = info;
+        packageInfo.packageName = packageName;
+        getShadowApplicationManager().addPackage(packageInfo);
+        return info;
+    }
+
+    private ShadowApplicationPackageManager getShadowApplicationManager() {
+        return Shadow.extract(mContext.getPackageManager());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
new file mode 100644
index 0000000..81e6048
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageFileCategoryPreferenceControllerTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static android.os.storage.VolumeInfo.MOUNT_FLAG_PRIMARY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.os.storage.VolumeInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowStorageManagerVolumeProvider;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+/** Unit test for {@link StorageFileCategoryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowStorageManagerVolumeProvider.class, ShadowCarUserManagerHelper.class})
+public class StorageFileCategoryPreferenceControllerTest {
+
+    private static final int TEST_USER = 10;
+
+    private Context mContext;
+    private ProgressBarPreference mProgressBarPreference;
+    private StorageFileCategoryPreferenceController mController;
+    private PreferenceControllerTestHelper<StorageFileCategoryPreferenceController>
+            mPreferenceControllerHelper;
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        mProgressBarPreference = new ProgressBarPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                StorageFileCategoryPreferenceController.class, mProgressBarPreference);
+        mController = mPreferenceControllerHelper.getController();
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(TEST_USER);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowStorageManagerVolumeProvider.reset();
+    }
+
+    @Test
+    public void handlePreferenceClicked_currentUser_startNewActivity() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
+        volumeInfo.mountFlags = MOUNT_FLAG_PRIMARY;
+        ShadowStorageManagerVolumeProvider.setVolumeInfo(volumeInfo);
+
+        mProgressBarPreference.performClick();
+        ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(mContext).startActivityAsUser(argumentCaptor.capture(), nullable(UserHandle.class));
+
+        Intent intent = argumentCaptor.getValue();
+        Intent browseIntent = volumeInfo.buildBrowseIntent();
+        assertThat(intent.getAction()).isEqualTo(browseIntent.getAction());
+        assertThat(intent.getData()).isEqualTo(browseIntent.getData());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
new file mode 100644
index 0000000..1bd79b0
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryDetailPreferenceControllerTest.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+
+/** Unit test for {@link StorageMediaCategoryDetailPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageMediaCategoryDetailPreferenceControllerTest {
+
+    private static final String SOURCE = "source";
+    private static final int UID = 12;
+    private static final long EXTRA_AUDIO_BYTES = 100;
+    private static final String LABEL = "label";
+    private static final String SIZE_STR = "12.34 MB";
+    private static final String PACKAGE_NAME = "com.google.packageName";
+
+    private Context mContext;
+    private LogicalPreferenceGroup mLogicalPreferenceGroup;
+    private StorageMediaCategoryDetailPreferenceController mController;
+    private PreferenceControllerTestHelper<StorageMediaCategoryDetailPreferenceController>
+            mPreferenceControllerHelper;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mLogicalPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                StorageMediaCategoryDetailPreferenceController.class, mLogicalPreferenceGroup);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void refreshUi_defaultInitialize_hasNoPreference() {
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void onDataLoaded_addPreference_hasTwoPreferences() {
+        ArrayList<ApplicationsState.AppEntry> apps = new ArrayList<>();
+        ApplicationInfo appInfo = new ApplicationInfo();
+        appInfo.uid = UID;
+        appInfo.sourceDir = SOURCE;
+
+        ApplicationsState.AppEntry appEntry = new ApplicationsState.AppEntry(mContext, appInfo,
+                1234L);
+        appEntry.label = LABEL;
+        appEntry.sizeStr = SIZE_STR;
+        appEntry.icon = mContext.getDrawable(R.drawable.test_icon);
+        appEntry.info.packageName = PACKAGE_NAME;
+        apps.add(appEntry);
+
+        mController.setExternalAudioBytes(EXTRA_AUDIO_BYTES);
+        mController.onDataLoaded(apps);
+        // even when the manager notifies the controller again on data loaded the preference
+        // count should remain the same if new appEntries are not added.
+        mController.onDataLoaded(apps);
+
+        assertThat(mLogicalPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getTitle()).isEqualTo(LABEL);
+        assertThat(mLogicalPreferenceGroup.getPreference(0).getSummary()).isEqualTo(SIZE_STR);
+
+        assertThat(mLogicalPreferenceGroup.getPreference(1).getTitle()).isEqualTo(
+                mContext.getString(R.string.storage_audio_files_title));
+        assertThat(mLogicalPreferenceGroup.getPreference(1).getSummary()).isEqualTo(
+                Long.toString(EXTRA_AUDIO_BYTES));
+    }
+
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
new file mode 100644
index 0000000..a91ca10
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageMediaCategoryPreferenceControllerTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ProgressBarPreference;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+/** Unit test for {@link StorageMediaCategoryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageMediaCategoryPreferenceControllerTest {
+
+    @Test
+    public void handlePreferenceClicked_shouldLaunchAccountSyncDetailsFragment() {
+        Context context = RuntimeEnvironment.application;
+        ProgressBarPreference progressBarPreference = new ProgressBarPreference(context);
+        PreferenceControllerTestHelper<StorageMediaCategoryPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(context,
+                        StorageMediaCategoryPreferenceController.class, progressBarPreference);
+        FragmentController mMockFragmentController = helper.getMockFragmentController();
+        helper.markState(Lifecycle.State.CREATED);
+
+        progressBarPreference.performClick();
+
+        verify(mMockFragmentController).launchFragment(
+                any(StorageMediaCategoryDetailFragment.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
new file mode 100644
index 0000000..4174d07
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageSettingsManagerTest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.storage.VolumeInfo;
+import android.util.SparseArray;
+
+import androidx.loader.app.LoaderManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.settingslib.deviceinfo.PrivateStorageInfo;
+import com.android.settingslib.deviceinfo.StorageVolumeProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+/** Unit test for {@link StorageSettingsManager}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageSettingsManagerTest {
+
+    private Context mContext;
+    private VolumeInfo mVolumeInfo;
+    private StorageSettingsManager mStorageSettingsManager;
+    @Captor
+    private ArgumentCaptor<LoaderManager
+            .LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>>> mAppsStorageResult;
+    @Captor
+    private ArgumentCaptor<LoaderManager.LoaderCallbacks<PrivateStorageInfo>> mVolumeSizeCallback;
+
+    @Mock
+    private StorageSettingsManager.VolumeListener mVolumeListener1;
+
+    @Mock
+    private StorageSettingsManager.VolumeListener mVolumeListener2;
+
+    @Mock
+    private LoaderManager mLoaderManager;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mStorageSettingsManager = new StorageSettingsManager(mContext, mVolumeInfo);
+        mStorageSettingsManager.startLoading(mLoaderManager);
+        verify(mLoaderManager, times(1)).restartLoader(eq(0), eq(Bundle.EMPTY),
+                mAppsStorageResult.capture());
+        verify(mLoaderManager, times(1)).restartLoader(eq(1), eq(Bundle.EMPTY),
+                mVolumeSizeCallback.capture());
+    }
+
+    @Test
+    public void volumeSizeCallback_onLoadFinished_listenerOnSizeCalculatedCalled()
+            throws Exception {
+        mStorageSettingsManager.registerListener(mVolumeListener1);
+        mStorageSettingsManager.registerListener(mVolumeListener2);
+
+        StorageVolumeProvider storageVolumeProvider = mock(StorageVolumeProvider.class);
+        when(storageVolumeProvider.getTotalBytes(any(), any())).thenReturn(10000L);
+        when(storageVolumeProvider.getFreeBytes(any(), any())).thenReturn(1000L);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> data = new SparseArray<>();
+        mAppsStorageResult.getValue().onLoadFinished(null, data);
+
+        PrivateStorageInfo storageInfo = new VolumeSizesLoader(mContext, storageVolumeProvider,
+                null, mVolumeInfo).loadInBackground();
+
+        mVolumeSizeCallback.getValue().onLoadFinished(null, storageInfo);
+
+        verify(mVolumeListener1, times(1)).onDataLoaded(data, 9000L, 10000L);
+        verify(mVolumeListener2, times(1)).onDataLoaded(data, 9000L, 10000L);
+    }
+
+    @Test
+    public void appsStorageResult_unregisterListener_onlyOneListenerOnDataLoadedCalled()
+            throws Exception {
+        mStorageSettingsManager.registerListener(mVolumeListener1);
+        mStorageSettingsManager.registerListener(mVolumeListener2);
+        mStorageSettingsManager.unregisterlistener(mVolumeListener2);
+        SparseArray<StorageAsyncLoader.AppsStorageResult> data = new SparseArray<>();
+        mAppsStorageResult.getValue().onLoadFinished(null, data);
+
+        StorageVolumeProvider storageVolumeProvider = mock(StorageVolumeProvider.class);
+        when(storageVolumeProvider.getTotalBytes(any(), any())).thenReturn(10000L);
+        when(storageVolumeProvider.getFreeBytes(any(), any())).thenReturn(1000L);
+
+        PrivateStorageInfo storageInfo = new VolumeSizesLoader(mContext, storageVolumeProvider,
+                null, mVolumeInfo).loadInBackground();
+
+        mVolumeSizeCallback.getValue().onLoadFinished(null, storageInfo);
+
+        verify(mVolumeListener1, times(1)).onDataLoaded(data, 9000L, 10000L);
+        verify(mVolumeListener2, never()).onDataLoaded(data, 9000L, 10000L);
+    }
+
+    @Test
+    public void onReceivedSizes_storageResultNotLoaded_noListenersCalled()
+            throws Exception {
+        mStorageSettingsManager.registerListener(mVolumeListener1);
+        mStorageSettingsManager.registerListener(mVolumeListener2);
+        SparseArray<StorageAsyncLoader.AppsStorageResult> data = new SparseArray<>();
+
+        StorageVolumeProvider storageVolumeProvider = mock(StorageVolumeProvider.class);
+        when(storageVolumeProvider.getTotalBytes(any(), any())).thenReturn(10000L);
+        when(storageVolumeProvider.getFreeBytes(any(), any())).thenReturn(1000L);
+
+        PrivateStorageInfo storageInfo = new VolumeSizesLoader(mContext, storageVolumeProvider,
+                null, mVolumeInfo).loadInBackground();
+        mVolumeSizeCallback.getValue().onLoadFinished(null, storageInfo);
+
+        verify(mVolumeListener1, never()).onDataLoaded(data, 9000L, 10000L);
+        verify(mVolumeListener2, never()).onDataLoaded(data, 9000L, 10000L);
+    }
+
+    @Test
+    public void onReceivedSizes_volumeSizeNotLoaded_noListenersCalled()
+            throws Exception {
+        mStorageSettingsManager.registerListener(mVolumeListener1);
+        mStorageSettingsManager.registerListener(mVolumeListener2);
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> data = new SparseArray<>();
+        mAppsStorageResult.getValue().onLoadFinished(null, data);
+
+        StorageVolumeProvider storageVolumeProvider = mock(StorageVolumeProvider.class);
+        when(storageVolumeProvider.getTotalBytes(any(), any())).thenReturn(10000L);
+        when(storageVolumeProvider.getFreeBytes(any(), any())).thenReturn(1000L);
+
+        PrivateStorageInfo storageInfo = new VolumeSizesLoader(mContext, storageVolumeProvider,
+                null, mVolumeInfo).loadInBackground();
+
+        verify(mVolumeListener1, never()).onDataLoaded(data, 9000L, 10000L);
+        verify(mVolumeListener2, never()).onDataLoaded(data, 9000L, 10000L);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
new file mode 100644
index 0000000..bc63120
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageSizeBasePreferenceControllerTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import android.app.usage.StorageStats;
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.applications.StorageStatsSource;
+
+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;
+
+/** Unit test for {@link StorageSizeBasePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageSizeBasePreferenceControllerTest {
+
+    private StorageAppDetailPreference mStorageAppDetailPreference;
+    private TestStorageSizeBasePreferenceController mController;
+    private PreferenceControllerTestHelper<TestStorageSizeBasePreferenceController>
+            mPreferenceControllerHelper;
+
+    @Mock
+    private AppsStorageStatsManager mAppsStorageStatsManager;
+
+    private static class TestStorageSizeBasePreferenceController extends
+            StorageSizeBasePreferenceController {
+
+        TestStorageSizeBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected long getSize() {
+            return 1_000_000_000;
+        }
+    }
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        mStorageAppDetailPreference = new StorageAppDetailPreference(context);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                TestStorageSizeBasePreferenceController.class, mStorageAppDetailPreference);
+        mController = mPreferenceControllerHelper.getController();
+    }
+
+    @Test
+    public void refreshUi_defaultState_nothingIsSet() {
+        assertThat(mStorageAppDetailPreference.getDetailText()).isNull();
+        assertThat(mController.isCachedCleared()).isFalse();
+        assertThat(mController.isDataCleared()).isFalse();
+        assertThat(mController.getAppStorageStats()).isNull();
+    }
+
+    @Test
+    public void setAppsStorageStatsManager_shouldRegisterController() {
+        mController.setAppsStorageStatsManager(mAppsStorageStatsManager);
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+
+        verify(mAppsStorageStatsManager).registerListener(mController);
+    }
+
+    @Test
+    public void onDataLoaded_shouldUpdateCachedAndDataClearedState() {
+        mController.onDataLoaded(null, true, true);
+
+        assertThat(mController.isCachedCleared()).isTrue();
+        assertThat(mController.isDataCleared()).isTrue();
+    }
+
+    @Test
+    public void onDataLoaded_appStorageStatsNotSet_shouldNotUpdateDetailText() {
+        mController.onDataLoaded(null, true, true);
+
+        assertThat(mController.getAppStorageStats()).isNull();
+        assertThat(mStorageAppDetailPreference.getDetailText()).isNull();
+    }
+
+    @Test
+    public void onDataLoaded_appStorageStatsSet_shouldUpdateDetailText() {
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+
+        StorageStats stats = new StorageStats();
+        StorageStatsSource.AppStorageStats storageStats =
+                new StorageStatsSource.AppStorageStatsImpl(stats);
+        mController.setAppStorageStats(storageStats);
+        mController.onDataLoaded(null, true, true);
+
+        assertThat(mController.getAppStorageStats()).isNotNull();
+        assertThat(mStorageAppDetailPreference.getDetailText()).isEqualTo("1.00 GB");
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
new file mode 100644
index 0000000..97e99e0
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageSystemCategoryPreferenceControllerTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.Build;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ProgressBarPreference;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowApplication;
+
+/** Unit test for {@link StorageSystemCategoryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageSystemCategoryPreferenceControllerTest {
+
+    @Test
+    public void handlePreferenceClicked_openAlertDialog() {
+        Context context = RuntimeEnvironment.application;
+        ProgressBarPreference progressBarPreference = new ProgressBarPreference(context);
+        PreferenceControllerTestHelper<StorageSystemCategoryPreferenceController>
+                preferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                StorageSystemCategoryPreferenceController.class, progressBarPreference);
+        preferenceControllerHelper.markState(Lifecycle.State.CREATED);
+        progressBarPreference.performClick();
+
+        ShadowAlertDialog dialog = ShadowApplication.getInstance().getLatestAlertDialog();
+
+        assertThat(dialog.getMessage().toString()).contains(
+                context.getResources().getString(R.string.storage_detail_dialog_system,
+                        Build.VERSION.RELEASE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
new file mode 100644
index 0000000..c44ee03
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageUsageBasePreferenceControllerTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.android.car.settings.storage.FileSizeFormatter.MEGABYTE_IN_BYTES;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.util.SparseArray;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ProgressBarPreference;
+import com.android.settingslib.applications.StorageStatsSource;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+/** Unit test for {@link StorageUsageBasePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageUsageBasePreferenceControllerTest {
+
+    private Context mContext;
+    private ProgressBarPreference mProgressBarPreference;
+    private TestStorageUsageBasePreferenceController mController;
+    private PreferenceControllerTestHelper<TestStorageUsageBasePreferenceController>
+            mPreferenceControllerHelper;
+
+    private static class TestStorageUsageBasePreferenceController extends
+            StorageUsageBasePreferenceController {
+
+        TestStorageUsageBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        public long calculateCategoryUsage(
+                SparseArray<StorageAsyncLoader.AppsStorageResult> result, long usedSizeBytes) {
+            return 1_000_000_000;
+        }
+    }
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mProgressBarPreference = new ProgressBarPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestStorageUsageBasePreferenceController.class, mProgressBarPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void refreshUi_defaultInitialize_hasDefaultSummary() {
+        assertThat(mProgressBarPreference.getSummary().toString())
+                .isEqualTo(mContext.getString(R.string.memory_calculating_size));
+    }
+
+    @Test
+    public void onDataLoaded_setsSummary() {
+        SparseArray<StorageAsyncLoader.AppsStorageResult> results = new SparseArray<>();
+        StorageAsyncLoader.AppsStorageResult result =
+                new StorageAsyncLoader.AppsStorageResult(0, 0, 0, 0, 0);
+        result.setExternalStats(
+                new StorageStatsSource.ExternalStorageStats(
+                        MEGABYTE_IN_BYTES * 500, // total
+                        MEGABYTE_IN_BYTES * 100, // audio
+                        MEGABYTE_IN_BYTES * 150, // video
+                        MEGABYTE_IN_BYTES * 200, 0)); // image
+        results.put(0, result);
+        mController.onDataLoaded(results, 100, 100);
+
+        assertThat(mProgressBarPreference.getSummary().toString()).isEqualTo("1.0 GB");
+    }
+
+    @Test
+    public void onDataLoaded_setProgressBarPercentage() {
+        SparseArray<StorageAsyncLoader.AppsStorageResult> results = new SparseArray<>();
+        StorageAsyncLoader.AppsStorageResult result =
+                new StorageAsyncLoader.AppsStorageResult(0, 0, 0, 0, 0);
+        result.setExternalStats(
+                new StorageStatsSource.ExternalStorageStats(
+                        MEGABYTE_IN_BYTES * 500, // total
+                        MEGABYTE_IN_BYTES * 100, // audio
+                        MEGABYTE_IN_BYTES * 150, // video
+                        MEGABYTE_IN_BYTES * 200, 0)); // image
+        results.put(0, result);
+        mController.onDataLoaded(results, 100, 2_000_000_000);
+        // usage size is half the total size i.e percentage of storage used should be 50.
+        assertThat(mProgressBarPreference.getProgress()).isEqualTo(50);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java b/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java
new file mode 100644
index 0000000..17964d8
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/StorageUtilsTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static android.os.storage.VolumeInfo.STATE_MOUNTED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Unit test for {@link StorageUtils}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class StorageUtilsTest {
+
+    @Mock
+    private StorageManager mStorageManager;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void maybeInitializeVolume_mounted_shouldReturnVolumeInfo() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_PRIVATE, null, "id");
+        volumeInfo.state = STATE_MOUNTED;
+
+        when(mStorageManager.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL)).thenReturn(volumeInfo);
+
+        VolumeInfo expected = StorageUtils.maybeInitializeVolume(mStorageManager, null);
+
+        assertThat(expected).isEqualTo(volumeInfo);
+    }
+
+    @Test
+    public void maybeInitializeVolume_notMounted_shouldNotReturnVolumeInfo() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_PRIVATE, null, "id");
+
+        when(mStorageManager.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL)).thenReturn(volumeInfo);
+
+        VolumeInfo expected = StorageUtils.maybeInitializeVolume(mStorageManager, null);
+
+        assertThat(expected).isNull();
+    }
+
+    @Test
+    public void maybeInitializeVolume_differentType_shouldNotReturnVolumeInfo() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
+
+        when(mStorageManager.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL)).thenReturn(volumeInfo);
+
+        VolumeInfo expected = StorageUtils.maybeInitializeVolume(mStorageManager, null);
+
+        assertThat(expected).isNull();
+    }
+
+    @Test
+    public void maybeInitializeVolume_defaultId_notMounted_returnsNull() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_EMULATED, null, "id");
+        Bundle bundle = new Bundle();
+        when(mStorageManager.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL)).thenReturn(volumeInfo);
+
+        VolumeInfo expected = StorageUtils.maybeInitializeVolume(mStorageManager, bundle);
+
+        assertThat(expected).isNull();
+    }
+
+    @Test
+    public void maybeInitializeVolume_getDefaultIdFromBundle_mounted_shouldReturnVolumeInfo() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_PRIVATE, null, "id");
+        volumeInfo.state = STATE_MOUNTED;
+        Bundle bundle = new Bundle();
+        when(mStorageManager.findVolumeById(VolumeInfo.ID_PRIVATE_INTERNAL)).thenReturn(volumeInfo);
+
+        VolumeInfo expected = StorageUtils.maybeInitializeVolume(mStorageManager, bundle);
+
+        assertThat(expected).isEqualTo(volumeInfo);
+    }
+
+    @Test
+    public void maybeInitializeVolume_getIdFromBundle_shouldReturnVolumeInfo() {
+        VolumeInfo volumeInfo = new VolumeInfo("id", VolumeInfo.TYPE_PRIVATE, null, "id");
+        volumeInfo.state = STATE_MOUNTED;
+        Bundle bundle = new Bundle();
+        bundle.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_EMULATED_INTERNAL);
+        when(mStorageManager.findVolumeById(VolumeInfo.ID_EMULATED_INTERNAL)).thenReturn(
+                volumeInfo);
+
+        VolumeInfo expected = StorageUtils.maybeInitializeVolume(mStorageManager, bundle);
+
+        assertThat(expected).isEqualTo(volumeInfo);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java b/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
new file mode 100644
index 0000000..bd5eb2c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/storage/VolumeSizesLoaderTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.storage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.storage.VolumeInfo;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.settingslib.deviceinfo.PrivateStorageInfo;
+import com.android.settingslib.deviceinfo.StorageVolumeProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+/** Unit test for {@link VolumeSizesLoader}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class VolumeSizesLoaderTest {
+
+    private Context mContext;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @Test
+    public void getVolumeSize_getsValidSizes() throws Exception {
+        VolumeInfo info = mock(VolumeInfo.class);
+        StorageVolumeProvider storageVolumeProvider = mock(StorageVolumeProvider.class);
+        when(storageVolumeProvider.getTotalBytes(any(), any())).thenReturn(10000L);
+        when(storageVolumeProvider.getFreeBytes(any(), any())).thenReturn(1000L);
+
+        PrivateStorageInfo storageInfo = new VolumeSizesLoader(mContext, storageVolumeProvider,
+                null, info).loadInBackground();
+
+        assertThat(storageInfo.freeBytes).isEqualTo(1000L);
+        assertThat(storageInfo.totalBytes).isEqualTo(10000L);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/suggestions/SuggestionPreferenceTest.java b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionPreferenceTest.java
new file mode 100644
index 0000000..cc1478f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionPreferenceTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2018 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.car.settings.suggestions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.graphics.drawable.ShapeDrawable;
+import android.service.settings.suggestions.Suggestion;
+import android.view.View;
+
+import androidx.appcompat.view.ContextThemeWrapper;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+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;
+
+/** Unit test for {@link SuggestionPreference}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class SuggestionPreferenceTest {
+
+    private static final String SUGGESTION_ID = "id";
+
+    @Mock
+    private SuggestionPreference.Callback mCallback;
+    private Suggestion mSuggestion;
+    private PreferenceViewHolder mHolder;
+    private SuggestionPreference mPref;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+
+        mSuggestion = new Suggestion.Builder(SUGGESTION_ID).build();
+        Context themedContext = new ContextThemeWrapper(context, R.style.CarSettingTheme);
+        View rootView = View.inflate(themedContext, R.layout.suggestion_preference, null);
+        mHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+        mPref = new SuggestionPreference(context, mSuggestion, mCallback);
+    }
+
+    @Test
+    public void getSuggestion_returnsSuggestion() {
+        assertThat(mPref.getSuggestion()).isEqualTo(mSuggestion);
+    }
+
+    @Test
+    public void updateSuggestion_updatesPreference() {
+        Icon icon = mock(Icon.class);
+        Drawable iconDrawable = new ShapeDrawable();
+        when(icon.loadDrawable(any(Context.class))).thenReturn(iconDrawable);
+        String title = "title";
+        String summary = "summary";
+        Suggestion updatedSuggestion = new Suggestion.Builder(SUGGESTION_ID).setIcon(icon).setTitle(
+                title).setSummary(summary).build();
+
+        mPref.updateSuggestion(updatedSuggestion);
+
+        assertThat(mPref.getSuggestion()).isEqualTo(updatedSuggestion);
+        assertThat(mPref.getIcon()).isEqualTo(iconDrawable);
+        assertThat(mPref.getTitle()).isEqualTo(title);
+        assertThat(mPref.getSummary()).isEqualTo(summary);
+    }
+
+    @Test
+    public void updateSuggestion_idMismatch_throwsIllegalArgumentException() {
+        Suggestion updatedSuggestion = new Suggestion.Builder(SUGGESTION_ID + "wrong id").build();
+
+        assertThrows(IllegalArgumentException.class,
+                () -> mPref.updateSuggestion(updatedSuggestion));
+    }
+
+    @Test
+    public void getKey_includesSuggestionId() {
+        assertThat(mPref.getKey()).isEqualTo(
+                SuggestionPreference.SUGGESTION_PREFERENCE_KEY + SUGGESTION_ID);
+    }
+
+    @Test
+    public void onClick_callsLaunchSuggestion() {
+        mPref.onBindViewHolder(mHolder);
+
+        mHolder.itemView.performClick();
+
+        verify(mCallback).launchSuggestion(mPref);
+    }
+
+    @Test
+    public void dismissButtonClick_callsDismissSuggestion() {
+        mPref.onBindViewHolder(mHolder);
+
+        mHolder.findViewById(R.id.dismiss_button).performClick();
+
+        verify(mCallback).dismissSuggestion(mPref);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/suggestions/SuggestionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionsPreferenceControllerTest.java
new file mode 100644
index 0000000..6dbb518
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/suggestions/SuggestionsPreferenceControllerTest.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2018 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.car.settings.suggestions;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.testng.Assert.assertThrows;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.service.settings.suggestions.Suggestion;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.loader.app.LoaderManager;
+import androidx.loader.content.Loader;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.suggestions.SuggestionController;
+
+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.util.ReflectionHelpers;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/** Unit test for {@link SuggestionsPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class SuggestionsPreferenceControllerTest {
+
+    private static final Suggestion SUGGESTION_1 = new Suggestion.Builder("1").build();
+    private static final Suggestion SUGGESTION_2 = new Suggestion.Builder("2").build();
+
+    @Mock
+    private LoaderManager mLoaderManager;
+    @Mock
+    private Loader<List<Suggestion>> mLoader;
+    @Mock
+    private SuggestionController mSuggestionController;
+    private Context mContext;
+    private PreferenceGroup mGroup;
+    private PreferenceControllerTestHelper<SuggestionsPreferenceController> mControllerHelper;
+    private SuggestionsPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        mGroup = new PreferenceCategory(mContext);
+
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                SuggestionsPreferenceController.class);
+        mController = mControllerHelper.getController();
+        mController.setLoaderManager(mLoaderManager);
+        ReflectionHelpers.setField(SuggestionsPreferenceController.class, mController,
+                "mSuggestionController", mSuggestionController);
+        mControllerHelper.setPreference(mGroup);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+    }
+
+    @Test
+    public void setPreference_loaderManagerSet_doesNothing() {
+        PreferenceControllerTestHelper<SuggestionsPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        SuggestionsPreferenceController.class);
+        mController = helper.getController();
+        mController.setLoaderManager(mLoaderManager);
+
+        helper.setPreference(new PreferenceCategory(mContext));
+    }
+
+    @Test
+    public void checkInitialized_nullLoaderManager_throwsIllegalStateException() {
+        PreferenceControllerTestHelper<SuggestionsPreferenceController> helper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        SuggestionsPreferenceController.class);
+
+        assertThrows(IllegalStateException.class,
+                () -> helper.setPreference(new PreferenceCategory(mContext)));
+    }
+
+    @Test
+    public void onStart_noSuggestions_hidesGroup() {
+        assertThat(mGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void onStart_startsSuggestionController() {
+        verify(mSuggestionController).start();
+    }
+
+    @Test
+    public void onStop_stopsSuggestionController() {
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        verify(mSuggestionController).stop();
+    }
+
+    @Test
+    public void onStop_destroysLoader() {
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        verify(mLoaderManager).destroyLoader(SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS);
+    }
+
+    @Test
+    public void onServiceConnected_restartsLoader() {
+        mController.onServiceConnected();
+
+        verify(mLoaderManager).restartLoader(
+                SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS, /* args= */ null, mController);
+    }
+
+    @Test
+    public void onServiceDisconnected_destroysLoader() {
+        mController.onServiceDisconnected();
+
+        verify(mLoaderManager).destroyLoader(SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS);
+    }
+
+    @Test
+    public void onCreateLoader_returnsSettingsSuggestionsLoader() {
+        assertThat(mController.onCreateLoader(
+                SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS, /* args= */ null)).isInstanceOf(
+                SettingsSuggestionsLoader.class);
+    }
+
+    @Test
+    public void onCreateLoader_unsupportedId_throwsIllegalArgumentException() {
+        assertThrows(IllegalArgumentException.class, () -> mController.onCreateLoader(
+                SettingsSuggestionsLoader.LOADER_ID_SUGGESTIONS + 1000, /* args= */ null));
+    }
+
+    @Test
+    public void onLoadFinished_groupContainsSuggestionPreference() {
+        mController.onLoadFinished(mLoader, Collections.singletonList(SUGGESTION_1));
+
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(1);
+        Preference addedPref = mGroup.getPreference(0);
+        assertThat(addedPref).isInstanceOf(SuggestionPreference.class);
+    }
+
+    @Test
+    public void onLoadFinished_newSuggestion_addsToGroup() {
+        mController.onLoadFinished(mLoader, Collections.singletonList(SUGGESTION_1));
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(1);
+
+        mController.onLoadFinished(mLoader, Arrays.asList(SUGGESTION_1, SUGGESTION_2));
+
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void onLoadFinished_removedSuggestion_removesFromGroup() {
+        mController.onLoadFinished(mLoader, Arrays.asList(SUGGESTION_1, SUGGESTION_2));
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(2);
+
+        mController.onLoadFinished(mLoader, Collections.singletonList(SUGGESTION_2));
+
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(((SuggestionPreference) mGroup.getPreference(0)).getSuggestion()).isEqualTo(
+                SUGGESTION_2);
+    }
+
+    @Test
+    public void onLoadFinished_noSuggestions_hidesGroup() {
+        mController.onLoadFinished(mLoader, Collections.singletonList(SUGGESTION_1));
+        assertThat(mGroup.isVisible()).isTrue();
+
+        mController.onLoadFinished(mLoader, Collections.emptyList());
+
+        assertThat(mGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void launchSuggestion_sendsPendingIntent() throws PendingIntent.CanceledException {
+        PendingIntent pendingIntent = mock(PendingIntent.class);
+        Suggestion suggestion = new Suggestion.Builder("1").setPendingIntent(pendingIntent).build();
+        SuggestionPreference preference = new SuggestionPreference(mContext,
+                suggestion, /* callback= */ null);
+
+        mController.launchSuggestion(preference);
+
+        verify(pendingIntent).send();
+    }
+
+    @Test
+    public void launchSuggestion_callsSuggestionControllerLaunch() {
+        PendingIntent pendingIntent = mock(PendingIntent.class);
+        Suggestion suggestion = new Suggestion.Builder("1").setPendingIntent(pendingIntent).build();
+        SuggestionPreference preference = new SuggestionPreference(mContext,
+                suggestion, /* callback= */ null);
+
+        mController.launchSuggestion(preference);
+
+        verify(mSuggestionController).launchSuggestion(suggestion);
+    }
+
+    @Test
+    public void dismissSuggestion_removesSuggestion() {
+        mController.onLoadFinished(mLoader, Arrays.asList(SUGGESTION_1, SUGGESTION_2));
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(2);
+        SuggestionPreference pref = (SuggestionPreference) mGroup.getPreference(0);
+
+        mController.dismissSuggestion(pref);
+
+        assertThat(mGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(((SuggestionPreference) mGroup.getPreference(0)).getSuggestion()).isEqualTo(
+                SUGGESTION_2);
+    }
+
+    @Test
+    public void dismissSuggestion_lastSuggestion_hidesGroup() {
+        mController.onLoadFinished(mLoader, Collections.singletonList(SUGGESTION_1));
+        SuggestionPreference pref = (SuggestionPreference) mGroup.getPreference(0);
+
+        mController.dismissSuggestion(pref);
+
+        assertThat(mGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void dismissSuggestion_callsSuggestionControllerDismiss() {
+        mController.onLoadFinished(mLoader, Collections.singletonList(SUGGESTION_1));
+        SuggestionPreference pref = (SuggestionPreference) mGroup.getPreference(0);
+
+        mController.dismissSuggestion(pref);
+
+        verify(mSuggestionController).dismissSuggestions(pref.getSuggestion());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
new file mode 100644
index 0000000..ade3c89
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/BluetoothMacAddressPreferenceControllerTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static android.content.pm.PackageManager.FEATURE_BLUETOOTH;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowBluetoothPan;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link BluetoothMacAddressPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothPan.class})
+public class BluetoothMacAddressPreferenceControllerTest {
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<BluetoothMacAddressPreferenceController>
+            mControllerHelper;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        // Construct controller.
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+            BluetoothMacAddressPreferenceController.class, mPreference);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBluetoothAdapter.reset();
+    }
+
+    @Test
+    public void refreshUi_setsAddress() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+
+        // Make sure controller is available.
+        BluetoothAdapter.getDefaultAdapter().enable();
+        getShadowBluetoothAdapter().setState(BluetoothAdapter.STATE_ON);
+
+        String address = "address";
+        getShadowBluetoothAdapter().setAddress(address);
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreference.getSummary()).isEqualTo(address);
+    }
+
+    @Test
+    public void getAvailabilityStatus_featureBluetooth_unsupportedOnDevice() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ false);
+
+        assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_enableDefaultAdapter_available() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                FEATURE_BLUETOOTH, /* supported= */ true);
+
+        assertThat(mControllerHelper.getController().getAvailabilityStatus()).isEqualTo(
+                AVAILABLE);
+    }
+
+    private ShadowBluetoothAdapter getShadowBluetoothAdapter() {
+        return (ShadowBluetoothAdapter) Shadow.extract(BluetoothAdapter.getDefaultAdapter());
+    }
+}
+
diff --git a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
new file mode 100644
index 0000000..f9e9a6c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.development.DevelopmentSettingsUtil;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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 org.robolectric.shadows.ShadowToast;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class BuildNumberPreferenceControllerTest {
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<BuildNumberPreferenceController>
+            mPreferenceControllerHelper;
+    private BuildNumberPreferenceController mController;
+    private Preference mPreference;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                BuildNumberPreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+
+        // By default, user is an admin user.
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+
+        // By default, no restrictions on debugging features.
+        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(new UserInfo());
+        when(mCarUserManagerHelper.hasUserRestriction(eq(UserManager.DISALLOW_DEBUGGING_FEATURES),
+                any(UserInfo.class))).thenReturn(false);
+
+        // By default device is provisioned.
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+
+        // By default development settings is disabled.
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_notProvisioned_returnFalse() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0);
+        assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_nonAdmin_returnFalse() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+
+        assertThat(mController.handlePreferenceClicked(mPreference)).isFalse();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_demoUser_returnsTrue() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+
+        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_adminUser_returnsTrue() {
+        assertThat(mController.handlePreferenceClicked(mPreference)).isTrue();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_devSettingsDisabled_firstClick_noToast() {
+        mPreference.performClick();
+        assertThat(ShadowToast.shownToastCount()).isEqualTo(0);
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_devSettingsDisabled_someClicks_showToast() {
+        for (int i = 0; i < getTapsToShowToast(); i++) {
+            mPreference.performClick();
+        }
+
+        int remainingClicks = getTapsToBecomeDeveloper() - getTapsToShowToast();
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getResources().getQuantityString(R.plurals.show_dev_countdown,
+                        remainingClicks, remainingClicks));
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_devSettingsDisabled_allClicks_showDevEnabledToast() {
+        for (int i = 0; i < getTapsToBecomeDeveloper(); i++) {
+            mPreference.performClick();
+        }
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.show_dev_on));
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_devSettingsDisabled_allClicks_devSettingsEnabled() {
+        for (int i = 0; i < getTapsToBecomeDeveloper(); i++) {
+            mPreference.performClick();
+        }
+        assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
+                mCarUserManagerHelper)).isTrue();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_devSettingsDisabled_extraClicks_noAlreadyDevToast() {
+        int extraClicks = 100;
+        for (int i = 0; i < getTapsToBecomeDeveloper() + extraClicks; i++) {
+            mPreference.performClick();
+        }
+        assertThat(
+                ShadowToast.showedToast(mContext.getString(R.string.show_dev_already))).isFalse();
+    }
+
+    @Test
+    public void testHandlePreferenceClicked_devSettingsEnabled_click_showAlreadyDevToast() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
+        mPreference.performClick();
+        assertThat(ShadowToast.showedToast(mContext.getString(R.string.show_dev_already))).isTrue();
+    }
+
+    private int getTapsToBecomeDeveloper() {
+        return mContext.getResources().getInteger(R.integer.enable_developer_settings_click_count);
+    }
+
+    private int getTapsToShowToast() {
+        return mContext.getResources().getInteger(
+                R.integer.enable_developer_settings_clicks_to_show_toast_count);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..6f3a29b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class DeveloperOptionsEntryPreferenceControllerTest {
+
+    private Context mContext;
+    private DeveloperOptionsEntryPreferenceController mController;
+    private UserInfo mUserInfo;
+    @Mock
+    private CarUserManagerHelper mShadowCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mShadowCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mController = new PreferenceControllerTestHelper<>(mContext,
+                DeveloperOptionsEntryPreferenceController.class,
+                new Preference(mContext)).getController();
+
+        // Setup admin user who is able to enable developer settings.
+        mUserInfo = new UserInfo();
+        when(mShadowCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        when(mShadowCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+        when(mShadowCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(mUserInfo);
+        new CarUserManagerHelper(mContext).setUserRestriction(mUserInfo,
+                UserManager.DISALLOW_DEBUGGING_FEATURES, false);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testGetAvailabilityStatus_devOptionsEnabled_isAvailable() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void testGetAvailabilityStatus_devOptionsDisabled_isUnavailable() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void testGetAvailabilityStatus_devOptionsEnabled_hasUserRestriction_isUnavailable() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+        new CarUserManagerHelper(mContext).setUserRestriction(mUserInfo,
+                UserManager.DISALLOW_DEBUGGING_FEATURES, true);
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
new file mode 100644
index 0000000..9f582a2
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.os.UserManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowAccountManager;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserManager;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+/** Unit test for {@link MasterClearAccountsPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class,
+        ShadowAccountManager.class})
+public class MasterClearAccountsPreferenceControllerTest {
+
+    private static final int USER_ID = 111;
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private PreferenceControllerTestHelper<MasterClearAccountsPreferenceController>
+            mControllerHelper;
+    private MasterClearAccountsPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
+
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new PreferenceCategory(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                MasterClearAccountsPreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
+    }
+
+    @Test
+    public void onCreate_addsTitlePreference() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getTitle()).isEqualTo(
+                mContext.getString(R.string.master_clear_accounts));
+    }
+
+    @Test
+    public void refreshUi_accountsPresent_showsGroup() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        getShadowUserManager().addProfile(USER_ID, USER_ID,
+                String.valueOf(USER_ID), /* profileFlags= */ 0);
+        addAccountAndDescription(USER_ID, "accountName");
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_noAccountsPresent_hidesGroup() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        getShadowUserManager().addProfile(USER_ID, USER_ID,
+                String.valueOf(USER_ID), /* profileFlags= */ 0);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_multipleProfiles_showsAllAccounts() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        int profileId1 = 112;
+        getShadowUserManager().addProfile(USER_ID, profileId1,
+                String.valueOf(profileId1), /* profileFlags= */ 0);
+        String accountName1 = "accountName1";
+        addAccountAndDescription(profileId1, accountName1);
+
+        int profileId2 = 113;
+        getShadowUserManager().addProfile(USER_ID, profileId2,
+                String.valueOf(profileId2), /* profileFlags= */ 0);
+        String accountName2 = "accountName2";
+        addAccountAndDescription(profileId2, accountName2);
+
+        mController.refreshUi();
+
+        // Title + two profiles with one account each.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+        assertThat(mPreferenceGroup.getPreference(1).getTitle()).isEqualTo(accountName1);
+        assertThat(mPreferenceGroup.getPreference(2).getTitle()).isEqualTo(accountName2);
+    }
+
+    @Test
+    public void refreshUi_missingAccountDescription_skipsAccount() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        getShadowUserManager().addProfile(USER_ID, USER_ID,
+                String.valueOf(USER_ID), /* profileFlags= */ 0);
+        addAccountAndDescription(USER_ID, "account name with desc");
+        String accountNameNoDesc = "account name no desc";
+        getShadowAccountManager().addAccountAsUser(USER_ID,
+                new Account(accountNameNoDesc, accountNameNoDesc + "_type"));
+
+        mController.refreshUi();
+
+        // Title + one account with valid description.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+        assertThat(mPreferenceGroup.getPreference(1).getTitle()).isNotEqualTo(accountNameNoDesc);
+    }
+
+    @Test
+    public void refreshUi_accountAdded_addsPreferenceToGroup() {
+        getShadowUserManager().addProfile(USER_ID, USER_ID,
+                String.valueOf(USER_ID), /* profileFlags= */ 0);
+        addAccountAndDescription(USER_ID, "accountName");
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        String addedAccountName = "added account name";
+        addAccountAndDescription(USER_ID, addedAccountName);
+        mController.refreshUi();
+
+        // Title + one already present account + one newly added account.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+        assertThat(mPreferenceGroup.getPreference(2).getTitle()).isEqualTo(addedAccountName);
+    }
+
+    @Test
+    public void refreshUi_accountRemoved_removesPreferenceFromGroup() {
+        getShadowUserManager().addProfile(USER_ID, USER_ID,
+                String.valueOf(USER_ID), /* profileFlags= */ 0);
+        String accountNameToRemove = "account name to remove";
+        addAccountAndDescription(USER_ID, accountNameToRemove);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+
+        getShadowAccountManager().removeAllAccounts();
+        mController.refreshUi();
+
+        // Title only, all accounts removed.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1);
+        assertThat(mPreferenceGroup.getPreference(0).getTitle()).isNotEqualTo(accountNameToRemove);
+    }
+
+    private void addAccountAndDescription(int profileId, String accountName) {
+        String type = accountName + "_type";
+        getShadowAccountManager().addAccountAsUser(profileId, new Account(accountName, type));
+        getShadowAccountManager().addAuthenticatorAsUser(profileId,
+                new AuthenticatorDescription(type, "packageName", /* labelId= */ 0, /* iconId= */
+                        0, /* smallIconId= */ 0, /* prefId= */ 0));
+    }
+
+    private ShadowUserManager getShadowUserManager() {
+        return Shadow.extract(UserManager.get(mContext));
+    }
+
+    private ShadowAccountManager getShadowAccountManager() {
+        return Shadow.extract(AccountManager.get(mContext));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearConfirmFragmentTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearConfirmFragmentTest.java
new file mode 100644
index 0000000..5ed62ea
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearConfirmFragmentTest.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.service.oemlock.OemLockManager;
+import android.service.persistentdata.PersistentDataBlockManager;
+import android.widget.Button;
+
+import androidx.preference.PreferenceManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+
+import org.junit.After;
+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.shadows.ShadowApplication;
+
+/** Unit test for {@link MasterClearConfirmFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class MasterClearConfirmFragmentTest {
+
+    @Mock
+    private PersistentDataBlockManager mPersistentDataBlockManager;
+    @Mock
+    private OemLockManager mOemLockManager;
+
+    private Context mContext;
+    private MasterClearConfirmFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        // Note: this is not a general pattern to follow for other use cases! Most system
+        // services can be mocked using Shadows!
+        // Because these services are conditionally included in Android's SystemServiceRegistry
+        // and are not created in ShadowServiceManager, there is no way to conventionally shadow
+        // them in Robolectric.
+        ShadowApplication.getInstance().setSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE,
+                mPersistentDataBlockManager);
+        ShadowApplication.getInstance().setSystemService(Context.OEM_LOCK_SERVICE, mOemLockManager);
+
+        mFragment = FragmentController.of(new MasterClearConfirmFragment()).setup();
+
+        // Default to not provisioned.
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+                0);
+    }
+
+    @After
+    public void tearDown() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+                0);
+    }
+
+    @Test
+    public void confirmClicked_sendsResetIntent() {
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
+        assertThat(resetIntent.getPackage()).isEqualTo("android");
+        assertThat(resetIntent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND).isEqualTo(
+                Intent.FLAG_RECEIVER_FOREGROUND);
+        assertThat(resetIntent.getExtras().getString(Intent.EXTRA_REASON)).isEqualTo(
+                "MasterClearConfirm");
+    }
+
+    @Test
+    public void confirmClicked_resetEsimFalse_resetIntentReflectsChoice() {
+        PreferenceManager.getDefaultSharedPreferences(mContext).edit().putBoolean(
+                mContext.getString(R.string.pk_master_clear_reset_esim), false).commit();
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(resetIntent.getExtras().getBoolean(Intent.EXTRA_WIPE_ESIMS)).isEqualTo(false);
+    }
+
+    @Test
+    public void confirmClicked_pdbManagerNull_sendsResetIntent() {
+        ShadowApplication.getInstance().removeSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
+    }
+
+    @Test
+    public void confirmClicked_oemUnlockAllowed_doesNotWipePdb() {
+        when(mOemLockManager.isOemUnlockAllowed()).thenReturn(true);
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        verify(mPersistentDataBlockManager, never()).wipe();
+    }
+
+    @Test
+    public void confirmClicked_oemUnlockAllowed_sendsResetIntent() {
+        when(mOemLockManager.isOemUnlockAllowed()).thenReturn(true);
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
+    }
+
+    @Test
+    public void confirmClicked_noOemUnlockAllowed_notProvisioned_doesNotWipePdb() {
+        when(mOemLockManager.isOemUnlockAllowed()).thenReturn(false);
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        verify(mPersistentDataBlockManager, never()).wipe();
+    }
+
+    @Test
+    public void confirmClicked_noOemUnlockAllowed_notProvisioned_sendsResetIntent() {
+        when(mOemLockManager.isOemUnlockAllowed()).thenReturn(false);
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
+    }
+
+    @Test
+    public void confirmClicked_noOemUnlockAllowed_provisioned_wipesPdb() {
+        when(mOemLockManager.isOemUnlockAllowed()).thenReturn(false);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+                1);
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        verify(mPersistentDataBlockManager).wipe();
+    }
+
+    @Test
+    public void confirmClicked_noOemUnlockAllowed_provisioned_sendsResetIntent() {
+        when(mOemLockManager.isOemUnlockAllowed()).thenReturn(false);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+                1);
+
+        findMasterClearConfirmButton(mFragment.requireActivity()).performClick();
+
+        Intent resetIntent = ShadowApplication.getInstance().getBroadcastIntents().get(0);
+        assertThat(resetIntent.getAction()).isEqualTo(Intent.ACTION_FACTORY_RESET);
+    }
+
+    private Button findMasterClearConfirmButton(Activity activity) {
+        return activity.findViewById(R.id.action_button1);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..0843a59
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearEntryPreferenceControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static android.os.UserManager.DISALLOW_FACTORY_RESET;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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;
+
+/** Unit test for {@link MasterClearEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class MasterClearEntryPreferenceControllerTest {
+
+    private Context mContext;
+    private MasterClearEntryPreferenceController mController;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+
+        mController = new PreferenceControllerTestHelper<>(mContext,
+                MasterClearEntryPreferenceController.class,
+                new Preference(mContext)).getController();
+    }
+
+    @After
+    public void tearDown() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_DEMO_MODE, 0);
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_nonAdminUser_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_adminUser_available() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_adminUser_restricted_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_FACTORY_RESET)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_demoMode_demoUser_available() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_DEMO_MODE, 1);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_demoMode_demoUser_restricted_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_FACTORY_RESET)).thenReturn(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_DEMO_MODE, 1);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
new file mode 100644
index 0000000..10bbddf
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static android.app.Activity.RESULT_CANCELED;
+import static android.app.Activity.RESULT_OK;
+
+import static com.android.car.settings.system.MasterClearFragment.CHECK_LOCK_REQUEST_CODE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.widget.Button;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.security.CheckLockActivity;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.Collections;
+
+/** Unit test for {@link MasterClearFragment}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
+public class MasterClearFragmentTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    private MasterClearFragment mFragment;
+
+    @Before
+    public void setUp() {
+        // Setup needed by instantiated PreferenceControllers.
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Shadows.shadowOf(context.getPackageManager())
+                .setSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true);
+        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(Collections.emptyList());
+
+        mFragment = FragmentController.of(new MasterClearFragment()).setup();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
+    }
+
+    @Test
+    public void masterClearButtonClicked_launchesCheckLockActivity() {
+        findMasterClearButton(mFragment.requireActivity()).performClick();
+
+        Intent startedIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(startedIntent.getComponent().getClassName()).isEqualTo(
+                CheckLockActivity.class.getName());
+    }
+
+    @Test
+    public void processActivityResult_resultOk_launchesMasterClearConfirmFragment() {
+        mFragment.processActivityResult(CHECK_LOCK_REQUEST_CODE, RESULT_OK, /* data= */ null);
+
+        Fragment launchedFragment = mFragment.getFragmentManager().findFragmentById(
+                R.id.fragment_container);
+
+        assertThat(launchedFragment).isInstanceOf(MasterClearConfirmFragment.class);
+    }
+
+    @Test
+    public void processActivityResult_otherResultCode_doesNothing() {
+        mFragment.processActivityResult(CHECK_LOCK_REQUEST_CODE, RESULT_CANCELED, /* data= */ null);
+
+        Fragment launchedFragment = mFragment.getFragmentManager().findFragmentById(
+                R.id.fragment_container);
+
+        assertThat(launchedFragment).isInstanceOf(MasterClearFragment.class);
+    }
+
+    private Button findMasterClearButton(Activity activity) {
+        return activity.findViewById(R.id.action_button1);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceControllerTest.java
new file mode 100644
index 0000000..f6639a9
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearOtherUsersPresentPreferenceControllerTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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 java.util.Collections;
+
+/** Unit test for {@link MasterClearOtherUsersPresentPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class MasterClearOtherUsersPresentPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private Preference mPreference;
+    private MasterClearOtherUsersPresentPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+
+        Context context = RuntimeEnvironment.application;
+        mPreference = new Preference(context);
+        PreferenceControllerTestHelper<MasterClearOtherUsersPresentPreferenceController>
+                controllerHelper = new PreferenceControllerTestHelper<>(context,
+                MasterClearOtherUsersPresentPreferenceController.class, mPreference);
+        controllerHelper.markState(Lifecycle.State.STARTED);
+        mController = controllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void refreshUi_noSwitchableUsers_hidesPreference() {
+        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(Collections.emptyList());
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_switchableUsers_showsPreference() {
+        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+                Collections.singletonList(new UserInfo()));
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearResetEsimPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearResetEsimPreferenceControllerTest.java
new file mode 100644
index 0000000..cd16313
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearResetEsimPreferenceControllerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.provider.Settings;
+
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowEuiccManager;
+
+/** Unit test for {@link MasterClearResetEsimPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class MasterClearResetEsimPreferenceControllerTest {
+
+    private Context mContext;
+    private MasterClearResetEsimPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        ((ShadowEuiccManager) Shadow.extract(
+                mContext.getSystemService(Context.EUICC_SERVICE))).setIsEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.EUICC_PROVISIONED, 1);
+
+        mController = new PreferenceControllerTestHelper<>(mContext,
+                MasterClearResetEsimPreferenceController.class,
+                new SwitchPreference(mContext)).getController();
+    }
+
+    @After
+    public void tearDown() {
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.EUICC_PROVISIONED, 0);
+    }
+
+    @Test
+    public void getAvailabilityStatus_showEsimPropertyTrue_available() {
+        SystemProperties.set(MasterClearResetEsimPreferenceController.KEY_SHOW_ESIM_RESET_CHECKBOX,
+                Boolean.TRUE.toString());
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_showEsimPropertyFalse_unsupportedOnDevice() {
+        SystemProperties.set(MasterClearResetEsimPreferenceController.KEY_SHOW_ESIM_RESET_CHECKBOX,
+                Boolean.FALSE.toString());
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/RegulatoryInfoDisplayActivityTest.java b/tests/robotests/src/com/android/car/settings/system/RegulatoryInfoDisplayActivityTest.java
new file mode 100644
index 0000000..34ecb69
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/RegulatoryInfoDisplayActivityTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.SystemProperties;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.shadows.ShadowAlertDialog;
+
+/** Unit test for {@link RegulatoryInfoDisplayActivity}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class RegulatoryInfoDisplayActivityTest {
+
+    private ActivityController<RegulatoryInfoDisplayActivity> mActivityController;
+    private RegulatoryInfoDisplayActivity mActivity;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mActivityController = ActivityController.of(new RegulatoryInfoDisplayActivity());
+        mActivity = mActivityController.get();
+        mActivityController.create();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowAlertDialog.reset();
+    }
+
+    @Test
+    public void getRegulatoryInfoImageFileName_skuIsNotEmpty() {
+        SystemProperties.set("ro.boot.hardware.sku", "test");
+
+        assertThat(mActivity.getRegulatoryInfoImageFileName())
+                .isEqualTo("/data/misc/elabel/regulatory_info_test.png");
+    }
+
+    @Test
+    public void getRegulatoryInfoImageFileName_skuIsEmpty() {
+        SystemProperties.set("ro.boot.hardware.sku", "");
+
+        assertThat(mActivity.getRegulatoryInfoImageFileName())
+                .isEqualTo("/data/misc/elabel/regulatory_info.png");
+    }
+
+    @Test
+    public void getSku_shouldReturnSystemProperty() {
+        String testSku = "test";
+        SystemProperties.set("ro.boot.hardware.sku", testSku);
+
+        assertThat(mActivity.getSku()).isEqualTo(testSku);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
new file mode 100644
index 0000000..249eb09
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/ResetEsimPreferenceControllerTest.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowEuiccManager;
+
+/** Unit test for {@link ResetEsimPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ResetEsimPreferenceControllerTest {
+
+    private Context mContext;
+    private ResetEsimPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mController = new PreferenceControllerTestHelper<>(mContext,
+                ResetEsimPreferenceController.class,
+                new SwitchPreference(mContext)).getController();
+    }
+
+    @After
+    public void tearDown() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.EUICC_PROVISIONED, 0);
+    }
+
+    @Test
+    public void getAvailabilityStatus_disabledEuiccManager_unsupportedOnDevice() {
+        getShadowEuiccManager().setIsEnabled(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_euiccNotProvisioned_unsupportedOnDevice() {
+        getShadowEuiccManager().setIsEnabled(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_euiccNotProvisioned_developer_available() {
+        getShadowEuiccManager().setIsEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_euiccProvisioned_available() {
+        getShadowEuiccManager().setIsEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.EUICC_PROVISIONED, 1);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    private ShadowEuiccManager getShadowEuiccManager() {
+        return Shadow.extract(mContext.getSystemService(Context.EUICC_SERVICE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkConfirmFragmentTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkConfirmFragmentTest.java
new file mode 100644
index 0000000..1257b62
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkConfirmFragmentTest.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.robolectric.Shadows.shadowOf;
+import static org.testng.Assert.assertThrows;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.INetworkPolicyManager.Default;
+import android.net.NetworkPolicyManager;
+import android.net.Uri;
+import android.provider.Telephony;
+import android.telephony.SubscriptionManager;
+import android.widget.Button;
+
+import androidx.preference.PreferenceManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowBluetoothAdapter;
+import com.android.car.settings.testutils.ShadowConnectivityManager;
+import com.android.car.settings.testutils.ShadowNetworkPolicyManager;
+import com.android.car.settings.testutils.ShadowRecoverySystem;
+import com.android.car.settings.testutils.ShadowTelephonyManager;
+import com.android.car.settings.testutils.ShadowWifiManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowContentResolver;
+import org.robolectric.shadows.ShadowContextImpl;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {
+        ShadowConnectivityManager.class,
+        ShadowWifiManager.class,
+        ShadowBluetoothAdapter.class,
+        ShadowTelephonyManager.class,
+        ShadowNetworkPolicyManager.class,
+        ShadowRecoverySystem.class
+})
+public class ResetNetworkConfirmFragmentTest {
+
+    private Context mContext;
+    private Button mResetButton;
+    private ContentResolver mContentResolver;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        final NetworkPolicyManager npm = new NetworkPolicyManager(mContext, new Default());
+        ShadowContextImpl shadowContext =
+                Shadow.extract(RuntimeEnvironment.application.getBaseContext());
+        shadowContext.setSystemService(Context.NETWORK_POLICY_SERVICE, npm);
+
+        mContentResolver = mContext.getContentResolver();
+
+        setEuiccResetCheckbox(false);
+        setNetworkSubscriptionId("");
+
+        BaseTestActivity testActivity = Robolectric.setupActivity(BaseTestActivity.class);
+
+        ResetNetworkConfirmFragment fragment = new ResetNetworkConfirmFragment();
+        testActivity.launchFragment(fragment);
+
+        mResetButton = testActivity.findViewById(R.id.action_button1);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowConnectivityManager.reset();
+        ShadowWifiManager.reset();
+        ShadowBluetoothAdapter.reset();
+        ShadowRecoverySystem.reset();
+        ShadowTelephonyManager.reset();
+        ShadowNetworkPolicyManager.reset();
+        ShadowContentResolver.reset();
+    }
+
+    @Test
+    public void testResetButtonClick_connectivityManagerReset() {
+        mResetButton.performClick();
+        assertThat(ShadowConnectivityManager.verifyFactoryResetCalled(/* numTimes */ 1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_wifiManagerReset() {
+        mResetButton.performClick();
+        assertThat(ShadowWifiManager.verifyFactoryResetCalled(/* numTimes */ 1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_bluetoothAdapterReset() {
+        mResetButton.performClick();
+        assertThat(ShadowBluetoothAdapter.verifyFactoryResetCalled(/* numTimes */ 1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_cleanSmsRawTable() {
+        mResetButton.performClick();
+        assertThat(getUriWithGivenPrefix(shadowOf(mContentResolver).getDeletedUris(),
+                Telephony.Sms.CONTENT_URI)).isNotNull();
+    }
+
+    @Test
+    public void testResetButtonClick_euiccResetEnabled_euiccReset() {
+        setEuiccResetCheckbox(true);
+        mResetButton.performClick();
+        assertThat(ShadowRecoverySystem.verifyWipeEuiccDataCalled(/* numTimes */ 1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_euiccResetDisabled_euiccNotReset() {
+        setEuiccResetCheckbox(false);
+        mResetButton.performClick();
+        assertThat(ShadowRecoverySystem.verifyWipeEuiccDataCalled(/* numTimes */ 1)).isFalse();
+    }
+
+    @Test
+    public void testResetButtonClick_nonIntegerNetworkSubscriptionId_numberExceptionError() {
+        setNetworkSubscriptionId("abc");
+        assertThrows(NumberFormatException.class, () -> mResetButton.performClick());
+    }
+
+    @Test
+    public void testResetButtonClick_emptyNetworkSubscriptionId_telephonyNotReset() {
+        setNetworkSubscriptionId("");
+        mResetButton.performClick();
+        assertThat(ShadowTelephonyManager.verifyFactoryResetCalled(
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID, /* numTimes */ 1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_validNetworkSubscriptionId_telephonyReset() {
+        setNetworkSubscriptionId("123");
+        mResetButton.performClick();
+        assertThat(ShadowTelephonyManager.verifyFactoryResetCalled(123, /* numTimes */ 1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_emptyNetworkSubscriptionId_networkManagerNotReset() {
+        setNetworkSubscriptionId("");
+        mResetButton.performClick();
+        assertThat(ShadowNetworkPolicyManager.verifyFactoryResetCalled(null, /* numTimes */
+                1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_validNetworkSubscriptionId_networkManagerReset() {
+        setNetworkSubscriptionId("123");
+        mResetButton.performClick();
+        assertThat(ShadowNetworkPolicyManager.verifyFactoryResetCalled(
+                ShadowTelephonyManager.SUBSCRIBER_ID, /* numTimes */ 1)).isTrue();
+    }
+
+    @Test
+    public void testResetButtonClick_emptyNetworkSubscriptionId_noRestoreDefaultApn() {
+        setNetworkSubscriptionId("");
+        mResetButton.performClick();
+        Uri uri = getUriWithGivenPrefix(shadowOf(mContentResolver).getDeletedUris(),
+                ResetNetworkConfirmFragment.RESTORE_CARRIERS_URI);
+        assertThat(uri).isNotNull();
+        assertThat(uri.toString().contains("subId/")).isFalse();
+    }
+
+    @Test
+    public void testResetButtonClick_validNetworkSubscriptionId_restoreDefaultApn() {
+        setNetworkSubscriptionId("123");
+        mResetButton.performClick();
+        Uri uri = getUriWithGivenPrefix(shadowOf(mContentResolver).getDeletedUris(),
+                ResetNetworkConfirmFragment.RESTORE_CARRIERS_URI);
+        assertThat(uri).isNotNull();
+        assertThat(uri.toString().contains("subId/123")).isTrue();
+    }
+
+    private Uri getUriWithGivenPrefix(List<Uri> uris, String prefix) {
+        for (Uri uri : uris) {
+            if (uri.toString().startsWith(prefix)) return uri;
+        }
+        return null;
+    }
+
+    private Uri getUriWithGivenPrefix(List<Uri> uris, Uri prefix) {
+        for (Uri uri : uris) {
+            if (uri.isPathPrefixMatch(prefix)) return uri;
+        }
+        return null;
+    }
+
+    private void setEuiccResetCheckbox(boolean isChecked) {
+        PreferenceManager.getDefaultSharedPreferences(mContext).edit().putBoolean(
+                mContext.getString(R.string.pk_reset_esim), isChecked).commit();
+    }
+
+    private void setNetworkSubscriptionId(String id) {
+        PreferenceManager.getDefaultSharedPreferences(mContext).edit().putString(
+                mContext.getString(R.string.pk_reset_network_subscription), id).commit();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..1034a3f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkEntryPreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static android.os.UserManager.DISALLOW_NETWORK_RESET;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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;
+
+/** Unit test for {@link ResetNetworkEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class ResetNetworkEntryPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private ResetNetworkEntryPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+
+        mController = new PreferenceControllerTestHelper<>(context,
+                ResetNetworkEntryPreferenceController.class,
+                new Preference(context)).getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_nonAdminUser_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void getAvailabilityStatus_adminUser_available() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_adminUser_restricted_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessUserHasRestriction(
+                DISALLOW_NETWORK_RESET)).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
new file mode 100644
index 0000000..3e3a999
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/ResetNetworkSubscriptionPreferenceControllerTest.java
@@ -0,0 +1,353 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static android.telephony.SubscriptionManager.MIN_SUBSCRIPTION_ID_VALUE;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowPackageManager;
+import org.robolectric.shadows.ShadowSubscriptionManager;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+/** Unit test for {@link ResetNetworkSubscriptionPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ResetNetworkSubscriptionPreferenceControllerTest {
+
+    private static final int SUBID_1 = MIN_SUBSCRIPTION_ID_VALUE;
+    private static final int SUBID_2 = SUBID_1 + 1;
+    private static final int SUBID_3 = SUBID_2 + 1;
+    private static final int SUBID_4 = SUBID_3 + 1;
+
+    private Context mContext;
+    private ShadowSubscriptionManager mShadowSubscriptionManager;
+    private ListPreference mListPreference;
+    private PreferenceControllerTestHelper<ResetNetworkSubscriptionPreferenceController>
+            mPreferenceControllerHelper;
+    private ResetNetworkSubscriptionPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mShadowSubscriptionManager = Shadow.extract(
+                mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE));
+
+        mListPreference = new ListPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                ResetNetworkSubscriptionPreferenceController.class, mListPreference);
+        mController = mPreferenceControllerHelper.getController();
+
+        // Default to AVAILABLE status. Tests for this behavior will do their own setup.
+        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.setSystemFeature(PackageManager.FEATURE_TELEPHONY, /* supported= */
+                true);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_telephonyAvailable_available() {
+        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.setSystemFeature(PackageManager.FEATURE_TELEPHONY, /* supported= */
+                true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_telephonyNotAvailable_unsupportedOnDevice() {
+        ShadowPackageManager shadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
+        shadowPackageManager.setSystemFeature(PackageManager.FEATURE_TELEPHONY, /* supported= */
+                false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
+    public void refreshUi_nullSubscriptions_hidesPreference() {
+        mController.refreshUi();
+
+        assertThat(mListPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_nullSubscriptions_setsValue() {
+        mController.refreshUi();
+
+        assertThat(mListPreference.getValue()).isEqualTo(
+                String.valueOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
+    }
+
+    @Test
+    public void refreshUi_noSubscriptions_hidesPreference() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(Collections.emptyList());
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_noSubscriptions_setsValue() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(Collections.emptyList());
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.getValue()).isEqualTo(
+                String.valueOf(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
+    }
+
+    @Test
+    public void refreshUi_oneSubscription_hidesPreference() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Collections.singletonList(createSubInfo(SUBID_1, "sub1")));
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_oneSubscription_setsValue() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Collections.singletonList(createSubInfo(SUBID_1, "sub1")));
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_1));
+    }
+
+    @Test
+    public void refreshUi_multipleSubscriptions_showsPreference() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2")));
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_multipleSubscriptions_populatesEntries() {
+        String displayName1 = "sub1";
+        String displayName2 = "sub2";
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, displayName1),
+                        createSubInfo(SUBID_2, displayName2)));
+
+        mController.refreshUi();
+
+        assertThat(Arrays.asList(mListPreference.getEntries())).containsExactly(displayName1,
+                displayName2);
+        assertThat(Arrays.asList(mListPreference.getEntryValues())).containsExactly(
+                String.valueOf(SUBID_1),
+                String.valueOf(SUBID_2));
+    }
+
+    @Test
+    public void refreshUi_defaultSelection_fourthPriority_system() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
+                        createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
+
+        ShadowSubscriptionManager.setDefaultSubscriptionId(SUBID_4);
+        mController.refreshUi();
+
+        assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_4));
+    }
+
+    @Test
+    public void refreshUi_defaultSelection_thirdPriority_sms() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
+                        createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
+
+        ShadowSubscriptionManager.setDefaultSubscriptionId(SUBID_4);
+        ShadowSubscriptionManager.setDefaultSmsSubscriptionId(SUBID_3);
+        mController.refreshUi();
+
+        assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_3));
+    }
+
+    @Test
+    public void refreshUi_defaultSelection_secondPriority_voice() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
+                        createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
+
+        ShadowSubscriptionManager.setDefaultSubscriptionId(SUBID_4);
+        ShadowSubscriptionManager.setDefaultSmsSubscriptionId(SUBID_3);
+        ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(SUBID_2);
+        mController.refreshUi();
+
+        assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_2));
+    }
+
+    @Test
+    public void refreshUi_defaultSelection_firstPriority_data() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2"),
+                        createSubInfo(SUBID_3, "sub3"), createSubInfo(SUBID_4, "sub4")));
+
+        ShadowSubscriptionManager.setDefaultSubscriptionId(SUBID_4);
+        ShadowSubscriptionManager.setDefaultSmsSubscriptionId(SUBID_3);
+        ShadowSubscriptionManager.setDefaultVoiceSubscriptionId(SUBID_2);
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
+        mController.refreshUi();
+
+        assertThat(mListPreference.getValue()).isEqualTo(String.valueOf(SUBID_1));
+    }
+
+    @Test
+    public void refreshUi_title_fourthPriority_subscriptionNetworkIds() {
+        SubscriptionInfo subInfo = createSubInfo(
+                SUBID_1,
+                /* displayName= */ "",
+                /* carrierName= */ "",
+                /* number= */ "");
+        // Multiple subscriptions so that preference is shown / title is set.
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
+
+        mController.refreshUi();
+
+        String title = mListPreference.getTitle().toString();
+        assertThat(title).contains(String.valueOf(subInfo.getMcc()));
+        assertThat(title).contains(String.valueOf(subInfo.getMnc()));
+        assertThat(title).contains(String.valueOf(subInfo.getSimSlotIndex()));
+        assertThat(title).contains(String.valueOf(subInfo.getSubscriptionId()));
+    }
+
+    @Test
+    public void refreshUi_title_thirdPriority_subscriptionCarrierName() {
+        SubscriptionInfo subInfo = createSubInfo(
+                SUBID_1,
+                /* displayName= */ "",
+                "carrierName",
+                /* number= */ "");
+        // Multiple subscriptions so that preference is shown / title is set.
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.getTitle()).isEqualTo(subInfo.getCarrierName());
+    }
+
+    @Test
+    public void refreshUi_title_secondPriority_subscriptionNumber() {
+        SubscriptionInfo subInfo = createSubInfo(
+                SUBID_1,
+                /* displayName= */ "",
+                "carrierName",
+                "number");
+        // Multiple subscriptions so that preference is shown / title is set.
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.getTitle()).isEqualTo(subInfo.getNumber());
+    }
+
+    @Test
+    public void refreshUi_title_firstPriority_subscriptionDisplayName() {
+        SubscriptionInfo subInfo = createSubInfo(
+                SUBID_1,
+                "displayName",
+                "carrierName",
+                "number");
+        // Multiple subscriptions so that preference is shown / title is set.
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(subInfo, createSubInfo(SUBID_2, "sub2")));
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
+
+        mController.refreshUi();
+
+        assertThat(mListPreference.getTitle()).isEqualTo(subInfo.getDisplayName());
+    }
+
+    @Test
+    public void handlePreferenceChanged_updatesTitle() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2")));
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
+        mController.refreshUi();
+
+        mListPreference.callChangeListener(String.valueOf(SUBID_2));
+
+        assertThat(mListPreference.getTitle()).isEqualTo("sub2");
+    }
+
+    @Test
+    public void handlePreferenceChanged_returnsTrue() {
+        mShadowSubscriptionManager.setActiveSubscriptionInfoList(
+                Arrays.asList(createSubInfo(SUBID_1, "sub1"), createSubInfo(SUBID_2, "sub2")));
+        ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUBID_1);
+        mController.refreshUi();
+
+        assertThat(mController.handlePreferenceChanged(mListPreference,
+                String.valueOf(SUBID_2))).isTrue();
+    }
+
+    /** Reduce SubscriptionInfo constructor args to the ones we care about here. */
+    private SubscriptionInfo createSubInfo(int subId, String displayName) {
+        return createSubInfo(subId, displayName, "carrierName", "number");
+    }
+
+    /** Reduce SubscriptionInfo constructor args to the ones we care about here. */
+    private SubscriptionInfo createSubInfo(int subId, String displayName, String carrierName,
+            String number) {
+        // Hidden constructor so resort to mocking.
+        SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class);
+        when(subscriptionInfo.getSubscriptionId()).thenReturn(subId);
+        when(subscriptionInfo.getDisplayName()).thenReturn(displayName);
+        when(subscriptionInfo.getCarrierName()).thenReturn(carrierName);
+        when(subscriptionInfo.getNumber()).thenReturn(number);
+        when(subscriptionInfo.getSimSlotIndex()).thenReturn(111);
+        when(subscriptionInfo.getMcc()).thenReturn(222);
+        when(subscriptionInfo.getMnc()).thenReturn(333);
+        return subscriptionInfo;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
new file mode 100644
index 0000000..004bb01
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2018 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.car.settings.system;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowCarrierConfigManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowPackageManager;
+
+import java.util.List;
+
+/** Unit test for {@link SystemUpdatePreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowCarrierConfigManager.class})
+public class SystemUpdatePreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private Context mContext;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<SystemUpdatePreferenceController> mControllerHelper;
+    private SystemUpdatePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                SystemUpdatePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void getAvailabilityStatus_adminUser_available() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_nonAdminUser_disabledForUser() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
+    }
+
+    @Test
+    public void onCreate_setsActivityLabelAsTitle() {
+        ApplicationInfo applicationInfo = new ApplicationInfo();
+        applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.applicationInfo = applicationInfo;
+        activityInfo.packageName = "some.test.package";
+        activityInfo.name = "SomeActivity";
+
+        String label = "Activity Label";
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.nonLocalizedLabel = label;
+        resolveInfo.activityInfo = activityInfo;
+
+        Intent intent = new Intent();
+        ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
+        packageManager.addResolveInfoForIntent(intent, resolveInfo);
+        mPreference.setIntent(intent);
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+
+        assertThat(mPreference.getTitle()).isEqualTo(label);
+    }
+
+    @Test
+    public void refreshUi_activityNotFount_hidesPreference() {
+        mPreference.setIntent(new Intent());
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mController.refreshUi();
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void preferenceClicked_triggersClientInitiatedAction() {
+        // Arrange
+        String action = "action";
+        String key = "key";
+        String value = "value";
+
+        PersistableBundle config = new PersistableBundle();
+        config.putBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL, true);
+        config.putString(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING, action);
+        config.putString(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING, key);
+        config.putString(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING, value);
+
+        getShadowCarrierConfigManager().setConfigForSubId(
+                SubscriptionManager.getDefaultSubscriptionId(), config);
+
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        // Act
+        mPreference.performClick();
+
+        // Assert
+        List<Intent> broadcasts = ShadowApplication.getInstance().getBroadcastIntents();
+        assertThat(broadcasts).hasSize(1);
+        Intent broadcast = broadcasts.get(0);
+        assertThat(broadcast.getAction()).isEqualTo(action);
+        assertThat(broadcast.getStringExtra(key)).isEqualTo(value);
+    }
+
+    @Test
+    public void preferenceClicked_handledReturnsFalse() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        assertThat(mPreference.getOnPreferenceClickListener().onPreferenceClick(
+                mPreference)).isFalse();
+    }
+
+    private ShadowCarrierConfigManager getShadowCarrierConfigManager() {
+        return Shadow.extract(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/system/legal/LegalPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/legal/LegalPreferenceControllerTest.java
new file mode 100644
index 0000000..be62245
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/system/legal/LegalPreferenceControllerTest.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.system.legal;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.shadows.ShadowPackageManager;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/** Unit test for {@link LegalPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class LegalPreferenceControllerTest {
+    private static class TestLegalPreferenceControllerTest extends
+            LegalPreferenceController {
+
+        private static final Intent INTENT = new Intent("test_intent");
+
+        TestLegalPreferenceControllerTest(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Intent getIntent() {
+            return INTENT;
+        }
+    }
+
+    private static final String TEST_LABEL = "test_label";
+    private Context mContext;
+    private PreferenceControllerTestHelper<TestLegalPreferenceControllerTest> mControllerHelper;
+    private Preference mPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TestLegalPreferenceControllerTest.class, mPreference);
+    }
+
+    @Test
+    public void refreshUi_intentResolvesToActivity_isVisible() {
+        Intent intent = mControllerHelper.getController().getIntent();
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "some.test.package";
+        activityInfo.name = "SomeActivity";
+        activityInfo.applicationInfo = new ApplicationInfo();
+        activityInfo.applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
+
+        ResolveInfo resolveInfo = new ResolveInfo() {
+            @Override
+            public CharSequence loadLabel(PackageManager pm) {
+                return TEST_LABEL;
+            }
+        };
+        resolveInfo.activityInfo = activityInfo;
+        List<ResolveInfo> list = new LinkedList();
+        list.add(resolveInfo);
+
+        ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
+        packageManager.addResolveInfoForIntent(intent, list);
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_intentResolvesToActivity_updatesTitle() {
+        Intent intent = mControllerHelper.getController().getIntent();
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "some.test.package";
+        activityInfo.name = "SomeActivity";
+        activityInfo.applicationInfo = new ApplicationInfo();
+        activityInfo.applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
+        activityInfo.applicationInfo.nonLocalizedLabel = TEST_LABEL;
+
+        ResolveInfo resolveInfo = new ResolveInfo();
+        resolveInfo.activityInfo = activityInfo;
+
+        List<ResolveInfo> list = new LinkedList();
+        list.add(resolveInfo);
+
+        ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
+        packageManager.addResolveInfoForIntent(intent, list);
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreference.getTitle()).isEqualTo(TEST_LABEL);
+    }
+
+    @Test
+    public void refreshUi_intentResolvesToActivity_updatesIntentToSpecificActivity() {
+        Intent intent = mControllerHelper.getController().getIntent();
+
+        String packageName = "com.android.car.settings.testutils";
+        String activityName = "BaseTestActivity";
+
+        ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = packageName;
+        activityInfo.name = activityName;
+        activityInfo.applicationInfo = new ApplicationInfo();
+        activityInfo.applicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
+
+        ResolveInfo resolveInfo = new ResolveInfo() {
+            @Override
+            public CharSequence loadLabel(PackageManager pm) {
+                return TEST_LABEL;
+            }
+        };
+        resolveInfo.activityInfo = activityInfo;
+        List<ResolveInfo> list = new LinkedList();
+        list.add(resolveInfo);
+
+        ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
+        packageManager.addResolveInfoForIntent(intent, list);
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreference.getIntent().getComponent().flattenToString()).isEqualTo(
+                packageName + "/" + activityName);
+    }
+
+    @Test
+    public void refreshUi_intentResolvesToNull_isNotVisible() {
+        ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
+
+        packageManager.addResolveInfoForIntent(mControllerHelper.getController().getIntent(),
+                Collections.emptyList());
+
+        mControllerHelper.markState(Lifecycle.State.CREATED);
+        mControllerHelper.getController().refreshUi();
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java b/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java
index 9e9929a..5fff6f9 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/BaseTestActivity.java
@@ -17,29 +17,34 @@
 package com.android.car.settings.testutils;
 
 import android.car.drivingstate.CarUxRestrictions;
+import android.content.Intent;
+import android.content.IntentSender;
 import android.os.Bundle;
 
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.BaseFragment;
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.UxRestrictionsProvider;
 
 /**
- * Test activity that extends {@link AppCompatActivity}.
- * Used for testing {@code BaseFragment} instances.
+ * Test activity used for testing {@code BaseFragment} instances.
  */
-public class BaseTestActivity extends AppCompatActivity implements
-        BaseFragment.FragmentController,
-        BaseFragment.UXRestrictionsProvider {
+public class BaseTestActivity extends FragmentActivity implements FragmentController,
+        UxRestrictionsProvider {
+
     private boolean mOnBackPressedFlag;
+    private CarUxRestrictions mRestrictionInfo = new CarUxRestrictions.Builder(/* reqOpt= */ true,
+            CarUxRestrictions.UX_RESTRICTIONS_BASELINE, /* timestamp= */ 0).build();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.app_compat_activity);
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
+        setContentView(R.layout.car_setting_activity);
     }
 
     /**
@@ -48,34 +53,61 @@
      * @param fragment Fragment to add to activity.
      */
     @Override
-    public void launchFragment(BaseFragment fragment) {
+    public void launchFragment(Fragment fragment) {
+        if (fragment instanceof DialogFragment) {
+            throw new IllegalArgumentException(
+                    "cannot launch dialogs with launchFragment() - use showDialog() instead");
+        }
+        String tag = Integer.toString(getSupportFragmentManager().getBackStackEntryCount());
         getSupportFragmentManager()
                 .beginTransaction()
-                .replace(R.id.fragment_container, fragment)
+                .replace(R.id.fragment_container, fragment, tag)
                 .addToBackStack(null)
                 .commit();
     }
 
     @Override
-    public void showDOBlockingMessage() {
+    public void showBlockingMessage() {
         // no-op
     }
 
     @Override
-    public CarUxRestrictions getCarUxRestrictions() {
-        return new CarUxRestrictions.Builder(
-                /* reqOpt= */ true,
-                CarUxRestrictions.UX_RESTRICTIONS_BASELINE,
-                /* timestamp= */ 0
-        ).build();
+    public void showDialog(DialogFragment dialogFragment, @Nullable String tag) {
+        dialogFragment.show(getSupportFragmentManager(), tag);
     }
 
-    public void reattachFragment(BaseFragment fragment) {
-        getSupportFragmentManager()
-                .beginTransaction()
-                .detach(fragment)
-                .attach(fragment)
-                .commit();
+    @Override
+    @Nullable
+    public DialogFragment findDialogByTag(String tag) {
+        Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
+        if (fragment instanceof DialogFragment) {
+            return (DialogFragment) fragment;
+        }
+        return null;
+    }
+
+    @Override
+    public void startActivityForResult(Intent intent, int requestCode,
+            ActivityResultCallback callback) {
+        throw new UnsupportedOperationException(
+                "Unimplemented for activities that implement FragmentController");
+    }
+
+    @Override
+    public void startIntentSenderForResult(IntentSender intent, int requestCode,
+            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, Bundle options,
+            ActivityResultCallback callback) {
+        throw new UnsupportedOperationException(
+                "Unimplemented for activities that implement FragmentController");
+    }
+
+    @Override
+    public CarUxRestrictions getCarUxRestrictions() {
+        return mRestrictionInfo;
+    }
+
+    public void setCarUxRestrictions(CarUxRestrictions restrictionInfo) {
+        mRestrictionInfo = restrictionInfo;
     }
 
     /**
@@ -104,6 +136,6 @@
 
     @Override
     public void goBack() {
-
+        getSupportFragmentManager().popBackStackImmediate();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/CarSettingsShadowResources.java b/tests/robotests/src/com/android/car/settings/testutils/CarSettingsShadowResources.java
deleted file mode 100644
index 036eb6d..0000000
--- a/tests/robotests/src/com/android/car/settings/testutils/CarSettingsShadowResources.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.testutils;
-
-import static org.robolectric.shadow.api.Shadow.directlyOn;
-
-import android.annotation.ColorRes;
-import android.annotation.DimenRes;
-import android.annotation.Nullable;
-import android.content.res.Resources;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.annotation.RealObject;
-import org.robolectric.shadows.ShadowResources;
-
-/**
- * Overrides ShadowResources to return a dummy value if resources are not found.
- *
- * Reason for this is the Design Support Library has moved to prebuilts but robolectric is unable
- * to pull resources from binaries at this time.
- * TODO: Delete this shadow when robolectric supports binary resource loading
- */
-@Implements(value = Resources.class, inheritImplementationMethods = true)
-public class CarSettingsShadowResources extends ShadowResources {
-    @RealObject
-    public Resources realResources;
-
-    @Implementation
-    public int getDimensionPixelSize(@DimenRes int id) {
-        try {
-            return directlyOn(realResources, Resources.class).getDimensionPixelSize(id);
-        } catch (Resources.NotFoundException e1) {
-            return 0;
-        }
-    }
-
-    @Implementation
-    public int getDimensionPixelOffset(@DimenRes int id) {
-        try {
-            return directlyOn(realResources, Resources.class).getDimensionPixelOffset(id);
-        } catch (Resources.NotFoundException e1) {
-            return 0;
-        }
-    }
-
-    @Implementation
-    public int getColor(@ColorRes int id, @Nullable Resources.Theme theme) {
-        try {
-            return directlyOn(realResources, Resources.class).getColor(id, theme);
-        } catch (Resources.NotFoundException e1) {
-            return 0;
-        }
-    }
-}
-
diff --git a/tests/robotests/src/com/android/car/settings/testutils/DialogTestUtils.java b/tests/robotests/src/com/android/car/settings/testutils/DialogTestUtils.java
new file mode 100644
index 0000000..303b607
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/DialogTestUtils.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.fragment.app.DialogFragment;
+
+/**
+ * Helper methods for DialogFragment testing.
+ */
+public class DialogTestUtils {
+    private DialogTestUtils() {
+    }
+
+    /**
+     * Invokes onClick on the dialog's positive button.
+     */
+    public static void clickPositiveButton(DialogFragment dialogFragment) {
+        Button positiveButton = dialogFragment.getDialog().getWindow().findViewById(
+                com.android.internal.R.id.button1);
+        positiveButton.callOnClick();
+    }
+
+    /**
+     * Invokes onClick on the dialog's negative button.
+     */
+    public static void clickNegativeButton(DialogFragment dialogFragment) {
+        Button negativeButton = dialogFragment.getDialog().getWindow().findViewById(
+                com.android.internal.R.id.button2);
+        negativeButton.callOnClick();
+    }
+
+    /**
+     * Gets dialog's title.
+     */
+    public static String getTitle(DialogFragment dialogFragment) {
+        TextView titleView = dialogFragment.getDialog().getWindow().findViewById(
+                com.android.internal.R.id.alertTitle);
+        return titleView.getText().toString();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/DummyFragment.java b/tests/robotests/src/com/android/car/settings/testutils/DummyFragment.java
new file mode 100644
index 0000000..dc6cfba
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/DummyFragment.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+
+/**
+ * Empty Fragment.
+ */
+public class DummyFragment extends SettingsFragment {
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.settings_fragment;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/FragmentController.java b/tests/robotests/src/com/android/car/settings/testutils/FragmentController.java
new file mode 100644
index 0000000..a3b28f5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/FragmentController.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.R;
+
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.android.controller.ComponentController;
+
+/**
+ * Version of FragmentController that can be used for {@link androidx.fragment.app.Fragment} until
+ * upstream support is ready.
+ */
+public class FragmentController<F extends Fragment> extends
+        ComponentController<FragmentController<F>, F> {
+
+    private final F mFragment;
+    private final ActivityController<BaseTestActivity> mActivityController;
+
+    private FragmentController(F fragment) {
+        super(fragment);
+        mFragment = fragment;
+        mActivityController = ActivityController.of(new BaseTestActivity());
+    }
+
+    public static <F extends Fragment> FragmentController<F> of(F fragment) {
+        return new FragmentController<>(fragment);
+    }
+
+    /**
+     * Returns the fragment after attaching it to an activity, calling its onCreate() through
+     * onResume() lifecycle methods and making it visible.
+     */
+    public F setup() {
+        return create().start().resume().visible().get();
+    }
+
+    /**
+     * Creates the activity with {@link Bundle} and adds the fragment to it.
+     */
+    public FragmentController<F> create(final Bundle bundle) {
+        shadowMainLooper.runPaused(
+                () -> mActivityController
+                        .create(bundle)
+                        .get()
+                        .getSupportFragmentManager()
+                        .beginTransaction()
+                        .add(R.id.fragment_container, mFragment)
+                        .commitNow());
+        return this;
+    }
+
+    @Override
+    public FragmentController<F> create() {
+        return create(null);
+    }
+
+    @Override
+    public FragmentController<F> destroy() {
+        shadowMainLooper.runPaused(mActivityController::destroy);
+        return this;
+    }
+
+    public FragmentController<F> start() {
+        shadowMainLooper.runPaused(mActivityController::start);
+        return this;
+    }
+
+    public FragmentController<F> resume() {
+        shadowMainLooper.runPaused(mActivityController::resume);
+        return this;
+    }
+
+    public FragmentController<F> pause() {
+        shadowMainLooper.runPaused(mActivityController::pause);
+        return this;
+    }
+
+    public FragmentController<F> stop() {
+        shadowMainLooper.runPaused(mActivityController::stop);
+        return this;
+    }
+
+    public FragmentController<F> visible() {
+        shadowMainLooper.runPaused(mActivityController::visible);
+        return this;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowAccountManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowAccountManager.java
new file mode 100644
index 0000000..f8bf3b1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowAccountManager.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Implements(AccountManager.class)
+public class ShadowAccountManager extends org.robolectric.shadows.ShadowAccountManager {
+
+    private final Map<Integer, List<Account>> mAccountsAsUserMap = new ArrayMap<>();
+    private final Map<Integer, List<AuthenticatorDescription>> mAuthenticatorAsUserMap =
+            new ArrayMap<>();
+
+    @Implementation
+    protected Account[] getAccountsAsUser(int userId) {
+        if (mAccountsAsUserMap.containsKey(userId)) {
+            return mAccountsAsUserMap.get(userId).toArray(new Account[]{});
+        }
+        return getAccounts();
+    }
+
+    public void addAccountAsUser(int userId, Account account) {
+        mAccountsAsUserMap.putIfAbsent(userId, new ArrayList<>());
+        mAccountsAsUserMap.get(userId).add(account);
+    }
+
+    @Implementation
+    protected Account[] getAccountsByTypeAsUser(String type, UserHandle userHandle) {
+        return getAccountsByType(type);
+    }
+
+    @Implementation
+    protected AuthenticatorDescription[] getAuthenticatorTypesAsUser(int userId) {
+        if (mAuthenticatorAsUserMap.containsKey(userId)) {
+            return mAuthenticatorAsUserMap.get(userId).toArray(new AuthenticatorDescription[]{});
+        }
+        return getAuthenticatorTypes();
+    }
+
+    public void addAuthenticatorAsUser(int userId, AuthenticatorDescription authenticator) {
+        mAuthenticatorAsUserMap.putIfAbsent(userId, new ArrayList<>());
+        mAuthenticatorAsUserMap.get(userId).add(authenticator);
+    }
+
+    @Override
+    public void removeAllAccounts() {
+        super.removeAllAccounts();
+        mAccountsAsUserMap.clear();
+        mAuthenticatorAsUserMap.clear();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowActivityManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowActivityManager.java
new file mode 100644
index 0000000..b6a75aa
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowActivityManager.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.app.ActivityManager;
+import android.content.pm.IPackageDataObserver;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(value = ActivityManager.class)
+public class ShadowActivityManager extends org.robolectric.shadows.ShadowActivityManager {
+
+    private static boolean sIsApplicationUserDataCleared;
+
+    private String mMostRecentlyStoppedPackage;
+
+    @Resetter
+    public static void reset() {
+        sIsApplicationUserDataCleared = false;
+    }
+
+    @Implementation
+    protected void forceStopPackage(String packageName) {
+        mMostRecentlyStoppedPackage = packageName;
+    }
+
+    @Implementation
+    protected boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
+        return sIsApplicationUserDataCleared;
+    }
+
+    public String getMostRecentlyStoppedPackage() {
+        return mMostRecentlyStoppedPackage;
+    }
+
+    public static void setApplicationUserDataCleared(boolean applicationUserDataCleared) {
+        sIsApplicationUserDataCleared = applicationUserDataCleared;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowAppOpsManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowAppOpsManager.java
new file mode 100644
index 0000000..bfc582f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowAppOpsManager.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.app.AppOpsManager;
+import android.app.AppOpsManager.OpEntry;
+import android.app.AppOpsManager.PackageOps;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Table;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Implements(value = AppOpsManager.class)
+public class ShadowAppOpsManager {
+
+    private Table<Integer, InternalKey, Integer> mOpToKeyToMode = HashBasedTable.create();
+
+    @Implementation
+    protected void setMode(int code, int uid, String packageName, int mode) {
+        InternalKey key = new InternalKey(uid, packageName);
+        mOpToKeyToMode.put(code, key, mode);
+    }
+
+    /** Convenience method to get the mode directly instead of wrapped in an op list. */
+    public int getMode(int code, int uid, String packageName) {
+        Integer mode = mOpToKeyToMode.get(code, new InternalKey(uid, packageName));
+        return mode == null ? AppOpsManager.opToDefaultMode(code) : mode;
+    }
+
+    @Implementation
+    protected List<PackageOps> getPackagesForOps(int[] ops) {
+        if (ops == null) {
+            return Collections.emptyList();
+        }
+        ImmutableList.Builder<PackageOps> result = new ImmutableList.Builder<>();
+        for (int i = 0; i < ops.length; i++) {
+            int op = ops[i];
+            Map<InternalKey, Integer> keyToModeMap = mOpToKeyToMode.rowMap().get(op);
+            if (keyToModeMap == null) {
+                continue;
+            }
+            for (InternalKey key : keyToModeMap.keySet()) {
+                Integer mode = keyToModeMap.get(key);
+                if (mode == null) {
+                    mode = AppOpsManager.opToDefaultMode(op);
+                }
+                OpEntry opEntry = new OpEntry(op, mode);
+                PackageOps packageOp = new PackageOps(key.mPackageName, key.mUid,
+                        Collections.singletonList(opEntry));
+                result.add(packageOp);
+            }
+        }
+        return result.build();
+    }
+
+    private static class InternalKey {
+        private int mUid;
+        private String mPackageName;
+
+        InternalKey(int uid, String packageName) {
+            mUid = uid;
+            mPackageName = packageName;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof InternalKey) {
+                InternalKey that = (InternalKey) obj;
+                return mUid == that.mUid && mPackageName.equals(that.mPackageName);
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mUid, mPackageName);
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowApplicationPackageManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowApplicationPackageManager.java
new file mode 100644
index 0000000..ac738fc
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowApplicationPackageManager.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
+
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
+import android.app.ApplicationPackageManager;
+import android.content.ComponentName;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageDataObserver;
+import android.content.pm.ModuleInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.util.Pair;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Shadow of ApplicationPackageManager that allows the getting of content providers per user. */
+@Implements(value = ApplicationPackageManager.class)
+public class ShadowApplicationPackageManager extends
+        org.robolectric.shadows.ShadowApplicationPackageManager {
+
+    private static Resources sResources = null;
+    private static PackageManager sPackageManager;
+
+    private final Map<Integer, String> mUserIdToDefaultBrowserMap = new HashMap<>();
+    private final Map<String, ComponentName> mPkgToDefaultActivityMap = new HashMap<>();
+    private final Map<String, IntentFilter> mPkgToDefaultActivityIntentFilterMap = new HashMap<>();
+    private final Map<IntentFilter, ComponentName> mPreferredActivities = new LinkedHashMap<>();
+    private final Map<Pair<String, Integer>, Integer> mPkgAndUserIdToIntentVerificationStatusMap =
+            new HashMap<>();
+    private List<ResolveInfo> mHomeActivities = Collections.emptyList();
+    private ComponentName mDefaultHomeActivity;
+    private String mPermissionControllerPackageName;
+
+    @Resetter
+    public static void reset() {
+        sResources = null;
+        sPackageManager = null;
+    }
+
+    @Implementation
+    @NonNull
+    protected List<ModuleInfo> getInstalledModules(@PackageManager.ModuleInfoFlags int flags) {
+        return Collections.emptyList();
+    }
+
+    @Implementation
+    protected Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
+        return icon;
+    }
+
+    @Override
+    @Implementation
+    protected ProviderInfo resolveContentProviderAsUser(String name, int flags,
+            @UserIdInt int userId) {
+        return resolveContentProvider(name, flags);
+    }
+
+    @Implementation
+    protected int getPackageUidAsUser(String packageName, int flags, int userId)
+            throws PackageManager.NameNotFoundException {
+        return 0;
+    }
+
+    @Implementation
+    protected void deleteApplicationCacheFiles(String packageName, IPackageDataObserver observer) {
+        sPackageManager.deleteApplicationCacheFiles(packageName, observer);
+    }
+
+    @Implementation
+    protected Resources getResourcesForApplication(String appPackageName)
+            throws PackageManager.NameNotFoundException {
+        return sResources;
+    }
+
+    @Implementation
+    protected List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
+        return getInstalledApplications(flags);
+    }
+
+    @Implementation
+    protected ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId)
+            throws PackageManager.NameNotFoundException {
+        return getApplicationInfo(packageName, flags);
+    }
+
+    @Implementation
+    @Override
+    protected ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
+        outActivities.addAll(mHomeActivities);
+        return mDefaultHomeActivity;
+    }
+
+    @Implementation
+    @Override
+    protected void clearPackagePreferredActivities(String packageName) {
+        mPreferredActivities.clear();
+    }
+
+    @Implementation
+    @Override
+    public int getPreferredActivities(List<IntentFilter> outFilters,
+            List<ComponentName> outActivities, String packageName) {
+        for (IntentFilter filter : mPreferredActivities.keySet()) {
+            ComponentName name = mPreferredActivities.get(filter);
+            // If packageName is null, match everything, else filter by packageName.
+            if (packageName == null) {
+                outFilters.add(filter);
+                outActivities.add(name);
+            } else if (name.getPackageName().equals(packageName)) {
+                outFilters.add(filter);
+                outActivities.add(name);
+            }
+        }
+        return 0;
+    }
+
+    @Implementation
+    @Override
+    public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set,
+            ComponentName activity) {
+        mPreferredActivities.put(filter, activity);
+    }
+
+    @Implementation
+    @Override
+    protected String getDefaultBrowserPackageNameAsUser(int userId) {
+        return mUserIdToDefaultBrowserMap.getOrDefault(userId, null);
+    }
+
+    @Implementation
+    @Override
+    protected boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
+        mUserIdToDefaultBrowserMap.put(userId, packageName);
+        return true;
+    }
+
+    @Implementation
+    @Override
+    protected int getIntentVerificationStatusAsUser(String packageName, int userId) {
+        Pair<String, Integer> key = new Pair<>(packageName, userId);
+        return mPkgAndUserIdToIntentVerificationStatusMap.getOrDefault(key,
+                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED);
+    }
+
+    @Implementation
+    @Override
+    protected boolean updateIntentVerificationStatusAsUser(String packageName, int status,
+            int userId) {
+        Pair<String, Integer> key = new Pair<>(packageName, userId);
+        mPkgAndUserIdToIntentVerificationStatusMap.put(key, status);
+        return true;
+    }
+
+    @Implementation
+    protected String getPermissionControllerPackageName() {
+        return mPermissionControllerPackageName;
+    }
+
+    public void setPermissionControllerPackageName(String packageName) {
+        mPermissionControllerPackageName = packageName;
+    }
+
+    public void setHomeActivities(List<ResolveInfo> homeActivities) {
+        mHomeActivities = homeActivities;
+    }
+
+    public void setDefaultHomeActivity(ComponentName defaultHomeActivity) {
+        mDefaultHomeActivity = defaultHomeActivity;
+    }
+
+    public static void setResources(Resources resources) {
+        sResources = resources;
+    }
+
+    public static void setPackageManager(PackageManager packageManager) {
+        sPackageManager = packageManager;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowApplicationsState.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowApplicationsState.java
new file mode 100644
index 0000000..383a245
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowApplicationsState.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.app.Application;
+
+import com.android.settingslib.applications.ApplicationsState;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(ApplicationsState.class)
+public class ShadowApplicationsState {
+
+    private static ApplicationsState sApplicationsState;
+
+    public static void setInstance(ApplicationsState applicationsState) {
+        sApplicationsState = applicationsState;
+    }
+
+    @Resetter
+    public static void reset() {
+        sApplicationsState = null;
+    }
+
+    @Implementation
+    protected static ApplicationsState getInstance(Application app) {
+        return sApplicationsState;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowAutofillServiceInfo.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowAutofillServiceInfo.java
new file mode 100644
index 0000000..6974376
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowAutofillServiceInfo.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.Context;
+import android.content.pm.ServiceInfo;
+import android.service.autofill.AutofillServiceInfo;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(AutofillServiceInfo.class)
+public class ShadowAutofillServiceInfo {
+
+    private static String sSettingsActivity;
+
+    public void __constructor__(Context context, ServiceInfo si) {
+        // Do nothing when constructed in code.
+    }
+
+    @Resetter
+    public static void reset() {
+        sSettingsActivity = null;
+    }
+
+    @Implementation
+    protected String getSettingsActivity() {
+        return sSettingsActivity;
+    }
+
+    public static void setSettingsActivity(String settingsActivity) {
+        sSettingsActivity = settingsActivity;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowBluetoothAdapter.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowBluetoothAdapter.java
new file mode 100644
index 0000000..9de2084
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowBluetoothAdapter.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import static android.bluetooth.BluetoothAdapter.SCAN_MODE_NONE;
+import static android.bluetooth.BluetoothAdapter.STATE_ON;
+
+import android.bluetooth.BluetoothAdapter;
+import android.os.ParcelUuid;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.Collections;
+import java.util.List;
+
+@Implements(BluetoothAdapter.class)
+public class ShadowBluetoothAdapter extends org.robolectric.shadows.ShadowBluetoothAdapter {
+
+    private static int sResetCalledCount = 0;
+    private String mName;
+    private int mScanMode;
+
+    public static boolean verifyFactoryResetCalled(int numTimes) {
+        return sResetCalledCount == numTimes;
+    }
+
+    @Implementation
+    protected boolean factoryReset() {
+        sResetCalledCount++;
+        return true;
+    }
+
+    @Implementation
+    protected static synchronized BluetoothAdapter getDefaultAdapter() {
+        return (BluetoothAdapter) ShadowApplication.getInstance().getBluetoothAdapter();
+    }
+
+    @Implementation
+    protected ParcelUuid[] getUuids() {
+        return null;
+    }
+
+    @Implementation
+    protected String getName() {
+        return mName;
+    }
+
+    @Implementation
+    protected boolean setName(String name) {
+        if (getState() != STATE_ON) {
+            return false;
+        }
+        mName = name;
+        return true;
+    }
+
+    @Implementation
+    protected int getScanMode() {
+        if (getState() != STATE_ON) {
+            return SCAN_MODE_NONE;
+        }
+        return mScanMode;
+    }
+
+    @Implementation
+    protected boolean setScanMode(int scanMode) {
+        if (getState() != STATE_ON) {
+            return false;
+        }
+        mScanMode = scanMode;
+        return true;
+    }
+
+    @Implementation
+    protected List<Integer> getSupportedProfiles() {
+        return Collections.emptyList();
+    }
+
+    @Resetter
+    public static void reset() {
+        sResetCalledCount = 0;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowBluetoothPan.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowBluetoothPan.java
new file mode 100644
index 0000000..6d629e5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowBluetoothPan.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018 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.car.settings.testutils;
+
+import android.bluetooth.BluetoothPan;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(BluetoothPan.class)
+public class ShadowBluetoothPan {
+    @Implementation
+    public void __constructor__(Context context, BluetoothProfile.ServiceListener l) {
+        // Do nothing. Implemented to avoid NullPointerException in BluetoothPan.
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCar.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCar.java
index f96d4d2..ed0f78b 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowCar.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCar.java
@@ -16,14 +16,19 @@
 
 package com.android.car.settings.testutils;
 
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
 import android.car.Car;
+import android.car.CarNotConnectedException;
 import android.content.Context;
 import android.content.ServiceConnection;
 
+import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
 
 /**
  * Shadow class for {@link Car}. Components in car support library expects
@@ -32,8 +37,80 @@
 @Implements(Car.class)
 public class ShadowCar {
 
+    private static Car sMockCar = mock(Car.class);
+    private static boolean sIsConnected;
+    private static String sServiceName;
+    private static Object sCarManager;
+
+    /**
+     * Returns a mocked version of a {@link Car} object.
+     */
     @Implementation
-    public static Car createCar(Context context, ServiceConnection serviceConnection) {
-        return mock(Car.class);
+    protected static Car createCar(Context context, ServiceConnection serviceConnection) {
+        if (serviceConnection != null) {
+            doAnswer((Answer<Void>) invocation -> {
+                serviceConnection.onServiceConnected(null, null);
+                return null;
+            }).when(sMockCar).connect();
+            doAnswer((Answer<Void>) invocation -> {
+                serviceConnection.onServiceDisconnected(null);
+                return null;
+            }).when(sMockCar).disconnect();
+        }
+        doReturn(sIsConnected).when(sMockCar).isConnected();
+        if (sServiceName != null) {
+            try {
+                doReturn(sCarManager).when(sMockCar).getCarManager(sServiceName);
+            } catch (CarNotConnectedException e) {
+                // do nothing, have to do this because compiler doesn't understand mock can't throw
+                // exception.
+            }
+        }
+        return sMockCar;
+    }
+
+    /**
+     * Returns a mocked version of a {@link Car} object.
+     */
+    @Implementation
+    protected static Car createCar(Context context) {
+        doReturn(sIsConnected).when(sMockCar).isConnected();
+        if (sServiceName != null) {
+            try {
+                doReturn(sCarManager).when(sMockCar).getCarManager(sServiceName);
+            } catch (CarNotConnectedException e) {
+                // do nothing, have to do this because compiler doesn't understand mock can't throw
+                // exception.
+            }
+        }
+        return sMockCar;
+    }
+
+    /**
+     * Sets the manager returned by {@link Car#getCarManager(String)}.
+     *
+     * @param serviceName the name for the service request that should return this car manager.
+     * @param carManager  the object returned by a call with this service.
+     */
+    public static void setCarManager(String serviceName, Object carManager) {
+        sServiceName = serviceName;
+        sCarManager = carManager;
+        try {
+            doReturn(carManager).when(sMockCar).getCarManager(serviceName);
+        } catch (CarNotConnectedException e) {
+            // do nothing, have to do this because compiler doesn't understand mock can't throw e.
+        }
+    }
+
+    /**
+     * Resets the shadow state, note this will not remove stubbed behavior on references to older
+     * calls to {@link #createCar(Context, ServiceConnection)}.
+     */
+    @Resetter
+    public static void reset() {
+        sMockCar = mock(Car.class);
+        sServiceName = null;
+        sCarManager = null;
+        sIsConnected = false;
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUnitsManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUnitsManager.java
new file mode 100644
index 0000000..91ed48e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUnitsManager.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import com.android.car.settings.units.CarUnitsManager;
+import com.android.car.settings.units.Unit;
+import com.android.car.settings.units.UnitsMap;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.HashMap;
+
+/**
+ * Shadow class for {@link CarUnitsManager}.
+ */
+@Implements(CarUnitsManager.class)
+public class ShadowCarUnitsManager {
+    private static boolean sConnected = false;
+    private static CarUnitsManager.OnCarServiceListener sListener;
+    private static HashMap<Integer, Unit[]> sSupportedUnits = new HashMap<>();
+    private static HashMap<Integer, Unit> sUnitsBeingUsed = new HashMap<>();
+
+    @Implementation
+    protected void connect() {
+        sConnected = true;
+    }
+
+    @Implementation
+    protected void disconnect() {
+        sConnected = false;
+    }
+
+    @Implementation
+    protected static Unit[] getUnitsSupportedByProperty(int propertyId) {
+        return sSupportedUnits.get(propertyId);
+    }
+
+    @Implementation
+    protected static Unit getUnitUsedByProperty(int propertyId) {
+        return sUnitsBeingUsed.get(propertyId);
+    }
+
+    @Implementation
+    protected static void setUnitUsedByProperty(int propertyId, int unitId) {
+        sUnitsBeingUsed.put(propertyId, UnitsMap.MAP.get(unitId));
+    }
+
+    @Implementation
+    protected static void registerCarServiceListener(
+            CarUnitsManager.OnCarServiceListener listener) {
+        sListener = listener;
+    }
+
+    @Implementation
+    protected static void unregisterCarServiceListener() {
+        sListener = null;
+    }
+
+    @Resetter
+    public static void reset() {
+        sConnected = false;
+        sListener = null;
+        sSupportedUnits = new HashMap<>();
+        sUnitsBeingUsed = new HashMap<>();
+    }
+
+    public static void setUnitsSupportedByProperty(int propertyId, Unit[] units) {
+        sSupportedUnits.put(propertyId, units);
+    }
+
+    public static boolean isConnected() {
+        return sConnected;
+    }
+
+    public static CarUnitsManager.OnCarServiceListener getListener() {
+        return sListener;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
index 842a19c..b900a55 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarUserManagerHelper.java
@@ -16,18 +16,26 @@
 
 package com.android.car.settings.testutils;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper.OnUsersUpdateListener;
 import android.content.pm.UserInfo;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.annotation.Resetter;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * Shadow for {@link CarUserManagerHelper}
  */
 @Implements(CarUserManagerHelper.class)
 public class ShadowCarUserManagerHelper {
+    // First Map keys from user id to map of restrictions. Second Map keys from restriction id to
+    // bool.
+    private static Map<Integer, Map<String, Boolean>> sUserRestrictionMap = new HashMap<>();
     private static CarUserManagerHelper sMockInstance;
 
     public static void setMockInstance(CarUserManagerHelper userManagerHelper) {
@@ -37,10 +45,138 @@
     @Resetter
     public static void reset() {
         sMockInstance = null;
+        sUserRestrictionMap.clear();
     }
 
     @Implementation
-    public void setUserName(UserInfo user, String name) {
+    protected void setUserName(UserInfo user, String name) {
         sMockInstance.setUserName(user, name);
     }
+
+    @Implementation
+    protected UserInfo getCurrentProcessUserInfo() {
+        return sMockInstance.getCurrentProcessUserInfo();
+    }
+
+    @Implementation
+    protected UserInfo getCurrentForegroundUserInfo() {
+        return sMockInstance.getCurrentForegroundUserInfo();
+    }
+
+    @Implementation
+    protected int getCurrentProcessUserId() {
+        return sMockInstance.getCurrentProcessUserId();
+    }
+
+    @Implementation
+    protected boolean isCurrentProcessUser(UserInfo userInfo) {
+        return sMockInstance.isCurrentProcessUser(userInfo);
+    }
+
+    @Implementation
+    protected List<UserInfo> getAllSwitchableUsers() {
+        return sMockInstance.getAllSwitchableUsers();
+    }
+
+    @Implementation
+    protected List<UserInfo> getAllUsers() {
+        return sMockInstance.getAllUsers();
+    }
+
+    @Implementation
+    protected List<UserInfo> getAllPersistentUsers() {
+        return sMockInstance.getAllPersistentUsers();
+    }
+
+    @Implementation
+    protected UserInfo createNewNonAdminUser(String userName) {
+        return sMockInstance.createNewNonAdminUser(userName);
+    }
+
+    @Implementation
+    protected void registerOnUsersUpdateListener(OnUsersUpdateListener listener) {
+        sMockInstance.registerOnUsersUpdateListener(listener);
+    }
+
+    @Implementation
+    protected void unregisterOnUsersUpdateListener(OnUsersUpdateListener listener) {
+        sMockInstance.unregisterOnUsersUpdateListener(listener);
+    }
+
+    @Implementation
+    protected boolean isUserLimitReached() {
+        return sMockInstance.isUserLimitReached();
+    }
+
+    @Implementation
+    protected boolean canCurrentProcessModifyAccounts() {
+        return sMockInstance.canCurrentProcessModifyAccounts();
+    }
+
+    @Implementation
+    protected boolean canCurrentProcessAddUsers() {
+        return sMockInstance.canCurrentProcessAddUsers();
+    }
+
+    @Implementation
+    protected int getMaxSupportedRealUsers() {
+        return sMockInstance.getMaxSupportedRealUsers();
+    }
+
+    @Implementation
+    protected boolean canCurrentProcessRemoveUsers() {
+        return sMockInstance.canCurrentProcessRemoveUsers();
+    }
+
+    @Implementation
+    protected boolean canUserBeRemoved(UserInfo userInfo) {
+        return sMockInstance.canUserBeRemoved(userInfo);
+    }
+
+    @Implementation
+    protected void grantAdminPermissions(UserInfo user) {
+        sMockInstance.grantAdminPermissions(user);
+    }
+
+    @Implementation
+    protected boolean isCurrentProcessDemoUser() {
+        return sMockInstance.isCurrentProcessDemoUser();
+    }
+
+    @Implementation
+    protected boolean isCurrentProcessAdminUser() {
+        return sMockInstance.isCurrentProcessAdminUser();
+    }
+
+    @Implementation
+    protected boolean isCurrentProcessGuestUser() {
+        return sMockInstance.isCurrentProcessGuestUser();
+    }
+
+    @Implementation
+    protected boolean isCurrentProcessUserHasRestriction(String restriction) {
+        return sMockInstance.isCurrentProcessUserHasRestriction(restriction);
+    }
+
+    @Implementation
+    protected boolean removeUser(UserInfo userInfo, String guestUserName) {
+        return sMockInstance.removeUser(userInfo, guestUserName);
+    }
+
+    @Implementation
+    protected void setUserRestriction(UserInfo userInfo, String restriction, boolean enable) {
+        Map<String, Boolean> permissionsMap = sUserRestrictionMap.getOrDefault(userInfo.id,
+                new HashMap<>());
+        permissionsMap.put(restriction, enable);
+        sUserRestrictionMap.put(userInfo.id, permissionsMap);
+    }
+
+    @Implementation
+    protected boolean hasUserRestriction(String restriction, UserInfo userInfo) {
+        // False by default, if nothing was added to our map,
+        if (!sUserRestrictionMap.containsKey(userInfo.id)) {
+            return false;
+        }
+        return sUserRestrictionMap.get(userInfo.id).getOrDefault(restriction, false);
+    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
new file mode 100644
index 0000000..e07116a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+
+import com.android.car.settings.wifi.CarWifiManager;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.List;
+
+/** TODO: Refactor all methods to run without relying on sInstance. */
+@Implements(CarWifiManager.class)
+public class ShadowCarWifiManager {
+
+    public static final int STATE_UNKNOWN = -1;
+    public static final int STATE_STARTED = 0;
+    public static final int STATE_STOPPED = 1;
+    public static final int STATE_DESTROYED = 2;
+
+    private static CarWifiManager sInstance;
+    private static int sCurrentState = STATE_UNKNOWN;
+    private static WifiConfiguration sWifiConfiguration = new WifiConfiguration();
+    private static boolean sIsDualModeSupported = true;
+    private static boolean sIsDualBandSupported = true;
+
+    public static void setInstance(CarWifiManager wifiManager) {
+        sInstance = wifiManager;
+    }
+
+    @Resetter
+    public static void reset() {
+        sInstance = null;
+        sWifiConfiguration = new WifiConfiguration();
+        sCurrentState = STATE_UNKNOWN;
+        sIsDualModeSupported = true;
+        sIsDualBandSupported = true;
+    }
+
+    @Implementation
+    public void __constructor__(Context context) {
+    }
+
+    @Implementation
+    public void start() {
+        if (sInstance != null) {
+            sInstance.start();
+        }
+        sCurrentState = STATE_STARTED;
+    }
+
+    @Implementation
+    public void stop() {
+        if (sInstance != null) {
+            sInstance.stop();
+        }
+        sCurrentState = STATE_STOPPED;
+    }
+
+    @Implementation
+    public void destroy() {
+        if (sInstance != null) {
+            sInstance.destroy();
+        }
+        sCurrentState = STATE_DESTROYED;
+    }
+
+    @Implementation
+    public void setWifiApConfig(WifiConfiguration config) {
+        sWifiConfiguration = config;
+    }
+
+    @Implementation
+    public WifiConfiguration getWifiApConfig() {
+        return sWifiConfiguration;
+    }
+
+    @Implementation
+    public boolean setWifiEnabled(boolean enabled) {
+        return sInstance.setWifiEnabled(enabled);
+    }
+
+    @Implementation
+    public boolean isWifiEnabled() {
+        return sInstance.isWifiEnabled();
+    }
+
+    @Implementation
+    public boolean isWifiApEnabled() {
+        return sInstance.isWifiApEnabled();
+    }
+
+    @Implementation
+    public List<AccessPoint> getAllAccessPoints() {
+        return sInstance.getAllAccessPoints();
+    }
+
+    @Implementation
+    public List<AccessPoint> getSavedAccessPoints() {
+        return sInstance.getSavedAccessPoints();
+    }
+
+    @Implementation
+    public void connectToPublicWifi(AccessPoint accessPoint, WifiManager.ActionListener listener) {
+        sInstance.connectToPublicWifi(accessPoint, listener);
+    }
+
+    @Implementation
+    protected void connectToSavedWifi(AccessPoint accessPoint,
+            WifiManager.ActionListener listener) {
+        sInstance.connectToSavedWifi(accessPoint, listener);
+    }
+
+    @Implementation
+    protected boolean isDualModeSupported() {
+        return sIsDualModeSupported;
+    }
+
+    @Implementation
+    protected String getCountryCode() {
+        return "1";
+    }
+
+    @Implementation
+    protected boolean isDualBandSupported() {
+        return sIsDualBandSupported;
+    }
+
+    public static void setIsDualModeSupported(boolean supported) {
+        sIsDualModeSupported = supported;
+    }
+
+    public static void setIsDualBandSupported(boolean supported) {
+        sIsDualBandSupported = supported;
+    }
+
+    public static int getCurrentState() {
+        return sCurrentState;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarrierConfigManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarrierConfigManager.java
new file mode 100644
index 0000000..58cc473
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarrierConfigManager.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.util.SparseArray;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(CarrierConfigManager.class)
+public class ShadowCarrierConfigManager {
+
+    private SparseArray<PersistableBundle> mBundles = new SparseArray<>();
+
+    @Implementation
+    protected PersistableBundle getConfigForSubId(int subId) {
+        return mBundles.get(subId);
+    }
+
+    public void setConfigForSubId(int subId, PersistableBundle config) {
+        mBundles.put(subId, config);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowConnectivityManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowConnectivityManager.java
new file mode 100644
index 0000000..5c41365
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowConnectivityManager.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import static org.mockito.Mockito.mock;
+
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.os.Handler;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Implements(ConnectivityManager.class)
+public class ShadowConnectivityManager extends org.robolectric.shadows.ShadowConnectivityManager {
+
+    private static int sResetCalledCount = 0;
+
+    private final Map<Network, NetworkCapabilities> mCapabilitiesMap = new HashMap<>();
+
+    private int mStartTetheringCalledCount = 0;
+    private int mStopTetheringCalledCount = 0;
+    private int mTetheringType;
+
+    public static boolean verifyFactoryResetCalled(int numTimes) {
+        return sResetCalledCount == numTimes;
+    }
+
+    public boolean verifyStartTetheringCalled(int numTimes) {
+        return mStartTetheringCalledCount == numTimes;
+    }
+
+    public boolean verifyStopTetheringCalled(int numTimes) {
+        return mStopTetheringCalledCount == numTimes;
+    }
+
+    public int getTetheringType() {
+        return mTetheringType;
+    }
+
+    public void addNetworkCapabilities(Network network, NetworkCapabilities capabilities) {
+        super.addNetwork(network, mock(NetworkInfo.class));
+        mCapabilitiesMap.put(network, capabilities);
+    }
+
+    @Implementation
+    protected NetworkCapabilities getNetworkCapabilities(Network network) {
+        return mCapabilitiesMap.get(network);
+    }
+
+    @Implementation
+    public void startTethering(int type, boolean showProvisioningUi,
+            final ConnectivityManager.OnStartTetheringCallback callback, Handler handler) {
+        mTetheringType = type;
+        mStartTetheringCalledCount++;
+    }
+
+    @Implementation
+    public void stopTethering(int type) {
+        mTetheringType = type;
+        mStopTetheringCalledCount++;
+    }
+
+    @Implementation
+    protected void factoryReset() {
+        sResetCalledCount++;
+    }
+
+    @Resetter
+    public static void reset() {
+        sResetCalledCount = 0;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowContentResolver.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowContentResolver.java
new file mode 100644
index 0000000..e899705
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowContentResolver.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.accounts.Account;
+import android.annotation.UserIdInt;
+import android.content.ContentResolver;
+import android.content.SyncAdapterType;
+import android.content.SyncInfo;
+import android.content.SyncStatusInfo;
+import android.content.SyncStatusObserver;
+import android.os.Bundle;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Derived from {@link com.android.settings.testutils.shadow.ShadowContentResolver}
+ *
+ * <p>Needed for many account-related tests because the default ShadowContentResolver does not
+ * include an implementation of getSyncAdapterTypesAsUser, which is used by {@link
+ * com.android.settingslib.accounts.AuthenticatorHelper#buildAccountTypeToAuthoritiesMap}.
+ */
+@Implements(ContentResolver.class)
+public class ShadowContentResolver extends org.robolectric.shadows.ShadowContentResolver {
+    private static final int SYNCABLE = 1;
+
+    private static SyncAdapterType[] sSyncAdapterTypes = new SyncAdapterType[0];
+    private static Map<String, Integer> sSyncable = new HashMap<>();
+    private static Map<String, Boolean> sSyncAutomatically = new HashMap<>();
+    private static Map<Integer, Boolean> sMasterSyncAutomatically = new HashMap<>();
+    private static Map<String, SyncStatusInfo> sSyncStatus = new HashMap<>();
+    private static List<SyncInfo> sSyncs = new ArrayList<>();
+    private static SyncListener sSyncListener;
+    private static SyncStatusObserver sStatusObserver;
+
+    @Implementation
+    protected static SyncAdapterType[] getSyncAdapterTypesAsUser(int userId) {
+        return sSyncAdapterTypes;
+    }
+
+    @Implementation
+    protected static int getIsSyncableAsUser(Account account, String authority, int userId) {
+        return sSyncable.getOrDefault(authority, SYNCABLE);
+    }
+
+    @Implementation
+    protected static boolean getSyncAutomaticallyAsUser(Account account, String authority,
+            int userId) {
+        return sSyncAutomatically.getOrDefault(authority, true);
+    }
+
+    @Implementation
+    protected static boolean getMasterSyncAutomaticallyAsUser(int userId) {
+        return sMasterSyncAutomatically.getOrDefault(userId, true);
+    }
+
+    @Implementation
+    protected static List<SyncInfo> getCurrentSyncsAsUser(@UserIdInt int userId) {
+        return sSyncs;
+    }
+
+    @Implementation
+    protected static SyncStatusInfo getSyncStatusAsUser(Account account, String authority,
+            @UserIdInt int userId) {
+        return sSyncStatus.get(authority);
+    }
+
+    public static void setSyncAdapterTypes(SyncAdapterType[] syncAdapterTypes) {
+        sSyncAdapterTypes = syncAdapterTypes;
+    }
+
+    @Implementation
+    public static void setIsSyncable(Account account, String authority, int syncable) {
+        sSyncable.put(authority, syncable);
+    }
+
+    @Implementation
+    protected static void setSyncAutomaticallyAsUser(Account account, String authority,
+            boolean sync, @UserIdInt int userId) {
+        sSyncAutomatically.put(authority, sync);
+    }
+
+    @Implementation
+    protected static void setMasterSyncAutomaticallyAsUser(boolean sync, @UserIdInt int userId) {
+        sMasterSyncAutomatically.put(userId, sync);
+    }
+
+    public static void setCurrentSyncs(List<SyncInfo> syncs) {
+        sSyncs = syncs;
+    }
+
+    public static void setSyncStatus(Account account, String authority, SyncStatusInfo status) {
+        sSyncStatus.put(authority, status);
+    }
+
+    @Implementation
+    public static void cancelSyncAsUser(Account account, String authority, @UserIdInt int userId) {
+        if (sSyncListener != null) {
+            sSyncListener.onSyncCanceled(account, authority, userId);
+        }
+    }
+
+    @Implementation
+    public static void requestSyncAsUser(Account account, String authority, @UserIdInt int userId,
+            Bundle extras) {
+        if (sSyncListener != null) {
+            sSyncListener.onSyncRequested(account, authority, userId, extras);
+        }
+    }
+
+    public static void setSyncListener(SyncListener syncListener) {
+        sSyncListener = syncListener;
+    }
+
+    @Implementation
+    protected static Object addStatusChangeListener(int mask, SyncStatusObserver callback) {
+        sStatusObserver = callback;
+        return null;
+    }
+
+    @Implementation
+    protected static void removeStatusChangeListener(Object handle) {
+        sStatusObserver = null;
+    }
+
+    public static SyncStatusObserver getStatusChangeListener() {
+        return sStatusObserver;
+    }
+
+    @Resetter
+    public static void reset() {
+        org.robolectric.shadows.ShadowContentResolver.reset();
+        sSyncable.clear();
+        sSyncAutomatically.clear();
+        sMasterSyncAutomatically.clear();
+        sSyncAdapterTypes = new SyncAdapterType[0];
+        sSyncStatus.clear();
+        sSyncs = new ArrayList<>();
+        sSyncListener = null;
+        sStatusObserver = null;
+    }
+
+    /**
+     * A listener interface that can be used to verify calls to {@link #cancelSyncAsUser} and {@link
+     * #requestSyncAsUser}
+     */
+    public interface SyncListener {
+        void onSyncCanceled(Account account, String authority, @UserIdInt int userId);
+
+        void onSyncRequested(Account account, String authority, @UserIdInt int userId,
+                Bundle extras);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowDataUsageController.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowDataUsageController.java
new file mode 100644
index 0000000..bbbe214
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowDataUsageController.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.net.NetworkTemplate;
+
+import com.android.settingslib.net.DataUsageController;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(DataUsageController.class)
+public class ShadowDataUsageController {
+
+    private static DataUsageController sInstance;
+
+    public static void setInstance(DataUsageController dataUsageController) {
+        sInstance = dataUsageController;
+    }
+
+    @Implementation
+    protected DataUsageController.DataUsageInfo getDataUsageInfo(NetworkTemplate template) {
+        return sInstance.getDataUsageInfo(template);
+    }
+
+    @Resetter
+    public static void reset() {
+        sInstance = null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowDefaultDialerManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowDefaultDialerManager.java
new file mode 100644
index 0000000..2abc953
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowDefaultDialerManager.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.Context;
+import android.telecom.DefaultDialerManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(DefaultDialerManager.class)
+public class ShadowDefaultDialerManager {
+
+    private static String sDefaultDialerPackage;
+
+    @Resetter
+    public static void reset() {
+        sDefaultDialerPackage = null;
+    }
+
+    @Implementation
+    protected static String getDefaultDialerApplication(Context context) {
+        return sDefaultDialerPackage;
+    }
+
+    public static void setDefaultDialerApplication(String defaultDialerPackage) {
+        sDefaultDialerPackage = defaultDialerPackage;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowDevicePolicyManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowDevicePolicyManager.java
new file mode 100644
index 0000000..5a6e713
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowDevicePolicyManager.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.annotation.Nullable;
+import android.app.admin.DevicePolicyManager;
+import android.util.ArraySet;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.List;
+import java.util.Set;
+
+@Implements(value = DevicePolicyManager.class)
+public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDevicePolicyManager {
+    @Nullable
+    private static List<String> sPermittedInputMethods;
+
+    private Set<String> mActiveAdminsPackages = new ArraySet<>();
+    private boolean mIsInstallInQueue;
+
+    @Resetter
+    public static void reset() {
+        sPermittedInputMethods = null;
+    }
+
+    @Implementation
+    @Nullable
+    protected List<String> getPermittedInputMethodsForCurrentUser() {
+        return sPermittedInputMethods;
+    }
+
+    public static void setPermittedInputMethodsForCurrentUser(@Nullable List<String> inputMethods) {
+        sPermittedInputMethods = inputMethods;
+    }
+
+    @Implementation
+    protected boolean packageHasActiveAdmins(String packageName) {
+        return mActiveAdminsPackages.contains(packageName);
+    }
+
+    public void setPackageHasActiveAdmins(String packageName, boolean hasActiveAdmins) {
+        if (hasActiveAdmins) {
+            mActiveAdminsPackages.add(packageName);
+        } else {
+            mActiveAdminsPackages.remove(packageName);
+        }
+    }
+
+    @Implementation
+    protected boolean isUninstallInQueue(String packageName) {
+        return mIsInstallInQueue;
+    }
+
+    public void setIsUninstallInQueue(boolean isUninstallInQueue) {
+        mIsInstallInQueue = isUninstallInQueue;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowINetworkStatsServiceStub.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowINetworkStatsServiceStub.java
new file mode 100644
index 0000000..9de5a1d
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowINetworkStatsServiceStub.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.net.INetworkStatsService;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(value = INetworkStatsService.Stub.class)
+public class ShadowINetworkStatsServiceStub {
+
+    private static INetworkStatsService sINetworkStatsService;
+
+    @Resetter
+    public static void reset() {
+        sINetworkStatsService = null;
+    }
+
+    @Implementation
+    public static android.net.INetworkStatsService asInterface(android.os.IBinder obj) {
+        return sINetworkStatsService;
+    }
+
+    public static void setINetworkStatsSession(INetworkStatsService iNetworkStatsService) {
+        sINetworkStatsService = iNetworkStatsService;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowISms.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowISms.java
new file mode 100644
index 0000000..17a5073
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowISms.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.os.IBinder;
+
+import com.android.internal.telephony.ISms;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(value = ISms.Stub.class)
+public class ShadowISms {
+
+    private static ISms sISms;
+
+    @Resetter
+    public static void reset() {
+        sISms = null;
+    }
+
+    public static void setISms(ISms iSms) {
+        sISms = iSms;
+    }
+
+    @Implementation
+    protected static ISms asInterface(IBinder obj) {
+        return sISms;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowIUsbManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowIUsbManager.java
new file mode 100644
index 0000000..b940a2e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowIUsbManager.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.hardware.usb.IUsbManager;
+import android.os.IBinder;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(value = IUsbManager.Stub.class)
+public class ShadowIUsbManager {
+
+    private static IUsbManager sInstance;
+
+    public static void setInstance(IUsbManager instance) {
+        sInstance = instance;
+    }
+
+    @Implementation
+    public static IUsbManager asInterface(IBinder obj) {
+        return sInstance;
+    }
+
+    @Resetter
+    public static void reset() {
+        sInstance = null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowIconDrawableFactory.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowIconDrawableFactory.java
new file mode 100644
index 0000000..29ab22c
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowIconDrawableFactory.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.pm.ApplicationInfo;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.util.IconDrawableFactory;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(value = IconDrawableFactory.class)
+public class ShadowIconDrawableFactory {
+
+    @Implementation
+    protected Drawable getBadgedIcon(ApplicationInfo appInfo) {
+        return new ColorDrawable(0);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowInputMethodManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowInputMethodManager.java
new file mode 100644
index 0000000..6edf719
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowInputMethodManager.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.provider.Settings;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+
+import androidx.annotation.Nullable;
+
+import com.android.car.settings.inputmethod.InputMethodUtil;
+
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Implements(value = InputMethodManager.class)
+public class ShadowInputMethodManager extends org.robolectric.shadows.ShadowInputMethodManager {
+    private static List<InputMethodSubtype> sInputMethodSubtypes = new ArrayList<>();
+    private static List<InputMethodInfo> sInputMethodList = new ArrayList<>();
+    private static Map<String, InputMethodInfo> sInputMethodMap = new HashMap<>();
+
+    @Resetter
+    public static void reset() {
+        sInputMethodSubtypes.clear();
+        sInputMethodList.clear();
+        sInputMethodMap.clear();
+        org.robolectric.shadows.ShadowInputMethodManager.reset();
+    }
+
+    public static void setEnabledInputMethodSubtypeList(List<InputMethodSubtype> list) {
+        sInputMethodSubtypes = list;
+    }
+
+    @Implementation
+    protected List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi,
+            boolean allowsImplicitlySelectedSubtypes) {
+        return sInputMethodSubtypes;
+    }
+
+    public static void setEnabledInputMethodList(@Nullable List<InputMethodInfo> list) {
+        if (list == null || list.size() == 0) {
+            Settings.Secure.putString(RuntimeEnvironment.application.getContentResolver(),
+                    Settings.Secure.ENABLED_INPUT_METHODS, "");
+            return;
+        }
+
+        String concatenatedInputMethodIds = createInputMethodIdString(list.stream().map(
+                imi -> imi.getId()).collect(Collectors.toList()).toArray(new String[list.size()]));
+        Settings.Secure.putString(RuntimeEnvironment.application.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS, concatenatedInputMethodIds);
+        addInputMethodInfosToMap(list);
+    }
+
+    @Implementation
+    protected List<InputMethodInfo> getEnabledInputMethodList() {
+        List<InputMethodInfo> enabledInputMethodList = new ArrayList<>();
+
+        String inputMethodIdString = Settings.Secure.getString(
+                RuntimeEnvironment.application.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS);
+        if (inputMethodIdString == null || inputMethodIdString.isEmpty()) {
+            return enabledInputMethodList;
+        }
+
+        InputMethodUtil.sInputMethodSplitter.setString(inputMethodIdString);
+        while (InputMethodUtil.sInputMethodSplitter.hasNext()) {
+            enabledInputMethodList.add(sInputMethodMap.get(InputMethodUtil.sInputMethodSplitter
+                    .next()));
+        }
+        return enabledInputMethodList;
+    }
+
+    public void setInputMethodList(List<InputMethodInfo> inputMethodInfos) {
+        sInputMethodList = inputMethodInfos;
+        if (inputMethodInfos == null) {
+            return;
+        }
+
+        addInputMethodInfosToMap(inputMethodInfos);
+    }
+
+    @Implementation
+    protected List<InputMethodInfo> getInputMethodList() {
+        return sInputMethodList;
+    }
+
+    private static String createInputMethodIdString(String... ids) {
+        int size = ids == null ? 0 : ids.length;
+
+        if (size == 1) {
+            return ids[0];
+        }
+
+        StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < size; i++) {
+            builder.append(ids[i]);
+            if (i != size - 1) {
+                builder.append(InputMethodUtil.INPUT_METHOD_DELIMITER);
+            }
+        }
+        return builder.toString();
+    }
+
+    private static void addInputMethodInfosToMap(List<InputMethodInfo> inputMethodInfos) {
+        if (sInputMethodMap == null || sInputMethodMap.size() == 0) {
+            sInputMethodMap = inputMethodInfos.stream().collect(Collectors.toMap(
+                    InputMethodInfo::getId, imi -> imi));
+            return;
+        }
+
+        inputMethodInfos.forEach(imi -> {
+            sInputMethodMap.put(imi.getId(), imi);
+        });
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalBluetoothAdapter.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalBluetoothAdapter.java
new file mode 100644
index 0000000..da4d43b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalBluetoothAdapter.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.bluetooth.BluetoothAdapter;
+
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(LocalBluetoothAdapter.class)
+public class ShadowLocalBluetoothAdapter {
+
+    private int mState = BluetoothAdapter.STATE_OFF;
+    private boolean mIsBluetoothEnabled = true;
+    private int mScanMode = BluetoothAdapter.SCAN_MODE_NONE;
+
+    @Implementation
+    protected boolean isEnabled() {
+        return mIsBluetoothEnabled;
+    }
+
+    @Implementation
+    protected boolean enable() {
+        mIsBluetoothEnabled = true;
+        return true;
+    }
+
+    @Implementation
+    protected boolean disable() {
+        mIsBluetoothEnabled = false;
+        return true;
+    }
+
+    @Implementation
+    protected int getScanMode() {
+        return mScanMode;
+    }
+
+    @Implementation
+    protected void setScanMode(int mode) {
+        mScanMode = mode;
+    }
+
+    @Implementation
+    protected boolean setScanMode(int mode, int duration) {
+        mScanMode = mode;
+        return true;
+    }
+
+    @Implementation
+    protected int getState() {
+        return mState;
+    }
+
+    public void setState(int state) {
+        mState = state;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalBroadcastManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalBroadcastManager.java
new file mode 100644
index 0000000..54bbe71
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalBroadcastManager.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+import org.robolectric.util.ReflectionHelpers.ClassParameter;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+@Implements(LocalBroadcastManager.class)
+public class ShadowLocalBroadcastManager {
+    private static List<Intent> sSentBroadcastIntents = new ArrayList<>();
+    private static List<Wrapper> sRegisteredReceivers = new ArrayList<>();
+
+    @Implementation
+    public static LocalBroadcastManager getInstance(final Context context) {
+        return ShadowApplication.getInstance().getSingleton(LocalBroadcastManager.class,
+                () -> ReflectionHelpers.callConstructor(LocalBroadcastManager.class,
+                        ClassParameter.from(Context.class, context)));
+    }
+
+    @Implementation
+    public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+        sRegisteredReceivers.add(new Wrapper(receiver, filter));
+    }
+
+    @Implementation
+    public void unregisterReceiver(BroadcastReceiver receiver) {
+        Iterator<Wrapper> iterator = sRegisteredReceivers.iterator();
+        while (iterator.hasNext()) {
+            Wrapper wrapper = iterator.next();
+            if (wrapper.getBroadcastReceiver() == receiver) {
+                iterator.remove();
+            }
+        }
+    }
+
+    @Implementation
+    public boolean sendBroadcast(Intent intent) {
+        boolean sent = false;
+        sSentBroadcastIntents.add(intent);
+        List<Wrapper> copy = new ArrayList<>(sRegisteredReceivers);
+        for (Wrapper wrapper : copy) {
+            if (wrapper.getIntentFilter().matchAction(intent.getAction())) {
+                int match = wrapper.getIntentFilter().matchData(intent.getType(),
+                        intent.getScheme(), intent.getData());
+                if (match != IntentFilter.NO_MATCH_DATA && match != IntentFilter.NO_MATCH_TYPE) {
+                    sent = true;
+                    final BroadcastReceiver receiver = wrapper.getBroadcastReceiver();
+                    final Intent broadcastIntent = intent;
+                    Robolectric.getForegroundThreadScheduler().post(
+                            (Runnable) () -> receiver.onReceive(RuntimeEnvironment.application,
+                                    broadcastIntent));
+                }
+            }
+        }
+        return sent;
+    }
+
+    @Resetter
+    public static void reset() {
+        sSentBroadcastIntents.clear();
+        sRegisteredReceivers.clear();
+    }
+
+    public static List<Intent> getSentBroadcastIntents() {
+        return sSentBroadcastIntents;
+    }
+
+    public static List<Wrapper> getRegisteredBroadcastReceivers() {
+        return sRegisteredReceivers;
+    }
+
+    public static class Wrapper {
+        private final BroadcastReceiver mBroadcastReceiver;
+        private final IntentFilter mIntentFilter;
+
+        public Wrapper(BroadcastReceiver broadcastReceiver, IntentFilter intentFilter) {
+            this.mBroadcastReceiver = broadcastReceiver;
+            this.mIntentFilter = intentFilter;
+        }
+
+        public BroadcastReceiver getBroadcastReceiver() {
+            return mBroadcastReceiver;
+        }
+
+        public IntentFilter getIntentFilter() {
+            return mIntentFilter;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalePicker.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalePicker.java
new file mode 100644
index 0000000..ed59177
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocalePicker.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import com.android.internal.app.LocalePicker;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.Locale;
+
+@Implements(LocalePicker.class)
+public class ShadowLocalePicker {
+
+    private static boolean sLocaleUpdated = false;
+
+    @Resetter
+    public static void reset() {
+        sLocaleUpdated = false;
+    }
+
+    @Implementation
+    protected static void updateLocale(Locale locale) {
+        sLocaleUpdated = true;
+    }
+
+    public static boolean localeWasUpdated() {
+        return sLocaleUpdated;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLocaleStore.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocaleStore.java
new file mode 100644
index 0000000..a9dc5ce
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocaleStore.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.Context;
+
+import com.android.internal.app.LocaleStore;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+@Implements(LocaleStore.class)
+public class ShadowLocaleStore {
+
+    private static Map<LocaleStore.LocaleInfo, Set<LocaleStore.LocaleInfo>>
+            sLocaleInfoRelationships = new HashMap<>();
+
+    public static void addLocaleRelationship(Locale parent, Locale child) {
+        LocaleStore.LocaleInfo parentInfo = LocaleStore.getLocaleInfo(parent);
+        LocaleStore.LocaleInfo childInfo = LocaleStore.getLocaleInfo(child);
+        Set<LocaleStore.LocaleInfo> set = sLocaleInfoRelationships.getOrDefault(parentInfo,
+                new HashSet<>());
+        set.add(childInfo);
+        sLocaleInfoRelationships.put(parentInfo, set);
+    }
+
+    @Resetter
+    public static void reset() {
+        sLocaleInfoRelationships.clear();
+    }
+
+    @Implementation
+    protected static Set<LocaleStore.LocaleInfo> getLevelLocales(Context context,
+            Set<String> ignorables, LocaleStore.LocaleInfo parent, boolean translatedOnly) {
+        if (parent != null) {
+            return sLocaleInfoRelationships.getOrDefault(parent, new HashSet<>());
+        } else {
+            return sLocaleInfoRelationships.keySet();
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLocationManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocationManager.java
new file mode 100644
index 0000000..e92d342
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowLocationManager.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.Intent;
+import android.location.LocationManager;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(value = LocationManager.class)
+public class ShadowLocationManager {
+
+    @Implementation
+    protected void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
+        int newMode = enabled
+                ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
+                : Settings.Secure.LOCATION_MODE_OFF;
+
+        Settings.Secure.putIntForUser(RuntimeEnvironment.application.getContentResolver(),
+                Settings.Secure.LOCATION_MODE, newMode, userHandle.getIdentifier());
+        RuntimeEnvironment.application.sendBroadcast(new Intent(
+                LocationManager.MODE_CHANGED_ACTION));
+    }
+
+    @Implementation
+    protected boolean isLocationEnabled() {
+        return Settings.Secure.getInt(RuntimeEnvironment.application.getContentResolver(),
+                Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF)
+                != Settings.Secure.LOCATION_MODE_OFF;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowLockPatternUtils.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowLockPatternUtils.java
new file mode 100644
index 0000000..68731ec
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowLockPatternUtils.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.app.admin.DevicePolicyManager;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockPatternView;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Shadow for LockPatternUtils.
+ */
+@Implements(LockPatternUtils.class)
+public class ShadowLockPatternUtils {
+
+    public static final int NO_USER = -1;
+
+    private static int sPasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+    private static byte[] sSavedPassword;
+    private static List<LockPatternView.Cell> sSavedPattern;
+    private static byte[] sClearLockCredential;
+    private static int sClearLockUser = NO_USER;
+
+
+    @Resetter
+    public static void reset() {
+        sPasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+        sSavedPassword = null;
+        sSavedPattern = null;
+        sClearLockCredential = null;
+        sClearLockUser = NO_USER;
+    }
+
+    /**
+     * Sets the current password quality that is returned by
+     * {@link LockPatternUtils#getKeyguardStoredPasswordQuality}.
+     */
+    public static void setPasswordQuality(int passwordQuality) {
+        sPasswordQuality = passwordQuality;
+    }
+
+    /**
+     * Returns the password saved by a call to {@link LockPatternUtils#saveLockPassword}.
+     */
+    public static byte[] getSavedPassword() {
+        return sSavedPassword;
+    }
+
+    /**
+     * Returns the saved credential passed in to clear the lock, null if it has not been cleared.
+     */
+    public static byte[] getClearLockCredential() {
+        return sClearLockCredential;
+    }
+
+    /**
+     * Returns the user passed in to clear the lock, {@link #NO_USER} if it has not been cleared.
+     */
+    public static int getClearLockUser() {
+        return sClearLockUser;
+    }
+
+
+    /**
+     * Returns the pattern saved by a call to {@link LockPatternUtils#saveLockPattern}.
+     */
+    public static List<LockPatternView.Cell> getSavedPattern() {
+        return sSavedPattern;
+    }
+
+    @Implementation
+    protected void clearLock(byte[] savedCredential, int userHandle) {
+        sClearLockCredential = savedCredential;
+        sClearLockUser = userHandle;
+    }
+
+    @Implementation
+    protected int getKeyguardStoredPasswordQuality(int userHandle) {
+        return sPasswordQuality;
+    }
+
+    @Implementation
+    public void saveLockPassword(byte[] password, byte[] savedPassword, int requestedQuality,
+            int userHandler) {
+        sSavedPassword = password;
+    }
+
+    @Implementation
+    public void saveLockPattern(List<LockPatternView.Cell> pattern, byte[] savedPassword,
+            int userId, boolean allowUntrustedChanges) {
+        sSavedPattern = new ArrayList<>(pattern);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowNetworkPolicyEditor.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowNetworkPolicyEditor.java
new file mode 100644
index 0000000..85d16a6
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowNetworkPolicyEditor.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2011 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.car.settings.testutils;
+
+import android.net.NetworkPolicy;
+import android.net.NetworkTemplate;
+
+import com.android.settingslib.NetworkPolicyEditor;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(NetworkPolicyEditor.class)
+public class ShadowNetworkPolicyEditor {
+
+    private static NetworkPolicy sNetworkPolicy;
+
+    @Implementation
+    public NetworkPolicy getPolicy(NetworkTemplate template) {
+        return sNetworkPolicy;
+    }
+
+    public static void setNetworkPolicy(NetworkPolicy networkPolicy) {
+        sNetworkPolicy = networkPolicy;
+    }
+
+    @Resetter
+    public static void reset() {
+        sNetworkPolicy = null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowNetworkPolicyManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowNetworkPolicyManager.java
new file mode 100644
index 0000000..3d506d0
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowNetworkPolicyManager.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.Context;
+import android.net.NetworkPolicy;
+import android.net.NetworkPolicyManager;
+import android.util.Pair;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.time.ZonedDateTime;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+@Implements(NetworkPolicyManager.class)
+public class ShadowNetworkPolicyManager {
+
+    private static NetworkPolicyManager sNetworkPolicyManager;
+    private static Iterator<Pair<ZonedDateTime, ZonedDateTime>> sCycleIterator;
+    private static Map<String, Integer> sResetCalledForSubscriberCount = new HashMap<>();
+
+    public static boolean verifyFactoryResetCalled(String subscriber, int numTimes) {
+        if (!sResetCalledForSubscriberCount.containsKey(subscriber)) return false;
+        return sResetCalledForSubscriberCount.get(subscriber) == numTimes;
+    }
+
+    @Implementation
+    protected void factoryReset(String subscriber) {
+        sResetCalledForSubscriberCount.put(subscriber,
+                sResetCalledForSubscriberCount.getOrDefault(subscriber, 0) + 1);
+    }
+
+    @Implementation
+    protected int[] getUidsWithPolicy(int policy) {
+        return sNetworkPolicyManager == null ? new int[0] : sNetworkPolicyManager
+                .getUidsWithPolicy(policy);
+    }
+
+    @Implementation
+    protected static Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator(
+            NetworkPolicy policy) {
+        return sCycleIterator;
+    }
+
+    public static void setCycleIterator(
+            Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator) {
+        sCycleIterator = cycleIterator;
+    }
+
+    @Implementation
+    public static NetworkPolicyManager from(Context context) {
+        return sNetworkPolicyManager;
+    }
+
+    public static void setNetworkPolicyManager(NetworkPolicyManager networkPolicyManager) {
+        sNetworkPolicyManager = networkPolicyManager;
+    }
+
+    @Resetter
+    public static void reset() {
+        sResetCalledForSubscriberCount.clear();
+        sCycleIterator = null;
+        sNetworkPolicyManager = null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowNotificationManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowNotificationManager.java
new file mode 100644
index 0000000..3aab74f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowNotificationManager.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.app.AutomaticZenRule;
+import android.app.NotificationManager;
+import android.content.ComponentName;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.Map;
+import java.util.Set;
+
+@Implements(NotificationManager.class)
+public class ShadowNotificationManager extends org.robolectric.shadows.ShadowNotificationManager {
+
+    private Set<String> mNotificationPolicyGrantedPackages = new ArraySet<>();
+    private Set<ComponentName> mNotificationListenerAccessGrantedComponents = new ArraySet<>();
+    private Map<String, AutomaticZenRule> mAutomaticZenRules = new ArrayMap<>();
+    private int mZenRuleIdCounter = 0;
+
+    @Implementation
+    public void setNotificationPolicyAccessGranted(String pkg, boolean granted) {
+        if (granted) {
+            mNotificationPolicyGrantedPackages.add(pkg);
+        } else {
+            mNotificationPolicyGrantedPackages.remove(pkg);
+        }
+    }
+
+    @Implementation
+    protected boolean isNotificationPolicyAccessGrantedForPackage(String pkg) {
+        return mNotificationPolicyGrantedPackages.contains(pkg);
+    }
+
+    @Implementation
+    protected boolean isNotificationListenerAccessGranted(ComponentName listener) {
+        return mNotificationListenerAccessGrantedComponents.contains(listener);
+    }
+
+    @Implementation
+    protected void setNotificationListenerAccessGranted(ComponentName listener, boolean granted) {
+        if (granted) {
+            mNotificationListenerAccessGrantedComponents.add(listener);
+        } else {
+            mNotificationListenerAccessGrantedComponents.remove(listener);
+        }
+    }
+
+    @Implementation
+    protected Map<String, AutomaticZenRule> getAutomaticZenRules() {
+        return mAutomaticZenRules;
+    }
+
+    @Implementation
+    protected String addAutomaticZenRule(AutomaticZenRule automaticZenRule) {
+        String id = String.valueOf(mZenRuleIdCounter++);
+        mAutomaticZenRules.put(id, automaticZenRule);
+        return id;
+    }
+
+    @Implementation
+    protected void removeAutomaticZenRules(String packageName) {
+        mAutomaticZenRules.clear();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowPermissionControllerManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowPermissionControllerManager.java
new file mode 100644
index 0000000..e3f0a95
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowPermissionControllerManager.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.os.Handler;
+import android.permission.PermissionControllerManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.List;
+
+/**
+ * A RuntimePermissionPresenter that changes nothing and <u>never returns callbacks</u>.
+ */
+@Implements(PermissionControllerManager.class)
+public class ShadowPermissionControllerManager {
+    @Implementation
+    protected void __constructor__(Context context, @NonNull Handler handler) {
+        // no nothing, everything is shadowed
+    }
+
+    @Implementation
+    protected void getAppPermissions(String packageName,
+            PermissionControllerManager.OnGetAppPermissionResultCallback callback, Handler handler) {
+    }
+
+    @Implementation
+    protected void revokeRuntimePermission(String packageName, String permissionName) {
+    }
+
+    @Implementation
+    protected void countPermissionApps(List<String> permissionNames, boolean countOnlyGranted,
+            boolean countSystem,
+            PermissionControllerManager.OnCountPermissionAppsResultCallback callback,
+            Handler handler) {
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowRecoverySystem.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowRecoverySystem.java
new file mode 100644
index 0000000..90f37d7
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowRecoverySystem.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.Context;
+import android.os.RecoverySystem;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(RecoverySystem.class)
+public class ShadowRecoverySystem {
+
+    private static int sWipeEuiccDataCalledCount = 0;
+
+    public static boolean verifyWipeEuiccDataCalled(int numTimes) {
+        return sWipeEuiccDataCalledCount == numTimes;
+    }
+
+    @Implementation
+    protected static boolean wipeEuiccData(Context context, final String packageName) {
+        sWipeEuiccDataCalledCount++;
+        return true;
+    }
+
+    @Resetter
+    public static void reset() {
+        sWipeEuiccDataCalledCount = 0;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowRestrictedLockUtilsInternal.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowRestrictedLockUtilsInternal.java
new file mode 100644
index 0000000..5bde1bf
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowRestrictedLockUtilsInternal.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.Context;
+
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtilsInternal;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(RestrictedLockUtilsInternal.class)
+public class ShadowRestrictedLockUtilsInternal {
+
+    private static RestrictedLockUtils.EnforcedAdmin sEnforcedAdmin;
+    private static boolean sHasBaseUserRestriction;
+
+    @Resetter
+    public static void reset() {
+        sEnforcedAdmin = null;
+        sHasBaseUserRestriction = false;
+    }
+
+    public static void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin enforcedAdmin) {
+        sEnforcedAdmin = enforcedAdmin;
+    }
+
+    public static void setHasBaseUserRestriction(boolean hasBaseUserRestriction) {
+        sHasBaseUserRestriction = hasBaseUserRestriction;
+    }
+
+    public static void sendShowAdminSupportDetailsIntent(Context context,
+            RestrictedLockUtils.EnforcedAdmin admin) {
+        // do nothing
+    }
+
+    @Implementation
+    protected static RestrictedLockUtils.EnforcedAdmin checkIfRestrictionEnforced(Context context,
+            String userRestriction, int userId) {
+        return sEnforcedAdmin;
+    }
+
+    @Implementation
+    protected static boolean hasBaseUserRestriction(Context context,
+            String userRestriction, int userId) {
+        return sHasBaseUserRestriction;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowRingtone.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowRingtone.java
new file mode 100644
index 0000000..4be9cfe
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowRingtone.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.Context;
+import android.media.Ringtone;
+import android.net.Uri;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Implements(Ringtone.class)
+public class ShadowRingtone {
+
+    private static Map<Uri, String> sTitleForGivenUri = new HashMap<>();
+
+    public static void setExpectedTitleForUri(Uri uri, String title) {
+        sTitleForGivenUri.put(uri, title);
+    }
+
+    @Implementation
+    protected static String getTitle(
+            Context context, Uri uri, boolean followSettingsUri, boolean allowRemote) {
+        return sTitleForGivenUri.getOrDefault(uri, null);
+    }
+
+    @Resetter
+    public static void reset() {
+        sTitleForGivenUri.clear();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowRingtoneManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowRingtoneManager.java
new file mode 100644
index 0000000..026ec98
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowRingtoneManager.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.Context;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Implements(RingtoneManager.class)
+public class ShadowRingtoneManager {
+    private static Ringtone sRingtone;
+    private static Map<Integer, Uri> sSetDefaultRingtoneCalled = new HashMap<>();
+
+    public static void setRingtone(Ringtone ringtone) {
+        sRingtone = ringtone;
+    }
+
+    @Implementation
+    protected static Ringtone getRingtone(final Context context, Uri ringtoneUri) {
+        return sRingtone;
+    }
+
+    @Implementation
+    public static void setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri) {
+        sSetDefaultRingtoneCalled.put(type, ringtoneUri);
+    }
+
+    @Implementation
+    public static Uri getActualDefaultRingtoneUri(Context context, int type) {
+        return sSetDefaultRingtoneCalled.getOrDefault(type, null);
+    }
+
+    @Resetter
+    public static void reset() {
+        sRingtone = null;
+        sSetDefaultRingtoneCalled.clear();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowSecureSettings.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowSecureSettings.java
new file mode 100644
index 0000000..56e07ee
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowSecureSettings.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.content.ContentResolver;
+import android.provider.Settings;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowSettings;
+import org.robolectric.util.ReflectionHelpers;
+
+@Implements(Settings.Secure.class)
+public class ShadowSecureSettings extends ShadowSettings.ShadowSecure {
+
+    @Implementation
+    protected static int getInt(ContentResolver resolver, String name) {
+        return Shadow.directlyOn(
+                Settings.Secure.class,
+                "getInt",
+                ReflectionHelpers.ClassParameter.from(ContentResolver.class, resolver),
+                ReflectionHelpers.ClassParameter.from(String.class, name));
+    }
+
+    @Implementation
+    protected static int getInt(ContentResolver resolver, String name, int def) {
+        return Shadow.directlyOn(
+                Settings.Secure.class,
+                "getInt",
+                ReflectionHelpers.ClassParameter.from(ContentResolver.class, resolver),
+                ReflectionHelpers.ClassParameter.from(String.class, name),
+                ReflectionHelpers.ClassParameter.from(int.class, def));
+    }
+
+    @Implementation
+    protected static int getIntForUser(ContentResolver resolver, String name, int def,
+            int userHandle) {
+        return Shadow.directlyOn(
+                Settings.Secure.class,
+                "getIntForUser",
+                ReflectionHelpers.ClassParameter.from(ContentResolver.class, resolver),
+                ReflectionHelpers.ClassParameter.from(String.class, name),
+                ReflectionHelpers.ClassParameter.from(int.class, def),
+                ReflectionHelpers.ClassParameter.from(int.class, userHandle));
+    }
+
+    @Implementation
+    protected static boolean putInt(ContentResolver resolver, String name, int value) {
+        return Shadow.directlyOn(
+                Settings.Secure.class,
+                "putInt",
+                ReflectionHelpers.ClassParameter.from(ContentResolver.class, resolver),
+                ReflectionHelpers.ClassParameter.from(String.class, name),
+                ReflectionHelpers.ClassParameter.from(int.class, value));
+    }
+
+    @Implementation
+    protected static boolean putIntForUser(ContentResolver resolver, String name, int value,
+            int userHandle) {
+        return Shadow.directlyOn(
+                Settings.Secure.class,
+                "putIntForUser",
+                ReflectionHelpers.ClassParameter.from(ContentResolver.class, resolver),
+                ReflectionHelpers.ClassParameter.from(String.class, name),
+                ReflectionHelpers.ClassParameter.from(int.class, value),
+                ReflectionHelpers.ClassParameter.from(int.class, userHandle));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowSmsApplication.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowSmsApplication.java
new file mode 100644
index 0000000..4af6ff9
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowSmsApplication.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.ComponentName;
+import android.content.Context;
+
+import com.android.internal.telephony.SmsApplication;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(SmsApplication.class)
+public class ShadowSmsApplication {
+
+    private static ComponentName sDefaultSmsApplication;
+
+    @Resetter
+    public static void reset() {
+        sDefaultSmsApplication = null;
+    }
+
+    @Implementation
+    protected static ComponentName getDefaultSmsApplication(
+            Context context, boolean updateIfNeeded) {
+        return sDefaultSmsApplication;
+    }
+
+    public static void setDefaultSmsApplication(ComponentName defaultSmsApplication) {
+        sDefaultSmsApplication = defaultSmsApplication;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowStorageManagerVolumeProvider.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowStorageManagerVolumeProvider.java
new file mode 100644
index 0000000..5a02ae4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowStorageManagerVolumeProvider.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.os.storage.VolumeInfo;
+
+import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(StorageManagerVolumeProvider.class)
+public class ShadowStorageManagerVolumeProvider {
+
+    private static VolumeInfo sVolumeInfo;
+
+    @Resetter
+    public static void reset() {
+        sVolumeInfo = null;
+    }
+
+    @Implementation
+    protected VolumeInfo findEmulatedForPrivate(VolumeInfo privateVolume) {
+        return sVolumeInfo;
+    }
+
+    public static void setVolumeInfo(VolumeInfo volumeInfo) {
+        sVolumeInfo = volumeInfo;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowSubscriptionManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowSubscriptionManager.java
new file mode 100644
index 0000000..af06db3
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowSubscriptionManager.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.telephony.SubscriptionPlan;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Implements(SubscriptionManager.class)
+public class ShadowSubscriptionManager extends org.robolectric.shadows.ShadowSubscriptionManager {
+
+    private static SubscriptionInfo sDefaultDataSubscriptionInfo = null;
+
+    private List<SubscriptionPlan> mSubscriptionPlanList;
+    private List<SubscriptionInfo> mSelectableSubscriptionInfoList;
+    private List<OnSubscriptionsChangedListener> mOnSubscriptionsChangedListeners =
+            new ArrayList<>();
+    private int mCurrentActiveSubscriptionId;
+
+    @Implementation
+    protected List<SubscriptionPlan> getSubscriptionPlans(int subId) {
+        return mSubscriptionPlanList;
+    }
+
+    public void setSubscriptionPlans(List<SubscriptionPlan> subscriptionPlanList) {
+        mSubscriptionPlanList = subscriptionPlanList;
+    }
+
+    @Implementation
+    protected SubscriptionInfo getDefaultDataSubscriptionInfo() {
+        return sDefaultDataSubscriptionInfo;
+    }
+
+    public static void setDefaultDataSubscriptionInfo(SubscriptionInfo subscriptionInfo) {
+        sDefaultDataSubscriptionInfo = subscriptionInfo;
+    }
+
+    @Implementation
+    protected List<SubscriptionInfo> getSelectableSubscriptionInfoList() {
+        return mSelectableSubscriptionInfoList;
+    }
+
+    public void setSelectableSubscriptionInfoList(List<SubscriptionInfo> infos) {
+        mSelectableSubscriptionInfoList = infos;
+    }
+
+    @Implementation
+    protected void addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
+        super.addOnSubscriptionsChangedListener(listener);
+        mOnSubscriptionsChangedListeners.add(listener);
+    }
+
+    @Implementation
+    protected void removeOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
+        super.removeOnSubscriptionsChangedListener(listener);
+        mOnSubscriptionsChangedListeners.remove(listener);
+    }
+
+    public List<OnSubscriptionsChangedListener> getOnSubscriptionChangedListeners() {
+        return mOnSubscriptionsChangedListeners;
+
+    }
+
+    @Implementation
+    protected boolean isActiveSubscriptionId(int subscriptionId) {
+        return mCurrentActiveSubscriptionId == subscriptionId;
+    }
+
+    public void setCurrentActiveSubscriptionId(int subscriptionId) {
+        mCurrentActiveSubscriptionId = subscriptionId;
+    }
+
+    @Resetter
+    public static void reset() {
+        org.robolectric.shadows.ShadowSubscriptionManager.reset();
+        sDefaultDataSubscriptionInfo = null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowTelephonyManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowTelephonyManager.java
new file mode 100644
index 0000000..9c464f7
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowTelephonyManager.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import static android.telephony.PhoneStateListener.LISTEN_NONE;
+
+import android.telephony.PhoneStateListener;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Implements(TelephonyManager.class)
+public class ShadowTelephonyManager extends org.robolectric.shadows.ShadowTelephonyManager {
+
+    public static final String SUBSCRIBER_ID = "test_id";
+    private static Map<Integer, Integer> sSubIdsWithResetCalledCount = new HashMap<>();
+    private static int sSimCount = 1;
+    private final Map<PhoneStateListener, Integer> mPhoneStateRegistrations = new HashMap<>();
+    private boolean mIsDataEnabled = false;
+    private boolean mIsRoamingEnabled = false;
+
+    public static boolean verifyFactoryResetCalled(int subId, int numTimes) {
+        if (!sSubIdsWithResetCalledCount.containsKey(subId)) return false;
+        return sSubIdsWithResetCalledCount.get(subId) == numTimes;
+    }
+
+    @Implementation
+    protected void listen(PhoneStateListener listener, int flags) {
+        super.listen(listener, flags);
+
+        if (flags == LISTEN_NONE) {
+            mPhoneStateRegistrations.remove(listener);
+        } else {
+            mPhoneStateRegistrations.put(listener, flags);
+        }
+    }
+
+    public List<PhoneStateListener> getListenersForFlags(int flags) {
+        List<PhoneStateListener> listeners = new ArrayList<>();
+        for (PhoneStateListener listener : mPhoneStateRegistrations.keySet()) {
+            if ((mPhoneStateRegistrations.get(listener) & flags) != 0) {
+                listeners.add(listener);
+            }
+        }
+        return listeners;
+    }
+
+    @Implementation
+    protected void setDataEnabled(boolean enable) {
+        mIsDataEnabled = enable;
+    }
+
+    @Implementation
+    protected boolean isDataEnabled() {
+        return mIsDataEnabled;
+    }
+
+    @Implementation
+    protected void factoryReset(int subId) {
+        sSubIdsWithResetCalledCount.put(subId,
+                sSubIdsWithResetCalledCount.getOrDefault(subId, 0) + 1);
+    }
+
+    @Implementation
+    protected String getSubscriberId(int subId) {
+        return subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID ? null : SUBSCRIBER_ID;
+    }
+
+    @Implementation
+    protected int getSimCount() {
+        return sSimCount;
+    }
+
+    public static void setSimCount(int simCount) {
+        sSimCount = simCount;
+    }
+
+    @Implementation
+    protected void setDataRoamingEnabled(boolean isEnabled) {
+        mIsRoamingEnabled = isEnabled;
+    }
+
+    @Implementation
+    protected boolean isDataRoamingEnabled() {
+        return mIsRoamingEnabled;
+    }
+
+    @Resetter
+    public static void reset() {
+        sSubIdsWithResetCalledCount.clear();
+        sSimCount = 1;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowTextListItem.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowTextListItem.java
deleted file mode 100644
index f093f2c..0000000
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowTextListItem.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.testutils;
-
-import android.graphics.drawable.Drawable;
-import android.view.View;
-
-import androidx.car.widget.TextListItem;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-
-/**
- * Allows access to the internals of a text list item for testing.
- */
-@Implements(TextListItem.class)
-public class ShadowTextListItem {
-    private Drawable mDrawable;
-    private int mSupplementalIconDrawableId;
-    private String mTitle;
-    private String mBody;
-    private View.OnClickListener mOnClickListener;
-
-    @Implementation
-    public void setPrimaryActionIcon(Drawable drawable, boolean useLargeIcon) {
-        mDrawable = drawable;
-    }
-
-    @Implementation
-    public void setSupplementalIcon(int iconResId, boolean showDivider) {
-        mSupplementalIconDrawableId = iconResId;
-    }
-
-    @Implementation
-    public void setTitle(String title) {
-        mTitle = title;
-    }
-
-    @Implementation
-    public void setBody(String body) {
-        mBody = body;
-    }
-
-    @Implementation
-    public void setBody(String body, boolean asPrimary) {
-        mBody = body;
-    }
-
-    @Implementation
-    public void setOnClickListener(View.OnClickListener listener) {
-        mOnClickListener = listener;
-    }
-
-    /**
-     * Returns the drawable set on this item.
-     */
-    public Drawable getDrawable() {
-        return mDrawable;
-    }
-
-    /**
-     * Returns the supplemental drawable id set on this item.
-     */
-    public int getSupplementalIconDrawableId() {
-        return mSupplementalIconDrawableId;
-    }
-
-    /**
-     * Returns the title set on this item.
-     */
-    public String getTitle() {
-        return mTitle;
-    }
-
-    /**
-     * Returns the body set on this item.
-     */
-    public String getBody() {
-        return mBody;
-    }
-
-    /**
-     * Returns the onclick listener for this item.
-     */
-    public View.OnClickListener getOnClickListener() {
-        return mOnClickListener;
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowTextToSpeech.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowTextToSpeech.java
new file mode 100644
index 0000000..cdc4b39
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowTextToSpeech.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.Voice;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.Locale;
+
+@Implements(TextToSpeech.class)
+public class ShadowTextToSpeech {
+
+    private static TextToSpeech sInstance;
+    private static TextToSpeech.OnInitListener sOnInitListener;
+    private static String sEngine;
+
+    public static void setInstance(TextToSpeech textToSpeech) {
+        sInstance = textToSpeech;
+    }
+
+    /**
+     * Override constructor and only store the name of the last constructed engine and init
+     * listener.
+     */
+    public void __constructor__(Context context, TextToSpeech.OnInitListener listener,
+            String engine,
+            String packageName, boolean useFallback) {
+        sOnInitListener = listener;
+        sEngine = engine;
+    }
+
+    public void __constructor__(Context context, TextToSpeech.OnInitListener listener,
+            String engine) {
+        __constructor__(context, listener, engine, null, false);
+    }
+
+    public void __constructor__(Context context, TextToSpeech.OnInitListener listener) {
+        __constructor__(context, listener, null, null, false);
+    }
+
+    @Implementation
+    protected String getCurrentEngine() {
+        return sInstance.getCurrentEngine();
+    }
+
+    @Implementation
+    protected int setLanguage(final Locale loc) {
+        return sInstance.setLanguage(loc);
+    }
+
+    @Implementation
+    protected void shutdown() {
+        sInstance.shutdown();
+    }
+
+    @Implementation
+    protected int setSpeechRate(float speechRate) {
+        return sInstance.setSpeechRate(speechRate);
+    }
+
+    @Implementation
+    protected int setPitch(float pitch) {
+        return sInstance.setPitch(pitch);
+    }
+
+    @Implementation
+    protected Voice getVoice() {
+        return sInstance.getVoice();
+    }
+
+    @Implementation
+    protected int isLanguageAvailable(final Locale loc) {
+        return sInstance.isLanguageAvailable(loc);
+    }
+
+    @Implementation
+    protected int speak(final CharSequence text,
+            final int queueMode,
+            final Bundle params,
+            final String utteranceId) {
+        return sInstance.speak(text, queueMode, params, utteranceId);
+    }
+
+    @Resetter
+    public static void reset() {
+        sInstance = null;
+        sOnInitListener = null;
+        sEngine = null;
+    }
+
+    /** Check for the last constructed engine name. */
+    public static String getLastConstructedEngine() {
+        return sEngine;
+    }
+
+    /** Trigger the initializtion callback given the input status. */
+    public static void callInitializationCallbackWithStatus(int status) {
+        sOnInitListener.onInit(status);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowTtsEngines.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowTtsEngines.java
new file mode 100644
index 0000000..df3eef8
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowTtsEngines.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.Intent;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.List;
+import java.util.Locale;
+
+@Implements(TtsEngines.class)
+public class ShadowTtsEngines {
+    private static TtsEngines sInstance;
+
+    public static void setInstance(TtsEngines ttsEngines) {
+        sInstance = ttsEngines;
+    }
+
+    @Resetter
+    public static void reset() {
+        sInstance = null;
+    }
+
+    @Implementation
+    protected List<TextToSpeech.EngineInfo> getEngines() {
+        return sInstance.getEngines();
+    }
+
+    @Implementation
+    protected TextToSpeech.EngineInfo getEngineInfo(String packageName) {
+        return sInstance.getEngineInfo(packageName);
+    }
+
+    @Implementation
+    protected String getDefaultEngine() {
+        return sInstance.getDefaultEngine();
+    }
+
+    @Implementation
+    protected Intent getSettingsIntent(String engine) {
+        return sInstance.getSettingsIntent(engine);
+    }
+
+    @Implementation
+    protected boolean isLocaleSetToDefaultForEngine(String engineName) {
+        return sInstance.isLocaleSetToDefaultForEngine(engineName);
+    }
+
+    @Implementation
+    protected Locale getLocalePrefForEngine(String engineName) {
+        return sInstance.getLocalePrefForEngine(engineName);
+    }
+
+    @Implementation
+    protected synchronized void updateLocalePrefForEngine(String engineName, Locale newLocale) {
+        sInstance.updateLocalePrefForEngine(engineName, newLocale);
+    }
+
+    @Implementation
+    protected Locale parseLocaleString(String localeString) {
+        return sInstance.parseLocaleString(localeString);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUidDetailProvider.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUidDetailProvider.java
new file mode 100644
index 0000000..2db468a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUidDetailProvider.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2011 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.car.settings.testutils;
+
+import com.android.settingslib.net.UidDetail;
+import com.android.settingslib.net.UidDetailProvider;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(UidDetailProvider.class)
+public class ShadowUidDetailProvider {
+
+    private static UidDetail sUidDetail;
+
+    @Resetter
+    public static void reset() {
+        sUidDetail = null;
+    }
+
+    @Implementation
+    public UidDetail getUidDetail(int uid, boolean blocking) {
+        return sUidDetail;
+    }
+
+    public static void setUidDetail(UidDetail uidDetail) {
+        sUidDetail = uidDetail;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java
index c4bcf1d..acddacc 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserIconProvider.java
@@ -27,7 +27,12 @@
 @Implements(UserIconProvider.class)
 public class ShadowUserIconProvider {
     @Implementation
-    public Drawable getUserIcon(UserInfo userInfo, Context context) {
+    protected Drawable getUserIcon(UserInfo userInfo, Context context) {
+        return null;
+    }
+
+    @Implementation
+    protected Drawable getDefaultGuestIcon(Context context) {
         return null;
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
new file mode 100644
index 0000000..d08f2c9
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.annotation.UserIdInt;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+import android.util.ArrayMap;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Implements(UserManager.class)
+public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
+    private static UserManager sInstance;
+
+    private Map<Integer, List<UserInfo>> mProfiles = new ArrayMap<>();
+
+    public static void setInstance(UserManager manager) {
+        sInstance = manager;
+    }
+
+    @Implementation
+    protected UserInfo getUserInfo(@UserIdInt int userHandle) {
+        return sInstance.getUserInfo(userHandle);
+    }
+
+    @Implementation
+    protected int[] getProfileIdsWithDisabled(int userId) {
+        if (mProfiles.containsKey(userId)) {
+            return mProfiles.get(userId).stream().mapToInt(userInfo -> userInfo.id).toArray();
+        }
+        return new int[]{};
+    }
+
+    @Implementation
+    protected List<UserInfo> getProfiles(int userHandle) {
+        if (mProfiles.containsKey(userHandle)) {
+            return new ArrayList<>(mProfiles.get(userHandle));
+        }
+        return Collections.emptyList();
+    }
+
+    /** Adds a profile to be returned by {@link #getProfiles(int)}. **/
+    public void addProfile(
+            int userHandle, int profileUserHandle, String profileName, int profileFlags) {
+        mProfiles.putIfAbsent(userHandle, new ArrayList<>());
+        mProfiles.get(userHandle).add(new UserInfo(profileUserHandle, profileName, profileFlags));
+    }
+
+    @Resetter
+    public static void reset() {
+        sInstance = null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUtils.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUtils.java
new file mode 100644
index 0000000..0bacf94
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUtils.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.res.Resources;
+
+import com.android.settingslib.Utils;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(value = Utils.class)
+public class ShadowUtils {
+    private static String sDeviceProvisioningPackage;
+
+    @Resetter
+    public static void reset() {
+        sDeviceProvisioningPackage = null;
+    }
+
+    @Implementation
+    protected static boolean isDeviceProvisioningPackage(Resources resources,
+            String packageName) {
+        return sDeviceProvisioningPackage != null && sDeviceProvisioningPackage.equals(
+                packageName);
+    }
+
+    public static void setDeviceProvisioningPackage(String deviceProvisioningPackage) {
+        sDeviceProvisioningPackage = deviceProvisioningPackage;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowVoiceInteractionServiceInfo.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowVoiceInteractionServiceInfo.java
new file mode 100644
index 0000000..936d0b4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowVoiceInteractionServiceInfo.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.testutils;
+
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.service.voice.VoiceInteractionServiceInfo;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Implements(VoiceInteractionServiceInfo.class)
+public class ShadowVoiceInteractionServiceInfo {
+    private static Map<ServiceInfo, Boolean> sSupportsAssistMap = new HashMap<>();
+    private static Map<ServiceInfo, String> sRecognitionServiceMap = new HashMap<>();
+    private static Map<ServiceInfo, String> sSettingsActivityMap = new HashMap<>();
+
+    private ServiceInfo mServiceInfo;
+
+    public void __constructor__(PackageManager pm, ServiceInfo si) {
+        mServiceInfo = si;
+    }
+
+    public static void setSupportsAssist(ServiceInfo si, boolean supports) {
+        sSupportsAssistMap.put(si, supports);
+    }
+
+    public static void setRecognitionService(ServiceInfo si, String recognitionService) {
+        sRecognitionServiceMap.put(si, recognitionService);
+    }
+
+    public static void setSettingsActivity(ServiceInfo si, String settingsActivity) {
+        sSettingsActivityMap.put(si, settingsActivity);
+    }
+
+    @Implementation
+    protected boolean getSupportsAssist() {
+        return sSupportsAssistMap.get(mServiceInfo);
+    }
+
+    @Implementation
+    protected String getRecognitionService() {
+        return sRecognitionServiceMap.get(mServiceInfo);
+    }
+
+    @Implementation
+    protected String getSettingsActivity() {
+        return sSettingsActivityMap.get(mServiceInfo);
+    }
+
+    @Implementation
+    protected ServiceInfo getServiceInfo() {
+        return mServiceInfo;
+    }
+
+    @Resetter
+    public static void reset() {
+        sSupportsAssistMap.clear();
+        sRecognitionServiceMap.clear();
+        sSettingsActivityMap.clear();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowWifiManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowWifiManager.java
new file mode 100644
index 0000000..2b5d46f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowWifiManager.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2018 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.car.settings.testutils;
+
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Implements(WifiManager.class)
+public class ShadowWifiManager extends org.robolectric.shadows.ShadowWifiManager {
+
+    private static int sResetCalledCount = 0;
+
+    private final Map<Integer, WifiConfiguration> mNetworkIdToConfiguredNetworks =
+            new LinkedHashMap<>();
+    private int mLastForgottenNetwork = Integer.MIN_VALUE;
+
+    @Implementation
+    @Override
+    protected int addNetwork(WifiConfiguration config) {
+        int networkId = mNetworkIdToConfiguredNetworks.size();
+        config.networkId = -1;
+        mNetworkIdToConfiguredNetworks.put(networkId, makeCopy(config, networkId));
+        return networkId;
+    }
+
+    public WifiConfiguration getLastAddedNetworkConfiguration() {
+        return mNetworkIdToConfiguredNetworks.get(getLastAddedNetworkId());
+    }
+
+    public int getLastAddedNetworkId() {
+        return mNetworkIdToConfiguredNetworks.size() - 1;
+    }
+
+    public static boolean verifyFactoryResetCalled(int numTimes) {
+        return sResetCalledCount == numTimes;
+    }
+
+    @Implementation
+    protected void forget(int netId, WifiManager.ActionListener listener) {
+        mLastForgottenNetwork = netId;
+    }
+
+    public int getLastForgottenNetwork() {
+        return mLastForgottenNetwork;
+    }
+
+    @Implementation
+    protected void factoryReset() {
+        sResetCalledCount++;
+    }
+
+    @Resetter
+    public static void reset() {
+        sResetCalledCount = 0;
+    }
+
+    private WifiConfiguration makeCopy(WifiConfiguration config, int networkId) {
+        WifiConfiguration copy = Shadows.shadowOf(config).copy();
+        copy.networkId = networkId;
+        return copy;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..c945d60
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineEntryPreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowTtsEngines;
+
+import org.junit.After;
+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 org.robolectric.shadows.ShadowApplication;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowTtsEngines.class})
+public class PreferredEngineEntryPreferenceControllerTest {
+
+    private static final TextToSpeech.EngineInfo ENGINE_INFO = new TextToSpeech.EngineInfo();
+    private static final String INTENT_ACTION = "test_action";
+
+    static {
+        ENGINE_INFO.label = "Test Engine";
+        ENGINE_INFO.name = "com.android.car.settings.tts.test.Engine";
+    }
+
+    private ButtonPreference mPreference;
+    @Mock
+    private TtsEngines mEnginesHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowTtsEngines.setInstance(mEnginesHelper);
+        Context context = RuntimeEnvironment.application;
+
+        mPreference = new ButtonPreference(context);
+        PreferenceControllerTestHelper<PreferredEngineEntryPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(context,
+                        PreferredEngineEntryPreferenceController.class, mPreference);
+
+        Intent intent = new Intent(INTENT_ACTION);
+        when(mEnginesHelper.getSettingsIntent(ENGINE_INFO.name)).thenReturn(intent);
+        when(mEnginesHelper.getEngineInfo(ENGINE_INFO.name)).thenReturn(
+                ENGINE_INFO);
+        when(mEnginesHelper.getDefaultEngine()).thenReturn(ENGINE_INFO.name);
+
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowTtsEngines.reset();
+    }
+
+    @Test
+    public void performButtonClick_navigateToNextActivity() {
+        mPreference.performButtonClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getAction()).isEqualTo(INTENT_ACTION);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceControllerTest.java
new file mode 100644
index 0000000..9134b47
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/tts/PreferredEngineOptionsPreferenceControllerTest.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowTextToSpeech;
+import com.android.car.settings.testutils.ShadowTtsEngines;
+
+import org.junit.After;
+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 java.util.Arrays;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowTtsEngines.class, ShadowTextToSpeech.class})
+public class PreferredEngineOptionsPreferenceControllerTest {
+    private static final TextToSpeech.EngineInfo OTHER_ENGINE_INFO = new TextToSpeech.EngineInfo();
+    private static final TextToSpeech.EngineInfo CURRENT_ENGINE_INFO =
+            new TextToSpeech.EngineInfo();
+
+    static {
+        OTHER_ENGINE_INFO.label = "Test Engine 1";
+        OTHER_ENGINE_INFO.name = "com.android.car.settings.tts.test.Engine1";
+        CURRENT_ENGINE_INFO.label = "Test Engine 2";
+        CURRENT_ENGINE_INFO.name = "com.android.car.settings.tts.test.Engine2";
+    }
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<PreferredEngineOptionsPreferenceController>
+            mControllerHelper;
+    private PreferredEngineOptionsPreferenceController mController;
+    private PreferenceGroup mPreferenceGroup;
+    @Mock
+    private TtsEngines mEnginesHelper;
+    @Mock
+    private TextToSpeech mTextToSpeech;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowTtsEngines.setInstance(mEnginesHelper);
+        ShadowTextToSpeech.setInstance(mTextToSpeech);
+
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                PreferredEngineOptionsPreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+
+        when(mEnginesHelper.getEngines()).thenReturn(
+                Arrays.asList(OTHER_ENGINE_INFO, CURRENT_ENGINE_INFO));
+        when(mEnginesHelper.getEngineInfo(OTHER_ENGINE_INFO.name)).thenReturn(OTHER_ENGINE_INFO);
+        when(mEnginesHelper.getEngineInfo(CURRENT_ENGINE_INFO.name)).thenReturn(
+                CURRENT_ENGINE_INFO);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowTtsEngines.reset();
+        ShadowTextToSpeech.reset();
+    }
+
+    @Test
+    public void onCreate_populatesGroup() {
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(CURRENT_ENGINE_INFO.name);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
+    }
+
+    @Test
+    public void refreshUi_currentEngineInfoSummarySet() {
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(CURRENT_ENGINE_INFO.name);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(
+                mPreferenceGroup.findPreference(CURRENT_ENGINE_INFO.name).getSummary()).isEqualTo(
+                mContext.getString(R.string.text_to_speech_current_engine));
+    }
+
+    @Test
+    public void refreshUi_otherEngineInfoSummaryEmpty() {
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(CURRENT_ENGINE_INFO.name);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.findPreference(OTHER_ENGINE_INFO.name).getSummary()).isEqualTo(
+                "");
+    }
+
+    @Test
+    public void performClick_currentEngine_returnFalse() {
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(CURRENT_ENGINE_INFO.name);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        Preference currentEngine = mPreferenceGroup.findPreference(CURRENT_ENGINE_INFO.name);
+        assertThat(currentEngine.getOnPreferenceClickListener().onPreferenceClick(
+                currentEngine)).isFalse();
+    }
+
+    @Test
+    public void performClick_otherEngine_returnTrue() {
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(CURRENT_ENGINE_INFO.name);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        Preference otherEngine = mPreferenceGroup.findPreference(OTHER_ENGINE_INFO.name);
+        assertThat(otherEngine.getOnPreferenceClickListener().onPreferenceClick(
+                otherEngine)).isTrue();
+    }
+
+    @Test
+    public void performClick_otherEngine_initSuccess_changeCurrentEngine() {
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(CURRENT_ENGINE_INFO.name);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        Preference otherEngine = mPreferenceGroup.findPreference(OTHER_ENGINE_INFO.name);
+        otherEngine.performClick();
+
+        ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
+        assertThat(ShadowTextToSpeech.getLastConstructedEngine()).isEqualTo(OTHER_ENGINE_INFO.name);
+    }
+
+    @Test
+    public void performClick_otherEngine_initFail_keepCurrentEngine() {
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(CURRENT_ENGINE_INFO.name);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        Preference otherEngine = mPreferenceGroup.findPreference(OTHER_ENGINE_INFO.name);
+        otherEngine.performClick();
+
+        ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.ERROR);
+        assertThat(ShadowTextToSpeech.getLastConstructedEngine()).isEqualTo(
+                CURRENT_ENGINE_INFO.name);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
new file mode 100644
index 0000000..f5f1df8
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackPreferenceControllerTest.java
@@ -0,0 +1,441 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+import android.speech.tts.Voice;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ActivityResultCallback;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.SeekBarPreference;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+import com.android.car.settings.testutils.ShadowTextToSpeech;
+import com.android.car.settings.testutils.ShadowTtsEngines;
+
+import com.google.android.collect.Lists;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.Locale;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowTextToSpeech.class, ShadowTtsEngines.class,
+        ShadowSecureSettings.class})
+public class TtsPlaybackPreferenceControllerTest {
+
+    private static final String DEFAULT_ENGINE_NAME = "com.android.car.settings.tts.test.default";
+    private static final TextToSpeech.EngineInfo ENGINE_INFO = new TextToSpeech.EngineInfo();
+    private static final Voice VOICE = new Voice("Test Name", Locale.ENGLISH, /* quality= */0,
+            /* latency= */ 0, /* requiresNetworkConnection= */ true, /* features= */ null);
+
+    static {
+        ENGINE_INFO.label = "Test Engine";
+        ENGINE_INFO.name = "com.android.car.settings.tts.test.other";
+    }
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<TtsPlaybackPreferenceController>
+            mControllerHelper;
+    private TtsPlaybackPreferenceController mController;
+    private PreferenceGroup mPreferenceGroup;
+    private ListPreference mDefaultLanguagePreference;
+    private SeekBarPreference mSpeechRatePreference;
+    private SeekBarPreference mVoicePitchPreference;
+    private Preference mResetPreference;
+    @Mock
+    private TextToSpeech mTextToSpeech;
+    @Mock
+    private TtsEngines mEnginesHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowTextToSpeech.setInstance(mTextToSpeech);
+        ShadowTtsEngines.setInstance(mEnginesHelper);
+
+        mContext = RuntimeEnvironment.application;
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                TtsPlaybackPreferenceController.class, mPreferenceGroup);
+
+        mDefaultLanguagePreference = new ListPreference(mContext);
+        mDefaultLanguagePreference.setKey(mContext.getString(R.string.pk_tts_default_language));
+        mPreferenceGroup.addPreference(mDefaultLanguagePreference);
+
+        mSpeechRatePreference = new SeekBarPreference(mContext);
+        mSpeechRatePreference.setKey(mContext.getString(R.string.pk_tts_speech_rate));
+        mPreferenceGroup.addPreference(mSpeechRatePreference);
+
+        mVoicePitchPreference = new SeekBarPreference(mContext);
+        mVoicePitchPreference.setKey(mContext.getString(R.string.pk_tts_pitch));
+        mPreferenceGroup.addPreference(mVoicePitchPreference);
+
+        mResetPreference = new Preference(mContext);
+        mResetPreference.setKey(mContext.getString(R.string.pk_tts_reset));
+        mPreferenceGroup.addPreference(mResetPreference);
+
+        mController = mControllerHelper.getController();
+
+        when(mTextToSpeech.getCurrentEngine()).thenReturn(ENGINE_INFO.name);
+        when(mTextToSpeech.getVoice()).thenReturn(VOICE);
+        when(mEnginesHelper.parseLocaleString(VOICE.getLocale().toString())).thenReturn(
+                VOICE.getLocale());
+        when(mEnginesHelper.parseLocaleString(Locale.CANADA.toString())).thenReturn(Locale.CANADA);
+        when(mEnginesHelper.parseLocaleString(Locale.KOREA.toString())).thenReturn(Locale.KOREA);
+
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_RATE,
+                TextToSpeech.Engine.DEFAULT_RATE);
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_PITCH,
+                TextToSpeech.Engine.DEFAULT_PITCH);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowTtsEngines.reset();
+        ShadowTextToSpeech.reset();
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void onCreate_startsCheckVoiceData() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+        verify(mControllerHelper.getMockFragmentController()).startActivityForResult(
+                intent.capture(), eq(TtsPlaybackPreferenceController.VOICE_DATA_CHECK),
+                any(ActivityResultCallback.class));
+
+        assertThat(intent.getValue().getAction()).isEqualTo(
+                TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
+        assertThat(intent.getValue().getPackage()).isEqualTo(ENGINE_INFO.name);
+    }
+
+    @Test
+    public void voiceDataCheck_processActivityResult_dataIsNull_defaultSynthRemainsUnchanged() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_SYNTH,
+                DEFAULT_ENGINE_NAME);
+
+        mController.processActivityResult(
+                TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, /* data= */ null);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_SYNTH)).isEqualTo(DEFAULT_ENGINE_NAME);
+    }
+
+    @Test
+    public void voiceDataCheck_processActivityResult_dataIsNotNull_updatesDefaultSynth() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_SYNTH,
+                DEFAULT_ENGINE_NAME);
+
+        Intent data = new Intent();
+        mController.processActivityResult(
+                TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
+
+        assertThat(Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_SYNTH)).isEqualTo(ENGINE_INFO.name);
+    }
+
+    @Test
+    public void voiceDataCheck_processActivityResult_checkSuccess_hasVoices_populatesPreference() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        // Check that the length is 0 initially.
+        assertThat(mDefaultLanguagePreference.getEntries()).isNull();
+
+        Intent data = new Intent();
+        data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
+                Lists.newArrayList(
+                        Locale.ENGLISH.toString(),
+                        Locale.CANADA.toString(),
+                        Locale.KOREA.toString()
+                ));
+
+        ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
+        mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
+
+        // Length is 3 languages + default language.
+        assertThat(mDefaultLanguagePreference.getEntries().length).isEqualTo(4);
+    }
+
+    @Test
+    public void getSampleText_processActivityResult_dataIsNull_setsDefaultText() {
+        mController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
+                TextToSpeech.LANG_AVAILABLE, /* data= */ null);
+
+        assertThat(mController.getSampleText()).isEqualTo(
+                mContext.getString(R.string.tts_default_sample_string));
+    }
+
+    @Test
+    public void getSampleText_processActivityResult_emptyText_setsDefaultText() {
+        String testData = "";
+
+        Intent data = new Intent();
+        data.putExtra(TextToSpeech.Engine.EXTRA_SAMPLE_TEXT, testData);
+
+        mController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
+                TextToSpeech.LANG_AVAILABLE, data);
+
+        assertThat(mController.getSampleText()).isEqualTo(
+                mContext.getString(R.string.tts_default_sample_string));
+    }
+
+    @Test
+    public void getSampleText_processActivityResult_dataIsNotNull_setsCorrectText() {
+        String testData = "Test sample text";
+
+        Intent data = new Intent();
+        data.putExtra(TextToSpeech.Engine.EXTRA_SAMPLE_TEXT, testData);
+
+        mController.processActivityResult(TtsPlaybackPreferenceController.GET_SAMPLE_TEXT,
+                TextToSpeech.LANG_AVAILABLE, data);
+
+        assertThat(mController.getSampleText()).isEqualTo(testData);
+    }
+
+    @Test
+    public void defaultLanguage_handlePreferenceChanged_passEmptyValue_setsDefault() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        Intent data = new Intent();
+        data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
+                Lists.newArrayList(
+                        Locale.ENGLISH.toString(),
+                        Locale.CANADA.toString(),
+                        Locale.KOREA.toString()
+                ));
+        mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
+
+        // Test change listener.
+        mDefaultLanguagePreference.callChangeListener("");
+
+        verify(mTextToSpeech).setLanguage(Locale.getDefault());
+    }
+
+    @Test
+    public void defaultLanguage_handlePreferenceChanged_passLocale_setsLocale() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        Intent data = new Intent();
+        data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
+                Lists.newArrayList(
+                        Locale.ENGLISH.toString(),
+                        Locale.CANADA.toString(),
+                        Locale.KOREA.toString()
+                ));
+        mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
+
+        // Test change listener.
+        mDefaultLanguagePreference.callChangeListener(Locale.ENGLISH.toString());
+
+        verify(mTextToSpeech).setLanguage(Locale.ENGLISH);
+    }
+
+    @Test
+    public void defaultLanguage_handlePreferenceChanged_passLocale_setsSummary() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        Intent data = new Intent();
+        data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
+                Lists.newArrayList(
+                        Locale.ENGLISH.toString(),
+                        Locale.CANADA.toString(),
+                        Locale.KOREA.toString()
+                ));
+        mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
+        mDefaultLanguagePreference.callChangeListener(Locale.ENGLISH.toString());
+
+        assertThat(mDefaultLanguagePreference.getSummary()).isEqualTo(
+                Locale.ENGLISH.getDisplayName());
+    }
+
+    @Test
+    public void speechRate_handlePreferenceChanged_updatesSecureSettings() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
+        mSpeechRatePreference.callChangeListener(newSpeechRate);
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_RATE, TextToSpeech.Engine.DEFAULT_RATE)).isEqualTo(
+                newSpeechRate);
+    }
+
+    @Test
+    public void speechRate_handlePreferenceChanged_updatesTts() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
+        mSpeechRatePreference.callChangeListener(newSpeechRate);
+
+        verify(mTextToSpeech).setSpeechRate(
+                newSpeechRate / TtsPlaybackSettingsManager.SCALING_FACTOR);
+    }
+
+    @Test
+    public void speechRate_handlePreferenceChanged_speaksSampleText() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
+        mSpeechRatePreference.callChangeListener(newSpeechRate);
+
+        verify(mTextToSpeech).speak(any(), eq(TextToSpeech.QUEUE_FLUSH), isNull(), eq("Sample"));
+    }
+
+    @Test
+    public void voicePitch_handlePreferenceChanged_updatesSecureSettings() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
+        mVoicePitchPreference.callChangeListener(newVoicePitch);
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_PITCH, TextToSpeech.Engine.DEFAULT_PITCH)).isEqualTo(
+                newVoicePitch);
+    }
+
+    @Test
+    public void voicePitch_handlePreferenceChanged_updatesTts() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
+        mVoicePitchPreference.callChangeListener(newVoicePitch);
+
+        verify(mTextToSpeech).setPitch(
+                newVoicePitch / TtsPlaybackSettingsManager.SCALING_FACTOR);
+    }
+
+    @Test
+    public void voicePitch_handlePreferenceChanged_speaksSampleText() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
+        mVoicePitchPreference.callChangeListener(newVoicePitch);
+
+        verify(mTextToSpeech).speak(any(), eq(TextToSpeech.QUEUE_FLUSH), isNull(), eq("Sample"));
+    }
+
+    @Test
+    public void refreshUi_notInitialized_disablesPreference() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+
+        assertThat(mDefaultLanguagePreference.isEnabled()).isFalse();
+        assertThat(mSpeechRatePreference.isEnabled()).isFalse();
+        assertThat(mVoicePitchPreference.isEnabled()).isFalse();
+        assertThat(mResetPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_initialized_defaultLocaleIsNull_disablesPreference() {
+        when(mEnginesHelper.parseLocaleString(any())).thenReturn(null);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
+
+        mController.refreshUi();
+
+        assertThat(mDefaultLanguagePreference.isEnabled()).isFalse();
+        assertThat(mSpeechRatePreference.isEnabled()).isFalse();
+        assertThat(mVoicePitchPreference.isEnabled()).isFalse();
+        assertThat(mResetPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_defaultLocaleNotSupported_disablesPreferencesExceptLanguage() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
+
+        Intent data = new Intent();
+        data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
+                Lists.newArrayList(
+                        // English is default locale, but isn't available.
+                        Locale.CANADA.toString(),
+                        Locale.KOREA.toString()
+                ));
+        mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
+
+        mController.refreshUi();
+
+        assertThat(mDefaultLanguagePreference.isEnabled()).isTrue();
+        assertThat(mSpeechRatePreference.isEnabled()).isFalse();
+        assertThat(mVoicePitchPreference.isEnabled()).isFalse();
+        assertThat(mResetPreference.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_initialized_defaultLocaleSupported_enablesPreference() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        ShadowTextToSpeech.callInitializationCallbackWithStatus(TextToSpeech.SUCCESS);
+
+        Intent data = new Intent();
+        data.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
+                Lists.newArrayList(
+                        Locale.ENGLISH.toString(),
+                        Locale.CANADA.toString(),
+                        Locale.KOREA.toString()
+                ));
+        mController.processActivityResult(TtsPlaybackPreferenceController.VOICE_DATA_CHECK,
+                TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, data);
+
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isEnabled()).isTrue();
+        assertThat(mDefaultLanguagePreference.isEnabled()).isTrue();
+        assertThat(mSpeechRatePreference.isEnabled()).isTrue();
+        assertThat(mVoicePitchPreference.isEnabled()).isTrue();
+        assertThat(mResetPreference.isEnabled()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
new file mode 100644
index 0000000..3df09dd
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/tts/TtsPlaybackSettingsManagerTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.tts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TtsEngines;
+import android.speech.tts.Voice;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+import com.android.car.settings.testutils.ShadowTextToSpeech;
+import com.android.car.settings.testutils.ShadowTtsEngines;
+
+import org.junit.After;
+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 org.robolectric.shadows.ShadowAlertDialog;
+
+import java.util.Locale;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowTtsEngines.class, ShadowTextToSpeech.class, ShadowSecureSettings.class})
+public class TtsPlaybackSettingsManagerTest {
+
+    private static final String ENGINE_NAME = "com.android.car.settings.tts.test";
+    private static final String SAMPLE_TEXT = "Sample text";
+
+    private Context mContext;
+    private TtsPlaybackSettingsManager mPlaybackSettingsManager;
+    @Mock
+    private TextToSpeech mTts;
+    @Mock
+    private TtsEngines mEnginesHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowTextToSpeech.setInstance(mTts);
+        ShadowTtsEngines.setInstance(mEnginesHelper);
+
+        mContext = RuntimeEnvironment.application;
+        mPlaybackSettingsManager = new TtsPlaybackSettingsManager(mContext, mTts, mEnginesHelper);
+
+        when(mTts.getCurrentEngine()).thenReturn(ENGINE_NAME);
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_RATE,
+                TextToSpeech.Engine.DEFAULT_RATE);
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.TTS_DEFAULT_PITCH,
+                TextToSpeech.Engine.DEFAULT_PITCH);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowTextToSpeech.reset();
+        ShadowTtsEngines.reset();
+        ShadowAlertDialog.reset();
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void updateSpeechRate_updatesSetting() {
+        int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
+        mPlaybackSettingsManager.updateSpeechRate(newSpeechRate);
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_RATE, TextToSpeech.Engine.DEFAULT_RATE)).isEqualTo(
+                newSpeechRate);
+    }
+
+    @Test
+    public void updateSpeechRate_updatesTts() {
+        int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
+        mPlaybackSettingsManager.updateSpeechRate(newSpeechRate);
+        verify(mTts).setSpeechRate(newSpeechRate / TtsPlaybackSettingsManager.SCALING_FACTOR);
+    }
+
+    @Test
+    public void getCurrentSpeechRate_returnsCorrectRate() {
+        int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
+        mPlaybackSettingsManager.updateSpeechRate(newSpeechRate);
+
+        assertThat(mPlaybackSettingsManager.getCurrentSpeechRate()).isEqualTo(newSpeechRate);
+    }
+
+    @Test
+    public void resetSpeechRate_setsToDefault() {
+        int newSpeechRate = TextToSpeech.Engine.DEFAULT_RATE + 40;
+        mPlaybackSettingsManager.updateSpeechRate(newSpeechRate);
+
+        mPlaybackSettingsManager.resetSpeechRate();
+
+        assertThat(mPlaybackSettingsManager.getCurrentSpeechRate()).isEqualTo(
+                TextToSpeech.Engine.DEFAULT_RATE);
+    }
+
+    @Test
+    public void updateVoicePitch_updatesSetting() {
+        int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
+        mPlaybackSettingsManager.updateVoicePitch(newVoicePitch);
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.TTS_DEFAULT_PITCH, TextToSpeech.Engine.DEFAULT_PITCH)).isEqualTo(
+                newVoicePitch);
+    }
+
+    @Test
+    public void updateVoicePitch_updatesTts() {
+        int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
+        mPlaybackSettingsManager.updateVoicePitch(newVoicePitch);
+        verify(mTts).setPitch(newVoicePitch / TtsPlaybackSettingsManager.SCALING_FACTOR);
+    }
+
+    @Test
+    public void getCurrentVoicePitch_returnsCorrectRate() {
+        int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
+        mPlaybackSettingsManager.updateVoicePitch(newVoicePitch);
+
+        assertThat(mPlaybackSettingsManager.getCurrentVoicePitch()).isEqualTo(newVoicePitch);
+    }
+
+    @Test
+    public void resetVoicePitch_setsToDefault() {
+        int newVoicePitch = TextToSpeech.Engine.DEFAULT_PITCH + 40;
+        mPlaybackSettingsManager.updateVoicePitch(newVoicePitch);
+
+        mPlaybackSettingsManager.resetVoicePitch();
+
+        assertThat(mPlaybackSettingsManager.getCurrentVoicePitch()).isEqualTo(
+                TextToSpeech.Engine.DEFAULT_PITCH);
+    }
+
+    @Test
+    public void getStoredTtsLocale_localeIsNotDefaultForEngine_returnsLocale() {
+        when(mEnginesHelper.isLocaleSetToDefaultForEngine(ENGINE_NAME)).thenReturn(false);
+        when(mEnginesHelper.getLocalePrefForEngine(ENGINE_NAME)).thenReturn(Locale.CHINESE);
+
+        assertThat(mPlaybackSettingsManager.getStoredTtsLocale()).isEqualTo(Locale.CHINESE);
+    }
+
+    @Test
+    public void getStoredTtsLocale_localeIsDefaultForEngine_returnsNull() {
+        when(mEnginesHelper.isLocaleSetToDefaultForEngine(ENGINE_NAME)).thenReturn(true);
+
+        assertThat(mPlaybackSettingsManager.getStoredTtsLocale()).isNull();
+    }
+
+    @Test
+    public void updateTtsLocale_nonNullLocale_setsLanguage() {
+        mPlaybackSettingsManager.updateTtsLocale(Locale.KOREAN);
+
+        verify(mTts).setLanguage(Locale.KOREAN);
+    }
+
+    @Test
+    public void updateTtsLocale_nullLocale_setsDefaultLanguage() {
+        mPlaybackSettingsManager.updateTtsLocale(null);
+
+        verify(mTts).setLanguage(Locale.getDefault());
+    }
+
+    @Test
+    public void updateTtsLocale_nonNullLocale_correctResultCode_updatesLocalePref() {
+        when(mTts.setLanguage(Locale.KOREAN)).thenReturn(TextToSpeech.LANG_AVAILABLE);
+        mPlaybackSettingsManager.updateTtsLocale(Locale.KOREAN);
+
+        verify(mEnginesHelper).updateLocalePrefForEngine(ENGINE_NAME, Locale.KOREAN);
+    }
+
+    @Test
+    public void updateTtsLocale_nonNullLocale_wrongResultCode_doesNotUpdateLocalePref() {
+        when(mTts.setLanguage(Locale.KOREAN)).thenReturn(TextToSpeech.LANG_MISSING_DATA);
+        mPlaybackSettingsManager.updateTtsLocale(Locale.KOREAN);
+
+        verify(mEnginesHelper, never()).updateLocalePrefForEngine(any(), any());
+    }
+
+    @Test
+    public void speakSampleText_requiresNetworkConnection_languageNotAvailable_showsAlert() {
+        Voice voice = new Voice("Test Name", Locale.FRANCE, /* quality= */0,
+                /* latency= */ 0, /* requiresNetworkConnection= */ true, /* features= */ null);
+        when(mTts.getVoice()).thenReturn(voice);
+        when(mEnginesHelper.parseLocaleString(Locale.FRANCE.toString())).thenReturn(Locale.FRANCE);
+        when(mTts.isLanguageAvailable(any(Locale.class))).thenReturn(
+                TextToSpeech.LANG_MISSING_DATA);
+
+        mPlaybackSettingsManager.speakSampleText(SAMPLE_TEXT);
+
+        assertThat(ShadowAlertDialog.getLatestAlertDialog()).isNotNull();
+    }
+
+    @Test
+    public void speakSampleText_requiresNetworkConnection_languageAvailable_speaksText() {
+        Voice voice = new Voice("Test Name", Locale.FRENCH, /* quality= */0,
+                /* latency= */ 0, /* requiresNetworkConnection= */ true, /* features= */ null);
+        when(mTts.getVoice()).thenReturn(voice);
+        when(mTts.isLanguageAvailable(Locale.FRENCH)).thenReturn(TextToSpeech.LANG_AVAILABLE);
+
+        mPlaybackSettingsManager.speakSampleText(SAMPLE_TEXT);
+
+        verify(mTts).speak(SAMPLE_TEXT, TextToSpeech.QUEUE_FLUSH, null, "Sample");
+    }
+
+    @Test
+    public void speakSampleText_doesNotRequireNetworkConnection_speaksText() {
+        Voice voice = new Voice("Test Name", Locale.FRENCH, /* quality= */0,
+                /* latency= */ 0, /* requiresNetworkConnection= */ false, /* features= */ null);
+        when(mTts.getVoice()).thenReturn(voice);
+
+        mPlaybackSettingsManager.speakSampleText(SAMPLE_TEXT);
+
+        verify(mTts).speak(SAMPLE_TEXT, TextToSpeech.QUEUE_FLUSH, null, "Sample");
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/units/UnitsBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/units/UnitsBasePreferenceControllerTest.java
new file mode 100644
index 0000000..becafe8
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/units/UnitsBasePreferenceControllerTest.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.units;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.property.CarPropertyManager;
+import android.content.Context;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCar;
+import com.android.car.settings.testutils.ShadowCarUnitsManager;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCar.class, ShadowCarUnitsManager.class})
+public class UnitsBasePreferenceControllerTest {
+
+    private static final int TEST_PROPERTY_ID = -1;
+    private static final Unit[] AVAILABLE_UNITS =
+            {UnitsMap.YEAR, UnitsMap.SECS, UnitsMap.NANO_SECS};
+    private static final Unit DEFAULT_UNIT = UnitsMap.YEAR;
+
+    private Context mContext;
+    private ListPreference mPreference;
+    private PreferenceControllerTestHelper<TestUnitsBasePreferenceController> mControllerHelper;
+    private TestUnitsBasePreferenceController mController;
+    private CarUnitsManager mCarUnitsManager;
+
+    @Mock
+    private CarPropertyManager mCarPropertyManager;
+    @Mock
+    private CarPropertyValue mCarPropertyValue;
+
+    private static class TestUnitsBasePreferenceController extends UnitsBasePreferenceController {
+
+        private TestUnitsBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected int getPropertyId() {
+            return TEST_PROPERTY_ID;
+        }
+
+
+        @Override
+        protected Class<ListPreference> getPreferenceType() {
+            return ListPreference.class;
+        }
+    }
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        ShadowCarUnitsManager.setUnitsSupportedByProperty(TEST_PROPERTY_ID, AVAILABLE_UNITS);
+        mCarUnitsManager = new CarUnitsManager(mContext);
+        mCarUnitsManager.setUnitUsedByProperty(TEST_PROPERTY_ID, DEFAULT_UNIT.getId());
+        mPreference = new ListPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(
+                mContext, TestUnitsBasePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUnitsManager.reset();
+    }
+
+
+    @Test
+    public void onCreate_connectsCarUnitsManager() {
+        assertThat(ShadowCarUnitsManager.isConnected()).isTrue();
+    }
+
+    @Test
+    public void onCreate_registersCarServiceListener() {
+        assertThat(ShadowCarUnitsManager.getListener())
+                .isEqualTo(mController.mOnCarServiceListener);
+    }
+
+    @Test
+    public void onCreate_preferenceIsConditionallyUnavailable() {
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(PreferenceController.CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void onCarServiceConnected_availableUnitsExist_preferenceIsAvailable() {
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(PreferenceController.AVAILABLE);
+    }
+
+    @Test
+    public void onCarServiceConnected_noAvailableUnits_preferenceIsConditionallyUnavailable() {
+        ShadowCarUnitsManager.setUnitsSupportedByProperty(TEST_PROPERTY_ID, null);
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(PreferenceController.CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
+    public void onCarServiceConnected_setsEntriesOfSupportedUnits() {
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+        CharSequence[] expectedEntries = mController.getEntriesOfSupportedUnits();
+
+        assertThat(mPreference.getEntries()).isEqualTo(expectedEntries);
+    }
+
+    @Test
+    public void onCarServiceConnected_setsSupportedUnitsIdsAsEntryValues() {
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+        CharSequence[] expectedEntryValues = mController.getIdsOfSupportedUnits();
+
+        assertThat(mPreference.getEntryValues()).isEqualTo(expectedEntryValues);
+    }
+
+    @Test
+    public void onCarServiceConnected_setsUnitBeingUsedAsPreferenceValue() {
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+        String expectedValue = Integer.toString(DEFAULT_UNIT.getId());
+
+        assertThat(mPreference.getValue()).isEqualTo(expectedValue);
+    }
+
+    @Test
+    public void onPreferenceChanged_runsSetUnitUsedByPropertyWithNewUnit() {
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+        mController.handlePreferenceChanged(mPreference, Integer.toString(UnitsMap.SECS.getId()));
+
+        assertThat(mCarUnitsManager.getUnitUsedByProperty(TEST_PROPERTY_ID))
+                .isEqualTo(UnitsMap.SECS);
+    }
+
+    @Test
+    public void onPropertyChanged_propertyStatusIsAvailable_setsNewUnitIdAsValue() {
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+        Unit newUnit = UnitsMap.SECS;
+        when(mCarPropertyValue.getStatus()).thenReturn(CarPropertyValue.STATUS_AVAILABLE);
+        when(mCarPropertyValue.getValue()).thenReturn(newUnit.getId());
+        mController.mCarPropertyEventCallback.onChangeEvent(mCarPropertyValue);
+
+        assertThat(mPreference.getValue()).isEqualTo(Integer.toString(newUnit.getId()));
+    }
+
+    @Test
+    public void onPropertyChanged_propertyStatusIsAvailable_setsNewUnitAbbreviationAsSummary() {
+        mController.mOnCarServiceListener.handleServiceConnected(mCarPropertyManager);
+        Unit newUnit = UnitsMap.SECS;
+        when(mCarPropertyValue.getStatus()).thenReturn(CarPropertyValue.STATUS_AVAILABLE);
+        when(mCarPropertyValue.getValue()).thenReturn(newUnit.getId());
+        mController.mCarPropertyEventCallback.onChangeEvent(mCarPropertyValue);
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getString(newUnit.getAbbreviationResId()));
+    }
+
+    @Test
+    public void onDestroy_disconnectsCarUnitsManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        assertThat(ShadowCarUnitsManager.isConnected()).isFalse();
+    }
+
+    @Test
+    public void onDestroy_unregistersCarServiceListener() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        assertThat(ShadowCarUnitsManager.getListener()).isNull();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java b/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
index b9294f9..832dd70 100644
--- a/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/AddNewUserTaskTest.java
@@ -19,7 +19,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
 import android.content.pm.UserInfo;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
@@ -48,28 +48,45 @@
 
     @Test
     public void testTaskCallsCreateNewNonAdminUser() {
-        mTask.execute("Test name");
+        String newUserName = "Test name";
+        mTask.execute(newUserName);
         Robolectric.flushBackgroundThreadScheduler();
 
-        verify(mCarUserManagerHelper).createNewNonAdminUser("Test name");
+        verify(mCarUserManagerHelper).createNewNonAdminUser(newUserName);
     }
 
     @Test
     public void testSwitchToNewUserIfUserCreated() {
-        UserInfo newUser = new UserInfo(10, "Test name", /* flags= */ 0);
-        when(mCarUserManagerHelper.createNewNonAdminUser("Test name")).thenReturn(newUser);
+        String newUserName = "Test name";
+        UserInfo newUser = new UserInfo(10, newUserName, /* flags= */ 0);
+        when(mCarUserManagerHelper.createNewNonAdminUser(newUserName)).thenReturn(newUser);
 
-        mTask.execute("Test name");
+        mTask.execute(newUserName);
         Robolectric.flushBackgroundThreadScheduler();
 
         verify(mCarUserManagerHelper).switchToUser(newUser);
     }
 
     @Test
-    public void testAddNewUserListenerCalled() {
-        mTask.execute("Test name");
+    public void testOnUserAddedSuccessCalledIfUserCreated() {
+        String newUserName = "Test name";
+        UserInfo newUser = new UserInfo(10, newUserName, /* flags= */ 0);
+        when(mCarUserManagerHelper.createNewNonAdminUser(newUserName)).thenReturn(newUser);
+
+        mTask.execute(newUserName);
         Robolectric.flushBackgroundThreadScheduler();
 
-        verify(mAddNewUserListener).onUserAdded();
+        verify(mAddNewUserListener).onUserAddedSuccess();
+    }
+
+    @Test
+    public void testOnUserAddedFailureCalledIfNullReturned() {
+        String newUserName = "Test name";
+        when(mCarUserManagerHelper.createNewNonAdminUser(newUserName)).thenReturn(null);
+
+        mTask.execute(newUserName);
+        Robolectric.flushBackgroundThreadScheduler();
+
+        verify(mAddNewUserListener).onUserAddedFailure();
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminFragmentTest.java
new file mode 100644
index 0000000..b6f41b5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminFragmentTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.pm.UserInfo;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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.annotation.Config;
+
+/**
+ * Tests for ChooseNewAdminFragment.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class ChooseNewAdminFragmentTest {
+
+    private static final UserInfo TEST_ADMIN_USER = new UserInfo(/* id= */ 10,
+            "TEST_USER_NAME", /* flags= */ 0);
+    private BaseTestActivity mTestActivity;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUpTestActivity() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testBackButtonPressed_whenRemoveCancelled() {
+        ChooseNewAdminFragment fragment = ChooseNewAdminFragment.newInstance(TEST_ADMIN_USER);
+        mTestActivity.launchFragment(fragment);
+        Button actionButton = (Button) mTestActivity.findViewById(R.id.action_button1);
+
+        actionButton.callOnClick();
+        assertThat(mTestActivity.getOnBackPressedFlag()).isTrue();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminPreferenceControllerTest.java
new file mode 100644
index 0000000..e539143
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/ChooseNewAdminPreferenceControllerTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.ErrorDialog;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class ChooseNewAdminPreferenceControllerTest {
+
+    private static final UserInfo TEST_ADMIN_USER = new UserInfo(/* id= */ 10,
+            "TEST_USER_NAME", /* flags= */ 0);
+    private static final UserInfo TEST_OTHER_USER = new UserInfo(/* id= */ 11,
+            "TEST_OTHER_NAME", /* flags= */ 0);
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<ChooseNewAdminPreferenceController> mControllerHelper;
+    private ChooseNewAdminPreferenceController mController;
+    private ConfirmationDialogFragment mDialog;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                ChooseNewAdminPreferenceController.class);
+        mController = mControllerHelper.getController();
+        mController.setAdminInfo(TEST_ADMIN_USER);
+        mControllerHelper.setPreference(new LogicalPreferenceGroup(mContext));
+        mDialog = new ConfirmationDialogFragment.Builder(mContext).build();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testOnCreate_hasPreviousDialog_dialogListenerSet() {
+        when(mControllerHelper.getMockFragmentController().findDialogByTag(
+                ConfirmationDialogFragment.TAG)).thenReturn(mDialog);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mDialog.getConfirmListener()).isNotNull();
+    }
+
+    @Test
+    public void testCheckInitialized_noAdminInfoSet_throwsError() {
+        assertThrows(IllegalStateException.class,
+                () -> new PreferenceControllerTestHelper<>(mContext,
+                        ChooseNewAdminPreferenceController.class,
+                        new LogicalPreferenceGroup(mContext)));
+    }
+
+    @Test
+    public void testUserClicked_opensDialog() {
+        mController.userClicked(/* userToMakeAdmin= */ TEST_OTHER_USER);
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class),
+                eq(ConfirmationDialogFragment.TAG));
+    }
+
+    @Test
+    public void testAssignNewAdminAndRemoveOldAdmin_grantAdminCalled() {
+        mController.assignNewAdminAndRemoveOldAdmin(TEST_OTHER_USER);
+
+        verify(mCarUserManagerHelper).grantAdminPermissions(TEST_OTHER_USER);
+    }
+
+    @Test
+    public void testAssignNewAdminAndRemoveOldAdmin_removeUserCalled() {
+        mController.assignNewAdminAndRemoveOldAdmin(TEST_OTHER_USER);
+
+        verify(mCarUserManagerHelper).removeUser(eq(TEST_ADMIN_USER), anyString());
+    }
+
+    @Test
+    public void testAssignNewAdminAndRemoveOldAdmin_success_noErrorDialog() {
+        when(mCarUserManagerHelper.removeUser(TEST_ADMIN_USER,
+                mContext.getString(R.string.user_guest))).thenReturn(true);
+
+        mController.assignNewAdminAndRemoveOldAdmin(TEST_OTHER_USER);
+
+        verify(mControllerHelper.getMockFragmentController(), never()).showDialog(
+                any(ErrorDialog.class), any());
+    }
+
+    @Test
+    public void testAssignNewAdminAndRemoveOldAdmin_failure_errorDialog() {
+        when(mCarUserManagerHelper.removeUser(TEST_ADMIN_USER,
+                mContext.getString(R.string.user_guest))).thenReturn(false);
+
+        mController.assignNewAdminAndRemoveOldAdmin(TEST_OTHER_USER);
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(any(ErrorDialog.class),
+                any());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/ConfirmExitRetailModeDialogTest.java b/tests/robotests/src/com/android/car/settings/users/ConfirmExitRetailModeDialogTest.java
new file mode 100644
index 0000000..db8ee92
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/ConfirmExitRetailModeDialogTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.DialogTestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+
+/**
+ * Tests for ConfirmExitRetailModeDialog.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ConfirmExitRetailModeDialogTest {
+    private BaseTestActivity mTestActivity;
+    private Fragment mTestFragment;
+    private ConfirmExitRetailModeDialog mDialog;
+
+    @Before
+    public void setUpTestActivity() {
+        MockitoAnnotations.initMocks(this);
+
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
+
+        mTestFragment = new Fragment();
+        mTestActivity.launchFragment(mTestFragment);
+
+        mDialog = new ConfirmExitRetailModeDialog();
+    }
+
+    @Test
+    public void testConfirmExitRetailModeInvokesOnExitRetailModeConfirmed() {
+        ConfirmExitRetailModeDialog.ConfirmExitRetailModeListener listener = Mockito.mock(
+                ConfirmExitRetailModeDialog.ConfirmExitRetailModeListener.class);
+        mDialog.setConfirmExitRetailModeListener(listener);
+        showDialog();
+
+        // Invoke exit retail mode.
+        DialogTestUtils.clickPositiveButton(mDialog);
+
+        verify(listener).onExitRetailModeConfirmed();
+        assertThat(isDialogShown()).isFalse(); // Dialog is dismissed.
+    }
+
+    @Test
+    public void testCancelDismissesDialog() {
+        showDialog();
+
+        // Invoke cancel.
+        DialogTestUtils.clickNegativeButton(mDialog);
+
+        assertThat(isDialogShown()).isFalse(); // Dialog is dismissed.
+    }
+
+    @Test
+    public void testNoConfirmClickListenerDismissesDialog() {
+        showDialog();
+
+        // Invoke confirm add user.
+        DialogTestUtils.clickPositiveButton(mDialog);
+
+        assertThat(isDialogShown()).isFalse(); // Dialog is dismissed.
+    }
+
+    private void showDialog() {
+        mDialog.show(mTestFragment);
+        assertThat(isDialogShown()).isTrue();
+    }
+
+    private boolean isDialogShown() {
+        return mTestActivity.getSupportFragmentManager()
+                .findFragmentByTag(ConfirmExitRetailModeDialog.DIALOG_TAG) != null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/EditUserNameEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/EditUserNameEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..c97b47b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/EditUserNameEntryPreferenceControllerTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static android.content.pm.UserInfo.FLAG_ADMIN;
+import static android.content.pm.UserInfo.FLAG_INITIALIZED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class EditUserNameEntryPreferenceControllerTest {
+
+    private static final String TEST_USERNAME = "Test Username";
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<EditUserNameEntryPreferenceController>
+            mPreferenceControllerHelper;
+    private EditUserNameEntryPreferenceController mController;
+    private ButtonPreference mButtonPreference;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                EditUserNameEntryPreferenceController.class);
+        mController = mPreferenceControllerHelper.getController();
+        mController.setUserInfo(new UserInfo());
+        mButtonPreference = new ButtonPreference(mContext);
+        mButtonPreference.setSelectable(false);
+        mPreferenceControllerHelper.setPreference(mButtonPreference);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testOnButtonClick_isCurrentUser_launchesEditUsernameFragment() {
+        UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, /* flags= */ 0);
+        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+        mController.setUserInfo(userInfo);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mButtonPreference.performButtonClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).launchFragment(
+                any(EditUsernameFragment.class));
+    }
+
+    @Test
+    public void testOnButtonClick_isNotCurrentUser_doesNothing() {
+        UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, /* flags= */ 0);
+        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+        mController.setUserInfo(userInfo);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mButtonPreference.performButtonClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController(), never()).launchFragment(
+                any(EditUsernameFragment.class));
+    }
+
+    @Test
+    public void testRefreshUi_elementHasTitle() {
+        UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, /* flags= */ 0);
+        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+        mController.setUserInfo(userInfo);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+        assertThat(mButtonPreference.getTitle()).isEqualTo(TEST_USERNAME);
+    }
+
+    @Test
+    public void testRefreshUi_userNotSetup_setsSummary() {
+        UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, /* flags= */ 0);
+        mController.setUserInfo(userInfo);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+        assertThat(mButtonPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.user_summary_not_set_up));
+    }
+
+    @Test
+    public void testRefreshUi_userSetup_noSummary() {
+        UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME, FLAG_INITIALIZED);
+        mController.setUserInfo(userInfo);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+        assertThat(mButtonPreference.getSummary()).isNull();
+    }
+
+    @Test
+    public void testRefreshUi_isAdmin_notCurrentUser() {
+        UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME,
+                FLAG_INITIALIZED | FLAG_ADMIN);
+        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(false);
+        mController.setUserInfo(userInfo);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+        assertThat(mButtonPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.user_admin));
+    }
+
+    @Test
+    public void testRefreshUi_isAdmin_currentUser() {
+        UserInfo userInfo = new UserInfo(/* id= */ 10, TEST_USERNAME,
+                FLAG_INITIALIZED | FLAG_ADMIN);
+        when(mCarUserManagerHelper.isCurrentProcessUser(userInfo)).thenReturn(true);
+        mController.setUserInfo(userInfo);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mController.refreshUi();
+        assertThat(mButtonPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.signed_in_admin_user));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java
index 7475baa..d4b5061 100644
--- a/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/EditUsernameFragmentTest.java
@@ -21,18 +21,18 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
 import android.content.pm.UserInfo;
 import android.os.UserManager;
 import android.widget.Button;
+import android.widget.EditText;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 
-import com.google.android.material.textfield.TextInputEditText;
-
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,7 +45,7 @@
  * Tests for EditUsernameFragment.
  */
 @RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = { ShadowCarUserManagerHelper.class })
+@Config(shadows = {ShadowCarUserManagerHelper.class})
 public class EditUsernameFragmentTest {
     private BaseTestActivity mTestActivity;
 
@@ -58,9 +58,12 @@
     public void setUpTestActivity() {
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        mTestActivity = Robolectric.buildActivity(BaseTestActivity.class)
-                .setup()
-                .get();
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
     }
 
     /**
@@ -72,8 +75,7 @@
         UserInfo testUser = new UserInfo(/* id= */ 10, testUserName, /* flags= */ 0);
         createEditUsernameFragment(testUser);
 
-        TextInputEditText userNameEditText =
-                (TextInputEditText) mTestActivity.findViewById(R.id.user_name_text_edit);
+        EditText userNameEditText = mTestActivity.findViewById(R.id.user_name_text_edit);
         assertThat(userNameEditText.getText().toString()).isEqualTo(testUserName);
     }
 
@@ -84,13 +86,13 @@
     public void testClickingOkSavesNewUserName() {
         UserInfo testUser = new UserInfo(/* id= */ 10, "user_name", /* flags= */ 0);
         createEditUsernameFragment(testUser);
-        TextInputEditText userNameEditText =
-                (TextInputEditText) mTestActivity.findViewById(R.id.user_name_text_edit);
+        EditText userNameEditText = mTestActivity.findViewById(R.id.user_name_text_edit);
         Button okButton = (Button) mTestActivity.findViewById(R.id.action_button2);
 
         String newUserName = "new_user_name";
         userNameEditText.requestFocus();
         userNameEditText.setText(newUserName);
+        assertThat(okButton.isEnabled()).isTrue();
         okButton.callOnClick();
 
         verify(mCarUserManagerHelper).setUserName(testUser, newUserName);
@@ -104,8 +106,7 @@
         int userId = 10;
         UserInfo testUser = new UserInfo(userId, /* name= */ "test_user", /* flags= */ 0);
         createEditUsernameFragment(testUser);
-        TextInputEditText userNameEditText =
-                (TextInputEditText) mTestActivity.findViewById(R.id.user_name_text_edit);
+        EditText userNameEditText = mTestActivity.findViewById(R.id.user_name_text_edit);
         Button cancelButton = (Button) mTestActivity.findViewById(R.id.action_button1);
 
         String newUserName = "new_user_name";
@@ -122,6 +123,19 @@
         verify(mUserManager, never()).setUserName(userId, newUserName);
     }
 
+    @Test
+    public void testEmptyUsernameCannotBeSaved() {
+        UserInfo testUser = new UserInfo(/* id= */ 10, "user_name", /* flags= */ 0);
+        createEditUsernameFragment(testUser);
+        EditText userNameEditText = mTestActivity.findViewById(R.id.user_name_text_edit);
+        Button okButton = (Button) mTestActivity.findViewById(R.id.action_button2);
+
+        userNameEditText.requestFocus();
+        userNameEditText.setText("");
+
+        assertThat(okButton.isEnabled()).isFalse();
+    }
+
     private void createEditUsernameFragment(UserInfo userInfo) {
         EditUsernameFragment fragment = EditUsernameFragment.newInstance(userInfo);
         mTestActivity.launchFragment(fragment);
diff --git a/tests/robotests/src/com/android/car/settings/users/MakeAdminPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/MakeAdminPreferenceControllerTest.java
new file mode 100644
index 0000000..5c62bcd
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/MakeAdminPreferenceControllerTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.matches;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.ButtonPreference;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class MakeAdminPreferenceControllerTest {
+
+    private static final UserInfo TEST_USER = new UserInfo(/* id= */ 10,
+            "Test Username", /* flags= */0);
+
+    private PreferenceControllerTestHelper<MakeAdminPreferenceController>
+            mPreferenceControllerHelper;
+    private MakeAdminPreferenceController mController;
+    private ButtonPreference mButtonPreference;
+    private ConfirmationDialogFragment mDialog;
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                MakeAdminPreferenceController.class);
+        mController = mPreferenceControllerHelper.getController();
+        mController.setUserInfo(TEST_USER);
+        mButtonPreference = new ButtonPreference(context);
+        mButtonPreference.setSelectable(false);
+        mPreferenceControllerHelper.setPreference(mButtonPreference);
+        mDialog = new ConfirmationDialogFragment.Builder(context).build();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testOnCreate_hasPreviousDialog_dialogListenerSet() {
+        when(mPreferenceControllerHelper.getMockFragmentController().findDialogByTag(
+                ConfirmationDialogFragment.TAG)).thenReturn(mDialog);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mDialog.getConfirmListener()).isNotNull();
+    }
+
+    @Test
+    public void testOnButtonClick_showsDialog() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mButtonPreference.performButtonClick();
+        verify(mPreferenceControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmationDialogFragment.class),
+                matches(ConfirmationDialogFragment.TAG));
+    }
+
+    @Test
+    public void testListener_makeUserAdmin() {
+        Bundle arguments = new Bundle();
+        arguments.putParcelable(UsersDialogProvider.KEY_USER_TO_MAKE_ADMIN, TEST_USER);
+        mController.mConfirmListener.onConfirm(arguments);
+        verify(mCarUserManagerHelper).grantAdminPermissions(TEST_USER);
+    }
+
+    @Test
+    public void testListener_goBack() {
+        Bundle arguments = new Bundle();
+        arguments.putParcelable(UsersDialogProvider.KEY_USER_TO_MAKE_ADMIN, TEST_USER);
+        mController.mConfirmListener.onConfirm(arguments);
+        verify(mPreferenceControllerHelper.getMockFragmentController()).goBack();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
new file mode 100644
index 0000000..9245f97
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/PermissionsPreferenceControllerTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+/**
+ * Test for the preference controller which populates the various permissions preferences.
+ * Note that the switch preference represents the opposite of the restriction it is controlling.
+ * i.e. DISALLOW_ADD_USER may be the restriction, but the switch represents "create new users".
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class PermissionsPreferenceControllerTest {
+
+    private static final String TEST_RESTRICTION = UserManager.DISALLOW_ADD_USER;
+    private static final UserInfo TEST_USER = new UserInfo(/* id= */ 10,
+            "TEST_USER_NAME", /* flags= */ 0);
+
+    private PreferenceControllerTestHelper<PermissionsPreferenceController>
+            mPreferenceControllerHelper;
+    private PermissionsPreferenceController mController;
+    private PreferenceGroup mPreferenceGroup;
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        ShadowCarUserManagerHelper.setMockInstance(mock(CarUserManagerHelper.class));
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                PermissionsPreferenceController.class);
+        mController = mPreferenceControllerHelper.getController();
+        mController.setUserInfo(TEST_USER);
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mPreferenceControllerHelper.setPreference(mPreferenceGroup);
+        mCarUserManagerHelper = new CarUserManagerHelper(context);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testRefreshUi_populatesGroup() {
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(5);
+    }
+
+    @Test
+    public void testRefreshUi_callingTwice_noDuplicates() {
+        mController.refreshUi();
+        mController.refreshUi();
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(5);
+    }
+
+    @Test
+    public void testRefreshUi_setToFalse() {
+        SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
+                TEST_RESTRICTION);
+        preference.setChecked(true);
+        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, true);
+        mController.refreshUi();
+        assertThat(preference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void testRefreshUi_setToTrue() {
+        SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
+                TEST_RESTRICTION);
+        preference.setChecked(false);
+        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, false);
+        mController.refreshUi();
+        assertThat(preference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void testOnPreferenceChange_changeToFalse() {
+        SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
+                TEST_RESTRICTION);
+        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, true);
+        preference.callChangeListener(true);
+        assertThat(mCarUserManagerHelper.hasUserRestriction(TEST_RESTRICTION, TEST_USER)).isFalse();
+    }
+
+    @Test
+    public void testOnPreferenceChange_changeToTrue() {
+        SwitchPreference preference = getPreferenceForRestriction(mPreferenceGroup,
+                TEST_RESTRICTION);
+        mCarUserManagerHelper.setUserRestriction(TEST_USER, TEST_RESTRICTION, false);
+        preference.callChangeListener(false);
+        assertThat(mCarUserManagerHelper.hasUserRestriction(TEST_RESTRICTION, TEST_USER)).isTrue();
+    }
+
+    private SwitchPreference getPreferenceForRestriction(
+            PreferenceGroup preferenceGroup, String restriction) {
+        for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
+            SwitchPreference preference = (SwitchPreference) preferenceGroup.getPreference(i);
+            if (restriction.equals(preference.getExtras().getString(
+                    PermissionsPreferenceController.PERMISSION_TYPE_KEY))) {
+                return preference;
+            }
+        }
+        return null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
new file mode 100644
index 0000000..6aaed03
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+import android.view.View;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
+
+import org.junit.After;
+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.annotation.Config;
+
+import java.util.Arrays;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
+        ShadowUserIconProvider.class})
+public class UserDetailsBaseFragmentTest {
+
+    /*
+     * This class needs to be public and static in order for it to be recreated from instance
+     * state if necessary.
+     */
+    public static class TestUserDetailsBaseFragment extends UserDetailsBaseFragment {
+
+        @Override
+        protected String getTitleText() {
+            return "test_title";
+        }
+
+        @Override
+        protected int getPreferenceScreenResId() {
+            return R.xml.test_user_details_base_fragment;
+        }
+    }
+
+    private BaseTestActivity mTestActivity;
+    private UserDetailsBaseFragment mUserDetailsBaseFragment;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private UserManager mUserManager;
+
+    private Button mRemoveUserButton;
+
+    @Before
+    public void setUpTestActivity() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowUserManager.setInstance(mUserManager);
+
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
+    }
+
+    @Test
+    public void testRemoveUserButtonVisible_whenAllowedToRemoveUsers() {
+        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+        createUserDetailsBaseFragment();
+
+        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void testRemoveUserButtonHidden_whenNotAllowedToRemoveUSers() {
+        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(false);
+        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+        createUserDetailsBaseFragment();
+
+        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testRemoveUserButtonHidden_whenUserCannotBeRemoved() {
+        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(false);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+        createUserDetailsBaseFragment();
+
+        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testRemoveUserButtonHidden_demoUser() {
+        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(true);
+        createUserDetailsBaseFragment();
+
+        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void testRemoveUserButtonClick_createsRemovalDialog() {
+        when(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).thenReturn(true);
+        when(mCarUserManagerHelper.canUserBeRemoved(any())).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
+        when(mCarUserManagerHelper.getAllPersistentUsers()).thenReturn(
+                Arrays.asList(new UserInfo()));
+        createUserDetailsBaseFragment();
+        mRemoveUserButton.performClick();
+
+        assertThat(mUserDetailsBaseFragment.findDialogByTag(
+                ConfirmationDialogFragment.TAG)).isNotNull();
+    }
+
+    private void createUserDetailsBaseFragment() {
+        UserInfo testUser = new UserInfo();
+        // Use UserDetailsFragment, since we cannot test an abstract class.
+        mUserDetailsBaseFragment = UserDetailsBaseFragment.addUserIdToFragmentArguments(
+                new TestUserDetailsBaseFragment(), testUser.id);
+        when(mUserManager.getUserInfo(testUser.id)).thenReturn(testUser);
+        mTestActivity.launchFragment(mUserDetailsBaseFragment);
+        mRemoveUserButton = (Button) mTestActivity.findViewById(R.id.action_button1);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsBasePreferenceControllerTest.java
new file mode 100644
index 0000000..97a988f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsBasePreferenceControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.testng.Assert.assertThrows;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class UserDetailsBasePreferenceControllerTest {
+
+    private static class TestUserDetailsBasePreferenceController extends
+            UserDetailsBasePreferenceController<Preference> {
+
+        TestUserDetailsBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Class<Preference> getPreferenceType() {
+            return Preference.class;
+        }
+    }
+
+    private PreferenceControllerTestHelper<TestUserDetailsBasePreferenceController>
+            mPreferenceControllerHelper;
+    private TestUserDetailsBasePreferenceController mController;
+    private Preference mPreference;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        Context context = RuntimeEnvironment.application;
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(context,
+                TestUserDetailsBasePreferenceController.class);
+        mController = mPreferenceControllerHelper.getController();
+        mPreference = new Preference(context);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testCheckInitialized_missingUserInfo() {
+        assertThrows(() -> mPreferenceControllerHelper.setPreference(mPreference));
+    }
+
+    @Test
+    public void testOnCreate_registerListener() {
+        mController.setUserInfo(new UserInfo());
+        mPreferenceControllerHelper.setPreference(mPreference);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(any(CarUserManagerHelper
+                .OnUsersUpdateListener.class));
+    }
+
+    @Test
+    public void testOnDestroy_unregisterListener() {
+        mController.setUserInfo(new UserInfo());
+        mPreferenceControllerHelper.setPreference(mPreference);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        ArgumentCaptor<CarUserManagerHelper.OnUsersUpdateListener> listenerArgumentCaptor =
+                ArgumentCaptor.forClass(CarUserManagerHelper.OnUsersUpdateListener.class);
+        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(
+                listenerArgumentCaptor.capture());
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+        verify(mCarUserManagerHelper).unregisterOnUsersUpdateListener(
+                listenerArgumentCaptor.getValue());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
index 84daa8e..c6b51b2 100644
--- a/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
@@ -18,164 +18,97 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.content.pm.UserInfo;
-import android.view.View;
-import android.widget.Button;
+import android.os.UserManager;
+import android.widget.TextView;
 
 import com.android.car.settings.CarSettingsRobolectricTestRunner;
 import com.android.car.settings.R;
 import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
+import com.android.car.settings.testutils.ShadowUserManager;
 
+import org.junit.After;
 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.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-/**
- * Tests for UserDetailsFragment.
- */
 @RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = { ShadowUserIconProvider.class })
+@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
+        ShadowUserIconProvider.class})
 public class UserDetailsFragmentTest {
+
+    private static final String TEST_NAME = "test_name";
+    private static final String TEST_UPDATED_NAME = "test_updated_name";
+    private static final int TEST_USER_ID = 10;
+
+    private Context mContext;
     private BaseTestActivity mTestActivity;
     private UserDetailsFragment mUserDetailsFragment;
-
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
     @Mock
-    private UserIconProvider mUserIconProvider;
+    private UserManager mUserManager;
 
-    private Button mRemoveUserButton;
-    private Button mSwitchUserButton;
+    private TextView mTitle;
 
     @Before
     public void setUpTestActivity() {
         MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        ShadowUserManager.setInstance(mUserManager);
 
-        when(mUserIconProvider.getUserIcon(any(), any())).thenReturn(null);
-
-        mTestActivity = Robolectric.buildActivity(BaseTestActivity.class)
-                .setup()
-                .get();
+        mContext = RuntimeEnvironment.application;
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
     }
 
-    /**
-     * Tests that if the current user cannot remove other users, the removeUserButton is hidden.
-     */
-    @Test
-    public void test_canCurrentProcessRemoveUsers_isFalse_hidesRemoveUserButton() {
-        doReturn(true).when(mCarUserManagerHelper).canCurrentProcessRemoveUsers();
-        doReturn(true).when(mCarUserManagerHelper).canUserBeRemoved(any());
-        doReturn(false).when(mCarUserManagerHelper).isCurrentProcessDemoUser();
-        createUserDetailsFragment();
-
-        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.VISIBLE);
-
-        doReturn(false).when(mCarUserManagerHelper).canCurrentProcessRemoveUsers();
-        refreshFragment();
-
-        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+        ShadowUserManager.reset();
     }
 
-    /**
-     * Tests that if the user cannot be removed, the remove button is hidden.
-     */
     @Test
-    public void test_canUserBeRemoved_isFalse_hidesRemoveUserButton() {
-        doReturn(true).when(mCarUserManagerHelper).canCurrentProcessRemoveUsers();
-        doReturn(true).when(mCarUserManagerHelper).canUserBeRemoved(any());
-        doReturn(false).when(mCarUserManagerHelper).isCurrentProcessDemoUser();
+    public void testCarUserManagerHelperUpdateListener_showsCorrectText() {
+        UserInfo testUser = new UserInfo(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
+        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUser);
         createUserDetailsFragment();
-
-        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.VISIBLE);
-
-        doReturn(false).when(mCarUserManagerHelper).canUserBeRemoved(any());
-        refreshFragment();
-
-        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
+        mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
+        assertThat(mTitle.getText()).isEqualTo(
+                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUser));
     }
 
-    /**
-     * Tests that demo user cannot remove other users.
-     */
     @Test
-    public void test_isCurrentProcessDemoUser_isTrue_hidesRemoveUserButton() {
-        doReturn(true).when(mCarUserManagerHelper).canCurrentProcessRemoveUsers();
-        doReturn(true).when(mCarUserManagerHelper).canUserBeRemoved(any());
-        doReturn(false).when(mCarUserManagerHelper).isCurrentProcessDemoUser();
+    public void testCarUserManagerHelperUpdateListener_textChangesWithUserUpdate() {
+        UserInfo testUser = new UserInfo(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
+        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUser);
+
         createUserDetailsFragment();
+        mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
+        assertThat(mTitle.getText()).isEqualTo(
+                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUser));
 
-        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.VISIBLE);
+        UserInfo testUserUpdated = new UserInfo(TEST_USER_ID, TEST_UPDATED_NAME, /* flags= */ 0);
+        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUserUpdated);
 
-        doReturn(true).when(mCarUserManagerHelper).isCurrentProcessDemoUser();
-        refreshFragment();
-
-        assertThat(mRemoveUserButton.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    /**
-     * Tests that if the current user cannot switch to other users, the switchUserButton is hidden.
-     */
-    @Test
-    public void test_canCurrentProcessSwitchUsers_isFalse_hidesSwitchUserButton() {
-        doReturn(true).when(mCarUserManagerHelper).canCurrentProcessSwitchUsers();
-        doReturn(false).when(mCarUserManagerHelper).isForegroundUser(any());
-        createUserDetailsFragment();
-
-        assertThat(mSwitchUserButton.getVisibility()).isEqualTo(View.VISIBLE);
-
-        doReturn(false).when(mCarUserManagerHelper).canCurrentProcessSwitchUsers();
-        refreshFragment();
-
-        assertThat(mSwitchUserButton.getVisibility()).isEqualTo(View.GONE);
-    }
-
-    /**
-     * Tests that if UserDetailsFragment is displaying foreground user already, switch button is
-     * hidden.
-     */
-    @Test
-    public void test_isForegroundUser_isTrue_hidesSwitchUserButton() {
-        doReturn(true).when(mCarUserManagerHelper).canCurrentProcessSwitchUsers();
-        doReturn(false).when(mCarUserManagerHelper).isForegroundUser(any());
-        createUserDetailsFragment();
-
-        assertThat(mSwitchUserButton.getVisibility()).isEqualTo(View.VISIBLE);
-
-        doReturn(false).when(mCarUserManagerHelper).canCurrentProcessSwitchUsers();
-        refreshFragment();
-
-        assertThat(mSwitchUserButton.getVisibility()).isEqualTo(View.GONE);
+        mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
+        assertThat(mTitle.getText()).isEqualTo(
+                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUserUpdated));
     }
 
     private void createUserDetailsFragment() {
-        UserInfo testUser = new UserInfo();
-
-        mUserDetailsFragment = UserDetailsFragment.newInstance(testUser);
-        mUserDetailsFragment.mCarUserManagerHelper = mCarUserManagerHelper;
+        mUserDetailsFragment = UserDetailsFragment.newInstance(TEST_USER_ID);
         mTestActivity.launchFragment(mUserDetailsFragment);
-
-        refreshButtons();
-    }
-
-    private void refreshFragment() {
-        mTestActivity.reattachFragment(mUserDetailsFragment);
-
-        refreshButtons();
-    }
-
-    private void refreshButtons() {
-        // Get buttons;
-        mRemoveUserButton = (Button) mTestActivity.findViewById(R.id.action_button1);
-        mSwitchUserButton = (Button) mTestActivity.findViewById(R.id.action_button2);
+        mTitle = mTestActivity.findViewById(R.id.title);
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UsersBasePreferenceControllerTest.java
new file mode 100644
index 0000000..42e2b89
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UsersBasePreferenceControllerTest.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static android.content.pm.UserInfo.FLAG_ADMIN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class UsersBasePreferenceControllerTest {
+
+    private static class TestUsersBasePreferenceController extends UsersBasePreferenceController {
+
+        TestUsersBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected void userClicked(UserInfo userInfo) {
+        }
+    }
+
+    private static final UserInfo TEST_CURRENT_USER = new UserInfo(/* id= */ 10,
+            "TEST_USER_NAME", /* flags= */ 0);
+    private static final UserInfo TEST_OTHER_USER = new UserInfo(/* id= */ 11,
+            "TEST_OTHER_NAME", /* flags= */ 0);
+    private PreferenceControllerTestHelper<TestUsersBasePreferenceController> mControllerHelper;
+    private TestUsersBasePreferenceController mController;
+    private PreferenceGroup mPreferenceGroup;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                TestUsersBasePreferenceController.class, mPreferenceGroup);
+        mController = mControllerHelper.getController();
+        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_CURRENT_USER);
+        when(mCarUserManagerHelper.isCurrentProcessUser(TEST_CURRENT_USER)).thenReturn(true);
+        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+                Collections.singletonList(TEST_OTHER_USER));
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void onCreate_registersOnUsersUpdateListener() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(
+                any(CarUserManagerHelper.OnUsersUpdateListener.class));
+    }
+
+    @Test
+    public void onCreate_populatesUsers() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        // Three users. Current user, other user, guest user.
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3);
+    }
+
+    @Test
+    public void onDestroy_unregistersOnUsersUpdateListener() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        verify(mCarUserManagerHelper).unregisterOnUsersUpdateListener(
+                any(CarUserManagerHelper.OnUsersUpdateListener.class));
+    }
+
+    @Test
+    public void refreshUi_userChange_updatesGroup() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        // Store the list of previous Preferences.
+        List<Preference> currentPreferences = new ArrayList<>();
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            currentPreferences.add(mPreferenceGroup.getPreference(i));
+        }
+
+        // Mock a change so that other user becomes an admin.
+        UserInfo adminOtherUser = new UserInfo(/* id= */ 11, "TEST_OTHER_NAME", FLAG_ADMIN);
+        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+                Collections.singletonList(adminOtherUser));
+
+        mController.refreshUi();
+
+        List<Preference> newPreferences = new ArrayList<>();
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            newPreferences.add(mPreferenceGroup.getPreference(i));
+        }
+
+        assertThat(newPreferences).containsNoneIn(currentPreferences);
+    }
+
+    @Test
+    public void refreshUi_noChange_doesNotUpdateGroup() {
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+
+        // Store the list of previous Preferences.
+        List<Preference> currentPreferences = new ArrayList<>();
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            currentPreferences.add(mPreferenceGroup.getPreference(i));
+        }
+
+        mController.refreshUi();
+
+        List<Preference> newPreferences = new ArrayList<>();
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            newPreferences.add(mPreferenceGroup.getPreference(i));
+        }
+
+        assertThat(newPreferences).containsExactlyElementsIn(currentPreferences);
+    }
+
+    @Test
+    public void onUsersUpdated_updatesGroup() {
+        ArgumentCaptor<CarUserManagerHelper.OnUsersUpdateListener> listenerCaptor =
+                ArgumentCaptor.forClass(CarUserManagerHelper.OnUsersUpdateListener.class);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+        verify(mCarUserManagerHelper).registerOnUsersUpdateListener(listenerCaptor.capture());
+
+        // Store the list of previous Preferences.
+        List<Preference> currentPreferences = new ArrayList<>();
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            currentPreferences.add(mPreferenceGroup.getPreference(i));
+        }
+
+        // Mock a change so that other user becomes an admin.
+        UserInfo adminOtherUser = new UserInfo(/* id= */ 11, "TEST_OTHER_NAME", FLAG_ADMIN);
+        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+                Collections.singletonList(adminOtherUser));
+
+        listenerCaptor.getValue().onUsersUpdate();
+
+        List<Preference> newPreferences = new ArrayList<>();
+        for (int i = 0; i < mPreferenceGroup.getPreferenceCount(); i++) {
+            newPreferences.add(mPreferenceGroup.getPreference(i));
+        }
+
+        assertThat(newPreferences).containsNoneIn(currentPreferences);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UsersEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..e9744c5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UsersEntryPreferenceControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+/** Unit test for {@link UsersEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class})
+public class UsersEntryPreferenceControllerTest {
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    private Preference mPreference;
+    private PreferenceControllerTestHelper<UsersEntryPreferenceController> mControllerHelper;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+
+        Context context = RuntimeEnvironment.application;
+        mPreference = new Preference(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                UsersEntryPreferenceController.class, mPreference);
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void preferenceClicked_adminUser_handled() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+
+        assertThat(
+                mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference)).isTrue();
+    }
+
+    @Test
+    public void preferenceClicked_adminUser_launchesUsersListFragment() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+
+        mPreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(
+                any(UsersListFragment.class));
+    }
+
+    @Test
+    public void preferenceClicked_nonAdminUser_handled() {
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+
+        assertThat(
+                mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference)).isTrue();
+    }
+
+    @Test
+    public void preferenceClicked_nonAdminUser_launchesUserDetailsFragment() {
+        int userId = 1234;
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(userId);
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(false);
+
+        mPreference.performClick();
+
+        ArgumentCaptor<UserDetailsFragment> fragmentCaptor = ArgumentCaptor.forClass(
+                UserDetailsFragment.class);
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(
+                fragmentCaptor.capture());
+        UserDetailsFragment launchedFragment = fragmentCaptor.getValue();
+        assertThat(launchedFragment.getArguments()).isNotNull();
+        assertThat(launchedFragment.getArguments().getInt(Intent.EXTRA_USER_ID)).isEqualTo(userId);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersItemProviderTest.java b/tests/robotests/src/com/android/car/settings/users/UsersItemProviderTest.java
deleted file mode 100644
index a563846..0000000
--- a/tests/robotests/src/com/android/car/settings/users/UsersItemProviderTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.users;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-import static org.robolectric.RuntimeEnvironment.application;
-
-import android.car.user.CarUserManagerHelper;
-import android.content.pm.UserInfo;
-import android.view.View;
-
-import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.R;
-import com.android.car.settings.testutils.ShadowTextListItem;
-
-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 org.robolectric.shadow.api.Shadow;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests for UsersItemProviderTest.
- */
-@RunWith(CarSettingsRobolectricTestRunner.class)
-@Config(shadows = { ShadowTextListItem.class })
-public class UsersItemProviderTest {
-    @Mock
-    private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
-    private UsersItemProvider.UserClickListener mUserClickListener;
-
-    @Before
-    public void setUpMocks() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void testFirstUserIsCurrentUser() {
-        UserInfo currentUser = new UserInfo();
-        String testName = "test_user_name";
-        currentUser.name = testName;
-        doReturn(currentUser).when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-
-        UsersItemProvider usersItemProvider = createProvider();
-
-        ShadowTextListItem textListItem = Shadow.extract(usersItemProvider.get(0));
-        assertThat(textListItem.getTitle())
-                .isEqualTo(application.getString(R.string.current_user_name, testName));
-    }
-
-    @Test
-    public void testDemoUserOnlySeesItself() {
-        UserInfo demoUser = new UserInfo(/* id= */ 10, /* name= */ "Demo", UserInfo.FLAG_DEMO);
-        doReturn(demoUser).when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-        doReturn(Arrays.asList(new UserInfo(), new UserInfo()))
-                .when(mCarUserManagerHelper).getAllSwitchableUsers();
-
-        UsersItemProvider usersItemProvider = createProvider();
-
-        assertThat(usersItemProvider.size()).isEqualTo(1);
-    }
-
-    @Test
-    public void testGuestUsersNotShown() {
-        UserInfo user10 = new UserInfo(/* id= */ 10, "User 10", /* flags= */ 0);
-        UserInfo user11 = new UserInfo(/* id= */ 11, "User 11", UserInfo.FLAG_GUEST);
-        UserInfo user12 = new UserInfo(/* id= */ 12, "User 12", UserInfo.FLAG_GUEST);
-        UserInfo user13 = new UserInfo(/* id= */ 13, "User 13", /* flags= */ 0);
-        UserInfo user14 = new UserInfo(/* id= */ 14, "User 14", /* flags= */ 0);
-        List<UserInfo> users = Arrays.asList(user10, user11, user12, user13);
-
-        doReturn(user14).when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-        doReturn(users).when(mCarUserManagerHelper).getAllSwitchableUsers();
-
-        UsersItemProvider provider = createProvider();
-
-        assertThat(getItem(provider, 0).getTitle())
-                .isEqualTo(application.getString(R.string.current_user_name, user14.name));
-        assertThat(getItem(provider, 1).getTitle()).isEqualTo(user10.name);
-        assertThat(getItem(provider, 2).getTitle()).isEqualTo(user13.name);
-    }
-
-    @Test
-    public void testGuestShownAsSeparateItem() {
-        UserInfo user10 = new UserInfo(/* id= */ 10, "User 10", /* flags= */ 0);
-        UserInfo user11 = new UserInfo(/* id= */ 11, "User 11", /* flags= */ UserInfo.FLAG_GUEST);
-        UserInfo user12 = new UserInfo(/* id= */ 12, "User 12", /* flags= */ UserInfo.FLAG_GUEST);
-        UserInfo user13 = new UserInfo(/* id= */ 13, "User 13", /* flags= */ 0);
-        List<UserInfo> users = Arrays.asList(user10, user11, user12, user13);
-
-        doReturn(new UserInfo(/* id= */ 14, "User 14", /* flags= */ 0))
-                .when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-        doReturn(users).when(mCarUserManagerHelper).getAllSwitchableUsers();
-
-        UsersItemProvider provider = createProvider();
-
-        assertThat(getItem(provider, 3).getTitle())
-                .isEqualTo(application.getString(R.string.user_guest));
-    }
-
-    @Test
-    public void testClickOnUsersInvokesOnUserClicked() {
-        UserInfo currentUser = new UserInfo(/* id= */ 11, "User 11", /* flags= */ 0);
-        List<UserInfo> otherUsers = Arrays.asList(
-                new UserInfo(/* id= */ 10, "User 10", /* flags= */ 0));
-
-        doReturn(currentUser).when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-        doReturn(otherUsers).when(mCarUserManagerHelper).getAllSwitchableUsers();
-
-        UsersItemProvider provider = createProvider();
-
-        // Clicking on current user invokes OnUserClicked.
-        ShadowTextListItem textListItem = getItem(provider, 0);
-        textListItem.getOnClickListener().onClick(new View(application.getApplicationContext()));
-        verify(mUserClickListener).onUserClicked(currentUser);
-
-        // Clicking on another user invokes OnUserClicked.
-        textListItem = getItem(provider, 1);
-        textListItem.getOnClickListener().onClick(new View(application.getApplicationContext()));
-        verify(mUserClickListener).onUserClicked(otherUsers.get(0));
-    }
-
-    @Test
-    public void testClickOnGuestInvokesOnGuestClicked() {
-        UserInfo currentUser = new UserInfo(/* id= */ 11, "User 11", /* flags= */ 0);
-        doReturn(currentUser).when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-
-        UsersItemProvider provider = createProvider();
-
-        // Clicking on guest user invokes OnGuestClicked.
-        ShadowTextListItem guestListItem = getItem(provider, 1);
-        guestListItem.getOnClickListener().onClick(new View(application.getApplicationContext()));
-        verify(mUserClickListener).onGuestClicked();
-    }
-
-    @Test
-    public void testSummariesForAdminUsers() {
-        UserInfo currentUser = new UserInfo(/* id= */ 11, "User 11",
-                UserInfo.FLAG_ADMIN | UserInfo.FLAG_INITIALIZED);
-        List<UserInfo> otherUsers = Arrays.asList(new UserInfo(/* id= */ 10, "User 10",
-                UserInfo.FLAG_ADMIN | UserInfo.FLAG_INITIALIZED));
-
-        doReturn(currentUser).when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-        doReturn(otherUsers).when(mCarUserManagerHelper).getAllSwitchableUsers();
-
-        UsersItemProvider provider = createProvider();
-
-        assertThat(getItem(provider, 0).getBody())
-                .isEqualTo(application.getString(R.string.signed_in_admin_user));
-        assertThat(getItem(provider, 1).getBody())
-                .isEqualTo(application.getString(R.string.user_admin));
-    }
-
-    @Test
-    public void testSummariesForNonInitializedUsers() {
-        UserInfo currentUser = new UserInfo(/* id= */ 11, "User 11", UserInfo.FLAG_INITIALIZED);
-        List<UserInfo> otherUsers = Arrays.asList(
-                new UserInfo(/* id= */ 10, "User 10", /* flags= */ 0));
-
-        doReturn(currentUser).when(mCarUserManagerHelper).getCurrentForegroundUserInfo();
-        doReturn(otherUsers).when(mCarUserManagerHelper).getAllSwitchableUsers();
-
-        UsersItemProvider provider = createProvider();
-
-        assertThat(getItem(provider, 0).getBody()).isNull();
-        assertThat(getItem(provider, 1).getBody())
-                .isEqualTo(application.getString(R.string.user_summary_not_set_up));
-    }
-
-
-    private UsersItemProvider createProvider() {
-        return new UsersItemProvider(RuntimeEnvironment.application.getApplicationContext(),
-                mUserClickListener, mCarUserManagerHelper);
-    }
-
-    private ShadowTextListItem getItem(UsersItemProvider provider, int index) {
-        return Shadow.extract(provider.get(index));
-    }
-}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
new file mode 100644
index 0000000..09a3871
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+import android.widget.Button;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.ConfirmationDialogFragment;
+import com.android.car.settings.testutils.BaseTestActivity;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+
+/**
+ * Tests for UserDetailsFragment.
+ */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class UsersListFragmentTest {
+
+    private Context mContext;
+    private BaseTestActivity mTestActivity;
+    private UsersListFragment mFragment;
+    private Button mActionButton;
+    private ConfirmationDialogFragment mDialog;
+
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private UserManager mUserManager;
+
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mContext = RuntimeEnvironment.application;
+        mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    /* Test that onCreateNewUserConfirmed invokes a creation of a new non-admin. */
+    @Test
+    public void testOnCreateNewUserConfirmedInvokesCreateNewNonAdminUser() {
+        createUsersListFragment();
+        mFragment.mConfirmListener.onConfirm(/* arguments= */ null);
+        Robolectric.flushBackgroundThreadScheduler();
+        verify(mCarUserManagerHelper)
+                .createNewNonAdminUser(mContext.getString(R.string.user_new_user_name));
+    }
+
+    /* Test that if we're in demo user, click on the button starts exit out of the retail mode. */
+    @Test
+    public void testCallOnClick_demoUser_exitRetailMode() {
+        doReturn(true).when(mCarUserManagerHelper).isCurrentProcessDemoUser();
+        createUsersListFragment();
+        mActionButton.callOnClick();
+        assertThat(isDialogShown(ConfirmExitRetailModeDialog.DIALOG_TAG)).isTrue();
+    }
+
+    /* Test that if the max num of users is reached, click on the button informs user of that. */
+    @Test
+    public void testCallOnClick_userLimitReached_showErrorDialog() {
+        doReturn(5).when(mCarUserManagerHelper).getMaxSupportedRealUsers();
+        doReturn(true).when(mCarUserManagerHelper).isUserLimitReached();
+        createUsersListFragment();
+
+        mActionButton.callOnClick();
+        assertThat(isDialogShown(MaxUsersLimitReachedDialog.DIALOG_TAG)).isTrue();
+    }
+
+    /* Test that if user can add other users, click on the button creates a dialog to confirm. */
+    @Test
+    public void testCallOnClick_showAddUserDialog() {
+        doReturn(true).when(mCarUserManagerHelper).canCurrentProcessAddUsers();
+        createUsersListFragment();
+
+        mActionButton.callOnClick();
+        assertThat(isDialogShown(ConfirmationDialogFragment.TAG)).isTrue();
+    }
+
+    private void createUsersListFragment() {
+        UserInfo testUser = new UserInfo();
+        mFragment = new UsersListFragment();
+        doReturn(testUser).when(mCarUserManagerHelper).getCurrentProcessUserInfo();
+        doReturn(testUser).when(mUserManager).getUserInfo(anyInt());
+        doReturn(new ArrayList<UserInfo>()).when(mCarUserManagerHelper).getAllSwitchableUsers();
+        doReturn(null).when(mCarUserManagerHelper).createNewNonAdminUser(any());
+        mTestActivity.launchFragment(mFragment);
+        refreshButtons();
+    }
+
+    private void refreshButtons() {
+        mActionButton = (Button) mTestActivity.findViewById(R.id.action_button1);
+    }
+
+    private boolean isDialogShown(String tag) {
+        return mTestActivity.getSupportFragmentManager().findFragmentByTag(tag) != null;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/users/UsersListPreferenceControllerTest.java
new file mode 100644
index 0000000..73b7fba
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListPreferenceControllerTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static android.content.pm.UserInfo.FLAG_ADMIN;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
+import com.android.car.settings.testutils.ShadowUserIconProvider;
+
+import org.junit.After;
+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 java.util.Collections;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
+public class UsersListPreferenceControllerTest {
+
+    private static final UserInfo TEST_CURRENT_USER = new UserInfo(/* id= */ 10,
+            "TEST_USER_NAME", FLAG_ADMIN);
+    private static final UserInfo TEST_OTHER_USER = new UserInfo(/* id= */ 11,
+            "TEST_OTHER_NAME", /* flags= */ 0);
+
+    private PreferenceControllerTestHelper<UsersListPreferenceController> mControllerHelper;
+    private PreferenceGroup mPreferenceGroup;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        MockitoAnnotations.initMocks(this);
+        ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        mPreferenceGroup = new LogicalPreferenceGroup(context);
+        mControllerHelper = new PreferenceControllerTestHelper<>(context,
+                UsersListPreferenceController.class, mPreferenceGroup);
+
+        when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(TEST_CURRENT_USER);
+        when(mCarUserManagerHelper.isCurrentProcessUser(TEST_CURRENT_USER)).thenReturn(true);
+        when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
+        when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(
+                Collections.singletonList(TEST_OTHER_USER));
+
+        mControllerHelper.markState(Lifecycle.State.STARTED);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarUserManagerHelper.reset();
+    }
+
+    @Test
+    public void testPreferencePerformClick_currentAdminUser_openNewFragment() {
+        mPreferenceGroup.getPreference(0).performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(
+                any(UserDetailsFragment.class));
+    }
+
+    @Test
+    public void testPreferencePerformClick_otherNonAdminUser_openNewFragment() {
+        mPreferenceGroup.getPreference(1).performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).launchFragment(
+                any(UserDetailsPermissionsFragment.class));
+    }
+
+    @Test
+    public void testPreferencePerformClick_guestUser_noAction() {
+        mPreferenceGroup.getPreference(2).performClick();
+
+        verify(mControllerHelper.getMockFragmentController(), never()).launchFragment(any());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java b/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
new file mode 100644
index 0000000..b08723b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/users/UsersPreferenceProviderTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2018 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.car.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.pm.UserInfo;
+
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+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 java.util.Arrays;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class UsersPreferenceProviderTest {
+
+    private static final String TEST_CURRENT_USER_NAME = "Current User";
+    private static final String TEST_OTHER_USER_1_NAME = "User 1";
+    private static final String TEST_OTHER_USER_2_NAME = "User 2";
+    private static final String TEST_GUEST_USER_1_NAME = "Guest 1";
+    private static final String TEST_GUEST_USER_2_NAME = "Guest 2";
+
+    private static final UserInfo TEST_CURRENT_USER = new UserInfo(/* id= */ 14,
+            TEST_CURRENT_USER_NAME, /* flags= */ 0);
+    private static final UserInfo TEST_OTHER_USER_1 = new UserInfo(/* id= */ 10,
+            TEST_OTHER_USER_1_NAME, /* flags= */ 0);
+    private static final UserInfo TEST_OTHER_USER_2 = new UserInfo(/* id= */ 11,
+            TEST_OTHER_USER_2_NAME, /* flags= */ 0);
+    private static final UserInfo TEST_GUEST_USER_1 = new UserInfo(/* id= */ 12,
+            TEST_GUEST_USER_1_NAME, /* flags= */ UserInfo.FLAG_GUEST);
+    private static final UserInfo TEST_GUEST_USER_2 = new UserInfo(/* id= */ 13,
+            TEST_GUEST_USER_2_NAME, /* flags= */ UserInfo.FLAG_GUEST);
+
+
+    private Context mContext;
+    @Mock
+    private CarUserManagerHelper mCarUserManagerHelper;
+    @Mock
+    private UsersPreferenceProvider.UserClickListener mUserClickListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        List<UserInfo> users = Arrays.asList(TEST_OTHER_USER_1, TEST_GUEST_USER_1,
+                TEST_GUEST_USER_2,
+                TEST_OTHER_USER_2);
+
+        doReturn(TEST_CURRENT_USER).when(mCarUserManagerHelper).getCurrentProcessUserInfo();
+        doReturn(true).when(mCarUserManagerHelper).isCurrentProcessUser(TEST_CURRENT_USER);
+        doReturn(users).when(mCarUserManagerHelper).getAllSwitchableUsers();
+    }
+
+    @Test
+    public void testCreateUserList_firstUserIsCurrentUser() {
+        UsersPreferenceProvider provider = createProvider();
+
+        Preference first = provider.createUserList().get(0);
+        assertThat(first.getTitle()).isEqualTo(
+                mContext.getString(R.string.current_user_name, TEST_CURRENT_USER_NAME));
+    }
+
+    @Test
+    public void testCreateUserList_repeatedGuestUserNotShown() {
+        UsersPreferenceProvider provider = createProvider();
+
+        List<Preference> userList = provider.createUserList();
+        assertThat(userList.size()).isEqualTo(4); // 3 real users + guest item.
+        assertThat(userList.get(0).getTitle()).isEqualTo(
+                mContext.getString(R.string.current_user_name, TEST_CURRENT_USER_NAME));
+        assertThat(userList.get(1).getTitle()).isEqualTo(TEST_OTHER_USER_1_NAME);
+        assertThat(userList.get(2).getTitle()).isEqualTo(TEST_OTHER_USER_2_NAME);
+    }
+
+    @Test
+    public void testCreateUserList_guestShownAsSeparateLastElement() {
+        UsersPreferenceProvider provider = createProvider();
+
+        List<Preference> userList = provider.createUserList();
+        assertThat(userList.get(userList.size() - 1).getTitle()).isEqualTo(
+                mContext.getString(R.string.user_guest));
+    }
+
+    @Test
+    public void testCreateUserList_currentUserNotShown() {
+        UsersPreferenceProvider provider = createProvider();
+        provider.setIncludeCurrentUser(false);
+
+        List<Preference> userList = provider.createUserList();
+        assertThat(userList.size()).isEqualTo(3); // 3 real users + guest item.
+        assertThat(userList.get(0).getTitle()).isEqualTo(TEST_OTHER_USER_1_NAME);
+        assertThat(userList.get(1).getTitle()).isEqualTo(TEST_OTHER_USER_2_NAME);
+        assertThat(userList.get(2).getTitle()).isEqualTo(
+                mContext.getString(R.string.user_guest));
+    }
+
+    @Test
+    public void testCreateUserList_guestNotShown() {
+        UsersPreferenceProvider provider = createProvider();
+        provider.setIncludeGuest(false);
+
+        List<Preference> userList = provider.createUserList();
+        assertThat(userList.size()).isEqualTo(3); // 3 real users.
+        assertThat(userList.get(0).getTitle()).isEqualTo(
+                mContext.getString(R.string.current_user_name, TEST_CURRENT_USER_NAME));
+        assertThat(userList.get(1).getTitle()).isEqualTo(TEST_OTHER_USER_1_NAME);
+        assertThat(userList.get(2).getTitle()).isEqualTo(TEST_OTHER_USER_2_NAME);
+    }
+
+    @Test
+    public void testPerformClick_currentUser_invokesUserClickListener() {
+        UsersPreferenceProvider provider = createProvider();
+
+        List<Preference> userList = provider.createUserList();
+        userList.get(0).performClick();
+        verify(mUserClickListener).onUserClicked(TEST_CURRENT_USER);
+    }
+
+    @Test
+    public void testPerformClick_otherUser_invokesUserClickListener() {
+        UsersPreferenceProvider provider = createProvider();
+
+        List<Preference> userList = provider.createUserList();
+        userList.get(1).performClick();
+        verify(mUserClickListener).onUserClicked(TEST_OTHER_USER_1);
+    }
+
+    @Test
+    public void testPerformClick_guestUser_doesntInvokeUserClickListener() {
+        UsersPreferenceProvider provider = createProvider();
+
+        List<Preference> userList = provider.createUserList();
+        userList.get(userList.size() - 1).performClick();
+        verify(mUserClickListener, never()).onUserClicked(any(UserInfo.class));
+    }
+
+    private UsersPreferenceProvider createProvider() {
+        return new UsersPreferenceProvider(mContext, mCarUserManagerHelper, mUserClickListener);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AccessPointListPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/AccessPointListPreferenceControllerTest.java
new file mode 100644
index 0000000..7ecf4ae
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/AccessPointListPreferenceControllerTest.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.util.Pair;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.PreferenceGroup;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.LogicalPreferenceGroup;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+import com.android.car.settings.testutils.ShadowWifiManager;
+import com.android.car.settings.wifi.details.WifiDetailsFragment;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class, ShadowWifiManager.class})
+public class AccessPointListPreferenceControllerTest {
+    private static final int SIGNAL_LEVEL = 1;
+    @Mock
+    private AccessPoint mMockAccessPoint1;
+    @Mock
+    private AccessPoint mMockAccessPoint2;
+    @Mock
+    private CarWifiManager mMockCarWifiManager;
+
+    private Context mContext;
+    private PreferenceGroup mPreferenceGroup;
+    private AccessPointListPreferenceController mController;
+    private FragmentController mFragmentController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarWifiManager.setInstance(mMockCarWifiManager);
+        mContext = RuntimeEnvironment.application;
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(PackageManager.FEATURE_WIFI,
+                true);
+        mPreferenceGroup = new LogicalPreferenceGroup(mContext);
+        PreferenceControllerTestHelper<AccessPointListPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        AccessPointListPreferenceController.class, mPreferenceGroup);
+        mController = controllerHelper.getController();
+        mFragmentController = controllerHelper.getMockFragmentController();
+
+        when(mMockAccessPoint1.getSecurity()).thenReturn(AccessPoint.SECURITY_NONE);
+        when(mMockAccessPoint1.getLevel()).thenReturn(SIGNAL_LEVEL);
+        when(mMockAccessPoint2.getSecurity()).thenReturn(AccessPoint.SECURITY_NONE);
+        when(mMockAccessPoint2.getLevel()).thenReturn(SIGNAL_LEVEL);
+
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarWifiManager.reset();
+    }
+
+    @Test
+    public void refreshUi_emptyList_notVisible() {
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(new ArrayList<>());
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isEqualTo(false);
+    }
+
+    @Test
+    public void refreshUi_notEmpty_visible() {
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.isVisible()).isEqualTo(true);
+    }
+
+    @Test
+    public void refreshUi_notEmpty_listCount() {
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(accessPointList.size());
+    }
+
+    @Test
+    public void onUxRestrictionsChanged_switchToSavedApOnly() {
+        List<AccessPoint> allAccessPointList = Arrays.asList(mMockAccessPoint1, mMockAccessPoint2);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(allAccessPointList);
+        List<AccessPoint> savedAccessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getSavedAccessPoints()).thenReturn(savedAccessPointList);
+        mController.refreshUi();
+
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(allAccessPointList.size());
+
+        CarUxRestrictions noSetupRestrictions = new CarUxRestrictions.Builder(
+                true, CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP, 0).build();
+        mController.onUxRestrictionsChanged(noSetupRestrictions);
+        assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(savedAccessPointList.size());
+    }
+
+    @Test
+    public void performClick_noSecurityNotConnectedAccessPoint_connect() {
+        when(mMockAccessPoint1.getSecurity()).thenReturn(AccessPoint.SECURITY_NONE);
+        when(mMockAccessPoint1.isSaved()).thenReturn(false);
+        when(mMockAccessPoint1.isActive()).thenReturn(false);
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+        verify(mMockCarWifiManager).connectToPublicWifi(eq(mMockAccessPoint1), any());
+    }
+
+    @Test
+    public void performClick_activeAccessPoint_showDetailsFragment() {
+        when(mMockAccessPoint1.isActive()).thenReturn(true);
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+        verify(mFragmentController).launchFragment(any(WifiDetailsFragment.class));
+    }
+
+    @Test
+    public void performClick_savedAccessPoint_connect() {
+        when(mMockAccessPoint1.isSaved()).thenReturn(true);
+        when(mMockAccessPoint1.isActive()).thenReturn(false);
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        mPreferenceGroup.getPreference(0).performClick();
+        verify(mMockCarWifiManager).connectToSavedWifi(eq(mMockAccessPoint1), any());
+    }
+
+    @Test
+    public void performButtonClick_savedAccessPoint_wrongPassword_forgetsNetwork() {
+        int netId = 1;
+
+        WifiConfiguration config = mock(WifiConfiguration.class);
+        WifiConfiguration.NetworkSelectionStatus status = mock(
+                WifiConfiguration.NetworkSelectionStatus.class);
+        config.networkId = netId;
+        when(mMockAccessPoint1.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+        when(mMockAccessPoint1.isSaved()).thenReturn(true);
+        when(mMockAccessPoint1.getConfig()).thenReturn(config);
+        when(config.getNetworkSelectionStatus()).thenReturn(status);
+        when(status.isNetworkEnabled()).thenReturn(false);
+        when(status.getNetworkSelectionDisableReason()).thenReturn(
+                WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD);
+
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        ButtonPasswordEditTextPreference preference =
+                (ButtonPasswordEditTextPreference) mPreferenceGroup.getPreference(0);
+        preference.performButtonClick();
+
+        assertThat(getShadowWifiManager().getLastForgottenNetwork()).isEqualTo(netId);
+    }
+
+    @Test
+    public void callChangeListener_newSecureAccessPoint_wifiAdded() {
+        String ssid = "test_ssid";
+        String password = "test_password";
+        when(mMockAccessPoint1.getSsid()).thenReturn(ssid);
+        when(mMockAccessPoint1.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+        when(mMockAccessPoint1.isSaved()).thenReturn(false);
+        when(mMockAccessPoint1.isActive()).thenReturn(false);
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        mPreferenceGroup.getPreference(0).callChangeListener(password);
+        WifiConfiguration lastAdded = getShadowWifiManager().getLastAddedNetworkConfiguration();
+
+        assertThat(lastAdded.SSID).contains(ssid);
+        assertThat(lastAdded.getAuthType()).isEqualTo(WifiConfiguration.KeyMgmt.WPA_PSK);
+        assertThat(lastAdded.preSharedKey).contains(password);
+    }
+
+    @Test
+    public void callChangeListener_newSecureAccessPoint_wifiEnabled() {
+        String ssid = "test_ssid";
+        String password = "test_password";
+        when(mMockAccessPoint1.getSsid()).thenReturn(ssid);
+        when(mMockAccessPoint1.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+        when(mMockAccessPoint1.isSaved()).thenReturn(false);
+        when(mMockAccessPoint1.isActive()).thenReturn(false);
+        List<AccessPoint> accessPointList = Arrays.asList(mMockAccessPoint1);
+        when(mMockCarWifiManager.getAllAccessPoints()).thenReturn(accessPointList);
+        mController.refreshUi();
+
+        mPreferenceGroup.getPreference(0).callChangeListener(password);
+        Pair<Integer, Boolean> lastEnabled = getShadowWifiManager().getLastEnabledNetwork();
+
+        // Enable should be called on the most recently added network id.
+        assertThat(lastEnabled.first).isEqualTo(getShadowWifiManager().getLastAddedNetworkId());
+        // WifiUtil will try to enable the network right away.
+        assertThat(lastEnabled.second).isTrue();
+    }
+
+    private ShadowWifiManager getShadowWifiManager() {
+        return Shadow.extract(mContext.getSystemService(WifiManager.class));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AccessPointPreferenceTest.java b/tests/robotests/src/com/android/car/settings/wifi/AccessPointPreferenceTest.java
new file mode 100644
index 0000000..2e6a5e1
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/AccessPointPreferenceTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.settingslib.wifi.AccessPoint;
+
+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.shadows.ShadowAlertDialog;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AccessPointPreferenceTest {
+
+    private static final String TEST_KEY = "test_key";
+    private AccessPointPreference mPreference;
+
+    @Mock
+    private AccessPoint mAccessPoint;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Context context = RuntimeEnvironment.application;
+        FragmentController<TestSettingsFragment> fragmentController = FragmentController.of(
+                new TestSettingsFragment());
+        TestSettingsFragment fragment = fragmentController.get();
+        fragmentController.setup();
+
+        mPreference = new AccessPointPreference(context, mAccessPoint);
+        mPreference.setKey(TEST_KEY);
+        fragment.getPreferenceScreen().addPreference(mPreference);
+    }
+
+    @Test
+    public void onClick_securityTypeNone_doesntOpenDialog() {
+        when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_NONE);
+        mPreference.onClick();
+
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        assertThat(dialog).isNull();
+    }
+
+    @Test
+    public void onClick_hasSecurity_isSaved_correctPassword_doesntOpenDialog() {
+        WifiConfiguration config = mock(WifiConfiguration.class);
+        WifiConfiguration.NetworkSelectionStatus status = mock(
+                WifiConfiguration.NetworkSelectionStatus.class);
+        when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+        when(mAccessPoint.isSaved()).thenReturn(true);
+        when(mAccessPoint.getConfig()).thenReturn(config);
+        when(config.getNetworkSelectionStatus()).thenReturn(status);
+        when(status.isNetworkEnabled()).thenReturn(true);
+        mPreference.onClick();
+
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        assertThat(dialog).isNull();
+
+    }
+
+    @Test
+    public void onClick_hasSecurity_isSaved_incorrectPassword_opensDialog() {
+        WifiConfiguration config = mock(WifiConfiguration.class);
+        WifiConfiguration.NetworkSelectionStatus status = mock(
+                WifiConfiguration.NetworkSelectionStatus.class);
+        when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+        when(mAccessPoint.isSaved()).thenReturn(true);
+        when(mAccessPoint.getConfig()).thenReturn(config);
+        when(config.getNetworkSelectionStatus()).thenReturn(status);
+        when(status.isNetworkEnabled()).thenReturn(false);
+        when(status.getNetworkSelectionDisableReason()).thenReturn(
+                WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD);
+        mPreference.onClick();
+
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        assertThat(dialog).isNotNull();
+    }
+
+    @Test
+    public void onClick_hasSecurity_isNotSaved_opensDialog() {
+        when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+        when(mAccessPoint.isSaved()).thenReturn(false);
+        mPreference.onClick();
+
+        AlertDialog dialog = ShadowAlertDialog.getLatestAlertDialog();
+        assertThat(dialog).isNotNull();
+    }
+
+    /** Concrete {@link SettingsFragment} for testing. */
+    public static class TestSettingsFragment extends SettingsFragment {
+        @Override
+        protected int getPreferenceScreenResId() {
+            return R.xml.settings_fragment;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AddWifiFragmentTest.java b/tests/robotests/src/com/android/car/settings/wifi/AddWifiFragmentTest.java
new file mode 100644
index 0000000..b48d36f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/AddWifiFragmentTest.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.widget.Button;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+import com.android.car.settings.testutils.ShadowWifiManager;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLocalBroadcastManager.class, ShadowWifiManager.class})
+public class AddWifiFragmentTest {
+
+    private Context mContext;
+    private LocalBroadcastManager mLocalBroadcastManager;
+    private AddWifiFragment mFragment;
+    private FragmentController<AddWifiFragment> mFragmentController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext);
+        mFragment = new AddWifiFragment();
+        mFragmentController = FragmentController.of(mFragment);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowLocalBroadcastManager.reset();
+        ShadowWifiManager.reset();
+    }
+
+    @Test
+    public void onStart_registersNameChangeListener() {
+        mFragmentController.create().start();
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkNamePreferenceController.ACTION_NAME_CHANGE)).isTrue();
+    }
+
+    @Test
+    public void onStart_registersSecurityChangeListener() {
+        mFragmentController.create().start();
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE)).isTrue();
+    }
+
+    @Test
+    public void onStop_unregistersNameChangeListener() {
+        mFragmentController.create().start();
+        mFragmentController.stop();
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkNamePreferenceController.ACTION_NAME_CHANGE)).isFalse();
+    }
+
+    @Test
+    public void onStop_unregistersSecurityChangeListener() {
+        mFragmentController.create().start();
+        mFragmentController.stop();
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE)).isFalse();
+    }
+
+    @Test
+    public void initialState_buttonDisabled() {
+        mFragmentController.setup();
+        assertThat(getAddWifiButton().isEnabled()).isFalse();
+    }
+
+    @Test
+    public void receiveNameChangeIntent_emptyName_buttonDisabled() {
+        mFragmentController.setup();
+        Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, "");
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        assertThat(getAddWifiButton().isEnabled()).isFalse();
+    }
+
+    @Test
+    public void receiveNameChangeIntent_name_buttonEnabled() {
+        mFragmentController.setup();
+        String networkName = "test_network_name";
+        Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, networkName);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        assertThat(getAddWifiButton().isEnabled()).isTrue();
+    }
+
+    @Test
+    public void receiveSecurityChangeIntent_nameSet_buttonDisabled() {
+        mFragmentController.setup();
+        String networkName = "test_network_name";
+        Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, networkName);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        intent = new Intent(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
+        intent.putExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                AccessPoint.SECURITY_PSK);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        assertThat(getAddWifiButton().isEnabled()).isFalse();
+    }
+
+    private Button getAddWifiButton() {
+        return mFragment.requireActivity().findViewById(R.id.action_button1);
+    }
+
+    private boolean isReceiverRegisteredForAction(String action) {
+        List<ShadowLocalBroadcastManager.Wrapper> receivers =
+                ShadowLocalBroadcastManager.getRegisteredBroadcastReceivers();
+
+        boolean found = false;
+        for (ShadowLocalBroadcastManager.Wrapper receiver : receivers) {
+            if (receiver.getIntentFilter().hasAction(action)) {
+                found = true;
+            }
+        }
+
+        return found;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/AddWifiPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/AddWifiPreferenceControllerTest.java
new file mode 100644
index 0000000..f02fb8b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/AddWifiPreferenceControllerTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.net.wifi.WifiManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Arrays;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class AddWifiPreferenceControllerTest {
+
+    private static final List<Integer> VISIBLE_STATES = Arrays.asList(
+            WifiManager.WIFI_STATE_ENABLED,
+            WifiManager.WIFI_STATE_DISABLING,
+            WifiManager.WIFI_STATE_ENABLING,
+            WifiManager.WIFI_STATE_UNKNOWN);
+    private static final List<Integer> INVISIBLE_STATES = Arrays.asList(
+            WifiManager.WIFI_STATE_DISABLED);
+
+    private Preference mPreference;
+    private AddWifiPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        mPreference = new Preference(context);
+        PreferenceControllerTestHelper<AddWifiPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(context, AddWifiPreferenceController.class,
+                        mPreference);
+        mController = controllerHelper.getController();
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void onWifiStateChanged_invisible() {
+        for (int state : INVISIBLE_STATES) {
+            mController.onWifiStateChanged(state);
+            assertThat(mPreference.isVisible()).isEqualTo(false);
+        }
+    }
+
+    @Test
+    public void onWifiStateChanged_visible() {
+        for (int state : VISIBLE_STATES) {
+            mController.onWifiStateChanged(state);
+            assertThat(mPreference.isVisible()).isEqualTo(true);
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java b/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
new file mode 100644
index 0000000..198a4cb
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/ButtonPasswordEditTextPreferenceTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.view.ContextThemeWrapper;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ButtonPasswordEditTextPreferenceTest {
+
+    private PreferenceViewHolder mViewHolder;
+    private ButtonPasswordEditTextPreference mButtonPreference;
+
+    @Before
+    public void setUp() {
+        Context context = RuntimeEnvironment.application;
+        Context themedContext = new ContextThemeWrapper(context, R.style.CarSettingTheme);
+        View rootView = View.inflate(themedContext, R.layout.two_action_preference, /* root= */
+                null);
+        mViewHolder = PreferenceViewHolder.createInstanceForTests(rootView);
+        mButtonPreference = new ButtonPasswordEditTextPreference(RuntimeEnvironment.application);
+    }
+
+    @Test
+    public void buttonClicked_callsListener() {
+        mButtonPreference.onBindViewHolder(mViewHolder);
+        ButtonPasswordEditTextPreference.OnButtonClickListener listener = mock(
+                ButtonPasswordEditTextPreference.OnButtonClickListener.class);
+        mButtonPreference.setOnButtonClickListener(listener);
+
+        mViewHolder.findViewById(android.R.id.widget_frame).performClick();
+
+        verify(listener).onButtonClick(mButtonPreference);
+    }
+
+    @Test
+    public void performButtonClick_listenerSetAndButtonVisible_listenerFired() {
+        ButtonPasswordEditTextPreference.OnButtonClickListener listener = mock(
+                ButtonPasswordEditTextPreference.OnButtonClickListener.class);
+        mButtonPreference.setOnButtonClickListener(listener);
+        mButtonPreference.showButton(true);
+
+        mButtonPreference.performButtonClick();
+        verify(listener).onButtonClick(mButtonPreference);
+    }
+
+    @Test
+    public void performButtonClick_listenerSetAndButtonInvisible_listenerNotFired() {
+        ButtonPasswordEditTextPreference.OnButtonClickListener listener = mock(
+                ButtonPasswordEditTextPreference.OnButtonClickListener.class);
+        mButtonPreference.setOnButtonClickListener(listener);
+        mButtonPreference.showButton(false);
+
+        mButtonPreference.performButtonClick();
+        verify(listener, never()).onButtonClick(mButtonPreference);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkNamePreferenceControllerTest.java
new file mode 100644
index 0000000..6f8364a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkNamePreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.EditTextPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLocalBroadcastManager.class})
+public class NetworkNamePreferenceControllerTest {
+
+    private static final String TEST_SSID = "test_ssid";
+
+    private Context mContext;
+    private EditTextPreference mEditTextPreference;
+    private NetworkNamePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mEditTextPreference = new EditTextPreference(mContext);
+        PreferenceControllerTestHelper<NetworkNamePreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        NetworkNamePreferenceController.class, mEditTextPreference);
+        mController = controllerHelper.getController();
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowLocalBroadcastManager.reset();
+    }
+
+    @Test
+    public void refreshUi_defaultState_showsDefaultString() {
+        mController.refreshUi();
+        assertThat(mEditTextPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.default_network_name_summary));
+    }
+
+    @Test
+    public void handlePreferenceChanged_newTextIsSet() {
+        mEditTextPreference.setText("Old value");
+        mEditTextPreference.callChangeListener("New value");
+        assertThat(mEditTextPreference.getSummary()).isEqualTo("New value");
+    }
+
+    @Test
+    public void handlePreferenceChanged_broadcastIsSent() {
+        String value = "New value";
+        mEditTextPreference.callChangeListener(value);
+
+        List<Intent> intents = ShadowLocalBroadcastManager.getSentBroadcastIntents();
+        assertThat(intents).hasSize(1);
+        assertThat(intents.get(0).getAction()).isEqualTo(
+                NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        assertThat(intents.get(0).getStringExtra(
+                NetworkNamePreferenceController.KEY_NETWORK_NAME)).isEqualTo(value);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreferenceTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreferenceTest.java
new file mode 100644
index 0000000..cbcef40
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkNameRestrictedPasswordEditTextPreferenceTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.SettingsFragment;
+import com.android.car.settings.testutils.FragmentController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.shadows.ShadowToast;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class NetworkNameRestrictedPasswordEditTextPreferenceTest {
+
+    private static final String KEY = "test_key";
+
+    private Context mContext;
+    private NetworkNameRestrictedPasswordEditTextPreference mPreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        FragmentController<TestSettingsFragment> fragmentController = FragmentController.of(
+                new TestSettingsFragment());
+        TestSettingsFragment fragment = fragmentController.get();
+        fragmentController.setup();
+
+        mPreference = new NetworkNameRestrictedPasswordEditTextPreference(mContext);
+        mPreference.setKey(KEY);
+        fragment.getPreferenceScreen().addPreference(mPreference);
+    }
+
+    @Test
+    public void performClick_noName_toastShown() {
+        mPreference.performClick();
+
+        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
+                mContext.getString(R.string.wifi_no_network_name));
+    }
+
+    @Test
+    public void performClick_hasName_showsDialog() {
+        mPreference.setNetworkName("test_name");
+        mPreference.performClick();
+
+        assertThat(ShadowDialog.getLatestDialog()).isNotNull();
+    }
+
+    /** Concrete {@link SettingsFragment} for testing. */
+    public static class TestSettingsFragment extends SettingsFragment {
+        @Override
+        protected int getPreferenceScreenResId() {
+            return R.xml.settings_fragment;
+        }
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkPasswordPreferenceControllerTest.java
new file mode 100644
index 0000000..28b555a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkPasswordPreferenceControllerTest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.util.Pair;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+import com.android.car.settings.testutils.ShadowWifiManager;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLocalBroadcastManager.class, ShadowWifiManager.class})
+public class NetworkPasswordPreferenceControllerTest {
+
+    private Context mContext;
+    private LocalBroadcastManager mLocalBroadcastManager;
+    private NetworkNameRestrictedPasswordEditTextPreference mPasswordEditTextPreference;
+    private PreferenceControllerTestHelper<NetworkPasswordPreferenceController>
+            mPreferenceControllerHelper;
+    private NetworkPasswordPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext);
+        mPasswordEditTextPreference = new NetworkNameRestrictedPasswordEditTextPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                NetworkPasswordPreferenceController.class, mPasswordEditTextPreference);
+        mController = mPreferenceControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowLocalBroadcastManager.reset();
+        ShadowWifiManager.reset();
+    }
+
+    @Test
+    public void onStart_registersNameChangeListener() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkNamePreferenceController.ACTION_NAME_CHANGE)).isTrue();
+    }
+
+    @Test
+    public void onStart_registersSecurityChangeListener() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE)).isTrue();
+    }
+
+    @Test
+    public void onStop_unregistersNameChangeListener() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkNamePreferenceController.ACTION_NAME_CHANGE)).isFalse();
+    }
+
+    @Test
+    public void onStop_unregistersSecurityChangeListener() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(isReceiverRegisteredForAction(
+                NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE)).isFalse();
+    }
+
+    @Test
+    public void receiveNameChangeIntent_emptyName_dialogNameRemoved() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, "");
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        assertThat(mPasswordEditTextPreference.getDialogTitle()).isEqualTo(
+                mContext.getString(R.string.wifi_password));
+    }
+
+    @Test
+    public void receiveNameChangeIntent_name_dialogNameSet() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        String networkName = "test_network_name";
+        Intent intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, networkName);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        assertThat(mPasswordEditTextPreference.getDialogTitle()).isEqualTo(networkName);
+    }
+
+    @Test
+    public void receiveSecurityChangeIntent_setUnsecureType_preferenceHidden() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        Intent intent = new Intent(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
+        intent.putExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                AccessPoint.SECURITY_NONE);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        assertThat(mPasswordEditTextPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void receiveSecurityChangeIntent_setSecureType_preferenceVisible() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        Intent intent = new Intent(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
+        intent.putExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                AccessPoint.SECURITY_PSK);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        assertThat(mPasswordEditTextPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceChanged_hasSecurity_networkNameSet_wifiAdded() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        String networkName = "network_name";
+        String password = "password";
+        Intent intent = new Intent(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
+        intent.putExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                AccessPoint.SECURITY_PSK);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, networkName);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+        mPasswordEditTextPreference.callChangeListener(password);
+
+        WifiConfiguration lastAdded = getShadowWifiManager().getLastAddedNetworkConfiguration();
+        assertThat(lastAdded.SSID).contains(networkName);
+        assertThat(lastAdded.getAuthType()).isEqualTo(WifiConfiguration.KeyMgmt.WPA_PSK);
+        assertThat(lastAdded.preSharedKey).contains(password);
+    }
+
+    @Test
+    public void handlePreferenceChanged_hasSecurity_networkNameSet_wifiEnabled() {
+        mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        String networkName = "network_name";
+        String password = "password";
+        Intent intent = new Intent(NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
+        intent.putExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                AccessPoint.SECURITY_PSK);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+
+        intent = new Intent(NetworkNamePreferenceController.ACTION_NAME_CHANGE);
+        intent.putExtra(NetworkNamePreferenceController.KEY_NETWORK_NAME, networkName);
+        mLocalBroadcastManager.sendBroadcastSync(intent);
+        mPasswordEditTextPreference.callChangeListener(password);
+
+        Pair<Integer, Boolean> lastEnabled = getShadowWifiManager().getLastEnabledNetwork();
+        // Enable should be called on the most recently added network id.
+        assertThat(lastEnabled.first).isEqualTo(getShadowWifiManager().getLastAddedNetworkId());
+        // WifiUtil will try to enable the network right away.
+        assertThat(lastEnabled.second).isTrue();
+    }
+
+    private ShadowWifiManager getShadowWifiManager() {
+        return Shadow.extract(mContext.getSystemService(WifiManager.class));
+    }
+
+    private boolean isReceiverRegisteredForAction(String action) {
+        List<ShadowLocalBroadcastManager.Wrapper> receivers =
+                ShadowLocalBroadcastManager.getRegisteredBroadcastReceivers();
+
+        boolean found = false;
+        for (ShadowLocalBroadcastManager.Wrapper receiver : receivers) {
+            if (receiver.getIntentFilter().hasAction(action)) {
+                found = true;
+            }
+        }
+
+        return found;
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/NetworkSecurityPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/NetworkSecurityPreferenceControllerTest.java
new file mode 100644
index 0000000..361e107
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/NetworkSecurityPreferenceControllerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowLocalBroadcastManager.class})
+public class NetworkSecurityPreferenceControllerTest {
+
+    private Context mContext;
+    private ListPreference mListPreference;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mListPreference = new ListPreference(mContext);
+        PreferenceControllerTestHelper<NetworkSecurityPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        NetworkSecurityPreferenceController.class, mListPreference);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowLocalBroadcastManager.reset();
+    }
+
+    @Test
+    public void handlePreferenceChanged_unsecureNetwork_summaryUpdated() {
+        String value = Integer.toString(AccessPoint.SECURITY_NONE);
+        mListPreference.callChangeListener(value);
+
+        assertThat(mListPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.wifi_security_none));
+    }
+
+    @Test
+    public void handlePreferenceChanged_pskNetwork_summaryUpdated() {
+        String value = Integer.toString(AccessPoint.SECURITY_PSK);
+        mListPreference.callChangeListener(value);
+
+        assertThat(mListPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.wifi_security_psk_generic));
+    }
+
+    @Test
+    public void handlePreferenceChanged_broadcastIsSent() {
+        String value = Integer.toString(AccessPoint.SECURITY_PSK);
+        mListPreference.callChangeListener(value);
+
+        List<Intent> intents = ShadowLocalBroadcastManager.getSentBroadcastIntents();
+        assertThat(intents).hasSize(1);
+        assertThat(intents.get(0).getAction()).isEqualTo(
+                NetworkSecurityPreferenceController.ACTION_SECURITY_CHANGE);
+        assertThat(intents.get(0).getIntExtra(NetworkSecurityPreferenceController.KEY_SECURITY_TYPE,
+                AccessPoint.SECURITY_NONE)).isEqualTo(Integer.parseInt(value));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiEntryPreferenceControllerTest.java
new file mode 100644
index 0000000..e8fc536
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiEntryPreferenceControllerTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import static com.android.car.settings.common.PreferenceController.AVAILABLE;
+import static com.android.car.settings.common.PreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.MasterSwitchPreference;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+
+import org.junit.After;
+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.Shadows;
+import org.robolectric.annotation.Config;
+
+/** Unit test for {@link WifiEntryPreferenceController}. */
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class})
+public class WifiEntryPreferenceControllerTest {
+
+    private Context mContext;
+    private MasterSwitchPreference mMasterSwitchPreference;
+    private PreferenceControllerTestHelper<WifiEntryPreferenceController> mControllerHelper;
+    private WifiEntryPreferenceController mController;
+    @Mock
+    private CarWifiManager mCarWifiManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+        mContext = RuntimeEnvironment.application;
+        mMasterSwitchPreference = new MasterSwitchPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                WifiEntryPreferenceController.class, mMasterSwitchPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarWifiManager.reset();
+    }
+
+    @Test
+    public void onCreate_setsListener() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+        assertThat(mMasterSwitchPreference.getSwitchToggleListener()).isNull();
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        assertThat(mMasterSwitchPreference.getSwitchToggleListener()).isNotNull();
+    }
+
+    @Test
+    public void refreshUi_wifiDisabled_setsSwitchUnchecked() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+        when(mCarWifiManager.isWifiEnabled()).thenReturn(false);
+        mMasterSwitchPreference.setSwitchChecked(true);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+        assertThat(mMasterSwitchPreference.isSwitchChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_wifiEnabled_setsSwitchChecked() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+        when(mCarWifiManager.isWifiEnabled()).thenReturn(true);
+        mMasterSwitchPreference.setSwitchChecked(false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        mController.refreshUi();
+        assertThat(mMasterSwitchPreference.isSwitchChecked()).isTrue();
+    }
+
+    @Test
+    public void getAvailabilityStatus_wifiAvailable_available() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ true);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void getAvailabilityStatus_wifiNotAvailable_unsupportedOnDevice() {
+        Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+                PackageManager.FEATURE_WIFI, /* supported= */ false);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
new file mode 100644
index 0000000..32692dd
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.net.wifi.WifiManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Arrays;
+import java.util.List;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiStatusPreferenceControllerTest {
+    private static final List<Integer> VISIBLE_STATES = Arrays.asList(
+            WifiManager.WIFI_STATE_DISABLED,
+            WifiManager.WIFI_STATE_ENABLING);
+    private static final List<Integer> INVISIBLE_STATES = Arrays.asList(
+            WifiManager.WIFI_STATE_ENABLED,
+            WifiManager.WIFI_STATE_DISABLING,
+            WifiManager.WIFI_STATE_UNKNOWN);
+
+    private Context mContext;
+    private Preference mPreference;
+    private WifiStatusPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new Preference(mContext);
+        PreferenceControllerTestHelper<WifiStatusPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        WifiStatusPreferenceController.class, mPreference);
+        mController = controllerHelper.getController();
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void onWifiStateChanged_invisible() {
+        for (int state : INVISIBLE_STATES) {
+            mController.onWifiStateChanged(state);
+            assertThat(mPreference.isVisible()).isEqualTo(false);
+        }
+    }
+
+    @Test
+    public void onWifiStateChanged_visible() {
+        for (int state : VISIBLE_STATES) {
+            mController.onWifiStateChanged(state);
+            assertThat(mPreference.isVisible()).isEqualTo(true);
+        }
+    }
+
+    @Test
+    public void onWifiStateChanged_disabled() {
+        mController.onWifiStateChanged(WifiManager.WIFI_STATE_DISABLED);
+        assertThat(mPreference.getTitle())
+                .isEqualTo(mContext.getResources().getString(R.string.wifi_disabled));
+    }
+
+    @Test
+    public void onWifiStateChanged_enabling() {
+        mController.onWifiStateChanged(WifiManager.WIFI_STATE_ENABLING);
+        assertThat(mPreference.getTitle())
+                .isEqualTo(mContext.getResources().getString(R.string.loading_wifi_list));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceControllerTest.java
new file mode 100644
index 0000000..43fa83e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherApBandPreferenceControllerTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class})
+public class WifiTetherApBandPreferenceControllerTest {
+
+    private Context mContext;
+    private ListPreference mPreference;
+    private PreferenceControllerTestHelper<WifiTetherApBandPreferenceController>
+            mControllerHelper;
+    private CarWifiManager mCarWifiManager;
+    private WifiTetherApBandPreferenceController mController;
+
+    @Before
+    public void setup() {
+        mContext = RuntimeEnvironment.application;
+        mCarWifiManager = new CarWifiManager(mContext);
+        mPreference = new ListPreference(mContext);
+        mControllerHelper =
+                new PreferenceControllerTestHelper<WifiTetherApBandPreferenceController>(mContext,
+                        WifiTetherApBandPreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarWifiManager.reset();
+    }
+
+    @Test
+    public void onStart_5GhzBandNotSupported_preferenceIsNotEnabled() {
+        ShadowCarWifiManager.setIsDualBandSupported(false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(!mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onStart_5GhzBandNotSupported_summarySetToChoose2Ghz() {
+        ShadowCarWifiManager.setIsDualBandSupported(false);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.wifi_ap_choose_2G));
+    }
+
+    @Test
+    public void onStart_5GhzBandIsSupported_preferenceIsEnabled() {
+        ShadowCarWifiManager.setIsDualBandSupported(true);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.isEnabled()).isTrue();
+    }
+
+    @Test
+    public void onStart_wifiConfigApBandSetTo2Ghz_valueIsSetTo2Ghz() {
+        ShadowCarWifiManager.setIsDualBandSupported(true);
+        WifiConfiguration config = new WifiConfiguration();
+        config.apBand = WifiConfiguration.AP_BAND_2GHZ;
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.getValue())
+                .isEqualTo(Integer.toString(WifiConfiguration.AP_BAND_2GHZ));
+    }
+
+    @Test
+    public void onStart_wifiConfigApBandSetTo5Ghz_valueIsSetTo5Ghz() {
+        ShadowCarWifiManager.setIsDualBandSupported(true);
+        WifiConfiguration config = new WifiConfiguration();
+        config.apBand = WifiConfiguration.AP_BAND_5GHZ;
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.getValue())
+                .isEqualTo(Integer.toString(WifiConfiguration.AP_BAND_5GHZ));
+    }
+
+    @Test
+    public void onPreferenceChangedTo5Ghz_updatesApBandConfigTo5Ghz() {
+        ShadowCarWifiManager.setIsDualBandSupported(true);
+        ShadowCarWifiManager.setIsDualModeSupported(false);
+        WifiConfiguration config = new WifiConfiguration();
+        config.apBand = WifiConfiguration.AP_BAND_2GHZ;
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.handlePreferenceChanged(mPreference,
+                Integer.toString(WifiConfiguration.AP_BAND_5GHZ));
+
+        assertThat(mCarWifiManager.getWifiApConfig().apBand)
+                .isEqualTo(WifiConfiguration.AP_BAND_5GHZ);
+    }
+
+    @Test
+    public void onPreferenceChangedTo2Ghz_updatesApBandConfigTo2Ghz() {
+        ShadowCarWifiManager.setIsDualBandSupported(true);
+        ShadowCarWifiManager.setIsDualModeSupported(false);
+        WifiConfiguration config = new WifiConfiguration();
+        config.apBand = WifiConfiguration.AP_BAND_5GHZ;
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.handlePreferenceChanged(mPreference,
+                Integer.toString(WifiConfiguration.AP_BAND_2GHZ));
+
+        assertThat(mCarWifiManager.getWifiApConfig().apBand)
+                .isEqualTo(WifiConfiguration.AP_BAND_2GHZ);
+    }
+
+    @Test
+    public void onStart_dualModeIsSupported_summarySetToPrefer5Ghz() {
+        ShadowCarWifiManager.setIsDualBandSupported(true);
+        ShadowCarWifiManager.setIsDualModeSupported(true);
+        WifiConfiguration config = new WifiConfiguration();
+        config.apBand = WifiConfiguration.AP_BAND_5GHZ;
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.wifi_ap_prefer_5G));
+    }
+
+    @Test
+    public void onPreferenceChangedTo5Ghz_dualModeIsSupported_defaultToApBandAny() {
+        ShadowCarWifiManager.setIsDualBandSupported(true);
+        ShadowCarWifiManager.setIsDualModeSupported(true);
+        WifiConfiguration config = new WifiConfiguration();
+        config.apBand = WifiConfiguration.AP_BAND_2GHZ;
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.handlePreferenceChanged(mPreference,
+                Integer.toString(WifiConfiguration.AP_BAND_5GHZ));
+
+        assertThat(mCarWifiManager.getWifiApConfig().apBand)
+                .isEqualTo(WifiConfiguration.AP_BAND_ANY);
+    }
+
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceControllerTest.java
new file mode 100644
index 0000000..b179b72
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherAutoOffPreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiTetherAutoOffPreferenceControllerTest {
+
+    private Context mContext;
+    private TwoStatePreference mTwoStatePreference;
+    private PreferenceControllerTestHelper<WifiTetherAutoOffPreferenceController> mControllerHelper;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mTwoStatePreference = new SwitchPreference(mContext);
+        mControllerHelper =
+                new PreferenceControllerTestHelper<WifiTetherAutoOffPreferenceController>(mContext,
+                        WifiTetherAutoOffPreferenceController.class, mTwoStatePreference);
+    }
+
+    @Test
+    public void onStart_tetherAutoOff_on_shouldReturnSwitchStateOn() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mTwoStatePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void onStart_tetherAutoOff_off_shouldReturnSwitchStateOff() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 0);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void onSwitchOn_shouldReturnAutoOff_on() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 0);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mTwoStatePreference.performClick();
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 0))
+                .isEqualTo(1);
+    }
+
+    @Test
+    public void onSwitchOff_shouldReturnAutoOff_off() {
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mTwoStatePreference.performClick();
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.SOFT_AP_TIMEOUT_ENABLED, 1))
+                .isEqualTo(0);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherBasePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherBasePreferenceControllerTest.java
new file mode 100644
index 0000000..0335364
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherBasePreferenceControllerTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ValidatedEditTextPreference;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class})
+public class WifiTetherBasePreferenceControllerTest {
+
+    private static final String SUMMARY = "SUMMARY";
+    private static final String DEFAULT_SUMMARY = "DEFAULT_SUMMARY";
+
+    private static class TestWifiTetherBasePreferenceController extends
+            WifiTetherBasePreferenceController<Preference> {
+
+        private String mSummary;
+        private String mDefaultSummary;
+
+        TestWifiTetherBasePreferenceController(Context context, String preferenceKey,
+                FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+            super(context, preferenceKey, fragmentController, uxRestrictions);
+        }
+
+        @Override
+        protected Class<Preference> getPreferenceType() {
+            return Preference.class;
+        }
+
+        @Override
+        protected String getSummary() {
+            return mSummary;
+        }
+
+        @Override
+        protected String getDefaultSummary() {
+            return mDefaultSummary;
+        }
+
+        protected void setConfigSummaries(@Nullable String summary,
+                @Nullable String defaultSummary) {
+            mSummary = summary;
+            mDefaultSummary = defaultSummary;
+        }
+    }
+
+    private Context mContext;
+    private ValidatedEditTextPreference mPreference;
+    private PreferenceControllerTestHelper<TestWifiTetherBasePreferenceController>
+            mControllerHelper;
+    private TestWifiTetherBasePreferenceController mController;
+
+    @Before
+    public void setup() {
+        mContext = RuntimeEnvironment.application;
+        mPreference = new ValidatedEditTextPreference(mContext);
+        mControllerHelper =
+                new PreferenceControllerTestHelper<TestWifiTetherBasePreferenceController>(mContext,
+                        TestWifiTetherBasePreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarWifiManager.reset();
+    }
+
+    @Test
+    public void onStart_shouldStartCarWifiManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        assertThat(getShadowCarWifiManager().getCurrentState())
+                .isEqualTo(getShadowCarWifiManager().STATE_STARTED);
+    }
+
+    @Test
+    public void onStop_shouldStopCarWifiManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(getShadowCarWifiManager().getCurrentState())
+                .isEqualTo(getShadowCarWifiManager().STATE_STOPPED);
+    }
+
+    @Test
+    public void onDestroy_shouldDestroyCarWifiManager() {
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        assertThat(getShadowCarWifiManager().getCurrentState())
+                .isEqualTo(getShadowCarWifiManager().STATE_DESTROYED);
+    }
+
+    @Test
+    public void noSummaryToShow_defaultSummarySet_shouldShowDefaultSummary() {
+        mController.setConfigSummaries(/* summary= */ null, DEFAULT_SUMMARY);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(DEFAULT_SUMMARY);
+    }
+
+    @Test
+    public void noSummaryToShow_defaultSummaryNotSet_shouldNotShowSummary() {
+        mController.setConfigSummaries(/* summary= */ null, /* defaultSummary= */ null);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(null);
+    }
+
+    @Test
+    public void summaryToShow_defaultSummarySet_shouldShowNonDefaultSummary() {
+        mController.setConfigSummaries(SUMMARY, DEFAULT_SUMMARY);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(SUMMARY);
+    }
+
+    @Test
+    public void summaryToShow_defaultSummaryNotSet_shouldSHowNonDefaultSummary() {
+        mController.setConfigSummaries(SUMMARY, /* defaultSummary= */ null);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getSummary()).isEqualTo(SUMMARY);
+    }
+
+    private ShadowCarWifiManager getShadowCarWifiManager() {
+        return Shadow.extract(new CarWifiManager(mContext));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherFragmentTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherFragmentTest.java
new file mode 100644
index 0000000..e93f25f
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherFragmentTest.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.widget.Switch;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+import com.android.car.settings.testutils.ShadowConnectivityManager;
+
+import org.junit.After;
+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 org.robolectric.shadow.api.Shadow;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class, ShadowConnectivityManager.class})
+public class WifiTetherFragmentTest {
+
+    private Context mContext;
+    private WifiTetherFragment mFragment;
+    private FragmentController<WifiTetherFragment> mFragmentController;
+    @Mock
+    private CarWifiManager mCarWifiManager;
+    @Mock
+    private ConnectivityManager mConnectivityManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mFragment = new WifiTetherFragment();
+        mFragmentController = FragmentController.of(mFragment);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowConnectivityManager.reset();
+        ShadowCarWifiManager.reset();
+    }
+
+    @Test
+    public void onStart_tetherStateOn_shouldReturnSwitchStateOn() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(true);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+
+        mFragmentController.setup();
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isTrue();
+    }
+
+    @Test
+    public void onStart_tetherStateOff_shouldReturnSwitchStateOff() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(false);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+
+        mFragmentController.setup();
+
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
+    }
+
+    @Test
+    public void onSwitchOn_shouldAttemptTetherOn() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(false);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+
+        mFragmentController.setup();
+        findSwitch(mFragment.requireActivity()).performClick();
+
+        assertThat(getShadowConnectivityManager().verifyStartTetheringCalled(1)).isTrue();
+        assertThat(getShadowConnectivityManager().getTetheringType()
+                == ConnectivityManager.TETHERING_WIFI).isTrue();
+    }
+
+    @Test
+    public void onSwitchOff_shouldAttemptTetherOff() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(true);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+
+        mFragmentController.setup();
+        findSwitch(mFragment.requireActivity()).performClick();
+
+        assertThat(getShadowConnectivityManager().verifyStopTetheringCalled(1)).isTrue();
+        assertThat(getShadowConnectivityManager().getTetheringType()
+                == ConnectivityManager.TETHERING_WIFI).isTrue();
+    }
+
+    @Test
+    public void onTetherEnabling_shouldReturnSwitchStateDisabled() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(false);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+        mFragmentController.setup();
+
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_ENABLING);
+        mContext.sendBroadcast(intent);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isFalse();
+    }
+
+    @Test
+    public void onTetherEnabled_shouldReturnSwitchStateEnabledAndOn() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(false);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+        mFragmentController.setup();
+
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_ENABLED);
+        mContext.sendBroadcast(intent);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isTrue();
+    }
+
+    @Test
+    public void onTetherDisabled_shouldReturnSwitchStateEnabledAndOff() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(false);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+        mFragmentController.setup();
+
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_DISABLED);
+        mContext.sendBroadcast(intent);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
+    }
+
+    @Test
+    public void onEnableTetherFailed_shouldReturnSwitchStateEnabledAndOff() {
+        when(mCarWifiManager.isWifiApEnabled()).thenReturn(false);
+        ShadowCarWifiManager.setInstance(mCarWifiManager);
+        mFragmentController.setup();
+
+        Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_ENABLING);
+        mContext.sendBroadcast(intent);
+
+        Intent intent2 = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+        intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
+        mContext.sendBroadcast(intent2);
+
+        assertThat(findSwitch(mFragment.requireActivity()).isEnabled()).isTrue();
+        assertThat(findSwitch(mFragment.requireActivity()).isChecked()).isFalse();
+    }
+
+    private Switch findSwitch(Activity activity) {
+        return activity.findViewById(R.id.toggle_switch);
+    }
+
+    private ShadowConnectivityManager getShadowConnectivityManager() {
+        return Shadow.extract(mContext.getSystemService(Context.CONNECTIVITY_SERVICE));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherNamePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherNamePreferenceControllerTest.java
new file mode 100644
index 0000000..dd42a25
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherNamePreferenceControllerTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ValidatedEditTextPreference;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class})
+public class WifiTetherNamePreferenceControllerTest {
+
+    private Context mContext;
+    private ValidatedEditTextPreference mPreference;
+    private PreferenceControllerTestHelper<WifiTetherNamePreferenceController> mControllerHelper;
+    private CarWifiManager mCarWifiManager;
+
+    @After
+    public void tearDown() {
+        ShadowCarWifiManager.reset();
+    }
+
+    @Test
+    public void onStart_wifiConfigHasSSID_setsSummary() {
+        mContext = RuntimeEnvironment.application;
+        mCarWifiManager = new CarWifiManager(mContext);
+        String testSSID = "TEST_SSID";
+        WifiConfiguration config = new WifiConfiguration();
+        config.SSID = testSSID;
+        getShadowCarWifiManager().setWifiApConfig(config);
+        mPreference = new ValidatedEditTextPreference(mContext);
+        mControllerHelper =
+                new PreferenceControllerTestHelper<WifiTetherNamePreferenceController>(mContext,
+                        WifiTetherNamePreferenceController.class, mPreference);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        assertThat(mPreference.getSummary()).isEqualTo(testSSID);
+    }
+
+    private ShadowCarWifiManager getShadowCarWifiManager() {
+        return Shadow.extract(mCarWifiManager);
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceControllerTest.java
new file mode 100644
index 0000000..613525b
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherPasswordPreferenceControllerTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.wifi.WifiConfiguration;
+import android.text.InputType;
+import android.text.TextUtils;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.common.ValidatedEditTextPreference;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class, ShadowLocalBroadcastManager.class})
+public class WifiTetherPasswordPreferenceControllerTest {
+
+    private static final String TEST_PASSWORD = "TEST_PASSWORD";
+
+    private Context mContext;
+    private ValidatedEditTextPreference mPreference;
+    private PreferenceControllerTestHelper<WifiTetherPasswordPreferenceController>
+            mControllerHelper;
+    private CarWifiManager mCarWifiManager;
+    private LocalBroadcastManager mLocalBroadcastManager;
+    private WifiTetherPasswordPreferenceController mController;
+
+    @Before
+    public void setup() {
+        mContext = RuntimeEnvironment.application;
+        mCarWifiManager = new CarWifiManager(mContext);
+        mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext);
+        mPreference = new ValidatedEditTextPreference(mContext);
+        mControllerHelper =
+                new PreferenceControllerTestHelper<WifiTetherPasswordPreferenceController>(mContext,
+                        WifiTetherPasswordPreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarWifiManager.reset();
+        ShadowLocalBroadcastManager.reset();
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().remove(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD).commit();
+    }
+
+    @Test
+    public void onStart_securityTypeIsNotNone_visibilityIsSetToTrue() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = null;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void onStart_securityTypeIsNotNone_wifiConfigHasPassword_setsPasswordAsSummary() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = TEST_PASSWORD;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.getSummary()).isEqualTo(TEST_PASSWORD);
+    }
+
+    @Test
+    public void onStart_securityTypeIsNotNone_wifiConfigHasPassword_obscuresSummary() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = TEST_PASSWORD;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.getSummaryInputType())
+                .isEqualTo((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
+    }
+
+    @Test
+    public void onStart_securityTypeIsNotNone_wifiConfigHasNoPassword_passwordIsNotEmpty() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = "";
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(!TextUtils.isEmpty(mPreference.getSummary())).isTrue();
+    }
+
+    @Test
+    public void onStart_securityTypeIsNotNone_wifiConfigHasNoPassword_obscuresSummary() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = "";
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mPreference.getSummaryInputType())
+                .isEqualTo((InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
+    }
+
+    @Test
+    public void onStart_securityTypeIsNone_visibilityIsSetToFalse() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = null;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(!mPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void onStart_receiverIsRegisteredOnLocalBroadcastManager() {
+        WifiConfiguration config = new WifiConfiguration();
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(
+                ShadowLocalBroadcastManager.getRegisteredBroadcastReceivers().size())
+                .isEqualTo(1);
+    }
+
+    @Test
+    public void onStop_receiverIsUnregisteredFromLocalBroadcastManager() {
+        WifiConfiguration config = new WifiConfiguration();
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(
+                ShadowLocalBroadcastManager.getRegisteredBroadcastReceivers().size())
+                .isEqualTo(0);
+    }
+
+    @Test
+    public void onSecurityChangedToNone_visibilityIsFalse() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        Intent intent = new Intent(
+                WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
+        intent.putExtra(WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
+                WifiConfiguration.KeyMgmt.NONE);
+        mLocalBroadcastManager.sendBroadcast(intent);
+
+        assertThat(mPreference.isVisible()).isFalse();
+    }
+
+    @Test
+    public void onSecurityChangedToWPA2PSK_visibilityIsTrue() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        Intent intent = new Intent(
+                WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
+        intent.putExtra(WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
+                WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mLocalBroadcastManager.sendBroadcast(intent);
+
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void onChangePassword_updatesPassword() {
+        String oldPassword = "OLD_PASSWORD";
+        String newPassword = "NEW_PASSWORD";
+
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = oldPassword;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.handlePreferenceChanged(mPreference, newPassword);
+        String passwordReturned = mCarWifiManager.getWifiApConfig().preSharedKey;
+
+        assertThat(passwordReturned).isEqualTo(newPassword);
+    }
+
+    @Test
+    public void onChangePassword_savesNewPassword() {
+        String oldPassword = "OLD_PASSWORD";
+        String newPassword = "NEW_PASSWORD";
+
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = oldPassword;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+        mController.handlePreferenceChanged(mPreference, newPassword);
+
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+
+        String savedPassword = sp.getString(
+                WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD, "");
+
+        assertThat(savedPassword).isEqualTo(newPassword);
+    }
+
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceControllerTest.java
new file mode 100644
index 0000000..67ac93e
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiTetherSecurityPreferenceControllerTest.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.wifi.WifiConfiguration;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.ListPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class, ShadowLocalBroadcastManager.class})
+public class WifiTetherSecurityPreferenceControllerTest {
+
+    private Context mContext;
+    private ListPreference mPreference;
+    private PreferenceControllerTestHelper<WifiTetherSecurityPreferenceController>
+            mControllerHelper;
+    private CarWifiManager mCarWifiManager;
+    private LocalBroadcastManager mLocalBroadcastManager;
+    private WifiTetherSecurityPreferenceController mController;
+
+    @Before
+    public void setup() {
+        mContext = RuntimeEnvironment.application;
+        mCarWifiManager = new CarWifiManager(mContext);
+        mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext);
+        mPreference = new ListPreference(mContext);
+        mControllerHelper =
+                new PreferenceControllerTestHelper<WifiTetherSecurityPreferenceController>(mContext,
+                        WifiTetherSecurityPreferenceController.class, mPreference);
+        mController = mControllerHelper.getController();
+    }
+
+    @After
+    public void tearDown() {
+        ShadowCarWifiManager.reset();
+        ShadowLocalBroadcastManager.reset();
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().remove(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD).commit();
+    }
+
+    @Test
+    public void onStart_securityTypeSetToNone_setsValueToNone() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = null;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(Integer.parseInt(mPreference.getValue()))
+                .isEqualTo(WifiConfiguration.KeyMgmt.NONE);
+    }
+
+    @Test
+    public void onStart_securityTypeSetToWPA2PSK_setsValueToWPA2PSK() {
+        String testPassword = "TEST_PASSWORD";
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = testPassword;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(Integer.parseInt(mPreference.getValue()))
+                .isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
+    }
+
+    @Test
+    public void onPreferenceChangedToNone_updatesSecurityTypeToNone() {
+        String testPassword = "TEST_PASSWORD";
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = testPassword;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        mController.handlePreferenceChanged(mPreference,
+                Integer.toString(WifiConfiguration.KeyMgmt.NONE));
+
+        assertThat(mCarWifiManager.getWifiApConfig().getAuthType())
+                .isEqualTo(WifiConfiguration.KeyMgmt.NONE);
+
+    }
+
+    @Test
+    public void onPreferenceChangedToWPA2PSK_updatesSecurityTypeToWPA2PSK() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = null;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        mController.handlePreferenceChanged(mPreference,
+                Integer.toString(WifiConfiguration.KeyMgmt.WPA2_PSK));
+
+        assertThat(mCarWifiManager.getWifiApConfig().getAuthType())
+                .isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
+    }
+
+    @Test
+    public void onPreferenceSwitchFromNoneToWPA2PSK_retrievesSavedPassword() {
+        String savedPassword = "SAVED_PASSWORD";
+        SharedPreferences sp = mContext.getSharedPreferences(
+                WifiTetherPasswordPreferenceController.SHARED_PREFERENCE_PATH,
+                Context.MODE_PRIVATE);
+        sp.edit().putString(WifiTetherPasswordPreferenceController.KEY_SAVED_PASSWORD,
+                savedPassword).commit();
+
+        WifiConfiguration config = new WifiConfiguration();
+        config.preSharedKey = null;
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        mController.handlePreferenceChanged(mPreference,
+                Integer.toString(WifiConfiguration.KeyMgmt.WPA2_PSK));
+
+        assertThat(mCarWifiManager.getWifiApConfig().preSharedKey).isEqualTo(savedPassword);
+    }
+
+    @Test
+    public void onPreferenceChanged_broadcastsExactlyOneIntent() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        int newSecurityType = WifiConfiguration.KeyMgmt.WPA2_PSK;
+        mController.handlePreferenceChanged(mPreference, newSecurityType);
+
+        assertThat(ShadowLocalBroadcastManager.getSentBroadcastIntents().size()).isEqualTo(1);
+    }
+
+    @Test
+    public void onPreferenceChangedToWPA2PSK_broadcastsSecurityTypeWPA2PSK() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        int newSecurityType = WifiConfiguration.KeyMgmt.WPA2_PSK;
+
+        mController.handlePreferenceChanged(mPreference, newSecurityType);
+
+        Intent expectedIntent = new Intent(
+                WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
+        expectedIntent.putExtra(WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
+                newSecurityType);
+
+        assertThat(
+                ShadowLocalBroadcastManager.getSentBroadcastIntents().get(0).toString())
+                .isEqualTo(expectedIntent.toString());
+    }
+
+    @Test
+    public void onPreferenceChangedToNone_broadcastsSecurityTypeNone() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.allowedKeyManagement.clear();
+        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
+        mCarWifiManager.setWifiApConfig(config);
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_START);
+
+        int newSecurityType = WifiConfiguration.KeyMgmt.NONE;
+
+        mController.handlePreferenceChanged(mPreference, newSecurityType);
+
+        Intent expectedIntent = new Intent(
+                WifiTetherSecurityPreferenceController.ACTION_SECURITY_TYPE_CHANGED);
+        expectedIntent.putExtra(WifiTetherSecurityPreferenceController.KEY_SECURITY_TYPE,
+                newSecurityType);
+
+        assertThat(
+                ShadowLocalBroadcastManager.getSentBroadcastIntents().get(0).toString())
+                .isEqualTo(expectedIntent.toString());
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
new file mode 100644
index 0000000..89a6b6a
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiFrequencyPreferenceControllerTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.wifi.AccessPoint;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiFrequencyPreferenceControllerTest {
+
+    @Mock
+    private AccessPoint mMockAccessPoint;
+    @Mock
+    private WifiInfoProvider mMockWifiInfoProvider;
+    @Mock
+    private NetworkInfo mMockNetworkInfo;
+    @Mock
+    private WifiInfo mMockWifiInfo;
+
+    private WifiDetailsPreference mPreference;
+    private Context mContext;
+    private WifiFrequencyPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        shadowOf(mContext.getPackageManager()).setSystemFeature(PackageManager.FEATURE_WIFI, true);
+        mPreference = new WifiDetailsPreference(mContext);
+
+        PreferenceControllerTestHelper<WifiFrequencyPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        WifiFrequencyPreferenceController.class, mPreference);
+        mController = (WifiFrequencyPreferenceController) controllerHelper.getController().init(
+                mMockAccessPoint, mMockWifiInfoProvider);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        when(mMockWifiInfoProvider.getWifiInfo()).thenReturn(mMockWifiInfo);
+        when(mMockWifiInfo.getFrequency()).thenReturn(AccessPoint.LOWER_FREQ_24GHZ);
+    }
+
+    @Test
+    public void onWifiChanged_shouldHaveDetailTextSet() {
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        when(mMockWifiInfo.getFrequency()).thenReturn(AccessPoint.LOWER_FREQ_5GHZ);
+
+        String expected = mContext.getResources().getString(R.string.wifi_band_5ghz);
+        mController.onWifiChanged(mMockNetworkInfo, mMockWifiInfo);
+        assertThat(mPreference.getDetailText()).isEqualTo(expected);
+    }
+
+    @Test
+    public void onWifiChanged_isNotActive_noUpdate() {
+        when(mMockAccessPoint.isActive()).thenReturn(false);
+
+        mController.onWifiChanged(mMockNetworkInfo, mMockWifiInfo);
+        assertThat(mPreference.getDetailText()).isNull();
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
new file mode 100644
index 0000000..dc54df2
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiGatewayPreferenceControllerTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.RouteInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.wifi.AccessPoint;
+
+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 java.net.InetAddress;
+import java.util.Arrays;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiGatewayPreferenceControllerTest {
+
+    private static final String GATE_WAY = "gateway";
+
+    @Mock
+    private AccessPoint mMockAccessPoint;
+    @Mock
+    private WifiInfoProvider mMockWifiInfoProvider;
+    @Mock
+    private Network mMockNetwork;
+    @Mock
+    private LinkProperties mMockLinkProperties;
+    @Mock
+    private RouteInfo mMockRouteInfo;
+    @Mock
+    private InetAddress mMockInetAddress;
+
+    private Context mContext;
+    private WifiDetailsPreference mPreference;
+    private WifiGatewayPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        shadowOf(mContext.getPackageManager()).setSystemFeature(PackageManager.FEATURE_WIFI, true);
+        mPreference = new WifiDetailsPreference(mContext);
+        when(mMockWifiInfoProvider.getLinkProperties()).thenReturn(mMockLinkProperties);
+
+        PreferenceControllerTestHelper<WifiGatewayPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        WifiGatewayPreferenceController.class, mPreference);
+        mController = (WifiGatewayPreferenceController) controllerHelper.getController().init(
+                mMockAccessPoint, mMockWifiInfoProvider);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void onWifiChanged_shouldHaveDetailTextSet() {
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        when(mMockLinkProperties.getRoutes()).thenReturn(Arrays.asList(mMockRouteInfo));
+        when(mMockRouteInfo.isIPv4Default()).thenReturn(true);
+        when(mMockRouteInfo.hasGateway()).thenReturn(true);
+        when(mMockRouteInfo.getGateway()).thenReturn(mMockInetAddress);
+        when(mMockInetAddress.getHostAddress()).thenReturn(GATE_WAY);
+
+        mController.onLinkPropertiesChanged(mMockNetwork, mMockLinkProperties);
+        assertThat(mPreference.getDetailText()).isEqualTo(GATE_WAY);
+    }
+
+    @Test
+    public void onWifiChanged_isNotActive_noUpdate() {
+        when(mMockAccessPoint.isActive()).thenReturn(false);
+
+        mController.onLinkPropertiesChanged(mMockNetwork, mMockLinkProperties);
+        assertThat(mPreference.getDetailText()).isNull();
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderImplTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderImplTest.java
new file mode 100644
index 0000000..9928f52
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiInfoProviderImplTest.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.wifi.details.WifiInfoProvider.Listener;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiInfoProviderImplTest {
+    private static final int LEVEL = 1;
+    private static final int RSSI = -55;
+    private static final int LINK_SPEED = 123;
+    private static final String MAC_ADDRESS = WifiInfo.DEFAULT_MAC_ADDRESS;
+    private static final String SECURITY = "None";
+
+    @Mock
+    private AccessPoint mMockAccessPoint;
+    @Mock
+    private ConnectivityManager mMockConnectivityManager;
+    @Mock
+    private Network mMockNetwork;
+    @Mock
+    private NetworkInfo mMockNetworkInfo;
+    @Mock
+    private NetworkInfo mMockNetworkInfo2;
+    @Mock
+    private WifiConfiguration mMockWifiConfig;
+    @Mock
+    private WifiInfo mMockWifiInfo;
+    @Mock
+    private WifiInfo mMockWifiInfo2;
+    @Mock
+    private LinkProperties mMockLinkProperties;
+    @Mock
+    private LinkProperties mMockChangedLinkProperties;
+    @Mock
+    private NetworkCapabilities mMockNetworkCapabilities;
+    @Mock
+    private NetworkCapabilities mMockChangedNetworkCapabilities;
+    @Mock
+    private WifiManager mMockWifiManager;
+    @Mock
+    private Listener mMockListener;
+
+    @Captor
+    private ArgumentCaptor<NetworkCallback> mCallbackCaptor;
+
+    private Context mContext;
+    private WifiInfoProviderImpl mWifiInfoProviderImpl;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getSystemService(ConnectivityManager.class))
+                .thenReturn(mMockConnectivityManager);
+        when(mContext.getSystemService(WifiManager.class)).thenReturn(mMockWifiManager);
+        when(mMockAccessPoint.getConfig()).thenReturn(mMockWifiConfig);
+        when(mMockAccessPoint.getLevel()).thenReturn(LEVEL);
+        when(mMockAccessPoint.getSecurityString(false)).thenReturn(SECURITY);
+        when(mMockConnectivityManager.getNetworkInfo(any(Network.class)))
+                .thenReturn(mMockNetworkInfo);
+        when(mMockConnectivityManager.getLinkProperties(any(Network.class)))
+                .thenReturn(mMockLinkProperties);
+        when(mMockConnectivityManager.getNetworkCapabilities(any(Network.class)))
+                .thenReturn(mMockNetworkCapabilities);
+        doNothing().when(mMockConnectivityManager).registerNetworkCallback(
+                nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class));
+        when(mMockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED);
+        when(mMockWifiInfo.getRssi()).thenReturn(RSSI);
+        when(mMockWifiInfo.getMacAddress()).thenReturn(MAC_ADDRESS);
+        when(mMockWifiManager.getConnectionInfo()).thenReturn(mMockWifiInfo);
+
+        when(mMockWifiManager.getCurrentNetwork()).thenReturn(mMockNetwork);
+
+        mWifiInfoProviderImpl = new WifiInfoProviderImpl(mContext, mMockAccessPoint);
+        mWifiInfoProviderImpl.addListener(mMockListener);
+    }
+
+    @Test
+    public void onStart_allFieldsInitialized() {
+        mWifiInfoProviderImpl.onStart();
+
+        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isNotNull();
+        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isNotNull();
+        assertThat(mWifiInfoProviderImpl.getNetwork()).isNotNull();
+        assertThat(mWifiInfoProviderImpl.getNetworkCapabilities()).isNotNull();
+        assertThat(mWifiInfoProviderImpl.getNetworkConfiguration()).isNotNull();
+        assertThat(mWifiInfoProviderImpl.getLinkProperties()).isNotNull();
+    }
+
+    @Test
+    public void onStart_listenerCallback() {
+        mWifiInfoProviderImpl.onStart();
+        verify(mMockListener).onWifiChanged(eq(mMockNetworkInfo), eq(mMockWifiInfo));
+    }
+
+    @Test
+    public void onStart_getsNetwork() {
+        mWifiInfoProviderImpl.onStart();
+        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
+    }
+
+    @Test
+    public void networkCallback_shouldBeRegisteredOnStart() {
+        mWifiInfoProviderImpl.onStart();
+
+        verify(mMockConnectivityManager).registerNetworkCallback(
+                nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class));
+    }
+
+    @Test
+    public void networkCallback_shouldBeUnregisteredOnStop() {
+        mWifiInfoProviderImpl.onStart();
+        mWifiInfoProviderImpl.onStop();
+
+        verify(mMockConnectivityManager)
+                .unregisterNetworkCallback(mCallbackCaptor.getValue());
+    }
+
+    @Test
+    public void networkStateChangedIntent_shouldRefetchInfo() {
+        mWifiInfoProviderImpl.onStart();
+
+        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo);
+        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo);
+
+        when(mMockWifiManager.getConnectionInfo()).thenReturn(mMockWifiInfo2);
+        when(mMockConnectivityManager.getNetworkInfo(any(Network.class)))
+                .thenReturn(mMockNetworkInfo2);
+
+        mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
+
+        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo2);
+        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo2);
+    }
+
+    @Test
+    public void rssiChangedIntent_shouldRefetchInfo() {
+        mWifiInfoProviderImpl.onStart();
+
+        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo);
+        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo);
+
+        when(mMockWifiManager.getConnectionInfo()).thenReturn(mMockWifiInfo2);
+        when(mMockConnectivityManager.getNetworkInfo(any(Network.class)))
+                .thenReturn(mMockNetworkInfo2);
+
+        mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
+
+        assertThat(mWifiInfoProviderImpl.getNetwork()).isEqualTo(mMockNetwork);
+        assertThat(mWifiInfoProviderImpl.getWifiInfo()).isEqualTo(mMockWifiInfo2);
+        assertThat(mWifiInfoProviderImpl.getNetworkInfo()).isEqualTo(mMockNetworkInfo2);
+    }
+
+    @Test
+    public void onLost_lisntenerCallback() {
+        mWifiInfoProviderImpl.onStart();
+
+        mCallbackCaptor.getValue().onLost(mMockNetwork);
+
+        verify(mMockListener).onLost(any(Network.class));
+    }
+
+    @Test
+    public void onLinkPropertiesChanged_lisntenerCallback() {
+        mWifiInfoProviderImpl.onStart();
+
+        mCallbackCaptor.getValue().onLinkPropertiesChanged(
+                mMockNetwork, mMockChangedLinkProperties);
+
+        verify(mMockListener).onLinkPropertiesChanged(
+                any(Network.class), eq(mMockChangedLinkProperties));
+    }
+
+    @Test
+    public void onCapabilitiesChanged_lisntenerCallback() {
+        mWifiInfoProviderImpl.onStart();
+
+        mCallbackCaptor.getValue().onCapabilitiesChanged(
+                mMockNetwork, mMockChangedNetworkCapabilities);
+
+        verify(mMockListener).onCapabilitiesChanged(
+                any(Network.class), eq(mMockChangedNetworkCapabilities));
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
new file mode 100644
index 0000000..7fb3b48
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiMacAddressPreferenceControllerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.wifi.AccessPoint;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiMacAddressPreferenceControllerTest {
+
+    private static final String MAC_ADDRESS = "mac address";
+
+    @Mock
+    private AccessPoint mMockAccessPoint;
+    @Mock
+    private WifiInfoProvider mMockWifiInfoProvider;
+    @Mock
+    private NetworkInfo mMockNetworkInfo;
+    @Mock
+    private WifiInfo mMockWifiInfo;
+
+    private Context mContext;
+    private WifiDetailsPreference mPreference;
+    private WifiMacAddressPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        shadowOf(mContext.getPackageManager()).setSystemFeature(PackageManager.FEATURE_WIFI, true);
+        mPreference = new WifiDetailsPreference(mContext);
+        when(mMockWifiInfoProvider.getWifiInfo()).thenReturn(mMockWifiInfo);
+
+        PreferenceControllerTestHelper<WifiMacAddressPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        WifiMacAddressPreferenceController.class, mPreference);
+        mController = (WifiMacAddressPreferenceController) controllerHelper.getController().init(
+                mMockAccessPoint, mMockWifiInfoProvider);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void onWifiChanged_shouldHaveDetailTextSet() {
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        when(mMockWifiInfo.getMacAddress()).thenReturn(MAC_ADDRESS);
+
+        mController.onWifiChanged(mMockNetworkInfo, mMockWifiInfo);
+        assertThat(mPreference.getDetailText()).isEqualTo(MAC_ADDRESS);
+    }
+
+    @Test
+    public void onWifiChanged_isNotActive_noUpdate() {
+        when(mMockAccessPoint.isActive()).thenReturn(false);
+
+        mController.onWifiChanged(mMockNetworkInfo, mMockWifiInfo);
+        assertThat(mPreference.getDetailText()).isNull();
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
new file mode 100644
index 0000000..fbe4ac7
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/details/WifiSignalStrengthPreferenceControllerTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2018 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.car.settings.wifi.details;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiInfo;
+
+import androidx.lifecycle.Lifecycle;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.settingslib.wifi.AccessPoint;
+
+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;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class WifiSignalStrengthPreferenceControllerTest {
+
+    private static final int LEVEL = 1;
+
+    @Mock
+    private AccessPoint mMockAccessPoint;
+    @Mock
+    private WifiInfoProvider mMockWifiInfoProvider;
+    @Mock
+    private NetworkInfo mMockNetworkInfo;
+    @Mock
+    private WifiInfo mMockWifiInfo;
+
+    private WifiDetailsPreference mWifiDetailPreference;
+    private Context mContext;
+    private WifiSignalStrengthPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = RuntimeEnvironment.application;
+        shadowOf(mContext.getPackageManager()).setSystemFeature(PackageManager.FEATURE_WIFI, true);
+
+        mWifiDetailPreference = new WifiDetailsPreference(mContext);
+        when(mMockAccessPoint.getLevel()).thenReturn(LEVEL);
+
+        PreferenceControllerTestHelper<WifiSignalStrengthPreferenceController> controllerHelper =
+                new PreferenceControllerTestHelper<>(mContext,
+                        WifiSignalStrengthPreferenceController.class, mWifiDetailPreference);
+        mController =
+                (WifiSignalStrengthPreferenceController) controllerHelper.getController().init(
+                        mMockAccessPoint, mMockWifiInfoProvider);
+        controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @Test
+    public void onWifiChanged_shouldHaveDetailTextSet() {
+        when(mMockAccessPoint.isActive()).thenReturn(true);
+        String expectedStrength =
+                mContext.getResources().getStringArray(R.array.wifi_signals)[LEVEL];
+
+        mController.onWifiChanged(mMockNetworkInfo, mMockWifiInfo);
+        assertThat(mWifiDetailPreference.getDetailText()).isEqualTo(expectedStrength);
+    }
+
+    @Test
+    public void onWifiChanged_isNotActive_noUpdate() {
+        when(mMockAccessPoint.isActive()).thenReturn(false);
+
+        mController.onWifiChanged(mMockNetworkInfo, mMockWifiInfo);
+        assertThat(mWifiDetailPreference.getDetailText()).isNull();
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..f9bc2ab
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/preferences/CellularFallbackTogglePreferenceControllerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.preferences;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class CellularFallbackTogglePreferenceControllerTest {
+
+    private Context mContext;
+    private SwitchPreference mPreference;
+    private PreferenceControllerTestHelper<CellularFallbackTogglePreferenceController>
+            mPreferenceControllerHelper;
+    private CellularFallbackTogglePreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+
+        mPreference = new SwitchPreference(mContext);
+        mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                CellularFallbackTogglePreferenceController.class, mPreference);
+        mController = mPreferenceControllerHelper.getController();
+        mPreferenceControllerHelper.markState(Lifecycle.State.CREATED);
+    }
+
+    @Test
+    public void refreshUi_unchecked() {
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.NETWORK_AVOID_BAD_WIFI, null);
+        mPreference.setChecked(true);
+
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_checked() {
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.NETWORK_AVOID_BAD_WIFI, "1");
+        mPreference.setChecked(false);
+
+        mController.refreshUi();
+        assertThat(mPreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceChanged_toggleFalse_setsNull() {
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.NETWORK_AVOID_BAD_WIFI, "1");
+
+        mPreference.callChangeListener(false);
+        assertThat(Settings.Global.getString(mContext.getContentResolver(),
+                Settings.Global.NETWORK_AVOID_BAD_WIFI)).isNull();
+    }
+
+    @Test
+    public void handlePreferenceChanged_toggleTrue_setsEnabled() {
+        Settings.Global.putString(mContext.getContentResolver(),
+                Settings.Global.NETWORK_AVOID_BAD_WIFI, null);
+
+        mPreference.callChangeListener(true);
+        assertThat(Settings.Global.getString(mContext.getContentResolver(),
+                Settings.Global.NETWORK_AVOID_BAD_WIFI)).isEqualTo("1");
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragmentTest.java b/tests/robotests/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragmentTest.java
new file mode 100644
index 0000000..cb331a5
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/preferences/ConfirmEnableWifiScanningDialogFragmentTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.preferences;
+
+import static org.mockito.Mockito.verify;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.testutils.BaseTestActivity;
+
+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.shadows.ShadowDialog;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+public class ConfirmEnableWifiScanningDialogFragmentTest {
+
+    private ConfirmEnableWifiScanningDialogFragment mFragment;
+    @Mock
+    private ConfirmEnableWifiScanningDialogFragment.WifiScanningEnabledListener mListener;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mFragment = new ConfirmEnableWifiScanningDialogFragment();
+        mFragment.setWifiScanningEnabledListener(mListener);
+    }
+
+    @Test
+    public void onClick_positiveButton_callsListener() {
+        AlertDialog dialog = showDialog(mFragment);
+        dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+        verify(mListener).onWifiScanningEnabled();
+    }
+
+    private AlertDialog showDialog(ConfirmEnableWifiScanningDialogFragment fragment) {
+        BaseTestActivity activity = Robolectric.setupActivity(BaseTestActivity.class);
+        activity.showDialog(fragment, /* tag= */ null);
+        return (AlertDialog) ShadowDialog.getLatestDialog();
+    }
+}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
new file mode 100644
index 0000000..6a4a2e4
--- /dev/null
+++ b/tests/robotests/src/com/android/car/settings/wifi/preferences/WifiWakeupTogglePreferenceControllerTest.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.settings.wifi.preferences;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.location.LocationManager;
+import android.os.Process;
+import android.provider.Settings;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.car.settings.CarSettingsRobolectricTestRunner;
+import com.android.car.settings.R;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowLocationManager;
+import com.android.car.settings.testutils.ShadowSecureSettings;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowToast;
+
+@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowSecureSettings.class, ShadowLocationManager.class})
+public class WifiWakeupTogglePreferenceControllerTest {
+
+    private Context mContext;
+    private PreferenceControllerTestHelper<WifiWakeupTogglePreferenceController> mControllerHelper;
+    private WifiWakeupTogglePreferenceController mController;
+    private TwoStatePreference mTwoStatePreference;
+    private LocationManager mLocationManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mLocationManager = (LocationManager) mContext.getSystemService(Service.LOCATION_SERVICE);
+        mTwoStatePreference = new SwitchPreference(mContext);
+        mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+                WifiWakeupTogglePreferenceController.class, mTwoStatePreference);
+        mController = mControllerHelper.getController();
+
+        mControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowSecureSettings.reset();
+    }
+
+    @Test
+    public void handlePreferenceClicked_locationDisabled_startNewActivity() {
+        setLocationEnabled(false);
+
+        mTwoStatePreference.performClick();
+
+        Intent actual = ShadowApplication.getInstance().getNextStartedActivity();
+        assertThat(actual.getAction()).isEqualTo(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
+    }
+
+    @Test
+    public void handlePreferenceClicked_wifiWakeupEnabled_disablesWifiWakeup() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                1);
+
+        mTwoStatePreference.performClick();
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_WAKEUP_ENABLED, 1))
+                .isEqualTo(0);
+    }
+
+    @Test
+    public void handlePreferenceClicked_wifiScanningDisabled_showsDialog() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                0);
+
+        mTwoStatePreference.performClick();
+
+        verify(mControllerHelper.getMockFragmentController()).showDialog(
+                any(ConfirmEnableWifiScanningDialogFragment.class),
+                eq(ConfirmEnableWifiScanningDialogFragment.TAG));
+    }
+
+    @Test
+    public void handlePreferenceClicked_wifiScanningEnabled_wifiWakeupDisabled_enablesWifiWakeup() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                0);
+
+        mTwoStatePreference.performClick();
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_WAKEUP_ENABLED, 0))
+                .isEqualTo(1);
+    }
+
+    @Test
+    public void refreshUi_wifiWakeupEnabled_wifiScanningEnabled_locationEnabled_isChecked() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                1);
+        mTwoStatePreference.setChecked(false);
+
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isTrue();
+    }
+
+    @Test
+    public void refreshUi_wifiWakeupDisabled_wifiScanningEnabled_locationEnabled_isNotChecked() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                0);
+        mTwoStatePreference.setChecked(true);
+
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_wifiWakeupEnabled_wifiScanningDisabled_locationEnabled_isNotChecked() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                1);
+        mTwoStatePreference.setChecked(true);
+
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void refreshUi_wifiWakeupEnabled_wifiScanningEnabled_locationDisabled_isNotChecked() {
+        setLocationEnabled(false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                1);
+        mTwoStatePreference.setChecked(true);
+
+        mController.refreshUi();
+
+        assertThat(mTwoStatePreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void onWifiScanningEnabled_setsWifiScanningOn() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                0);
+
+        mController.onWifiScanningEnabled();
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0)).isEqualTo(1);
+    }
+
+    @Test
+    public void onWifiScanningEnabled_showsToast() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                0);
+
+        mController.onWifiScanningEnabled();
+
+        assertThat(ShadowToast.showedToast(
+                mContext.getString(R.string.wifi_settings_scanning_required_enabled))).isTrue();
+    }
+
+    @Test
+    public void onWifiScanningEnabled_enablesWifiWakeup() {
+        setLocationEnabled(true);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED,
+                0);
+
+        mController.onWifiScanningEnabled();
+
+        assertThat(Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.WIFI_WAKEUP_ENABLED, 0)).isEqualTo(1);
+    }
+
+    private void setLocationEnabled(boolean enabled) {
+        mLocationManager.setLocationEnabledForUser(enabled, Process.myUserHandle());
+    }
+}