Merge "Improve visual - Collapse the conditionals in all cases"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 871f609..0634ff1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3050,7 +3050,7 @@
             <intent-filter>
                 <action android:name="android.settings.WIFI_DPP_CONFIGURATOR_QR_CODE_SCANNER"/>
                 <action android:name="android.settings.WIFI_DPP_CONFIGURATOR_QR_CODE_GENERATOR"/>
-                <action android:name="android.settings.WIFI_DPP_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK"/>
+                <action android:name="android.settings.PROCESS_WIFI_DPP_QR_CODE"/>
                 <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>
         </activity>
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index fd0fc6c..7b0b28e 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -2,6 +2,18 @@
 <issues format="4">
 
     <issue
+        id="LintError"
+        severity="Error"
+        message="No `.class` files were found in project &quot;.&quot;, so none of the classfile based checks could be run. Does the project need to be built first?"
+        category="Lint"
+        priority="10"
+        summary="Lint Failure"
+        explanation="This issue type represents a problem running lint itself. Examples include failure to find bytecode for source files (which means certain detectors could not be run), parsing errors in lint configuration files, etc.&#xA;These errors are not errors in your own code, but they are shown to make it clear that some checks were not completed.">
+        <location
+            file="."/>
+    </issue>
+
+    <issue
         id="HardCodedColor"
         severity="Error"
         message="Avoid using hardcoded color"
@@ -233,6 +245,22 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="  &lt;color name=&quot;homepage_status_bar_color&quot;>#cc000000&lt;/color>"
+        errorLine2="  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values-night/colors.xml"
+            line="25"
+            column="3"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="    &lt;color name=&quot;crypt_keeper_clock_foreground&quot;>#ff666666&lt;/color>"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -1289,11 +1317,27 @@
         priority="4"
         summary="Using hardcoded color"
         explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+        errorLine1="    &lt;color name=&quot;homepage_status_bar_color&quot;>#ccFFFFFF&lt;/color>"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="res/values/colors.xml"
+            line="133"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="HardCodedColor"
+        severity="Error"
+        message="Avoid using hardcoded color"
+        category="Correctness"
+        priority="4"
+        summary="Using hardcoded color"
+        explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.&#xA;This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
         errorLine1="    &lt;color name=&quot;qr_corner_line_color&quot;>#ffdadce0&lt;/color>"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values/colors.xml"
-            line="133"
+            line="136"
             column="5"/>
     </issue>
 
@@ -1309,7 +1353,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values/colors.xml"
-            line="134"
+            line="137"
             column="5"/>
     </issue>
 
@@ -1325,7 +1369,7 @@
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values/colors.xml"
-            line="135"
+            line="138"
             column="5"/>
     </issue>
 
@@ -2477,7 +2521,7 @@
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~">
         <location
             file="res/values/strings.xml"
-            line="5883"
+            line="5885"
             column="36"/>
     </issue>
 
@@ -2509,7 +2553,7 @@
         errorLine2="                                           ^">
         <location
             file="res/values/styles.xml"
-            line="415"
+            line="388"
             column="44"/>
     </issue>
 
@@ -2525,7 +2569,7 @@
         errorLine2="                                           ^">
         <location
             file="res/values/styles.xml"
-            line="421"
+            line="394"
             column="44"/>
     </issue>
 
@@ -2541,7 +2585,7 @@
         errorLine2="                                           ^">
         <location
             file="res/values/styles.xml"
-            line="422"
+            line="395"
             column="44"/>
     </issue>
 
@@ -2557,7 +2601,7 @@
         errorLine2="                                 ^">
         <location
             file="res/values/styles.xml"
-            line="457"
+            line="430"
             column="34"/>
     </issue>
 
diff --git a/res/layout-land/confirm_lock_password.xml b/res/layout-land/confirm_lock_password.xml
index 8d742fa..d140bad 100644
--- a/res/layout-land/confirm_lock_password.xml
+++ b/res/layout-land/confirm_lock_password.xml
@@ -28,7 +28,7 @@
         android:layout_height="match_parent">
 
         <TextView
-            style="@android:style/TextAppearance.Material.Title"
+            style="@*android:style/TextAppearance.DeviceDefault.Title"
             android:id="@+id/headerText"
             android:layout_marginStart="24dp"
             android:layout_marginEnd="24dp"
@@ -38,7 +38,7 @@
             android:textColor="?android:attr/colorAccent"/>
 
         <TextView
-            style="@android:style/TextAppearance.Material.Body1"
+            style="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:id="@+id/detailsText"
             android:layout_marginStart="24dp"
             android:layout_marginEnd="24dp"
diff --git a/res/layout-land/confirm_lock_pattern.xml b/res/layout-land/confirm_lock_pattern.xml
index 0449e59..bcfd907 100644
--- a/res/layout-land/confirm_lock_pattern.xml
+++ b/res/layout-land/confirm_lock_pattern.xml
@@ -37,7 +37,7 @@
             android:orientation="vertical">
 
             <TextView
-                style="@android:style/TextAppearance.Material.Headline"
+                style="@*android:style/TextAppearance.DeviceDefault.Headline"
                 android:id="@+id/headerText"
                 android:layout_marginStart="32dp"
                 android:layout_marginEnd="32dp"
@@ -46,7 +46,7 @@
                 android:textColor="?android:attr/colorAccent"/>
 
             <TextView
-                style="@android:style/TextAppearance.Material.Body1"
+                style="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:id="@+id/detailsText"
                 android:layout_marginStart="32dp"
                 android:layout_marginEnd="32dp"
@@ -111,4 +111,4 @@
         </LinearLayout>
 
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
-</FrameLayout>
\ No newline at end of file
+</FrameLayout>
diff --git a/res/layout-land/storage_summary_donut.xml b/res/layout-land/storage_summary_donut.xml
index 5fe4cc8..f43737a 100644
--- a/res/layout-land/storage_summary_donut.xml
+++ b/res/layout-land/storage_summary_donut.xml
@@ -42,7 +42,7 @@
             android:fontFamily="@*android:string/config_headlineFontFamily"
             android:singleLine="true"
             android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Display1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
             android:textSize="36sp" />
 
         <TextView
@@ -54,7 +54,7 @@
             android:maxLines="10"
             android:paddingBottom="20dp"
             android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1" />
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
 
         <Button
             android:id="@+id/deletion_helper_button"
diff --git a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
index 4217867..21df686 100644
--- a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
@@ -25,8 +25,8 @@
     <include layout="@layout/wifi_dpp_fragment_header"/>
 
     <com.android.settings.wifi.qrcode.QrPreviewLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_width="@dimen/qrcode_preview_size"
+        android:layout_height="@dimen/qrcode_preview_size"
         android:layout_gravity="center">
         <TextureView
             android:id="@+id/preview_view"
diff --git a/res/layout-sw300dp-land/font_size_activity.xml b/res/layout-sw300dp-land/font_size_activity.xml
index 69abac1..6664704 100644
--- a/res/layout-sw300dp-land/font_size_activity.xml
+++ b/res/layout-sw300dp-land/font_size_activity.xml
@@ -56,7 +56,7 @@
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
                 android:padding="6dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Widget.TextView"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
                 android:elevation="2dp" />
 
             <com.android.settings.widget.LabeledSeekBar
@@ -102,7 +102,7 @@
                 android:layout_height="wrap_content"
                 android:text="@string/font_size_summary"
                 android:layout_marginBottom="16dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead" />
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
         </LinearLayout>
     </ScrollView>
 </LinearLayout>
diff --git a/res/layout-sw300dp-land/screen_zoom_activity.xml b/res/layout-sw300dp-land/screen_zoom_activity.xml
index 8d6e735..cd7c67c 100644
--- a/res/layout-sw300dp-land/screen_zoom_activity.xml
+++ b/res/layout-sw300dp-land/screen_zoom_activity.xml
@@ -56,7 +56,7 @@
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
                 android:padding="6dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Widget.TextView"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
                 android:elevation="2dp" />
 
             <com.android.settings.widget.LabeledSeekBar
@@ -102,7 +102,7 @@
                 android:layout_height="wrap_content"
                 android:text="@string/screen_zoom_summary"
                 android:layout_marginBottom="16dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead" />
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
         </LinearLayout>
     </ScrollView>
 </LinearLayout>
diff --git a/res/layout-sw360dp/storage_summary_donut.xml b/res/layout-sw360dp/storage_summary_donut.xml
index 5fe4cc8..f43737a 100644
--- a/res/layout-sw360dp/storage_summary_donut.xml
+++ b/res/layout-sw360dp/storage_summary_donut.xml
@@ -42,7 +42,7 @@
             android:fontFamily="@*android:string/config_headlineFontFamily"
             android:singleLine="true"
             android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Display1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
             android:textSize="36sp" />
 
         <TextView
@@ -54,7 +54,7 @@
             android:maxLines="10"
             android:paddingBottom="20dp"
             android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1" />
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
 
         <Button
             android:id="@+id/deletion_helper_button"
diff --git a/res/layout/admin_support_details_dialog.xml b/res/layout/admin_support_details_dialog.xml
index 922451f..66eaf0d 100644
--- a/res/layout/admin_support_details_dialog.xml
+++ b/res/layout/admin_support_details_dialog.xml
@@ -34,7 +34,7 @@
                 android:layout_height="wrap_content"
                 android:paddingStart="@dimen/admin_details_dialog_padding"
                 android:text="@string/disabled_by_policy_title"
-                android:textAppearance="@android:style/TextAppearance.Material.Title" />
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Title" />
     </LinearLayout>
 
     <ScrollView
@@ -48,7 +48,7 @@
             <TextView android:id="@+id/admin_support_msg"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
-                      android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                      android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                       android:text="@string/default_admin_support_msg"
                       android:maxLength="200"
                       android:autoLink="email|phone|web"
diff --git a/res/layout/battery_header.xml b/res/layout/battery_header.xml
index 9f5bde9..b3b699a 100644
--- a/res/layout/battery_header.xml
+++ b/res/layout/battery_header.xml
@@ -22,15 +22,12 @@
     android:layout_height="match_parent"
     android:layout_gravity="center"
     android:orientation="horizontal"
-    android:paddingTop="24dp"
-    android:paddingBottom="24dp"
     style="@style/EntityHeader">
 
     <LinearLayout
-        android:layout_width="0dp"
+        android:layout_width="170dp"
         android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:layout_marginStart="56dp"
+        android:layout_marginStart="72dp"
         android:layout_marginEnd="8dp"
         android:orientation="vertical">
 
@@ -39,8 +36,8 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="12dp"
-            android:fontFamily="@*android:string/config_headlineFontFamily"
-            android:textAppearance="@android:style/TextAppearance.Material.Display1"/>
+            android:textAppearance="@style/TextAppearance.EntityHeaderTitle"
+            android:textSize="36sp" />
 
         <TextView
             android:id="@+id/summary1"
@@ -48,20 +45,21 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="8dp"
             android:minLines="2"
-            android:textAppearance="@android:style/TextAppearance.Material.Small"/>
+            android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"/>
+            android:textColor="?android:attr/textColorPrimary"/>
 
         <TextView
             android:id="@+id/summary2"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Small"/>
-
+            android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"/>
+            android:textColor="?android:attr/textColorPrimary"/>
     </LinearLayout>
 
     <com.android.settings.fuelgauge.BatteryMeterView
         android:id="@+id/battery_header_icon"
-        android:layout_width="@dimen/battery_meter_width"
+        android:layout_width="match_parent"
         android:layout_height="@dimen/battery_meter_height"
-        android:layout_marginEnd="16dp"/>
+        android:layout_gravity="center"/>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml
index 33140d9..c55c9ff 100644
--- a/res/layout/bluetooth_pin_confirm.xml
+++ b/res/layout/bluetooth_pin_confirm.xml
@@ -40,7 +40,7 @@
             android:gravity="center_vertical"
             android:text="@string/bluetooth_pairing_key_msg"
             android:visibility="gone"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="@color/bluetooth_dialog_text_color"  />
 
         <TextView
@@ -52,7 +52,7 @@
             android:layout_marginBottom="@dimen/bluetooth_dialog_padding"
             android:gravity="center_vertical"
             android:visibility="gone"
-            android:textAppearance="@android:style/TextAppearance.Material.Headline" />
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Headline" />
 
         <TextView
             android:id="@+id/pairing_code_message"
@@ -63,7 +63,7 @@
             android:layout_marginBottom="@dimen/bluetooth_dialog_padding"
             android:gravity="center_vertical"
             android:text="@string/bluetooth_enter_passkey_msg"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
             android:textColor="@color/bluetooth_dialog_text_color"
             android:visibility="gone" />
 
@@ -73,7 +73,7 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="@dimen/bluetooth_dialog_padding"
             android:layout_marginEnd="@dimen/bluetooth_dialog_padding"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="@color/bluetooth_dialog_text_color"  />
 
     </LinearLayout>
diff --git a/res/layout/bluetooth_pin_entry.xml b/res/layout/bluetooth_pin_entry.xml
index c309a24..0c6861c 100644
--- a/res/layout/bluetooth_pin_entry.xml
+++ b/res/layout/bluetooth_pin_entry.xml
@@ -60,7 +60,7 @@
             android:layout_marginBottom="16dp"
             android:gravity="center"
             android:paddingStart="@dimen/bluetooth_checkbox_padding"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary"/>
 
         <TextView
@@ -71,7 +71,7 @@
             android:layout_marginEnd="@dimen/bluetooth_pairing_padding"
             android:layout_marginBottom="12dp"
             android:gravity="center_vertical"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
             android:textColor="?android:attr/textColorSecondary"/>
 
         <CheckBox
@@ -84,7 +84,7 @@
             android:gravity="center_vertical"
             android:paddingStart="@dimen/bluetooth_checkbox_padding"
             android:text="@string/bluetooth_pairing_shares_phonebook"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary"/>
 
     </LinearLayout>
diff --git a/res/layout/choose_lock_dialog_item.xml b/res/layout/choose_lock_dialog_item.xml
index 46ad539..f87b7c4 100644
--- a/res/layout/choose_lock_dialog_item.xml
+++ b/res/layout/choose_lock_dialog_item.xml
@@ -26,5 +26,5 @@
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:textAlignment="viewStart"
-    android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
     android:textColor="?android:attr/textColorAlertDialogListItem" />
diff --git a/res/layout/confirm_lock_password_base.xml b/res/layout/confirm_lock_password_base.xml
index edc8e25..22934ba 100644
--- a/res/layout/confirm_lock_password_base.xml
+++ b/res/layout/confirm_lock_password_base.xml
@@ -31,7 +31,7 @@
         android:paddingTop="@dimen/confirm_credentials_top_padding">
 
         <TextView
-            style="@android:style/TextAppearance.Material.Headline"
+            style="@*android:style/TextAppearance.DeviceDefault.Headline"
             android:id="@+id/headerText"
             android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
             android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
@@ -41,7 +41,7 @@
             android:textColor="?android:attr/colorAccent"/>
 
         <TextView
-            style="@android:style/TextAppearance.Material.Body1"
+            style="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:id="@+id/detailsText"
             android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
             android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
diff --git a/res/layout/confirm_lock_pattern_base.xml b/res/layout/confirm_lock_pattern_base.xml
index 46e2516..25fa08f 100644
--- a/res/layout/confirm_lock_pattern_base.xml
+++ b/res/layout/confirm_lock_pattern_base.xml
@@ -40,7 +40,7 @@
                 android:orientation="vertical">
 
                 <TextView
-                    style="@android:style/TextAppearance.Material.Headline"
+                    style="@*android:style/TextAppearance.DeviceDefault.Headline"
                     android:id="@+id/headerText"
                     android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
                     android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
@@ -50,7 +50,7 @@
                     android:textColor="?android:attr/colorAccent"/>
 
                 <TextView
-                    style="@android:style/TextAppearance.Material.Body1"
+                    style="@*android:style/TextAppearance.DeviceDefault.Body1"
                     android:id="@+id/detailsText"
                     android:layout_marginStart="?attr/confirmDeviceCredentialsSideMargin"
                     android:layout_marginEnd="?attr/confirmDeviceCredentialsSideMargin"
diff --git a/res/layout/data_usage_detail.xml b/res/layout/data_usage_detail.xml
index 5113139..8079fe1 100644
--- a/res/layout/data_usage_detail.xml
+++ b/res/layout/data_usage_detail.xml
@@ -64,14 +64,14 @@
                     android:singleLine="true"
                     android:ellipsize="marquee"
                     android:text="@string/data_usage_label_foreground"
-                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                     android:textColor="?android:attr/textColorSecondary"
                     android:textAlignment="viewStart" />
                 <TextView
                     android:id="@+id/app_foreground"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                     android:textColor="?android:attr/textColorSecondary"
                     android:textAlignment="viewEnd" />
             </LinearLayout>
@@ -87,14 +87,14 @@
                     android:singleLine="true"
                     android:ellipsize="marquee"
                     android:text="@string/data_usage_label_background"
-                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                     android:textColor="?android:attr/textColorSecondary"
                     android:textAlignment="viewStart" />
                 <TextView
                     android:id="@+id/app_background"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                     android:textColor="?android:attr/textColorSecondary"
                     android:textAlignment="viewEnd" />
             </LinearLayout>
diff --git a/res/layout/font_size_activity.xml b/res/layout/font_size_activity.xml
index aa3930c..3e84336 100644
--- a/res/layout/font_size_activity.xml
+++ b/res/layout/font_size_activity.xml
@@ -48,7 +48,7 @@
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
                 android:padding="6dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Widget.TextView"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
                 android:elevation="2dp" />
 
             <LinearLayout
@@ -94,7 +94,7 @@
                 android:layout_height="wrap_content"
                 android:text="@string/font_size_summary"
                 android:layout_marginBottom="16dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead" />
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
         </LinearLayout>
     </LinearLayout>
 </ScrollView>
diff --git a/res/layout/font_size_preview.xml b/res/layout/font_size_preview.xml
index d84bb39..669ece0 100644
--- a/res/layout/font_size_preview.xml
+++ b/res/layout/font_size_preview.xml
@@ -36,25 +36,25 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/font_size_preview_text_headline"
-                android:textAppearance="@android:style/TextAppearance.Material.Headline"/>
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Headline"/>
 
             <TextView
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/font_size_preview_text_title"
-                android:textAppearance="@android:style/TextAppearance.Material.Title"/>
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Title"/>
 
             <TextView
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/font_size_preview_text_subtitle"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead"/>
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
 
             <TextView
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:text="@string/font_size_preview_text_body"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"/>
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"/>
         </LinearLayout>
     </view>
 </ScrollView>
diff --git a/res/layout/homepage_dismissal_view.xml b/res/layout/homepage_dismissal_view.xml
index e60b375..e31d436 100644
--- a/res/layout/homepage_dismissal_view.xml
+++ b/res/layout/homepage_dismissal_view.xml
@@ -40,6 +40,7 @@
             style="@style/ContextualCardDismissalButton"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/homepage_card_dismissal_margin_bottom"
             android:text="@string/contextual_card_dismiss_keep"/>
 
         <Button
@@ -47,6 +48,7 @@
             style="@style/ContextualCardDismissalButton"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/homepage_card_dismissal_margin_bottom"
             android:text="@string/contextual_card_dismiss_remove"/>
 
     </LinearLayout>
diff --git a/res/layout/homepage_slice_tile.xml b/res/layout/homepage_slice_tile.xml
index 9fa7d61..2b7c1b0 100644
--- a/res/layout/homepage_slice_tile.xml
+++ b/res/layout/homepage_slice_tile.xml
@@ -30,6 +30,7 @@
             android:id="@+id/slice_view"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
             android:paddingStart="@dimen/homepage_card_padding_start"
             android:paddingEnd="@dimen/homepage_card_padding_end"/>
 
diff --git a/res/layout/preference.xml b/res/layout/preference.xml
index cf85e5d..195671b 100644
--- a/res/layout/preference.xml
+++ b/res/layout/preference.xml
@@ -35,7 +35,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:singleLine="true"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
             android:textColor="?android:attr/textColorPrimary"
             android:ellipsize="marquee"
             android:fadingEdge="horizontal" />
@@ -48,7 +48,7 @@
             android:layout_alignStart="@android:id/title"
             android:visibility="gone"
             android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary"
             android:maxLines="10" />
 
diff --git a/res/layout/preference_multiline_title.xml b/res/layout/preference_multiline_title.xml
index 16c25d5..ae93ead 100644
--- a/res/layout/preference_multiline_title.xml
+++ b/res/layout/preference_multiline_title.xml
@@ -34,7 +34,7 @@
             android:id="@android:id/title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
             android:textColor="?android:attr/textColorPrimary"
             android:ellipsize="marquee"
             android:fadingEdge="horizontal" />
@@ -47,7 +47,7 @@
             android:layout_alignStart="@android:id/title"
             android:visibility="gone"
             android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary"
             android:maxLines="10" />
 
diff --git a/res/layout/preference_progress_category.xml b/res/layout/preference_progress_category.xml
index 2ac3dc1..91a0312 100644
--- a/res/layout/preference_progress_category.xml
+++ b/res/layout/preference_progress_category.xml
@@ -46,7 +46,7 @@
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:layout_gravity="start|center"
-        android:textAppearance="@android:style/TextAppearance.Material.Body2"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"
         android:textColor="?android:attr/colorAccent"/>
 
     <ProgressBar
diff --git a/res/layout/preference_volume_slider.xml b/res/layout/preference_volume_slider.xml
index da3a028..34c732d 100644
--- a/res/layout/preference_volume_slider.xml
+++ b/res/layout/preference_volume_slider.xml
@@ -58,7 +58,7 @@
                 android:layout_weight="1"
                 android:paddingStart="12dp"
                 android:singleLine="true"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                 android:textColor="?android:attr/textColorPrimary"
                 android:ellipsize="marquee"
                 android:fadingEdge="horizontal"/>
@@ -94,7 +94,7 @@
                 android:singleLine="true"
                 android:ellipsize="end"
                 android:visibility="gone"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"/>
 
         </LinearLayout>
diff --git a/res/layout/preference_widget_seekbar_settings.xml b/res/layout/preference_widget_seekbar_settings.xml
index fb1e9c8..9893a1b 100644
--- a/res/layout/preference_widget_seekbar_settings.xml
+++ b/res/layout/preference_widget_seekbar_settings.xml
@@ -35,7 +35,7 @@
         android:paddingStart="56dp"
         android:paddingEnd="8dp"
         android:singleLine="true"
-        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
         android:textColor="?android:attr/textColorPrimary" />
 
     <TextView
diff --git a/res/layout/preset_picker_item.xml b/res/layout/preset_picker_item.xml
index 405b735..47887e1 100644
--- a/res/layout/preset_picker_item.xml
+++ b/res/layout/preset_picker_item.xml
@@ -44,6 +44,6 @@
         android:maxLines="2"
         android:minLines="2"
         android:gravity="top|center_horizontal"
-        android:textAppearance="@android:style/TextAppearance.Material.Body1" />
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
 
 </LinearLayout>
diff --git a/res/layout/preview_seek_bar_view_pager.xml b/res/layout/preview_seek_bar_view_pager.xml
index 264991a..12f2611 100644
--- a/res/layout/preview_seek_bar_view_pager.xml
+++ b/res/layout/preview_seek_bar_view_pager.xml
@@ -36,7 +36,7 @@
         android:paddingStart="32dp"
         android:gravity="start|center"
         android:text="@string/screen_zoom_preview_title"
-        android:textAppearance="@android:style/TextAppearance.Material.Widget.ActionBar.Title"
+        android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
         android:importantForAccessibility="no" />
 </LinearLayout>
 
diff --git a/res/layout/running_processes_header.xml b/res/layout/running_processes_header.xml
index a696b38..b2db025 100644
--- a/res/layout/running_processes_header.xml
+++ b/res/layout/running_processes_header.xml
@@ -30,7 +30,7 @@
         android:layout_height="48dp"
         android:singleLine="true"
         android:ellipsize="marquee"
-        android:textAppearance="@android:style/TextAppearance.Material.Body2"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"
         android:textColor="?android:attr/textColorPrimary"
         android:textAlignment="viewStart"
         android:gravity="left|center_vertical"
@@ -63,7 +63,7 @@
             <TextView
                 android:id="@+id/systemSizePrefix"
                 android:text="@string/running_processes_header_system_prefix"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
@@ -81,7 +81,7 @@
                 android:contentDescription="@null" />
             <TextView
                 android:id="@+id/systemSize"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
@@ -108,7 +108,7 @@
             <TextView
                 android:id="@+id/appsSizePrefix"
                 android:text="@string/running_processes_header_apps_prefix"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
@@ -126,7 +126,7 @@
                 android:contentDescription="@null" />
             <TextView
                 android:id="@+id/appsSize"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
@@ -153,7 +153,7 @@
             <TextView
                 android:id="@+id/freeSizePrefix"
                 android:text="@string/running_processes_header_free_prefix"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
@@ -171,7 +171,7 @@
                 android:contentDescription="@null" />
             <TextView
                 android:id="@+id/freeSize"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
@@ -186,7 +186,7 @@
         android:layout_marginTop="8dp"
         android:singleLine="true"
         android:ellipsize="marquee"
-        android:textAppearance="@android:style/TextAppearance.Material.Body2"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"
         android:textColor="?android:attr/textColorPrimary"
         android:textAlignment="viewStart"
         android:gravity="left|center_vertical"
diff --git a/res/layout/running_processes_item.xml b/res/layout/running_processes_item.xml
index 036a90e..45121eb 100644
--- a/res/layout/running_processes_item.xml
+++ b/res/layout/running_processes_item.xml
@@ -48,7 +48,7 @@
             android:layout_weight="1"
             android:singleLine="true"
             android:ellipsize="marquee"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
             android:textAlignment="viewStart" />
 
         <TextView
@@ -56,7 +56,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginStart="8dip"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary" />
 
     </LinearLayout>
@@ -70,7 +70,7 @@
             android:layout_width="0dip"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary"
             android:textAlignment="viewStart" />
 
@@ -79,7 +79,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginStart="8dip"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorSecondary" />
 
     </LinearLayout>
diff --git a/res/layout/screen_zoom_activity.xml b/res/layout/screen_zoom_activity.xml
index 0141019..4cfa7b6 100644
--- a/res/layout/screen_zoom_activity.xml
+++ b/res/layout/screen_zoom_activity.xml
@@ -48,7 +48,7 @@
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
                 android:padding="6dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Widget.TextView"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
                 android:elevation="2dp" />
 
             <LinearLayout
@@ -93,7 +93,7 @@
                 android:layout_height="wrap_content"
                 android:text="@string/screen_zoom_summary"
                 android:layout_marginBottom="16dp"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead" />
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
         </LinearLayout>
     </LinearLayout>
 </ScrollView>
diff --git a/res/layout/screen_zoom_preview_app_icon.xml b/res/layout/screen_zoom_preview_app_icon.xml
index 087afb8..1d56410 100644
--- a/res/layout/screen_zoom_preview_app_icon.xml
+++ b/res/layout/screen_zoom_preview_app_icon.xml
@@ -37,5 +37,5 @@
         android:ellipsize="end"
         android:gravity="center_horizontal|top"
         android:singleLine="true"
-        android:textAppearance="@android:style/TextAppearance.Material.Caption" />
-</LinearLayout>
\ No newline at end of file
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Caption" />
+</LinearLayout>
diff --git a/res/layout/screen_zoom_preview_settings.xml b/res/layout/screen_zoom_preview_settings.xml
index 9a0cc59..3401fcf 100644
--- a/res/layout/screen_zoom_preview_settings.xml
+++ b/res/layout/screen_zoom_preview_settings.xml
@@ -57,7 +57,7 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/wifi_settings"
-                        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                         android:textColor="?android:attr/textColorPrimary" />
 
 
@@ -65,7 +65,7 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/wifi_display_status_not_available"
-                        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                         android:textColor="?android:attr/textColorSecondary" />
                 </LinearLayout>
             </LinearLayout>
@@ -96,14 +96,14 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/data_usage_summary_title"
-                        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                         android:textColor="?android:attr/textColorPrimary" />
 
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/no_data_usage"
-                        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                         android:textColor="?android:attr/textColorSecondary" />
                 </LinearLayout>
             </LinearLayout>
@@ -134,14 +134,14 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/display_settings_title"
-                        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                         android:textColor="?android:attr/textColorPrimary" />
 
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/display_summary_example"
-                        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                         android:textColor="?android:attr/textColorSecondary" />
                 </LinearLayout>
             </LinearLayout>
@@ -172,14 +172,14 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/sound_settings"
-                        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                         android:textColor="?android:attr/textColorPrimary" />
 
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/sound_settings_example_summary"
-                        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                         android:textColor="?android:attr/textColorSecondary" />
                 </LinearLayout>
             </LinearLayout>
@@ -210,14 +210,14 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/applications_settings"
-                        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                         android:textColor="?android:attr/textColorPrimary" />
 
                     <TextView
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:text="@string/apps_summary_example"
-                        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                         android:textColor="?android:attr/textColorSecondary" />
                 </LinearLayout>
             </LinearLayout>
diff --git a/res/layout/settings_homepage_container.xml b/res/layout/settings_homepage_container.xml
index 75d449f..1e5bdce 100644
--- a/res/layout/settings_homepage_container.xml
+++ b/res/layout/settings_homepage_container.xml
@@ -31,8 +31,9 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
-            android:paddingTop="@dimen/app_bar_height"
-            android:descendantFocusability="blocksDescendants">
+            android:descendantFocusability="blocksDescendants"
+            android:paddingTop="104dp">
+            <!-- height of status bar(24dp) + height of action bar(48dp) + top/bottom margins(16dp) -->
 
             <FrameLayout
                 android:id="@+id/contextual_cards_content"
@@ -52,6 +53,13 @@
     <com.google.android.material.appbar.AppBarLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
+
+        <Space
+            android:layout_width="match_parent"
+            android:layout_height="@*android:dimen/status_bar_height"
+            android:background="@android:color/transparent"
+            app:layout_scrollFlags="scroll|enterAlways"/>
+
         <include layout="@layout/search_bar"/>
     </com.google.android.material.appbar.AppBarLayout>
 </androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/res/layout/settings_summary_preference.xml b/res/layout/settings_summary_preference.xml
index ae3b70d..e76190f 100644
--- a/res/layout/settings_summary_preference.xml
+++ b/res/layout/settings_summary_preference.xml
@@ -31,7 +31,7 @@
         android:fontFamily="@*android:string/config_headlineFontFamily"
         android:paddingTop="0dp"
         android:textColor="?android:attr/colorAccent"
-        android:textAppearance="@android:style/TextAppearance.Material.Display1"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
         />
 
     <TextView android:id="@android:id/summary"
diff --git a/res/layout/storage_internal_forget.xml b/res/layout/storage_internal_forget.xml
index cb47d3b..5ff232a 100644
--- a/res/layout/storage_internal_forget.xml
+++ b/res/layout/storage_internal_forget.xml
@@ -33,7 +33,7 @@
             android:paddingStart="@dimen/suw_layout_margin_sides"
             android:paddingEnd="@dimen/suw_layout_margin_sides"
             android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorPrimary" />
     </ScrollView>
 
diff --git a/res/layout/storage_internal_format.xml b/res/layout/storage_internal_format.xml
index 8aec28f..500592f 100644
--- a/res/layout/storage_internal_format.xml
+++ b/res/layout/storage_internal_format.xml
@@ -33,7 +33,7 @@
             android:paddingStart="@dimen/suw_layout_margin_sides"
             android:paddingEnd="@dimen/suw_layout_margin_sides"
             android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorPrimary" />
     </ScrollView>
 
diff --git a/res/layout/storage_internal_unmount.xml b/res/layout/storage_internal_unmount.xml
index 7e728c8..2e394df 100644
--- a/res/layout/storage_internal_unmount.xml
+++ b/res/layout/storage_internal_unmount.xml
@@ -33,7 +33,7 @@
             android:paddingStart="@dimen/suw_layout_margin_sides"
             android:paddingEnd="@dimen/suw_layout_margin_sides"
             android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:textColor="?android:attr/textColorPrimary" />
     </ScrollView>
 
diff --git a/res/layout/storage_item.xml b/res/layout/storage_item.xml
index aa2b4f8..cefb399 100644
--- a/res/layout/storage_item.xml
+++ b/res/layout/storage_item.xml
@@ -61,7 +61,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:singleLine="true"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                 android:textAlignment="viewStart"
                 android:ellipsize="marquee"
                 android:fadingEdge="horizontal" />
@@ -71,7 +71,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:textAlignment="viewStart"
-                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                 android:textColor="?android:attr/textColorSecondary"
                 android:maxLines="10"
                 android:layout_alignParentEnd="true"/>
diff --git a/res/layout/storage_summary.xml b/res/layout/storage_summary.xml
index d48d62d..ce03b54 100644
--- a/res/layout/storage_summary.xml
+++ b/res/layout/storage_summary.xml
@@ -35,7 +35,7 @@
         android:fontFamily="@*android:string/config_headlineFontFamily"
         android:singleLine="true"
         android:textAlignment="viewStart"
-        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
         android:textColor="?android:attr/colorAccent"
         android:textSize="36sp"/>
 
@@ -44,7 +44,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textAlignment="viewStart"
-        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
         android:maxLines="10" />
 
     <ProgressBar
diff --git a/res/layout/storage_summary_donut.xml b/res/layout/storage_summary_donut.xml
index 7a10fe7..1637189 100644
--- a/res/layout/storage_summary_donut.xml
+++ b/res/layout/storage_summary_donut.xml
@@ -32,7 +32,7 @@
         android:fontFamily="@*android:string/config_headlineFontFamily"
         android:singleLine="true"
         android:textAlignment="center"
-        android:textAppearance="@android:style/TextAppearance.Material.Display1"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
         android:textSize="36sp" />
 
     <TextView
@@ -43,7 +43,7 @@
         android:layout_marginEnd="4dp"
         android:maxLines="10"
         android:textAlignment="center"
-        android:textAppearance="@android:style/TextAppearance.Material.Body1" />
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
 
     <com.android.settings.widget.DonutView
         android:id="@+id/donut"
diff --git a/res/layout/storage_wizard_init.xml b/res/layout/storage_wizard_init.xml
index 73af8da..bca2676 100644
--- a/res/layout/storage_wizard_init.xml
+++ b/res/layout/storage_wizard_init.xml
@@ -48,7 +48,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginBottom="@dimen/suw_description_margin_bottom"
-                    android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                     android:text="@string/storage_wizard_init_v2_internal_title" />
                 <TextView
                     android:layout_width="match_parent"
@@ -115,7 +115,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_marginBottom="@dimen/suw_description_margin_bottom"
-                    android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                     android:text="@string/storage_wizard_init_v2_external_title" />
                 <TextView
                     android:layout_width="match_parent"
diff --git a/res/layout/tall_preference_category.xml b/res/layout/tall_preference_category.xml
index f0630f8..7eefdab 100644
--- a/res/layout/tall_preference_category.xml
+++ b/res/layout/tall_preference_category.xml
@@ -21,7 +21,7 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_marginBottom="16dip"
-    android:textAppearance="@android:style/TextAppearance.Material.Body2"
+    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"
     android:textColor="?android:attr/colorAccent"
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
diff --git a/res/layout/text_description_preference.xml b/res/layout/text_description_preference.xml
index 6b8594b..70385aa 100644
--- a/res/layout/text_description_preference.xml
+++ b/res/layout/text_description_preference.xml
@@ -18,5 +18,5 @@
     android:id="@android:id/summary"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
     android:padding="16dip" />
diff --git a/res/layout/widget_text_views.xml b/res/layout/widget_text_views.xml
index d95599d..9f0506e 100644
--- a/res/layout/widget_text_views.xml
+++ b/res/layout/widget_text_views.xml
@@ -26,7 +26,7 @@
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:layout_gravity="fill_horizontal|top"
-        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
         android:textColor="?android:attr/textColorSecondary"
         android:textAlignment="viewStart"
         android:singleLine="true"
@@ -40,7 +40,7 @@
         android:layout_weight="1"
         android:layout_marginStart="8dip"
         android:layout_gravity="fill_horizontal|top"
-        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
         android:textColor="?android:attr/textColorSecondary"
         android:textAlignment="viewEnd"
         android:singleLine="true"
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index 2a395b6..df676fc 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -68,7 +68,7 @@
                         android:layout_centerVertical="true"
                         android:layout_margin="5dp"
                         android:background="@null"
-                        android:src="@drawable/ic_qrcode_24dp"
+                        android:src="@drawable/ic_scan_24dp"
                         android:visibility="gone"
                         android:contentDescription="@string/wifi_add_network" />
                 </RelativeLayout>
@@ -303,7 +303,7 @@
                         android:layout_centerVertical="true"
                         android:layout_margin="5dp"
                         android:background="@null"
-                        android:src="@drawable/ic_qrcode_24dp"
+                        android:src="@drawable/ic_scan_24dp"
                         android:visibility="gone"
                         android:contentDescription="@string/wifi_add_network" />
                 </RelativeLayout>
diff --git a/res/layout/wifi_dpp_activity.xml b/res/layout/wifi_dpp_activity.xml
index cb82f66..48f2b65 100644
--- a/res/layout/wifi_dpp_activity.xml
+++ b/res/layout/wifi_dpp_activity.xml
@@ -15,7 +15,7 @@
      limitations under the License.
 -->
 
-<LinearLayout
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/root"
     android:layout_width="match_parent"
@@ -27,4 +27,4 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
 
-</LinearLayout>
+</ScrollView>
diff --git a/res/layout/wifi_dpp_add_device_fragment.xml b/res/layout/wifi_dpp_add_device_fragment.xml
index 03add62..5e70396 100644
--- a/res/layout/wifi_dpp_add_device_fragment.xml
+++ b/res/layout/wifi_dpp_add_device_fragment.xml
@@ -24,22 +24,19 @@
 
     <include layout="@layout/wifi_dpp_fragment_header"/>
 
-    <ProgressBar
-      android:id="@+id/progress_bar"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:indeterminate="true"/>
-
     <ImageView
         android:id="@+id/wifi_ap_picture_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_gravity="center"/>
 
-    <TextView android:id="@+id/choose_different_network"
+    <TextView
+        android:id="@+id/choose_different_network"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="center"/>
+        android:layout_gravity="center"
+        android:layout_marginTop="8dp"
+        android:text="@string/wifi_dpp_choose_different_network"/>
 
     <include layout="@layout/wifi_dpp_fragment_footer"
         android:gravity="center|bottom"/>
diff --git a/res/layout/wifi_dpp_fragment_header.xml b/res/layout/wifi_dpp_fragment_header.xml
index 266a3e8..20bcd7d 100644
--- a/res/layout/wifi_dpp_fragment_header.xml
+++ b/res/layout/wifi_dpp_fragment_header.xml
@@ -27,13 +27,13 @@
     android:paddingEnd="16dp">
 
     <ImageView
-        android:id="@+id/header_icon"
+        android:id="@android:id/icon"
         android:layout_width="48dp"
         android:layout_height="48dp"
         android:scaleType="fitCenter"/>
 
     <TextView
-        android:id="@+id/title"
+        android:id="@android:id/title"
         style="@style/TextAppearance.EntityHeaderTitle"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -44,7 +44,7 @@
         android:paddingEnd="32dp"/>
 
     <TextView
-        android:id="@+id/description"
+        android:id="@android:id/summary"
         style="@style/TextAppearance.EntityHeaderSummary"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
index 913998f..f09fc69 100644
--- a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
@@ -39,10 +39,15 @@
             android:layout_gravity="center"/>
     </com.android.settings.wifi.qrcode.QrPreviewLayout>
 
-    <TextView android:id="@+id/error_message"
+    <TextView
+        android:id="@+id/error_message"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="center"/>
+        android:layout_gravity="center"
+        android:layout_marginTop="8dp"
+        android:text="@string/wifi_dpp_could_not_detect_valid_qr_code"
+        android:visibility="invisible"
+        android:textColor="?android:attr/colorError"/>
 
 </LinearLayout>
 
diff --git a/res/layout/zen_onboarding.xml b/res/layout/zen_onboarding.xml
index 35b992d..27922c6 100644
--- a/res/layout/zen_onboarding.xml
+++ b/res/layout/zen_onboarding.xml
@@ -32,7 +32,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/zen_onboarding_dnd_visual_disturbances_header"
-            android:textAppearance="@android:style/TextAppearance.Material.DialogWindowTitle" />
+            android:textAppearance="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle" />
 
         <LinearLayout
             android:id="@+id/zen_onboarding_new_setting"
diff --git a/res/layout/zen_rule_type.xml b/res/layout/zen_rule_type.xml
index dea39ed..bd50273 100644
--- a/res/layout/zen_rule_type.xml
+++ b/res/layout/zen_rule_type.xml
@@ -42,7 +42,7 @@
                   android:singleLine="true"
                   android:textSize="16sp"
                   android:ellipsize="marquee"
-                  android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                  android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
                   android:fadingEdge="horizontal" />
 
         <TextView android:id="@+id/subtitle"
@@ -52,7 +52,7 @@
                   android:layout_alignStart="@id/title"
                   android:textSize="14sp"
                   android:textColor="?android:attr/textColorSecondary"
-                  android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                  android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
                   android:maxLines="2"
                   android:visibility="gone" />
 
diff --git a/res/layout/zen_rule_widget.xml b/res/layout/zen_rule_widget.xml
index c6214e7..3d75469 100644
--- a/res/layout/zen_rule_widget.xml
+++ b/res/layout/zen_rule_widget.xml
@@ -19,14 +19,7 @@
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:orientation="horizontal">
-    <ImageView
-            android:id="@+id/zen_automatic_rule_widget"
-            android:layout_width="wrap_content"
-            android:layout_height="fill_parent"
-            android:paddingStart="16dip"
-            android:paddingEnd="16dip"
-            android:src="@drawable/ic_settings"
-            android:contentDescription="zen_mode_rule_settings"
-            android:layout_gravity="center"
-            android:background="?android:attr/selectableItemBackground" />
+
+    <include layout="@layout/preference_widget_gear"
+             android:id="@+id/zen_automatic_rule_widget" />
 </LinearLayout>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index bc06f47..f864e03 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -21,5 +21,7 @@
   <color name="switchbar_switch_thumb_tint">@android:color/black</color>
   <color name="homepage_accessibility_background">#783BE5</color>
   <color name="homepage_support_background">#3F5FBD</color>
+  <!-- 80% black for status bar of homepage -->
+  <color name="homepage_status_bar_color">#cc000000</color>
 </resources>
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 2103649..5539d68 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -129,6 +129,9 @@
     <!-- launcher icon color -->
     <color name="icon_launcher_setting_color">@*android:color/accent_device_default_light</color>
 
+    <!-- 80% white for status bar of homepage -->
+    <color name="homepage_status_bar_color">#ccFFFFFF</color>
+
     <!-- QR code scanner colors -->
     <color name="qr_corner_line_color">#ffdadce0</color>
     <color name="qr_focused_corner_line_color">#ff1a73e8</color>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 0859d2c..b250eff 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -105,8 +105,6 @@
     <dimen name="search_bar_avatar_size">32dp</dimen>
     <dimen name="search_bar_avatar_start_margin">4dp</dimen>
     <dimen name="search_bar_avatar_end_margin">16dp</dimen>
-    <!-- appbar height is equal search bar height (48dp) plus search bar top and bottom margin  -->
-    <dimen name="app_bar_height">80dp</dimen>
 
     <!-- Dimensions for Wifi Assistant Card -->
     <dimen name="wifi_assistant_padding_top_bottom">16dp</dimen>
@@ -332,6 +330,7 @@
     <dimen name="homepage_half_card_padding_top">12dp</dimen>
     <dimen name="homepage_half_card_padding_bottom">16dp</dimen>
     <dimen name="homepage_half_card_title_margin_top">12dp</dimen>
+    <dimen name="homepage_card_dismissal_margin_bottom">2dp</dimen>
 
     <!-- Horizontal divider size and margin -->
     <dimen name="horizontal_divider_margin_top">4dp</dimen>
@@ -367,5 +366,6 @@
 
     <!-- QR code picture size -->
     <dimen name="qrcode_size">264dp</dimen>
+    <dimen name="qrcode_preview_size">360dp</dimen>
 
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f7eedba..61b6c14 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2077,19 +2077,33 @@
     <!-- Label for the spinner to show Wifi MAC randomization [CHAR LIMIT=25] -->
     <string name="wifi_privacy_settings">Privacy</string>
     <!-- Title for the fragment to add a device into the wifi network [CHAR LIMIT=50]  -->
-    <string name="wifi_dpp_add_device_to_network">Add a device to this network</string>
+    <string name="wifi_dpp_add_device_to_network">Add a device</string>
     <!-- Hint for the user to center another device's QR code in the below camera window [CHAR LIMIT=120] -->
-    <string name="wifi_dpp_center_qr_code">Center the device\u2019s QR code below to add device to \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d</string>
+    <string name="wifi_dpp_center_qr_code">Center the QR code below to add the device to \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d</string>
     <!-- Title for the fragment to scan QR code [CHAR LIMIT=50]  -->
     <string name="wifi_dpp_scan_qr_code">Scan QR code</string>
     <!-- Hint for the user to center another device's QR code in the below camera window [CHAR LIMIT=NONE] -->
-    <string name="wifi_dpp_scan_qr_code_join_network">Join \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d by scanning a QR code</string>
+    <string name="wifi_dpp_scan_qr_code_join_network">Center the QR code below to connect to \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d</string>
     <!-- Hint for the user to center another device's QR code in the below camera window [CHAR LIMIT=NONE] -->
     <string name="wifi_dpp_scan_qr_code_join_unknown_network">Join Wi\u2011Fi by scanning a QR code</string>
     <!-- Title for the fragment to share Wi-Fi [CHAR LIMIT=50]  -->
     <string name="wifi_dpp_share_wifi">Share Wi\u2011Fi</string>
     <!-- Hint for the user to use another device to scan QR code on screen to join Wi-Fi [CHAR LIMIT=NONE] -->
     <string name="wifi_dpp_scan_qr_code_with_another_device">Scan this QR code with another device to join \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d</string>
+    <!-- Hint for QR code detection [CHAR LIMIT=NONE]  -->
+    <string name="wifi_dpp_could_not_detect_valid_qr_code">Couldn\u2019t read QR code</string>
+    <!-- Title for the fragment choose network [CHAR LIMIT=50]  -->
+    <string name="wifi_dpp_choose_network">Choose network</string>
+    <!-- Hint for the user to center another device's QR code in the below camera window [CHAR LIMIT=NONE] -->
+    <string name="wifi_dpp_choose_network_to_connect_device">To connect your device, choose a network</string>
+    <!-- Hint for the user to add the device to a Wi-Fi network [CHAR LIMIT=NONE] -->
+    <string name="wifi_dpp_add_device_to_wifi">Add this device to \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d?</string>
+    <!-- Title for the fragment to tell the user that Wi-Fi shared with device successfully [CHAR LIMIT=50]  -->
+    <string name="wifi_dpp_wifi_shared_with_device">Wi\u2011Fi shared with device</string>
+    <!-- Button label to add another device to Wi-Fi [CHAR LIMIT=50]  -->
+    <string name="wifi_dpp_add_another_device">Add another device</string>
+    <!-- Button label to choose different Wi-Fi network [CHAR LIMIT=80]  -->
+    <string name="wifi_dpp_choose_different_network">Choose different network</string>
     <!-- Label for the check box to share a network with other users on the same device -->
     <string name="wifi_shared">Share with other device users</string>
     <!-- Hint for unchanged fields -->
@@ -2644,6 +2658,9 @@
     <!-- Description about the feature adaptive brightness -->
     <string name="auto_brightness_description">Your screen brightness will automatically adjust to your environment and activities. You can move the slider manually to help adaptive brightness learn your preferences.</string>
 
+    <!-- Display settings screen, display white balance settings title [CHAR LIMIT=30] -->
+    <string name="display_white_balance_title">Display white balance</string>
+
     <!-- Night display screen, setting option name to enable night display (renamed "Night Light" with title caps). [CHAR LIMIT=30] -->
     <string name="night_display_title">Night Light</string>
     <!-- Night display screen, description of night display feature (renamed "Night Light" with title caps). [CHAR LIMIT=NONE] -->
@@ -5221,6 +5238,9 @@
         <item quantity="other">%1$d apps restricted</item>
     </plurals>
 
+    <!-- Title to display the battery percentage. [CHAR LIMIT=24] -->
+    <string name="battery_header_title_alternate"><xliff:g id="number" example="88">^1</xliff:g><small> <font size="20"><xliff:g id="unit" example="%">%</xliff:g></font></small></string>
+
     <!-- Title for force stop dialog [CHAR LIMIT=30] -->
     <string name="dialog_stop_title">Stop app?</string>
     <!-- Message body for force stop dialog [CHAR LIMIT=NONE] -->
@@ -9453,10 +9473,14 @@
     <string name="notification_log_details_parcel">parcel size</string>
     <!-- Notification log debug tool: notification ashmem size -->
     <string name="notification_log_details_ashmem">ashmem</string>
+    <!-- Notification log debug tool: header: notification alert info -->
+    <string name="notification_log_details_alerted">notification alerted</string>
     <!-- Notification log debug tool: header: notification sound info -->
     <string name="notification_log_details_sound">sound</string>
     <!-- Notification log debug tool: header: notification vibration info -->
     <string name="notification_log_details_vibrate">vibrate</string>
+    <!-- Notification log debug tool: header: notification vibration info -->
+    <string name="notification_log_details_vibrate_pattern">pattern</string>
     <!-- Notification log debug tool: the word 'default' -->
     <string name="notification_log_details_default">default</string>
     <!-- Notification log debug tool: the word 'none' -->
@@ -10034,12 +10058,17 @@
     <!-- UI debug setting: ANGLE enabled app has been set [CHAR LIMIT=NONE] -->
     <string name="angle_enabled_app_set">ANGLE enabled application: <xliff:g id="app_name" example="com.company.app">%1$s</xliff:g></string>
 
-    <!-- UI debug setting: select an app to use updated graphics driver [CHAR LIMIT=100] -->
-    <string name="updated_gfx_driver_dev_opt_in_app">Select app to use updated graphics driver</string>
-    <!-- UI debug setting: no app selected to use updated GPU driver [CHAR LIMIT=100] -->
-    <string name="updated_gfx_driver_dev_opt_in_app_not_set">No selected app to use updated graphics driver</string>
-    <!-- UI debug setting: app selected to use updated graphics driver [CHAR LIMIT=NONE] -->
-    <string name="updated_gfx_driver_dev_opt_in_app_set">Opt in application: <xliff:g id="app_name" example="com.company.app">%1$s</xliff:g></string>
+    <!-- UI debug setting: select an app to use Game Update Package [CHAR LIMIT=100] -->
+    <string name="gup_dev_opt_in_app">Use Game Update Package</string>
+    <!-- UI debug setting: no app selected to use Game Update Package [CHAR LIMIT=100] -->
+    <string name="gup_dev_opt_in_app_not_set">No selected app</string>
+    <!-- UI debug setting: app selected to use Game Update Package [CHAR LIMIT=NONE] -->
+    <string name="gup_dev_opt_in_app_set"><xliff:g id="app_name" example="com.company.app">%1$s</xliff:g></string>
+
+    <!-- Title for Game Update Packages dashboard where developers can configure apps to use GUP or not [CHAR LIMIT=50] -->
+    <string name="gup_dashboard_title">Game Update Packages Preferences</string>
+    <!-- Summary for Game Update Packages dashboard [CHAR LIMIT=50] -->
+    <string name="gup_dashboard_summary">Modify Game Update Packages settings</string>
 
     <!-- Slices Strings -->
 
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 9a72ff5..c15a3fb 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -121,7 +121,7 @@
         <item name="android:paddingStart">8dip</item>
         <item name="android:textSize">14sp</item>
         <item name="android:textAlignment">viewStart</item>
-        <item name="android:textAppearance">@android:style/TextAppearance.Material.Body1</item>
+        <item name="android:textAppearance">@*android:style/TextAppearance.DeviceDefault.Body1</item>
         <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
 
@@ -129,13 +129,13 @@
         <item name="android:paddingStart">8dip</item>
         <item name="android:textSize">12sp</item>
         <item name="android:textAlignment">viewStart</item>
-        <item name="android:textAppearance">@android:style/TextAppearance.Material.Body1</item>
+        <item name="android:textAppearance">@*android:style/TextAppearance.DeviceDefault.Body1</item>
         <item name="android:textColor">?android:attr/colorError</item>
     </style>
 
     <style name="wifi_item_content">
         <item name="android:textAlignment">viewStart</item>
-        <item name="android:textAppearance">@android:style/TextAppearance.Material.Subhead</item>
+        <item name="android:textAppearance">@*android:style/TextAppearance.DeviceDefault.Subhead</item>
         <item name="android:textColor">?android:attr/textColorPrimary</item>
         <item name="android:minHeight">@dimen/min_tap_target_size</item>
     </style>
@@ -189,13 +189,13 @@
     <style name="vpn_label">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
-        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Small</item>
     </style>
 
     <style name="vpn_value">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
-        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
         <item name="android:singleLine">true</item>
         <item name="android:textAlignment">viewStart</item>
         <item name="android:minHeight">@dimen/min_tap_target_size</item>
@@ -205,10 +205,10 @@
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:paddingStart">8dip</item>
-        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Small</item>
     </style>
 
-    <style name="TextAppearance" parent="android:TextAppearance.Material"/>
+    <style name="TextAppearance" parent="android:TextAppearance.DeviceDefault"/>
 
     <style name="TextAppearance.info_label">
         <item name="android:textSize">14sp</item>
@@ -225,14 +225,14 @@
         <item name="android:textStyle">normal</item>
     </style>
 
-    <style name="TextAppearance.PasswordEntry" parent="android:TextAppearance.Material">
+    <style name="TextAppearance.PasswordEntry" parent="android:TextAppearance.DeviceDefault">
         <item name="android:gravity">center</item>
         <item name="android:singleLine">true</item>
         <item name="android:textColor">?android:attr/textColorPrimary</item>
         <item name="android:textSize">24sp</item>
     </style>
 
-    <style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.Material">
+    <style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.DeviceDefault">
         <item name="android:gravity">center_horizontal</item>
         <item name="android:background">@null</item>
         <item name="android:textCursorDrawable">@null</item>
@@ -240,22 +240,22 @@
         <item name="android:imeOptions">flagForceAscii|actionDone</item>
     </style>
 
-    <style name="TextAppearance.Medium" parent="@android:style/TextAppearance.Material.Medium"/>
-    <style name="TextAppearance.Small" parent="@android:style/TextAppearance.Material.Small"/>
+    <style name="TextAppearance.Medium" parent="@android:style/TextAppearance.DeviceDefault.Medium"/>
+    <style name="TextAppearance.Small" parent="@android:style/TextAppearance.DeviceDefault.Small"/>
     <style name="TextAppearance.Switch"
            parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
         <item name="android:textSize">16sp</item>
     </style>
 
     <style name="TextAppearance.CategoryTitle"
-           parent="@android:style/TextAppearance.Material.Body2">
+           parent="@*android:style/TextAppearance.DeviceDefault.Body2">
         <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
 
-    <style name="TextAppearance.TileTitle" parent="@android:style/TextAppearance.Material.Subhead"/>
+    <style name="TextAppearance.TileTitle" parent="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
 
     <style name="TextAppearance.SuggestionTitle"
-           parent="@android:style/TextAppearance.Material.Subhead">
+           parent="@*android:style/TextAppearance.DeviceDefault.Subhead">
         <item name="android:textSize">16sp</item>
     </style>
 
@@ -264,7 +264,7 @@
     </style>
 
     <style name="TextAppearance.ErrorText"
-           parent="android:TextAppearance.Material.Body1">
+           parent="@*android:TextAppearance.DeviceDefault.Body1">
         <item name="android:textColor">?android:attr/colorError</item>
     </style>
 
@@ -274,29 +274,29 @@
     </style>
 
     <style name="TextAppearance.RemoveDialogContent"
-           parent="@android:style/TextAppearance.Material">
+           parent="@android:style/TextAppearance.DeviceDefault">
         <item name="android:textSize">16sp</item>
         <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
 
     <style name="TextAppearance.SearchBar"
-           parent="@android:style/TextAppearance.Material.Widget.Toolbar.Subtitle">
+           parent="@*android:style/TextAppearance.DeviceDefault.Widget.Toolbar.Subtitle">
         <item name="android:textSize">@dimen/search_bar_text_size</item>
     </style>
 
     <style name="TextAppearance.SuggestionHeader"
-           parent="@android:style/TextAppearance.Material.Subhead">
+           parent="@*android:style/TextAppearance.DeviceDefault.Subhead">
         <item name="android:textSize">14sp</item>
         <item name="android:textColor">?android:attr/colorAccent</item>
     </style>
 
     <style name="TextAppearance.ConditionCardTitle"
-           parent="@android:style/TextAppearance.Material.Body2">
+           parent="@*android:style/TextAppearance.DeviceDefault.Body2">
         <item name="android:textSize">16sp</item>
     </style>
 
     <style name="TextAppearance.ConditionCardSummary"
-           parent="@android:style/TextAppearance.Material.Body1">
+           parent="@*android:style/TextAppearance.DeviceDefault.Body1">
         <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
 
@@ -311,7 +311,7 @@
     </style>
 
     <style name="TextAppearance.ContextualCardDismissalText"
-           parent="@android:style/TextAppearance.Material.Body1">
+           parent="@*android:style/TextAppearance.DeviceDefault.Body1">
         <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
         <item name="android:textSize">16sp</item>
     </style>
@@ -350,13 +350,13 @@
         <item name="android:gravity">center_vertical</item>
     </style>
 
-    <style name="FingerprintHeaderStyle" parent="android:style/TextAppearance.Material.Subhead">
+    <style name="FingerprintHeaderStyle" parent="@*android:style/TextAppearance.DeviceDefault.Subhead">
         <item name="android:paddingTop">16dp</item>
         <item name="android:textColor">@color/primary_dark_material_light</item>
         <item name="android:lineSpacingMultiplier">1.2</item>
     </style>
 
-    <style name="FaceHeaderStyle" parent="android:style/TextAppearance.Material.Subhead">
+    <style name="FaceHeaderStyle" parent="@*android:style/TextAppearance.DeviceDefault.Subhead">
         <item name="android:paddingTop">16dp</item>
         <item name="android:textColor">@color/primary_dark_material_light</item>
         <item name="android:lineSpacingMultiplier">1.2</item>
@@ -411,13 +411,13 @@
 
     <style name="device_info_dialog_label">
         <item name="android:textAlignment">viewStart</item>
-        <item name="android:textAppearance">@android:style/TextAppearance.Material.Body1</item>
+        <item name="android:textAppearance">@*android:style/TextAppearance.DeviceDefault.Body1</item>
         <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
 
     <style name="device_info_dialog_value">
         <item name="android:textAlignment">viewStart</item>
-        <item name="android:textAppearance">@android:style/TextAppearance.Material.Body2</item>
+        <item name="android:textAppearance">@*android:style/TextAppearance.DeviceDefault.Body2</item>
         <item name="android:paddingBottom">24dp</item>
     </style>
 
@@ -459,6 +459,7 @@
 
     <style name="ContextualCardDismissalButton"
            parent="android:Widget.DeviceDefault.Button.Borderless.Colored">
+        <item name="android:minHeight">16dp</item>
         <item name="android:textAllCaps">false</item>
     </style>
 
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 6b05a7c..6041ef8 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -180,7 +180,7 @@
         <item name="android:windowNoTitle">true</item>
     </style>
 
-    <style name="Theme.Settings.HomeBase" parent="Theme.AppCompat.DayNight.NoActionBar">
+    <style name="Theme.Settings.HomeBase" parent="Theme.Settings.NoActionBar">
         <item name="colorPrimary">@*android:color/primary_device_default_settings_light</item>
         <item name="colorAccent">@*android:color/accent_device_default_light</item>
         <item name="preferenceTheme">@style/PreferenceTheme</item>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index be45cd0..2eedca5 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -191,6 +191,12 @@
             android:title="@string/enable_gpu_debug_layers"
             android:summary="@string/enable_gpu_debug_layers_summary" />
 
+        <Preference
+            android:key="gup_dashboard"
+            android:title="@string/gup_dashboard_title"
+            android:summary="@string/gup_dashboard_summary"
+            android:fragment="com.android.settings.development.gup.GupDashboard" />
+
     </PreferenceCategory>
 
     <PreferenceCategory
@@ -424,9 +430,10 @@
             android:summary="%s"
             android:title="@string/simulate_color_space" />
 
-        <Preference android:key="updated_gfx_driver_dev_opt_in_app"
-            android:summary="@string/updated_gfx_driver_dev_opt_in_app_summary"
-            android:title="@string/updated_gfx_driver_dev_opt_in_app" />
+        <Preference
+            android:title="@string/gup_dev_opt_in_app"
+            android:key="gup_dev_opt_in_app"
+            android:summary="@string/gup_dev_opt_in_app_summary" />
 
     </PreferenceCategory>
 
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 50a5649..76b3d2e 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -79,6 +79,11 @@
         settings:controller="com.android.settings.display.ColorModePreferenceController"
         settings:keywords="@string/keywords_color_mode" />
 
+    <SwitchPreference
+        android:key="display_white_balance"
+        android:title="@string/display_white_balance_title"
+        settings:controller="com.android.settings.display.DisplayWhiteBalancePreferenceController" />
+
     <Preference
         android:key="font_size"
         android:title="@string/title_font_size"
diff --git a/res/xml/gup_settings.xml b/res/xml/gup_settings.xml
new file mode 100644
index 0000000..6344adb
--- /dev/null
+++ b/res/xml/gup_settings.xml
@@ -0,0 +1,20 @@
+<?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"
+    android:title="@string/gup_dashboard_title" />
diff --git a/res/xml/prevent_ringing_gesture_settings.xml b/res/xml/prevent_ringing_gesture_settings.xml
index 62f0223..4b0edc3 100644
--- a/res/xml/prevent_ringing_gesture_settings.xml
+++ b/res/xml/prevent_ringing_gesture_settings.xml
@@ -26,8 +26,11 @@
         app:animation="@raw/gesture_prevent_ringing"
         app:preview="@drawable/gesture_prevent_ringing" />
 
+    <com.android.settingslib.widget.LayoutPreference
+        android:key="gesture_prevent_ringing_switch"
+        android:layout="@layout/styled_switch_bar" />
+
     <PreferenceCategory
         android:key="gesture_prevent_ringing_category"
-        android:title="@string/gesture_prevent_ringing_title">
-    </PreferenceCategory>
+        android:title="@string/gesture_prevent_ringing_title" />
 </PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 0ddc1fc..798c188 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -150,7 +150,8 @@
             getNextButton().setVisibility(View.VISIBLE);
         } else {
             mErrorText.setText(errorMsg);
-            getNextButton().setVisibility(View.GONE);
+            getNextButton().setText(getResources().getString(R.string.done));
+            getNextButton().setVisibility(View.VISIBLE);
         }
     }
 
@@ -162,8 +163,13 @@
 
     @Override
     protected void onNextButtonClick(View view) {
-        // Lock thingy is already set up, launch directly to the next page
-        launchNextEnrollingActivity(mToken);
+        if (checkMaxEnrolled() == 0) {
+            // Lock thingy is already set up, launch directly to the next page
+            launchNextEnrollingActivity(mToken);
+        } else {
+            setResult(RESULT_FINISHED);
+            finish();
+        }
     }
 
     private void launchChooseLock() {
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
index eab2a28..2ea3371 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
@@ -52,8 +52,6 @@
         LocalBluetoothProfileManager.ServiceListener {
     private static final String TAG = "BluetoothDeviceUpdater";
     private static final boolean DBG = true;
-    private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
-            "persist.bluetooth.showdeviceswithoutnames";
 
     protected final DevicePreferenceCallback mDevicePreferenceCallback;
     protected final Map<BluetoothDevice, Preference> mPreferenceMap;
@@ -62,8 +60,6 @@
     @VisibleForTesting
     protected LocalBluetoothManager mLocalManager;
 
-    private final boolean mShowDeviceWithoutNames;
-
     @VisibleForTesting
     final GearPreference.OnGearClickListener mDeviceProfilesListener = pref -> {
         launchDeviceDetails(pref);
@@ -79,8 +75,6 @@
             DevicePreferenceCallback devicePreferenceCallback, LocalBluetoothManager localManager) {
         mFragment = fragment;
         mDevicePreferenceCallback = devicePreferenceCallback;
-        mShowDeviceWithoutNames = SystemProperties.getBoolean(
-                BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
         mPreferenceMap = new HashMap<>();
         mLocalManager = localManager;
     }
@@ -223,7 +217,7 @@
         if (!mPreferenceMap.containsKey(device)) {
             BluetoothDevicePreference btPreference =
                     new BluetoothDevicePreference(mPrefContext, cachedDevice,
-                            mShowDeviceWithoutNames);
+                            true /* showDeviceWithoutNames */);
             btPreference.setOnGearClickListener(mDeviceProfilesListener);
             if (this instanceof Preference.OnPreferenceClickListener) {
                 btPreference.setOnPreferenceClickListener(
diff --git a/src/com/android/settings/development/DevelopmentOptionsActivityRequestCodes.java b/src/com/android/settings/development/DevelopmentOptionsActivityRequestCodes.java
index e65d2ad..a67aac4 100644
--- a/src/com/android/settings/development/DevelopmentOptionsActivityRequestCodes.java
+++ b/src/com/android/settings/development/DevelopmentOptionsActivityRequestCodes.java
@@ -32,5 +32,5 @@
 
     int REQUEST_CODE_ANGLE_DRIVER_VALUES = 5;
 
-    int REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP = 6;
+    int REQUEST_CODE_GUP_DEV_OPT_IN_APPS = 6;
 }
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index aa9918c..5990320 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -423,7 +423,7 @@
         controllers.add(new SelectDebugAppPreferenceController(context, fragment));
         controllers.add(new WaitForDebuggerPreferenceController(context));
         controllers.add(new EnableGpuDebugLayersPreferenceController(context));
-        controllers.add(new UpdatedGfxDriverDevOptInPreferenceController(context, fragment));
+        controllers.add(new GameUpdatePackageDevOptInPreferenceController(context, fragment));
         controllers.add(new VerifyAppsOverUsbPreferenceController(context));
         controllers.add(new LogdSizePreferenceController(context));
         controllers.add(new LogPersistPreferenceController(context, fragment, lifecycle));
diff --git a/src/com/android/settings/development/UpdatedGfxDriverDevOptInPreferenceController.java b/src/com/android/settings/development/GameUpdatePackageDevOptInPreferenceController.java
similarity index 74%
rename from src/com/android/settings/development/UpdatedGfxDriverDevOptInPreferenceController.java
rename to src/com/android/settings/development/GameUpdatePackageDevOptInPreferenceController.java
index ad2131e..2d29505 100644
--- a/src/com/android/settings/development/UpdatedGfxDriverDevOptInPreferenceController.java
+++ b/src/com/android/settings/development/GameUpdatePackageDevOptInPreferenceController.java
@@ -17,7 +17,7 @@
 package com.android.settings.development;
 
 import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes
-        .REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP;
+        .REQUEST_CODE_GUP_DEV_OPT_IN_APPS;
 
 import android.app.Activity;
 import android.content.Context;
@@ -33,17 +33,16 @@
 import com.android.settingslib.development.DeveloperOptionsPreferenceController;
 
 // TODO(b/119221883): Need to override isAvailable() to return false when updatable graphics driver is not supported.
-public class UpdatedGfxDriverDevOptInPreferenceController
+public class GameUpdatePackageDevOptInPreferenceController
         extends DeveloperOptionsPreferenceController
         implements PreferenceControllerMixin, OnActivityResultListener {
 
-    private static final String UPDATED_GFX_DRIVER_DEV_OPT_IN_APP_KEY =
-            "updated_gfx_driver_dev_opt_in_app";
+    private static final String GUP_DEV_OPT_IN_APP_KEY = "gup_dev_opt_in_app";
 
     private final DevelopmentSettingsDashboardFragment mFragment;
     private final PackageManager mPackageManager;
 
-    public UpdatedGfxDriverDevOptInPreferenceController(Context context,
+    public GameUpdatePackageDevOptInPreferenceController(Context context,
             DevelopmentSettingsDashboardFragment fragment) {
         super(context);
         mFragment = fragment;
@@ -52,16 +51,15 @@
 
     @Override
     public String getPreferenceKey() {
-        return UPDATED_GFX_DRIVER_DEV_OPT_IN_APP_KEY;
+        return GUP_DEV_OPT_IN_APP_KEY;
     }
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (UPDATED_GFX_DRIVER_DEV_OPT_IN_APP_KEY.equals(preference.getKey())) {
+        if (GUP_DEV_OPT_IN_APP_KEY.equals(preference.getKey())) {
             // pass it on to settings
             final Intent intent = getActivityStartIntent();
-            mFragment.startActivityForResult(intent,
-                    REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP);
+            mFragment.startActivityForResult(intent, REQUEST_CODE_GUP_DEV_OPT_IN_APPS);
             return true;
         }
         return false;
@@ -74,12 +72,12 @@
 
     @Override
     public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (requestCode != REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP
+        if (requestCode != REQUEST_CODE_GUP_DEV_OPT_IN_APPS
                 || resultCode != Activity.RESULT_OK) {
             return false;
         }
         Settings.Global.putString(mContext.getContentResolver(),
-                Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, data.getAction());
+                Settings.Global.GUP_DEV_OPT_IN_APPS, data.getAction());
         updatePreferenceSummary();
         return true;
     }
@@ -88,7 +86,7 @@
     protected void onDeveloperOptionsSwitchDisabled() {
         super.onDeveloperOptionsSwitchDisabled();
         mPreference.setSummary(mContext.getResources().getString(
-                R.string.updated_gfx_driver_dev_opt_in_app_not_set));
+                R.string.gup_dev_opt_in_app_not_set));
     }
 
     @VisibleForTesting
@@ -99,15 +97,14 @@
     }
 
     private void updatePreferenceSummary() {
-        final String updatedGfxDriverDevOptInApp = Settings.Global.getString(
-                mContext.getContentResolver(), Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP);
-        if (updatedGfxDriverDevOptInApp != null && !updatedGfxDriverDevOptInApp.isEmpty()) {
+        final String optInApp = Settings.Global.getString(
+                mContext.getContentResolver(), Settings.Global.GUP_DEV_OPT_IN_APPS);
+        if (optInApp != null && !optInApp.isEmpty()) {
             mPreference.setSummary(mContext.getResources().getString(
-                    R.string.updated_gfx_driver_dev_opt_in_app_set,
-                    getAppLabel(updatedGfxDriverDevOptInApp)));
+                    R.string.gup_dev_opt_in_app_set, getAppLabel(optInApp)));
         } else {
             mPreference.setSummary(mContext.getResources().getString(
-                    R.string.updated_gfx_driver_dev_opt_in_app_not_set));
+                    R.string.gup_dev_opt_in_app_not_set));
         }
     }
 
diff --git a/src/com/android/settings/development/gup/GupDashboard.java b/src/com/android/settings/development/gup/GupDashboard.java
new file mode 100644
index 0000000..674a0a9
--- /dev/null
+++ b/src/com/android/settings/development/gup/GupDashboard.java
@@ -0,0 +1,50 @@
+/*
+ * 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.settings.development.gup;
+
+import android.content.Context;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import java.util.List;
+
+public class GupDashboard extends DashboardFragment {
+    private static final String TAG = "GupDashboard";
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.SETTINGS_GUP_DASHBOARD;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.gup_settings;
+    }
+
+    @Override
+    public int getHelpResource() {
+        return 0;
+    }
+}
diff --git a/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.java b/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.java
new file mode 100644
index 0000000..f1363a3
--- /dev/null
+++ b/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.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.settings.display;
+
+import android.content.Context;
+import android.hardware.display.ColorDisplayManager;
+import android.os.UserHandle;
+import android.provider.Settings.Secure;
+import com.android.settings.core.TogglePreferenceController;
+
+public class DisplayWhiteBalancePreferenceController extends TogglePreferenceController {
+
+    public DisplayWhiteBalancePreferenceController(Context context, String key) {
+        super(context, key);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return ColorDisplayManager.isDisplayWhiteBalanceAvailable(mContext) ?
+                AVAILABLE : DISABLED_FOR_USER;
+    }
+
+    @Override
+    public boolean isChecked() {
+        return Secure.getIntForUser(mContext.getContentResolver(),
+                Secure.DISPLAY_WHITE_BALANCE_ENABLED, 0, UserHandle.USER_CURRENT) == 1;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        Secure.putIntForUser(mContext.getContentResolver(), Secure.DISPLAY_WHITE_BALANCE_ENABLED,
+                isChecked ? 1 : 0, UserHandle.USER_CURRENT);
+        return true;
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index 48f4cc1..3064d4f 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -21,8 +21,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.icu.text.NumberFormat;
 import android.os.BatteryManager;
 import android.os.PowerManager;
+import android.text.TextUtils;
 import android.widget.TextView;
 
 import androidx.annotation.VisibleForTesting;
@@ -83,7 +85,7 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mBatteryLayoutPref = (LayoutPreference) screen.findPreference(getPreferenceKey());
+        mBatteryLayoutPref = screen.findPreference(getPreferenceKey());
         mBatteryMeterView = mBatteryLayoutPref
                 .findViewById(R.id.battery_header_icon);
         mBatteryPercentText = mBatteryLayoutPref.findViewById(R.id.battery_percent);
@@ -107,7 +109,7 @@
     }
 
     public void updateHeaderPreference(BatteryInfo info) {
-        mBatteryPercentText.setText(Utils.formatPercentage(info.batteryLevel));
+        mBatteryPercentText.setText(formatBatteryPercentageText(info.batteryLevel));
         if (info.remainingLabel == null) {
             mSummary1.setText(info.statusLabel);
         } else {
@@ -133,6 +135,11 @@
         mBatteryMeterView.setBatteryLevel(batteryLevel);
         mBatteryMeterView.setCharging(!discharging);
         mBatteryMeterView.setPowerSave(mPowerManager.isPowerSaveMode());
-        mBatteryPercentText.setText(Utils.formatPercentage(batteryLevel));
+        mBatteryPercentText.setText(formatBatteryPercentageText(batteryLevel));
+    }
+
+    private CharSequence formatBatteryPercentageText(int batteryLevel) {
+        return TextUtils.expandTemplate(mContext.getText(R.string.battery_header_title_alternate),
+                NumberFormat.getIntegerInstance().format(batteryLevel));
     }
 }
diff --git a/src/com/android/settings/gestures/PreventRingingGesturePreferenceController.java b/src/com/android/settings/gestures/PreventRingingGesturePreferenceController.java
index cb9bf4f..8f037ce 100644
--- a/src/com/android/settings/gestures/PreventRingingGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/PreventRingingGesturePreferenceController.java
@@ -46,7 +46,7 @@
         OnResume, OnPause, OnCreate, PreferenceControllerMixin {
 
     @VisibleForTesting static final String KEY_VIBRATE = "prevent_ringing_option_vibrate";
-    @VisibleForTesting static final String KEY_NONE = "prevent_ringing_option_none";
+
     @VisibleForTesting static final String KEY_MUTE = "prevent_ringing_option_mute";
 
     private final String KEY_VIDEO_PAUSED = "key_video_paused";
@@ -57,9 +57,8 @@
     private VideoPreference mVideoPreference;
     private boolean mVideoPaused;
 
-    private PreferenceCategory mPreferenceCategory;
+    @VisibleForTesting PreferenceCategory mPreferenceCategory;
     @VisibleForTesting RadioButtonPreference mVibratePref;
-    @VisibleForTesting RadioButtonPreference mNonePref;
     @VisibleForTesting RadioButtonPreference mMutePref;
 
     private SettingObserver mSettingObserver;
@@ -80,7 +79,6 @@
             mPreferenceCategory = (PreferenceCategory) screen.findPreference(getPreferenceKey());
             mVibratePref = makeRadioPreference(KEY_VIBRATE, R.string.prevent_ringing_option_vibrate);
             mMutePref = makeRadioPreference(KEY_MUTE, R.string.prevent_ringing_option_mute);
-            mNonePref = makeRadioPreference(KEY_NONE, R.string.prevent_ringing_option_none);
 
             if (mPreferenceCategory != null) {
                 mSettingObserver = new SettingObserver(mPreferenceCategory);
@@ -124,19 +122,21 @@
     public void updateState(Preference preference) {
         int preventRingingSetting = Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_VIBRATE);
-
         final boolean isVibrate = preventRingingSetting == Settings.Secure.VOLUME_HUSH_VIBRATE;
         final boolean isMute = preventRingingSetting == Settings.Secure.VOLUME_HUSH_MUTE;
-        final boolean isOff = preventRingingSetting == Settings.Secure.VOLUME_HUSH_OFF
-                || (!isVibrate && !isMute);
         if (mVibratePref != null && mVibratePref.isChecked() != isVibrate) {
             mVibratePref.setChecked(isVibrate);
         }
         if (mMutePref != null && mMutePref.isChecked() != isMute) {
             mMutePref.setChecked(isMute);
         }
-        if (mNonePref != null && mNonePref.isChecked() != isOff) {
-            mNonePref.setChecked(isOff);
+
+        if (preventRingingSetting == Settings.Secure.VOLUME_HUSH_OFF) {
+            mVibratePref.setEnabled(false);
+            mMutePref.setEnabled(false);
+        } else {
+            mVibratePref.setEnabled(true);
+            mMutePref.setEnabled(true);
         }
     }
 
@@ -173,13 +173,12 @@
 
     private int keyToSetting(String key) {
         switch (key) {
-            case KEY_NONE:
-                return Settings.Secure.VOLUME_HUSH_OFF;
             case KEY_MUTE:
                 return Settings.Secure.VOLUME_HUSH_MUTE;
             case KEY_VIBRATE:
-            default:
                 return Settings.Secure.VOLUME_HUSH_VIBRATE;
+            default:
+                return Settings.Secure.VOLUME_HUSH_OFF;
         }
     }
 
diff --git a/src/com/android/settings/gestures/PreventRingingGestureSettings.java b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
index 3e8ae85..420a019 100644
--- a/src/com/android/settings/gestures/PreventRingingGestureSettings.java
+++ b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
@@ -35,7 +35,6 @@
 public class PreventRingingGestureSettings extends DashboardFragment {
 
     private static final String TAG = "RingingGestureSettings";
-    private static final String KEY_PREVENT_RINGING = "gesture_prevent_ringing";
 
     @Override
     public void onAttach(Context context) {
@@ -51,6 +50,7 @@
             Lifecycle lifecycle) {
         List<AbstractPreferenceController> controllers = new ArrayList<>();
         controllers.add(new PreventRingingGesturePreferenceController(context, lifecycle));
+        controllers.add(new PreventRingingSwitchPreferenceController(context));
         return controllers;
     }
 
diff --git a/src/com/android/settings/gestures/PreventRingingSwitchPreferenceController.java b/src/com/android/settings/gestures/PreventRingingSwitchPreferenceController.java
new file mode 100644
index 0000000..b94cfff
--- /dev/null
+++ b/src/com/android/settings/gestures/PreventRingingSwitchPreferenceController.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.settings.gestures;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.widget.Switch;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.widget.SwitchBar;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.widget.LayoutPreference;
+
+public class PreventRingingSwitchPreferenceController extends AbstractPreferenceController
+    implements PreferenceControllerMixin, SwitchBar.OnSwitchChangeListener {
+
+    private static final String KEY = "gesture_prevent_ringing_switch";
+    private final Context mContext;
+    private SettingObserver mSettingObserver;
+
+    @VisibleForTesting SwitchBar mSwitch;
+
+    public PreventRingingSwitchPreferenceController(Context context) {
+        super(context);
+        mContext = context;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        if (isAvailable()) {
+            LayoutPreference pref = (LayoutPreference) screen.findPreference(getPreferenceKey());
+            if (pref != null) {
+                mSettingObserver = new SettingObserver(pref);
+                mSwitch = pref.findViewById(R.id.switch_bar);
+                if (mSwitch != null) {
+                    mSwitch.addOnSwitchChangeListener(this);
+                    mSwitch.show();
+                }
+            }
+        }
+    }
+
+    public void setChecked(boolean isChecked) {
+        if (mSwitch != null) {
+            mSwitch.setChecked(isChecked);
+        }
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        int preventRingingSetting = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_VIBRATE);
+        setChecked(preventRingingSetting != Settings.Secure.VOLUME_HUSH_OFF);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_volumeHushGestureEnabled);
+    }
+
+    @Override
+    public void onSwitchChanged(Switch switchView, boolean isChecked) {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.VOLUME_HUSH_GESTURE, isChecked ? Settings.Secure.VOLUME_HUSH_VIBRATE
+                        : Settings.Secure.VOLUME_HUSH_OFF);
+    }
+
+    private class SettingObserver extends ContentObserver {
+        private final Uri VOLUME_HUSH_GESTURE = Settings.Secure.getUriFor(
+                Settings.Secure.VOLUME_HUSH_GESTURE);
+
+        private final Preference mPreference;
+
+        public SettingObserver(Preference preference) {
+            super(new Handler());
+            mPreference = preference;
+        }
+
+        public void register(ContentResolver cr) {
+            cr.registerContentObserver(VOLUME_HUSH_GESTURE, false, this);
+        }
+
+        public void unregister(ContentResolver cr) {
+            cr.unregisterContentObserver(this);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+            if (uri == null || VOLUME_HUSH_GESTURE.equals(uri)) {
+                updateState(mPreference);
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index d3f11a0..d40006f 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -19,6 +19,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.FeatureFlagUtils;
+import android.view.View;
 import android.widget.ImageView;
 import android.widget.Toolbar;
 
@@ -47,6 +48,7 @@
             return;
         }
 
+        updateWindowProperties();
         setContentView(R.layout.settings_homepage_container);
 
         final Toolbar toolbar = findViewById(R.id.search_action_bar);
@@ -73,4 +75,15 @@
         }
         fragmentTransaction.commit();
     }
+
+    private void updateWindowProperties() {
+        final View decorView = getWindow().getDecorView();
+        decorView.setSystemUiVisibility(
+                decorView.getSystemUiVisibility() |
+                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
+                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+        );
+
+        getWindow().setStatusBarColor(getResources().getColor(R.color.homepage_status_bar_color));
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
index 6a75274..b2bec7f 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
@@ -273,7 +273,7 @@
     private SliceAction buildBluetoothDetailDeepLinkAction(CachedBluetoothDevice bluetoothDevice) {
         return SliceAction.createDeeplink(
                 getBluetoothDetailIntent(bluetoothDevice),
-                IconCompat.createWithResource(mContext, R.drawable.ic_settings),
+                IconCompat.createWithResource(mContext, R.drawable.ic_settings_24dp),
                 ListBuilder.ICON_IMAGE,
                 bluetoothDevice.getName());
     }
@@ -287,9 +287,7 @@
         final CharSequence title = mContext.getText(R.string.bluetooth_pairing_pref_title);
         final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_menu_add);
         final SliceAction sliceAction = SliceAction.createDeeplink(
-                getPairNewDeviceIntent(),
-                IconCompat.createWithResource(mContext, R.drawable.ic_settings),
-                ListBuilder.ICON_IMAGE, title);
+                getPairNewDeviceIntent(), icon, ListBuilder.ICON_IMAGE, title);
 
         return new ListBuilder.RowBuilder()
                 .setTitleItem(icon, ListBuilder.ICON_IMAGE)
diff --git a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java
index 5bfc584..1fd1986 100644
--- a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java
+++ b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java
@@ -6,9 +6,10 @@
 
 import android.content.Context;
 import android.location.LocationManager;
-import android.permission.RuntimePermissionPresenter;
+import android.permission.PermissionControllerManager;
 import android.provider.Settings;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
 import com.android.settings.R;
@@ -24,9 +25,11 @@
 
     private static final String KEY_APP_LEVEL_PERMISSIONS = "app_level_permissions";
     /** Total number of apps that has location permission. */
-    private int mNumTotal = -1;
+    @VisibleForTesting
+    int mNumTotal = -1;
     /** Total number of apps that has background location permission. */
-    private int mNumBackground = -1;
+    @VisibleForTesting
+    int mNumBackground = -1;
     private final LocationManager mLocationManager;
     private Preference mPreference;
 
@@ -70,7 +73,9 @@
         if (!mLocationManager.isLocationEnabled()) {
             return;
         }
-        RuntimePermissionPresenter.getInstance(mContext).countPermissionApps(
+        PermissionControllerManager permController =
+                mContext.getSystemService(PermissionControllerManager.class);
+        permController.countPermissionApps(
                 Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), false, false,
                 (numApps) -> {
                     mNumTotal = numApps;
@@ -79,7 +84,7 @@
                     }
                 }, null);
 
-        RuntimePermissionPresenter.getInstance(mContext).countPermissionApps(
+        permController.countPermissionApps(
                 Collections.singletonList(ACCESS_BACKGROUND_LOCATION), true, false,
                 (numApps) -> {
                     mNumBackground = numApps;
diff --git a/src/com/android/settings/location/TopLevelLocationPreferenceController.java b/src/com/android/settings/location/TopLevelLocationPreferenceController.java
index d0bd9a9..6d7789f 100644
--- a/src/com/android/settings/location/TopLevelLocationPreferenceController.java
+++ b/src/com/android/settings/location/TopLevelLocationPreferenceController.java
@@ -1,6 +1,5 @@
 package com.android.settings.location;
 
-import static android.Manifest.permission.ACCESS_BACKGROUND_LOCATION;
 import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
 import static android.Manifest.permission.ACCESS_FINE_LOCATION;
 
@@ -9,8 +8,9 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.location.LocationManager;
-import android.permission.RuntimePermissionPresenter;
+import android.permission.PermissionControllerManager;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
 import com.android.settings.R;
@@ -20,7 +20,6 @@
 import com.android.settingslib.core.lifecycle.events.OnStop;
 
 import java.util.Arrays;
-import java.util.Collections;
 
 public class TopLevelLocationPreferenceController extends BasePreferenceController implements
         LifecycleObserver, OnStart, OnStop {
@@ -56,6 +55,12 @@
         }
     }
 
+    @VisibleForTesting
+    void setLocationAppCount(int numApps) {
+        mNumTotal = numApps;
+        refreshSummary(mPreference);
+    }
+
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
@@ -65,11 +70,10 @@
         if (!mLocationManager.isLocationEnabled()) {
             return;
         }
-        RuntimePermissionPresenter.getInstance(mContext).countPermissionApps(
+        mContext.getSystemService(PermissionControllerManager.class).countPermissionApps(
                 Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION), false, false,
                 (numApps) -> {
-                    mNumTotal = numApps;
-                    refreshSummary(preference);
+                    setLocationAppCount(numApps);
                 }, null);
     }
 
diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
index 48fb710..ec9a841 100644
--- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
@@ -72,7 +72,7 @@
                 && MobileNetworkUtils.isWifiCallingEnabled(mContext,
                 SubscriptionManager.getPhoneId(mSubId))
                 ? AVAILABLE
-                : CONDITIONALLY_UNAVAILABLE;
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/nfc/AndroidBeamPreferenceController.java b/src/com/android/settings/nfc/AndroidBeamPreferenceController.java
index 181faa5..b784dc5 100644
--- a/src/com/android/settings/nfc/AndroidBeamPreferenceController.java
+++ b/src/com/android/settings/nfc/AndroidBeamPreferenceController.java
@@ -16,6 +16,7 @@
 package com.android.settings.nfc;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.nfc.NfcAdapter;
 
 import androidx.preference.PreferenceScreen;
@@ -54,6 +55,10 @@
     @Override
     @AvailabilityStatus
     public int getAvailabilityStatus() {
+        PackageManager pm = mContext.getPackageManager();
+        if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM)) {
+                return UNSUPPORTED_ON_DEVICE;
+        }
         return mNfcAdapter != null
                 ? AVAILABLE
                 : UNSUPPORTED_ON_DEVICE;
diff --git a/src/com/android/settings/notification/NotificationStation.java b/src/com/android/settings/notification/NotificationStation.java
index d3ebc08..116980f 100644
--- a/src/com/android/settings/notification/NotificationStation.java
+++ b/src/com/android/settings/notification/NotificationStation.java
@@ -16,10 +16,13 @@
 
 package com.android.settings.notification;
 
+import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
+
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.INotificationManager;
 import android.app.Notification;
+import android.app.NotificationChannel;
 import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.content.Context;
@@ -354,28 +357,53 @@
                         getString(R.string.notification_log_details_group_summary)));
             }
         }
-        sb.append("\n")
-                .append(bold(getString(R.string.notification_log_details_sound)))
-                .append(delim);
-        if (0 != (n.defaults & Notification.DEFAULT_SOUND)) {
-            sb.append(getString(R.string.notification_log_details_default));
-        } else if (n.sound != null) {
-            sb.append(n.sound.toString());
-        } else {
-            sb.append(getString(R.string.notification_log_details_none));
-        }
-        sb.append("\n")
-                .append(bold(getString(R.string.notification_log_details_vibrate)))
-                .append(delim);
-        if (0 != (n.defaults & Notification.DEFAULT_VIBRATE)) {
-            sb.append(getString(R.string.notification_log_details_default));
-        } else if (n.vibrate != null) {
-            for (int vi=0;vi<n.vibrate.length;vi++) {
-                if (vi > 0) sb.append(',');
-                sb.append(String.valueOf(n.vibrate[vi]));
+        if (info.active) {
+            // mRanking only applies to active notifications
+            if (mRanking != null && mRanking.getRanking(sbn.getKey(), rank)) {
+                if (rank.getLastAudiblyAlertedMillis() > 0) {
+                    sb.append("\n")
+                            .append(bold(getString(R.string.notification_log_details_alerted)));
+                }
             }
-        } else {
-            sb.append(getString(R.string.notification_log_details_none));
+        }
+        try {
+            NotificationChannel channel = mNoMan.getNotificationChannelForPackage(
+                    sbn.getPackageName(), sbn.getUid(), n.getChannelId(), false);
+            sb.append("\n")
+                    .append(bold(getString(R.string.notification_log_details_sound)))
+                    .append(delim);
+            if (channel.getImportance() == IMPORTANCE_UNSPECIFIED) {
+
+                if (0 != (n.defaults & Notification.DEFAULT_SOUND)) {
+                    sb.append(getString(R.string.notification_log_details_default));
+                } else if (n.sound != null) {
+                    sb.append(n.sound.toString());
+                } else {
+                    sb.append(getString(R.string.notification_log_details_none));
+                }
+            } else {
+                sb.append(String.valueOf(channel.getSound()));
+            }
+            sb.append("\n")
+                    .append(bold(getString(R.string.notification_log_details_vibrate)))
+                    .append(delim);
+            if (channel.getImportance() == IMPORTANCE_UNSPECIFIED) {
+                if (0 != (n.defaults & Notification.DEFAULT_VIBRATE)) {
+                    sb.append(getString(R.string.notification_log_details_default));
+                } else if (n.vibrate != null) {
+                    sb.append(getString(R.string.notification_log_details_vibrate_pattern));
+                } else {
+                    sb.append(getString(R.string.notification_log_details_none));
+                }
+            } else {
+                if (channel.getVibrationPattern() != null) {
+                    sb.append(getString(R.string.notification_log_details_vibrate_pattern));
+                } else {
+                    sb.append(getString(R.string.notification_log_details_none));
+                }
+            }
+        } catch (RemoteException e) {
+            Log.d(TAG, "cannot read channel info", e);
         }
         sb.append("\n")
                 .append(bold(getString(R.string.notification_log_details_visibility)))
diff --git a/src/com/android/settings/slices/SlicePreference.java b/src/com/android/settings/slices/SlicePreference.java
index 98719f7..37a53f4 100644
--- a/src/com/android/settings/slices/SlicePreference.java
+++ b/src/com/android/settings/slices/SlicePreference.java
@@ -33,12 +33,17 @@
 
     public SlicePreference(Context context, AttributeSet attrs) {
         super(context, attrs, R.attr.slicePreferenceStyle);
-        mSliceView = findViewById(R.id.slice_view);
+        init();
     }
 
     public SlicePreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, R.attr.slicePreferenceStyle);
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+    private void init() {
         mSliceView = findViewById(R.id.slice_view);
+        mSliceView.showTitleItems(true);
     }
 
     public void onSliceUpdated(Slice slice) {
diff --git a/src/com/android/settings/widget/VideoPreference.java b/src/com/android/settings/widget/VideoPreference.java
index d5d4f5e..fd215d8 100644
--- a/src/com/android/settings/widget/VideoPreference.java
+++ b/src/com/android/settings/widget/VideoPreference.java
@@ -54,6 +54,7 @@
     private float mAspectRadio = 1.0f;
     private int mPreviewResource;
     private boolean mViewVisible;
+    private Surface mSurface;
 
     public VideoPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -68,17 +69,12 @@
                     .authority(context.getPackageName())
                     .appendPath(String.valueOf(animation))
                     .build();
-            mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
+            mPreviewResource = attributes.getResourceId(
+                    R.styleable.VideoPreference_preview, 0);
+            initMediaPlayer();
             if (mMediaPlayer != null && mMediaPlayer.getDuration() > 0) {
                 setVisible(true);
                 setLayoutResource(R.layout.video_preference);
-
-                mPreviewResource = attributes.getResourceId(
-                        R.styleable.VideoPreference_preview, 0);
-
-                mMediaPlayer.setOnSeekCompleteListener(mp -> mVideoReady = true);
-
-                mMediaPlayer.setOnPreparedListener(mediaPlayer -> mediaPlayer.setLooping(true));
                 mAnimationAvailable = true;
                 updateAspectRatio();
             } else {
@@ -127,9 +123,8 @@
             public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
                     int height) {
                 if (mMediaPlayer != null) {
-                    mMediaPlayer.setSurface(new Surface(surfaceTexture));
-                    mVideoReady = false;
-                    mMediaPlayer.seekTo(0);
+                    mSurface = new Surface(surfaceTexture);
+                    mMediaPlayer.setSurface(mSurface);
                 }
             }
 
@@ -168,26 +163,40 @@
 
     @Override
     public void onDetached() {
-        if (mMediaPlayer != null) {
-            mMediaPlayer.stop();
-            mMediaPlayer.reset();
-            mMediaPlayer.release();
-        }
+        releaseMediaPlayer();
         super.onDetached();
     }
 
     public void onViewVisible(boolean videoPaused) {
         mViewVisible = true;
         mVideoPaused = videoPaused;
-        if (mVideoReady && mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
-            mMediaPlayer.seekTo(0);
-        }
+        initMediaPlayer();
     }
 
     public void onViewInvisible() {
         mViewVisible = false;
-        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
-            mMediaPlayer.pause();
+        releaseMediaPlayer();
+    }
+
+    private void initMediaPlayer() {
+        if (mMediaPlayer == null) {
+            mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
+            mMediaPlayer.seekTo(0);
+            mMediaPlayer.setOnSeekCompleteListener(mp -> mVideoReady = true);
+            mMediaPlayer.setOnPreparedListener(mediaPlayer -> mediaPlayer.setLooping(true));
+            if (mSurface != null) {
+                mMediaPlayer.setSurface(mSurface);
+            }
+        }
+    }
+
+    private void releaseMediaPlayer() {
+        if (mMediaPlayer != null) {
+            mMediaPlayer.stop();
+            mMediaPlayer.reset();
+            mMediaPlayer.release();
+            mMediaPlayer = null;
+            mVideoReady = false;
         }
     }
 
@@ -197,7 +206,6 @@
 
     @VisibleForTesting
     void updateAspectRatio() {
-        mAspectRadio = mMediaPlayer.getVideoWidth() / (float)mMediaPlayer.getVideoHeight();
+        mAspectRadio = mMediaPlayer.getVideoWidth() / (float) mMediaPlayer.getVideoHeight();
     }
-
 }
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 95e912d..eddae06 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -240,7 +240,7 @@
         mAddPreference.setIcon(R.drawable.ic_menu_add);
         mAddPreference.setTitle(R.string.wifi_add_network);
         if (WifiDppUtils.isSharingNetworkEnabled(getContext())) {
-            mAddPreference.setButtonIcon(R.drawable.ic_qrcode_24dp);
+            mAddPreference.setButtonIcon(R.drawable.ic_scan_24dp);
             mAddPreference.setButtonOnClickListener((View v) -> {
                 // Launch QR code scanner to join a network.
                 getContext().startActivity(
diff --git a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
index 8d6aa68..12814f8 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
@@ -16,7 +16,16 @@
 
 package com.android.settings.wifi.dpp;
 
+import android.app.ActionBar;
+import android.app.Activity;
 import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -26,10 +35,10 @@
  * to the Wi-Fi network.
  */
 public class WifiDppAddDeviceFragment extends WifiDppQrCodeBaseFragment {
-    @Override
-    protected int getLayout() {
-        return R.layout.wifi_dpp_add_device_fragment;
-    }
+    private ImageView mWifiApPictureView;
+    private TextView mChooseDifferentNetwork;
+    private Button mButtonLeft;
+    private Button mButtonRight;
 
     @Override
     public int getMetricsCategory() {
@@ -37,7 +46,46 @@
     }
 
     @Override
-    public void onActivityCreated (Bundle savedInstanceState) {
+    public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+
+        final ActionBar actionBar = getActivity().getActionBar();
+        if (actionBar != null) {
+            actionBar.hide();
+        }
+    }
+
+    @Override
+    public final View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.wifi_dpp_add_device_fragment, container,
+                /* attachToRoot */ false);
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        final WifiNetworkConfig wifiNetworkConfig = ((WifiDppConfiguratorActivity) getActivity())
+                .getWifiNetworkConfig();
+        if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
+            throw new IllegalStateException("Invalid Wi-Fi network for configuring");
+        }
+        mSummary.setText(getString(R.string.wifi_dpp_add_device_to_wifi,
+                wifiNetworkConfig.getSsid()));
+
+        mWifiApPictureView = view.findViewById(R.id.wifi_ap_picture_view);
+        mChooseDifferentNetwork = view.findViewById(R.id.choose_different_network);
+        mButtonLeft = view.findViewById(R.id.button_left);
+        mButtonLeft.setText(R.string.cancel);
+        mButtonLeft.setOnClickListener(v -> getFragmentManager().popBackStack());
+
+        mButtonRight = view.findViewById(R.id.button_right);
+        mButtonRight.setText(R.string.wifi_dpp_share_wifi);
+        mButtonRight.setOnClickListener(v -> startWifiDppInitiator());
+    }
+
+    private void startWifiDppInitiator() {
+        //TODO(b/122331217): starts Wi-Fi DPP initiator handshake here
     }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppChooseSavedWifiNetworkFragment.java b/src/com/android/settings/wifi/dpp/WifiDppChooseSavedWifiNetworkFragment.java
index 66bc349..8037e23 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppChooseSavedWifiNetworkFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppChooseSavedWifiNetworkFragment.java
@@ -16,7 +16,14 @@
 
 package com.android.settings.wifi.dpp;
 
+import android.app.ActionBar;
+import android.app.Activity;
 import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ListView;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -26,10 +33,9 @@
  * {@code WifiDppConfiguratorActivity} to start with this fragment to choose a saved Wi-Fi network.
  */
 public class WifiDppChooseSavedWifiNetworkFragment extends WifiDppQrCodeBaseFragment {
-    @Override
-    protected int getLayout() {
-        return R.layout.wifi_dpp_choose_saved_wifi_network_fragment;
-    }
+    private ListView mSavedWifiNetworkList;
+    private Button mButtonLeft;
+    private Button mButtonRight;
 
     @Override
     public int getMetricsCategory() {
@@ -37,7 +43,38 @@
     }
 
     @Override
-    public void onActivityCreated (Bundle savedInstanceState) {
+    public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+
+        final ActionBar actionBar = getActivity().getActionBar();
+        if (actionBar != null) {
+            actionBar.hide();
+        }
+    }
+
+    @Override
+    public final View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.wifi_dpp_choose_saved_wifi_network_fragment, container,
+                /* attachToRoot */ false);
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        mTitle.setText(R.string.wifi_dpp_choose_network);
+        mSummary.setText(R.string.wifi_dpp_choose_network_to_connect_device);
+
+        mButtonLeft = view.findViewById(R.id.button_left);
+        mButtonLeft.setText(R.string.cancel);
+        mButtonLeft.setOnClickListener(v -> {
+            Activity activity = getActivity();
+            activity.setResult(Activity.RESULT_CANCELED);
+            activity.finish();
+        });
+
+        mButtonRight = view.findViewById(R.id.button_right);
+        mButtonRight.setVisibility(View.GONE);
     }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
index 6c95f09..9c65d10 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
@@ -44,26 +44,37 @@
  * {@code WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY}
  * {@code WifiDppUtils.EXTRA_WIFI_HIDDEN_SSID}
  *
- * For intent action {@code ACTION_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK}, specify Wi-Fi (DPP)
+ * For intent action {@code ACTION_PROCESS_WIFI_DPP_QR_CODE}, specify Wi-Fi (DPP)
  * QR code in {@code WifiDppUtils.EXTRA_QR_CODE}
  */
 public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
         WifiNetworkConfig.Retriever,
-        WifiDppQrCodeGeneratorFragment.OnQrCodeGeneratorFragmentAddButtonClickedListener {
+        WifiDppQrCodeGeneratorFragment.OnQrCodeGeneratorFragmentAddButtonClickedListener,
+        WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener,
+        WifiDppQrCodeScannerFragment.OnScanZxingWifiFormatSuccessListener {
     private static final String TAG = "WifiDppConfiguratorActivity";
 
     public static final String ACTION_CONFIGURATOR_QR_CODE_SCANNER =
             "android.settings.WIFI_DPP_CONFIGURATOR_QR_CODE_SCANNER";
     public static final String ACTION_CONFIGURATOR_QR_CODE_GENERATOR =
             "android.settings.WIFI_DPP_CONFIGURATOR_QR_CODE_GENERATOR";
-    public static final String ACTION_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK =
-            "android.settings.WIFI_DPP_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK";
+    public static final String ACTION_PROCESS_WIFI_DPP_QR_CODE =
+            "android.settings.PROCESS_WIFI_DPP_QR_CODE";
 
     private FragmentManager mFragmentManager;
 
     /** The Wi-Fi network which will be configured */
     private WifiNetworkConfig mWifiNetworkConfig;
 
+    /** The public key from Wi-Fi DPP QR code */
+    private String mPublicKey;
+
+    /** The information from Wi-Fi DPP QR code */
+    private String mInformation;
+
+    /** The Wi-Fi DPP QR code from intent ACTION_PROCESS_WIFI_DPP_QR_CODE */
+    private WifiQrCode mWifiDppQrCode;
+
     @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR;
@@ -107,8 +118,14 @@
                     showQrCodeGeneratorFragment();
                 }
                 break;
-            case ACTION_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK:
-                showChooseSavedWifiNetworkFragment(/* addToBackStack */ false);
+            case ACTION_PROCESS_WIFI_DPP_QR_CODE:
+                String qrCode = intent.getStringExtra(WifiDppUtils.EXTRA_QR_CODE);
+                mWifiDppQrCode = getValidWiFiDppQrCodeOrNull(qrCode);
+                if (mWifiDppQrCode == null) {
+                    cancelActivity = true;
+                } else {
+                    showChooseSavedWifiNetworkFragment(/* addToBackStack */ false);
+                }
                 break;
             default:
                 cancelActivity = true;
@@ -127,8 +144,8 @@
             return;
         }
 
-        WifiDppQrCodeScannerFragment fragment = new WifiDppQrCodeScannerFragment();
-        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
+        final WifiDppQrCodeScannerFragment fragment = new WifiDppQrCodeScannerFragment();
+        final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
 
         fragmentTransaction.replace(R.id.fragment_container, fragment,
                 WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER);
@@ -145,8 +162,8 @@
             return;
         }
 
-        WifiDppQrCodeGeneratorFragment fragment = new WifiDppQrCodeGeneratorFragment();
-        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
+        final WifiDppQrCodeGeneratorFragment fragment = new WifiDppQrCodeGeneratorFragment();
+        final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
 
         fragmentTransaction.replace(R.id.fragment_container, fragment,
                 WifiDppUtils.TAG_FRAGMENT_QR_CODE_GENERATOR);
@@ -160,9 +177,9 @@
             return;
         }
 
-        WifiDppChooseSavedWifiNetworkFragment fragment =
+        final WifiDppChooseSavedWifiNetworkFragment fragment =
                 new WifiDppChooseSavedWifiNetworkFragment();
-        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
+        final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
 
         fragmentTransaction.replace(R.id.fragment_container, fragment,
                 WifiDppUtils.TAG_FRAGMENT_CHOOSE_SAVED_WIFI_NETWORK);
@@ -172,11 +189,57 @@
         fragmentTransaction.commit();
     }
 
+    private void showAddDeviceFragment(boolean addToBackStack) {
+        // Avoid to replace the same fragment during configuration change
+        if (mFragmentManager.findFragmentByTag(
+                WifiDppUtils.TAG_FRAGMENT_ADD_DEVICE) != null) {
+            return;
+        }
+
+        final WifiDppAddDeviceFragment fragment =
+                new WifiDppAddDeviceFragment();
+        final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
+
+        fragmentTransaction.replace(R.id.fragment_container, fragment,
+                WifiDppUtils.TAG_FRAGMENT_ADD_DEVICE);
+        if (addToBackStack) {
+            fragmentTransaction.addToBackStack(/* name */ null);
+        }
+        fragmentTransaction.commit();
+    }
+
+    private WifiQrCode getValidWiFiDppQrCodeOrNull(String qrCode) {
+        WifiQrCode wifiQrCode;
+        try {
+            wifiQrCode = new WifiQrCode(qrCode);
+        } catch(IllegalArgumentException e) {
+            return null;
+        }
+
+        if (WifiQrCode.SCHEME_DPP.equals(wifiQrCode.getScheme())) {
+            return wifiQrCode;
+        }
+
+        return null;
+    }
+
     @Override
     public WifiNetworkConfig getWifiNetworkConfig() {
         return mWifiNetworkConfig;
     }
 
+    public String getPublicKey() {
+        return mPublicKey;
+    }
+
+    public String getInformation() {
+        return mInformation;
+    }
+
+    public WifiQrCode getWifiDppQrCode() {
+        return mWifiDppQrCode;
+    }
+
     @Override
     public boolean setWifiNetworkConfig(WifiNetworkConfig config) {
         if(!WifiNetworkConfig.isValidConfig(config)) {
@@ -188,7 +251,7 @@
     }
 
     @Override
-    public boolean onNavigateUp(){
+    public boolean onNavigateUp() {
         Fragment fragment = mFragmentManager.findFragmentById(R.id.fragment_container);
         if (fragment instanceof WifiDppQrCodeGeneratorFragment) {
             setResult(Activity.RESULT_CANCELED);
@@ -201,7 +264,25 @@
         return false;
     }
 
-    @Override public void onQrCodeGeneratorFragmentAddButtonClicked() {
+    @Override
+    public void onQrCodeGeneratorFragmentAddButtonClicked() {
         showQrCodeScannerFragment(/* addToBackStack */ true);
     }
+
+    @Override
+    public void onScanWifiDppSuccess(String publicKey, String information) {
+        mPublicKey = publicKey;
+        mInformation = information;
+
+        showAddDeviceFragment(/* addToBackStack */ true);
+    }
+
+    @Override
+    public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) {
+        mPublicKey = null;
+        mInformation = null;
+        mWifiNetworkConfig = new WifiNetworkConfig(wifiNetworkConfig);
+
+        showAddDeviceFragment(/* addToBackStack */ true);
+    }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
index 920e736..584a819 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
@@ -16,9 +16,11 @@
 
 package com.android.settings.wifi.dpp;
 
+import android.provider.Settings;
 import android.app.ActionBar;
 import android.app.Activity;
 import android.content.Intent;
+import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.util.Log;
 
@@ -36,7 +38,10 @@
  * To use intent action {@code ACTION_ENROLLEE_QR_CODE_SCANNER}, specify the SSID string of the
  * Wi-Fi network to be provisioned in {@code WifiDppUtils.EXTRA_WIFI_SSID}.
  */
-public class WifiDppEnrolleeActivity extends InstrumentedActivity {
+public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
+        WifiManager.ActionListener,
+        WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener,
+        WifiDppQrCodeScannerFragment.OnScanZxingWifiFormatSuccessListener {
     private static final String TAG = "WifiDppEnrolleeActivity";
 
     public static final String ACTION_ENROLLEE_QR_CODE_SCANNER =
@@ -101,4 +106,31 @@
         finish();
         return true;
     }
+
+    @Override
+    public void onScanWifiDppSuccess(String publicKey, String information) {
+        // TODO(b/1023597): starts DPP enrollee handshake here
+    }
+
+    @Override
+    public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) {
+        wifiNetworkConfig.connect(/* context */ this, /* listener */ this);
+    }
+
+    @Override
+    public void onSuccess() {
+        startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
+        setResult(Activity.RESULT_OK);
+        finish();
+    }
+
+    @Override
+    public void onFailure(int reason) {
+        Log.d(TAG, "Wi-Fi connect onFailure reason - " + reason);
+
+        final Fragment fragment = mFragmentManager.findFragmentById(R.id.fragment_container);
+        if (fragment instanceof WifiDppQrCodeScannerFragment) {
+            ((WifiDppQrCodeScannerFragment)fragment).showErrorMessage(true);
+        }
+    }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java
index 6792dee..4ac5850 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java
@@ -17,25 +17,16 @@
 package com.android.settings.wifi.dpp;
 
 import android.os.Bundle;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
 import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.ProgressBar;
 import android.widget.TextView;
 
 import com.android.settings.core.InstrumentedFragment;
 import com.android.settings.R;
 
 /**
- * TODO: b/120645817 should refine code to only initiate UI component in each child fragment.
- */
-
-/**
  * There are below 4 fragments for Wi-Fi DPP UI flow, to reduce redundant code of UI components,
- * this parent fragment instantiates all UI components and provides setting APIs for them.
+ * this parent fragment instantiates common UI components
  *
  * {@code WifiDppQrCodeScannerFragment}
  * {@code WifiDppQrCodeGeneratorFragment}
@@ -43,128 +34,16 @@
  * {@code WifiDppAddDeviceFragment}
  */
 public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment {
-    private ImageView mHeaderIcon;
-    private TextView mTitle;
-    private TextView mDescription;
-
-    private TextView mErrorMessage;         //optional, for WifiDppQrCodeScannerFragment
-    private ListView mSavedWifiNetworkList; //optional, for WifiDppChooseSavedWifiNetworkFragment
-    private ProgressBar mProgressBar;       //optional, for WifiDppAddDeviceFragment
-    private ImageView mWifiApPictureView;   //optional, for WifiDppAddDeviceFragment
-    private TextView mChooseDifferentNetwork;//optional, for WifiDppAddDeviceFragment
-
-    private Button mButtonLeft;             //optional, for WifiDppChooseSavedWifiNetworkFragment,
-                                            //              WifiDppAddDeviceFragment
-    private Button mButtonRight;            //optional, for WifiDppChooseSavedWifiNetworkFragment,
-                                            //              WifiDppAddDeviceFragment
-
-    abstract protected int getLayout();
+    protected ImageView mHeaderIcon;
+    protected TextView mTitle;
+    protected TextView mSummary;
 
     @Override
-    public final void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
 
-    @Override
-    public final View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        View view = inflater.inflate(getLayout(), container, false);
-        initView(view);
-        return view;
-    }
-
-    private void initView(View view) {
-        mHeaderIcon = view.findViewById(R.id.header_icon);
-        mTitle = view.findViewById(R.id.title);
-        mDescription = view.findViewById(R.id.description);
-        mErrorMessage = view.findViewById(R.id.error_message);
-
-        mSavedWifiNetworkList = view.findViewById(R.id.saved_wifi_network_list);
-
-        mProgressBar = view.findViewById(R.id.progress_bar);
-        mWifiApPictureView = view.findViewById(R.id.wifi_ap_picture_view);
-        mChooseDifferentNetwork = view.findViewById(R.id.choose_different_network);
-
-        mButtonLeft = view.findViewById(R.id.button_left);
-        mButtonRight = view.findViewById(R.id.button_right);
-    }
-
-    protected void setHeaderIconImageResource(int resId) {
-        mHeaderIcon.setImageResource(resId);
-    }
-
-    protected void setTitle(String title) {
-        mTitle.setText(title);
-    }
-
-    protected void setDescription(String description) {
-        mDescription.setText(description);
-    }
-
-    /** optional, for WifiDppQrCodeScannerFragment */
-    protected void setErrorMessage(String errorMessage) {
-        if (mErrorMessage != null) {
-            mErrorMessage.setText(errorMessage);
-        }
-    }
-
-    /**
-     * optional, for WifiDppChooseSavedWifiNetworkFragment,
-     *               WifiDppAddDeviceFragment
-     */
-    protected void setLeftButtonText(String text) {
-        if (mButtonLeft != null) {
-            mButtonLeft.setText(text);
-        }
-    }
-
-    /**
-     * optional, for WifiDppChooseSavedWifiNetworkFragment,
-     *               WifiDppAddDeviceFragment
-     */
-    protected void setRightButtonText(String text) {
-        if (mButtonRight != null) {
-            mButtonRight.setText(text);
-        }
-    }
-
-    /**
-     * optional, for WifiDppChooseSavedWifiNetworkFragment,
-     *               WifiDppAddDeviceFragment
-     */
-    protected void hideLeftButton() {
-        if (mButtonLeft != null) {
-            mButtonLeft.setVisibility(View.INVISIBLE);
-        }
-    }
-
-    /**
-     * optional, for WifiDppChooseSavedWifiNetworkFragment,
-     *               WifiDppAddDeviceFragment
-     */
-    protected void hideRightButton() {
-        if (mButtonRight != null) {
-            mButtonRight.setVisibility(View.INVISIBLE);
-        }
-    }
-
-    /**
-     * optional, for WifiDppChooseSavedWifiNetworkFragment,
-     *               WifiDppAddDeviceFragment
-     */
-    protected void setLeftButtonOnClickListener(View.OnClickListener listener) {
-        if (mButtonLeft != null) {
-            mButtonLeft.setOnClickListener(listener);
-        }
-    }
-
-    /**
-     * optional, for WifiDppChooseSavedWifiNetworkFragment,
-     *               WifiDppAddDeviceFragment
-     */
-    protected void setRightButtonOnClickListener(View.OnClickListener listener) {
-        if (mButtonRight != null) {
-            mButtonRight.setOnClickListener(listener);
-        }
+        mHeaderIcon = view.findViewById(android.R.id.icon);
+        mTitle = view.findViewById(android.R.id.title);
+        mSummary = view.findViewById(android.R.id.summary);
     }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
index 02ebffc..f4bbcc1 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
@@ -21,10 +21,12 @@
 import android.graphics.Bitmap;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.ImageView;
 
 import com.android.internal.logging.nano.MetricsProto;
@@ -44,11 +46,6 @@
     private String mQrCode;
 
     @Override
-    protected int getLayout() {
-        return R.layout.wifi_dpp_qrcode_generator_fragment;
-    }
-
-    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR;
     }
@@ -63,25 +60,12 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
-        setHeaderIconImageResource(R.drawable.ic_qrcode_24dp);
-        WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
-                .getWifiNetworkConfig();
-        if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
-            throw new IllegalArgumentException("Invalid Wi-Fi network for configuring");
-        }
-        setTitle(getString(R.string.wifi_dpp_share_wifi));
-        setDescription(getString(R.string.wifi_dpp_scan_qr_code_with_another_device,
-                wifiNetworkConfig.getSsid()));
-
         setHasOptionsMenu(true);
-        ActionBar actionBar = getActivity().getActionBar();
+        final ActionBar actionBar = getActivity().getActionBar();
         if (actionBar != null) {
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.show();
         }
-
-        mQrCode = wifiNetworkConfig.getQrCode();
-        setQrCode();
     }
 
     @Override
@@ -119,9 +103,30 @@
     }
 
     @Override
+    public final View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.wifi_dpp_qrcode_generator_fragment, container,
+                /* attachToRoot */ false);
+    }
+
+    @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
+
         mQrCodeView = view.findViewById(R.id.qrcode_view);
+
+        mHeaderIcon.setImageResource(R.drawable.ic_qrcode_24dp);
+        WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
+                .getWifiNetworkConfig();
+        if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
+            throw new IllegalStateException("Invalid Wi-Fi network for configuring");
+        }
+        mTitle.setText(R.string.wifi_dpp_share_wifi);
+        mSummary.setText(getString(R.string.wifi_dpp_scan_qr_code_with_another_device,
+                wifiNetworkConfig.getSsid()));
+
+        mQrCode = wifiNetworkConfig.getQrCode();
+        setQrCode();
     }
 
     private void setQrCode() {
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
index 8cd3c56..c7c1461 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.wifi.dpp;
 
-import android.annotation.Nullable;
 import android.app.ActionBar;
 import android.app.Activity;
 import android.content.Context;
@@ -25,13 +24,18 @@
 import android.graphics.Rect;
 import android.graphics.SurfaceTexture;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.text.TextUtils;
 import android.util.Size;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.TextureView;
 import android.view.TextureView.SurfaceTextureListener;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -41,37 +45,69 @@
 public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment implements
         SurfaceTextureListener,
         QrCamera.ScannerCallback {
+    private static final String TAG = "WifiDppQrCodeScannerFragment";
+
+    /** Message sent to hide error message */
+    private static final int MESSAGE_HIDE_ERROR_MESSAGE = 1;
+
+    /** Message sent to show error message */
+    private static final int MESSAGE_SHOW_ERROR_MESSAGE = 2;
+
+    /** Message sent to manipulate Wi-Fi DPP QR code */
+    private static final int MESSAGE_SCAN_WIFI_DPP_SUCCESS = 3;
+
+    /** Message sent to manipulate ZXing Wi-Fi QR code */
+    private static final int MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS = 4;
+
+    private static final long SHOW_ERROR_MESSAGE_INTERVAL = 2000;
+    private static final long SHOW_SUCCESS_SQUARE_INTERVAL = 1000;
+
+    // Keys for Bundle usage
+    private static final String KEY_PUBLIC_KEY = "key_public_key";
+    private static final String KEY_INFORMATION = "key_information";
+
     private QrCamera mCamera;
     private TextureView mTextureView;
     private QrDecorateView mDecorateView;
+    private TextView mErrorMessage;
 
     /** true if the fragment working for configurator, false enrollee*/
-    private final boolean mConfiguratorMode;
+    private final boolean mIsConfiguratorMode;
 
     /** The SSID of the Wi-Fi network which the user specify to enroll */
     private String mSsid;
 
-    @Override
-    protected int getLayout() {
-        return R.layout.wifi_dpp_qrcode_scanner_fragment;
-    }
+    /** QR code data scanned by camera */
+    private WifiQrCode mWifiQrCode;
 
     @Override
     public int getMetricsCategory() {
-        if (mConfiguratorMode) {
+        if (mIsConfiguratorMode) {
             return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_CONFIGURATOR;
         } else {
             return MetricsProto.MetricsEvent.SETTINGS_WIFI_DPP_ENROLLEE;
         }
     }
 
+    // Container Activity must implement this interface
+    public interface OnScanWifiDppSuccessListener {
+        public void onScanWifiDppSuccess(String publicKey, String information);
+    }
+    OnScanWifiDppSuccessListener mScanWifiDppSuccessListener;
+
+    // Container Activity must implement this interface
+    public interface OnScanZxingWifiFormatSuccessListener {
+        public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig);
+    }
+    OnScanZxingWifiFormatSuccessListener mScanScanZxingWifiFormatSuccessListener;
+
     /**
      * Configurator container activity of the fragment should create instance with this constructor.
      */
     public WifiDppQrCodeScannerFragment() {
         super();
 
-        mConfiguratorMode = true;
+        mIsConfiguratorMode = true;
     }
 
     /**
@@ -81,7 +117,7 @@
     public WifiDppQrCodeScannerFragment(String ssid) {
         super();
 
-        mConfiguratorMode = false;
+        mIsConfiguratorMode = false;
         mSsid = ssid;
     }
 
@@ -89,30 +125,7 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
-        setHeaderIconImageResource(R.drawable.ic_scan_24dp);
-
-        if (mConfiguratorMode) {
-            setTitle(getString(R.string.wifi_dpp_add_device_to_network));
-
-            WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
-                .getWifiNetworkConfig();
-            if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
-                throw new IllegalArgumentException("Invalid Wi-Fi network for configuring");
-            }
-            setDescription(getString(R.string.wifi_dpp_center_qr_code, wifiNetworkConfig.getSsid()));
-        } else {
-            setTitle(getString(R.string.wifi_dpp_scan_qr_code));
-
-            String description;
-            if (TextUtils.isEmpty(mSsid)) {
-                description = getString(R.string.wifi_dpp_scan_qr_code_join_unknown_network, mSsid);
-            } else {
-                description = getString(R.string.wifi_dpp_scan_qr_code_join_network, mSsid);
-            }
-            setDescription(description);
-        }
-
-        ActionBar actionBar = getActivity().getActionBar();
+        final ActionBar actionBar = getActivity().getActionBar();
         if (actionBar != null) {
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.show();
@@ -120,13 +133,61 @@
     }
 
     @Override
-    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+    public void onAttach(Context context) {
+        super.onAttach(context);
+
+        mScanWifiDppSuccessListener = (OnScanWifiDppSuccessListener) context;
+        mScanScanZxingWifiFormatSuccessListener = (OnScanZxingWifiFormatSuccessListener) context;
+    }
+
+    @Override
+    public void onDetach() {
+        mScanWifiDppSuccessListener = null;
+        mScanScanZxingWifiFormatSuccessListener = null;
+
+        super.onDetach();
+    }
+
+    @Override
+    public final View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.wifi_dpp_qrcode_scanner_fragment, container,
+                /* attachToRoot */ false);
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
         mTextureView = (TextureView) view.findViewById(R.id.preview_view);
         mTextureView.setSurfaceTextureListener(this);
 
         mDecorateView = (QrDecorateView) view.findViewById(R.id.decorate_view);
+
+        mHeaderIcon.setImageResource(R.drawable.ic_scan_24dp);
+        if (mIsConfiguratorMode) {
+            mTitle.setText(R.string.wifi_dpp_add_device_to_network);
+
+            WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity())
+                .getWifiNetworkConfig();
+            if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
+                throw new IllegalStateException("Invalid Wi-Fi network for configuring");
+            }
+            mSummary.setText(getString(R.string.wifi_dpp_center_qr_code,
+                    wifiNetworkConfig.getSsid()));
+        } else {
+            mTitle.setText(R.string.wifi_dpp_scan_qr_code);
+
+            String description;
+            if (TextUtils.isEmpty(mSsid)) {
+                description = getString(R.string.wifi_dpp_scan_qr_code_join_unknown_network, mSsid);
+            } else {
+                description = getString(R.string.wifi_dpp_scan_qr_code_join_network, mSsid);
+            }
+            mSummary.setText(description);
+        }
+
+        mErrorMessage = view.findViewById(R.id.error_message);
     }
 
     @Override
@@ -173,10 +234,75 @@
     }
 
     @Override
+    public boolean isValid(String qrCode) {
+        try {
+            mWifiQrCode = new WifiQrCode(qrCode);
+        } catch (IllegalArgumentException e) {
+            mHandler.sendEmptyMessage(MESSAGE_SHOW_ERROR_MESSAGE);
+            return false;
+        }
+
+        final String scheme = mWifiQrCode.getScheme();
+
+        // When SSID is specified for enrollee, avoid to connect to the Wi-Fi of different SSID
+        if (!mIsConfiguratorMode && WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG.equals(scheme)) {
+            final String ssidQrCode = mWifiQrCode.getWifiNetworkConfig().getSsid();
+            if (!TextUtils.isEmpty(mSsid) && !mSsid.equals(ssidQrCode)) {
+                mHandler.sendEmptyMessage(MESSAGE_SHOW_ERROR_MESSAGE);
+                return false;
+            }
+        }
+
+        // It's impossible to provision other device with ZXing Wi-Fi Network config format
+        if (mIsConfiguratorMode && WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG.equals(scheme)) {
+            mHandler.sendEmptyMessage(MESSAGE_SHOW_ERROR_MESSAGE);
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * This method is only called when QrCamera.ScannerCallback.isValid returns true; 
+     */
+    @Override
     public void handleSuccessfulResult(String qrCode) {
+        switch (mWifiQrCode.getScheme()) {
+            case WifiQrCode.SCHEME_DPP:
+                handleWifiDpp(mWifiQrCode.getPublicKey(), mWifiQrCode.getInformation());
+                break;
+
+            case WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG:
+                handleZxingWifiFormat(mWifiQrCode.getWifiNetworkConfig());
+                break;
+
+            default:
+                // continue below
+        }
+    }
+
+    private void handleWifiDpp(String publicKey, String information) {
         destroyCamera();
         mDecorateView.setFocused(true);
-        // TODO(b/120243131): Add a network by Wi-Fi Network config shared via QR code.
+
+        final Bundle bundle = new Bundle();
+        bundle.putString(KEY_PUBLIC_KEY, publicKey);
+        bundle.putString(KEY_INFORMATION, information);
+
+        Message message = mHandler.obtainMessage(MESSAGE_SCAN_WIFI_DPP_SUCCESS);
+        message.setData(bundle);
+
+        mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL);
+    }
+
+    private void handleZxingWifiFormat(WifiNetworkConfig wifiNetworkConfig) {
+        destroyCamera();
+        mDecorateView.setFocused(true);
+
+        Message message = mHandler.obtainMessage(MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS);
+        message.obj = wifiNetworkConfig;
+
+        mHandler.sendMessageDelayed(message, SHOW_SUCCESS_SQUARE_INTERVAL);
     }
 
     @Override
@@ -198,4 +324,51 @@
             mCamera = null;
         }
     }
+
+    public void showErrorMessage(boolean show) {
+        mErrorMessage.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
+
+        if (show) {
+            mHandler.removeMessages(MESSAGE_HIDE_ERROR_MESSAGE);
+            mHandler.sendEmptyMessageDelayed(MESSAGE_HIDE_ERROR_MESSAGE,
+                    SHOW_ERROR_MESSAGE_INTERVAL);
+        }
+    }
+
+    private final Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MESSAGE_HIDE_ERROR_MESSAGE:
+                    showErrorMessage(false);
+                    break;
+
+                case MESSAGE_SHOW_ERROR_MESSAGE:
+                    showErrorMessage(true);
+                    break;
+
+                case MESSAGE_SCAN_WIFI_DPP_SUCCESS:
+                    if (mScanWifiDppSuccessListener == null) {
+                        return;
+                    }
+                    final Bundle bundle = msg.getData();
+                    final String publicKey = bundle.getString(KEY_PUBLIC_KEY);
+                    final String information = bundle.getString(KEY_INFORMATION);
+
+                    mScanWifiDppSuccessListener.onScanWifiDppSuccess(publicKey, information);
+                    break;
+
+                case MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS:
+                    if (mScanScanZxingWifiFormatSuccessListener == null) {
+                        return;
+                    }
+                    mScanScanZxingWifiFormatSuccessListener.onScanZxingWifiFormatSuccess(
+                            (WifiNetworkConfig)msg.obj);
+                    break;
+
+                default:
+                    return;
+            }
+        }
+    };
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java
index 0823294..c9bfbd6 100644
--- a/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java
+++ b/src/com/android/settings/wifi/dpp/WifiNetworkConfig.java
@@ -16,8 +16,18 @@
 
 package com.android.settings.wifi.dpp;
 
+import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_NO_PASSWORD;
+import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_WEP;
+import static com.android.settings.wifi.dpp.WifiQrCode.SECURITY_WPA;
+
+import android.content.Context;
 import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.AuthAlgorithm;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
+import android.net.wifi.WifiManager;
 import android.text.TextUtils;
+import android.util.Log;
 
 import androidx.annotation.Keep;
 
@@ -30,8 +40,7 @@
  * EXTRA_QR_CODE
  */
 public class WifiNetworkConfig {
-    // Ignores password if security is NO_PASSWORD or absent
-    public static final String NO_PASSWORD = "nopass";
+    private static final String TAG = "WifiNetworkConfig";
 
     private String mSecurity;
     private String mSsid;
@@ -47,18 +56,9 @@
     }
 
     public WifiNetworkConfig(WifiNetworkConfig config) {
-        if (config.mSecurity != null) {
-            mSecurity = new String(config.mSecurity);
-        }
-
-        if (config.mSsid != null) {
-            mSsid = new String(config.mSsid);
-        }
-
-        if (config.mPreSharedKey != null) {
-            mPreSharedKey = new String(config.mPreSharedKey);
-        }
-
+        mSecurity = config.mSecurity;
+        mSsid = config.mSsid;
+        mPreSharedKey = config.mPreSharedKey;
         mHiddenSsid = config.mHiddenSsid;
     }
 
@@ -106,7 +106,7 @@
 
     public static boolean isValidConfig(String security, String ssid, String preSharedKey,
             boolean hiddenSsid) {
-        if (!TextUtils.isEmpty(security) && !NO_PASSWORD.equals(security)) {
+        if (!TextUtils.isEmpty(security) && !SECURITY_NO_PASSWORD.equals(security)) {
             if (TextUtils.isEmpty(preSharedKey)) {
                 return false;
             }
@@ -183,4 +183,77 @@
     public boolean getHiddenSsid() {
         return mHiddenSsid;
     }
+
+    public void connect(Context context, WifiManager.ActionListener listener) {
+        WifiConfiguration wifiConfiguration = getWifiConfigurationOrNull();
+        if (wifiConfiguration == null) {
+            if (listener != null) {
+                listener.onFailure(WifiManager.ERROR);
+            }
+            return;
+        }
+
+        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
+        wifiManager.connect(wifiConfiguration, listener);
+    }
+
+    /**
+     * This is a simplified method from {@code WifiConfigController.getConfig()}
+     */
+    private WifiConfiguration getWifiConfigurationOrNull() {
+        if (!isValidConfig(this)) {
+            return null;
+        }
+
+        final WifiConfiguration wifiConfiguration = new WifiConfiguration();
+        wifiConfiguration.SSID = addQuotationIfNeeded(mSsid);
+        wifiConfiguration.hiddenSSID = mHiddenSsid;
+
+        if (TextUtils.isEmpty(mSecurity) || SECURITY_NO_PASSWORD.equals(mSecurity)) {
+            wifiConfiguration.allowedKeyManagement.set(KeyMgmt.NONE);
+            return wifiConfiguration;
+        }
+
+        if (mSecurity.startsWith(SECURITY_WEP)) {
+            wifiConfiguration.allowedKeyManagement.set(KeyMgmt.NONE);
+            wifiConfiguration.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
+            wifiConfiguration.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
+
+            // WEP-40, WEP-104, and 256-bit WEP (WEP-232?)
+            final int length = mPreSharedKey.length();
+            if ((length == 10 || length == 26 || length == 58)
+                    && mPreSharedKey.matches("[0-9A-Fa-f]*")) {
+                wifiConfiguration.wepKeys[0] = mPreSharedKey;
+            } else {
+                wifiConfiguration.wepKeys[0] = addQuotationIfNeeded(mPreSharedKey);
+            }
+        } else if (mSecurity.startsWith(SECURITY_WPA)) {
+            wifiConfiguration.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
+
+            if (mPreSharedKey.matches("[0-9A-Fa-f]{64}")) {
+                wifiConfiguration.preSharedKey = mPreSharedKey;
+            } else {
+                wifiConfiguration.preSharedKey = addQuotationIfNeeded(mPreSharedKey);
+            }
+        } else {
+            Log.w(TAG, "Unsupported security");
+            return null;
+        }
+
+        return wifiConfiguration;
+    }
+
+    private String addQuotationIfNeeded(String input) {
+        if (TextUtils.isEmpty(input)) {
+            return "";
+        }
+
+        if (input.length() >= 2 && input.startsWith("\"") && input.endsWith("\"")) {
+            return input;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("\"").append(input).append("\"");
+        return sb.toString();
+    }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiQrCode.java b/src/com/android/settings/wifi/dpp/WifiQrCode.java
index ebc39c3..a8562bb 100644
--- a/src/com/android/settings/wifi/dpp/WifiQrCode.java
+++ b/src/com/android/settings/wifi/dpp/WifiQrCode.java
@@ -22,7 +22,8 @@
 import androidx.annotation.Keep;
 import androidx.annotation.VisibleForTesting;
 
-import java.util.regex.Matcher;
+import java.util.Arrays;
+import java.util.List;
 import java.util.regex.Pattern;
 
 /**
@@ -62,7 +63,12 @@
     public static final String PREFIX_ZXING_PASSWORD = "P:";
     public static final String PREFIX_ZXING_HIDDEN_SSID = "H:";
 
-    public static final String SUFFIX_QR_CODE = ";";
+    public static final String DELIMITER_QR_CODE = ";";
+
+    // Ignores password if security is SECURITY_NO_PASSWORD or absent
+    public static final String SECURITY_NO_PASSWORD = "nopass";
+    public static final String SECURITY_WEP = "WEP";
+    public static final String SECURITY_WPA = "WPA";
 
     private String mQrCode;
 
@@ -100,22 +106,27 @@
 
     /** Parses Wi-Fi DPP QR code string */
     private void parseWifiDppQrCode(String qrCode) throws IllegalArgumentException {
-        String publicKey = getSubStringOrNull(qrCode, PREFIX_DPP_PUBLIC_KEY, SUFFIX_QR_CODE);
+        List keyValueList = getKeyValueList(qrCode, PREFIX_DPP, DELIMITER_QR_CODE);
+
+        String publicKey = getValueOrNull(keyValueList, PREFIX_DPP_PUBLIC_KEY);
         if (TextUtils.isEmpty(publicKey)) {
             throw new IllegalArgumentException("Invalid format");
         }
         mPublicKey = publicKey;
 
-        mInformation = getSubStringOrNull(qrCode, PREFIX_DPP_INFORMATION, SUFFIX_QR_CODE);
+        mInformation = getValueOrNull(keyValueList, PREFIX_DPP_INFORMATION);
     }
 
     /** Parses ZXing reader library's Wi-Fi Network config format */
     private void parseZxingWifiQrCode(String qrCode) throws IllegalArgumentException {
-        String security = getSubStringOrNull(qrCode, PREFIX_ZXING_SECURITY, SUFFIX_QR_CODE);
-        String ssid = getSubStringOrNull(qrCode, PREFIX_ZXING_SSID, SUFFIX_QR_CODE);
-        String password = getSubStringOrNull(qrCode, PREFIX_ZXING_PASSWORD, SUFFIX_QR_CODE);
-        String hiddenSsidString = getSubStringOrNull(qrCode, PREFIX_ZXING_HIDDEN_SSID,
-                SUFFIX_QR_CODE);
+        List keyValueList = getKeyValueList(qrCode, PREFIX_ZXING_WIFI_NETWORK_CONFIG,
+                DELIMITER_QR_CODE);
+
+        String security = getValueOrNull(keyValueList, PREFIX_ZXING_SECURITY);
+        String ssid = getValueOrNull(keyValueList, PREFIX_ZXING_SSID);
+        String password = getValueOrNull(keyValueList, PREFIX_ZXING_PASSWORD);
+        String hiddenSsidString = getValueOrNull(keyValueList, PREFIX_ZXING_HIDDEN_SSID);
+
         boolean hiddenSsid = "true".equalsIgnoreCase(hiddenSsidString);
 
         //"\", ";", "," and ":" are escaped with a backslash "\", should remove at first
@@ -132,33 +143,37 @@
     }
 
     /**
-     * Gets the substring between prefix & suffix from input.
+     * Splits key/value pairs from qrCode
      *
-     * @param prefix the string before the returned substring
-     * @param suffix the string after the returned substring
-     * @return null if not exists, non-null otherwise
+     * @param qrCode the QR code raw string
+     * @param prefixQrCode the string before all key/value pairs in qrCode
+     * @param delimiter the string to split key/value pairs, can't contain a backslash
+     * @return a list contains string of key/value (e.g. K:key1)
      */
-    private static String getSubStringOrNull(String input, String prefix, String suffix) {
-        StringBuilder sb = new StringBuilder();
-        String regex = sb.append(prefix).append("(.*?)").append(suffix).toString();
-        Pattern pattern = Pattern.compile(regex);
-        Matcher matcher = pattern.matcher(input);
+    private List<String> getKeyValueList(String qrCode, String prefixQrCode,
+                String delimiter) {
+        String keyValueString = qrCode.substring(prefixQrCode.length());
 
-        if (!matcher.find()) {
-            return null;
+        // Should not treat \delimiter as a delimiter
+        String regex = "(?<!\\\\)" + Pattern.quote(delimiter);
+
+        List<String> result = Arrays.asList(keyValueString.split(regex));
+        return result;
+    }
+
+    private String getValueOrNull(List<String> keyValueList, String prefix) {
+        for (String keyValue : keyValueList) {
+            if (keyValue.startsWith(prefix)) {
+                return  keyValue.substring(prefix.length());
+            }
         }
 
-        String target = matcher.group(1);
-        if (TextUtils.isEmpty(target)) {
-            return null;
-        }
-
-        return target;
+        return null;
     }
 
     @Keep
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    protected static String removeBackSlash(String input) {
+    protected String removeBackSlash(String input) {
         if (input == null) {
             return null;
         }
diff --git a/src/com/android/settings/wifi/qrcode/QrCamera.java b/src/com/android/settings/wifi/qrcode/QrCamera.java
index c60c30e..af366bc 100644
--- a/src/com/android/settings/wifi/qrcode/QrCamera.java
+++ b/src/com/android/settings/wifi/qrcode/QrCamera.java
@@ -152,6 +152,15 @@
          * @param transform The transform to apply to the content of preview
          */
         void setTransform(Matrix transform);
+
+        /**
+         * Verify QR code is valid or not. The camera will stop scanning if this callback returns
+         * true.
+         *
+         * @param qrCode The result QR code after decoding.
+         * @return Returns true if qrCode hold valid information.
+         */
+        boolean isValid(String qrCode);
     }
 
     private void setCameraParameter() {
@@ -245,7 +254,9 @@
                         mReader.reset();
                     }
                     if (qrCode != null) {
-                        return qrCode.getText();
+                        if (mScannerCallback.isValid(qrCode.getText())) {
+                            return qrCode.getText();
+                        }
                     }
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index c98fbdb..5f23f0c 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -178,6 +178,8 @@
         controllers.add(new WifiTetherSecurityPreferenceController(context, listener));
         controllers.add(new WifiTetherPasswordPreferenceController(context, listener));
         controllers.add(new WifiTetherApBandPreferenceController(context, listener));
+        controllers.add(
+                new WifiTetherAutoOffPreferenceController(context, KEY_WIFI_TETHER_AUTO_OFF));
 
         return controllers;
     }
diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider
index 447de00..2622eb3 100644
--- a/tests/robotests/assets/grandfather_not_implementing_index_provider
+++ b/tests/robotests/assets/grandfather_not_implementing_index_provider
@@ -28,6 +28,7 @@
 com.android.settings.datausage.AppDataUsage
 com.android.settings.datausage.DataUsageList
 com.android.settings.datetime.timezone.TimeZoneSettings
+com.android.settings.development.gup.GupDashboard
 com.android.settings.deviceinfo.PrivateVolumeSettings
 com.android.settings.deviceinfo.PublicVolumeSettings
 com.android.settings.deviceinfo.StorageProfileFragment
diff --git a/tests/robotests/res/layout/preference.xml b/tests/robotests/res/layout/preference.xml
index 3f73161..7ac733f 100644
--- a/tests/robotests/res/layout/preference.xml
+++ b/tests/robotests/res/layout/preference.xml
@@ -30,7 +30,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:singleLine="true"
-        android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
         android:textColor="?android:attr/textColorPrimary"
         android:ellipsize="marquee"
         android:fadingEdge="horizontal" />
@@ -43,7 +43,7 @@
         android:layout_alignStart="@android:id/title"
         android:visibility="gone"
         android:textAlignment="viewStart"
-        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+        android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
         android:textColor="?android:attr/textColorSecondary"
         android:maxLines="10" />
 
diff --git a/tests/robotests/src/com/android/settings/development/UpdatedGfxDriverDevOptInPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/GameUpdatePackageDevOptInPreferenceControllerTest.java
similarity index 76%
rename from tests/robotests/src/com/android/settings/development/UpdatedGfxDriverDevOptInPreferenceControllerTest.java
rename to tests/robotests/src/com/android/settings/development/GameUpdatePackageDevOptInPreferenceControllerTest.java
index e92f1a5..199cad6 100644
--- a/tests/robotests/src/com/android/settings/development/UpdatedGfxDriverDevOptInPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/GameUpdatePackageDevOptInPreferenceControllerTest.java
@@ -16,7 +16,7 @@
 
 package com.android.settings.development;
 
-import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP;
+import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_CODE_GUP_DEV_OPT_IN_APPS;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
@@ -44,7 +44,7 @@
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
-public class UpdatedGfxDriverDevOptInPreferenceControllerTest {
+public class GameUpdatePackageDevOptInPreferenceControllerTest {
 
     @Mock
     private PreferenceScreen mPreferenceScreen;
@@ -53,13 +53,13 @@
 
     private Context mContext;
     private Preference mPreference;
-    private UpdatedGfxDriverDevOptInPreferenceController mController;
+    private GameUpdatePackageDevOptInPreferenceController mController;
 
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
-        mController = spy(new UpdatedGfxDriverDevOptInPreferenceController(mContext, mFragment));
+        mController = spy(new GameUpdatePackageDevOptInPreferenceController(mContext, mFragment));
         mPreference = new Preference(mContext);
         mPreference.setKey(mController.getPreferenceKey());
 
@@ -75,18 +75,19 @@
         mController.handlePreferenceTreeClick(mPreference);
 
         verify(mFragment).startActivityForResult(activityStartIntent,
-                REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP);
+                REQUEST_CODE_GUP_DEV_OPT_IN_APPS);
     }
 
     @Test
-    public void updateState_foobarAppSelected_shouldUpdateSummaryWithUpdatedDriverDevOptInAppLabel() {
+    public void updateState_foobarAppSelected_shouldUpdateSummaryWithGUPDevOptInAppLabel() {
         final String selectedApp = "foobar";
         final ContentResolver contentResolver = mContext.getContentResolver();
         Settings.Global.putString(contentResolver,
-                Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, selectedApp);
+                Settings.Global.GUP_DEV_OPT_IN_APPS, selectedApp);
         mController.updateState(mPreference);
 
-        assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.updated_gfx_driver_dev_opt_in_app_set, selectedApp));
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.gup_dev_opt_in_app_set, selectedApp));
     }
 
     @Test
@@ -94,23 +95,25 @@
         final String selectedApp = null;
         final ContentResolver contentResolver = mContext.getContentResolver();
         Settings.Global.putString(contentResolver,
-                Settings.Global.UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, selectedApp);
+                Settings.Global.GUP_DEV_OPT_IN_APPS, selectedApp);
         mController.updateState(mPreference);
 
-        assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.updated_gfx_driver_dev_opt_in_app_not_set));
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.gup_dev_opt_in_app_not_set));
     }
 
     @Test
-    public void onActivityResult_foobarAppSelected_shouldUpdateSummaryWithUpdatedDriverDevOptInLabel() {
+    public void onActivityResult_foobarAppSelected_shouldUpdateSummaryWithGUPDevOptInLabel() {
         Intent activityResultIntent = new Intent(mContext, AppPicker.class);
         final String appLabel = "foobar";
         activityResultIntent.setAction(appLabel);
         final boolean result = mController
-            .onActivityResult(REQUEST_CODE_UPDATED_GFX_DRIVER_DEV_OPT_IN_APP, Activity.RESULT_OK,
+            .onActivityResult(REQUEST_CODE_GUP_DEV_OPT_IN_APPS, Activity.RESULT_OK,
                     activityResultIntent);
 
         assertThat(result).isTrue();
-        assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.updated_gfx_driver_dev_opt_in_app_set, appLabel));
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.gup_dev_opt_in_app_set, appLabel));
     }
 
     @Test
@@ -124,6 +127,7 @@
         mController.onDeveloperOptionsSwitchDisabled();
 
         assertThat(mPreference.isEnabled()).isFalse();
-        assertThat(mPreference.getSummary()).isEqualTo(mContext.getString(R.string.updated_gfx_driver_dev_opt_in_app_not_set));
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getString(R.string.gup_dev_opt_in_app_not_set));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/development/gup/GupDashboardTest.java b/tests/robotests/src/com/android/settings/development/gup/GupDashboardTest.java
new file mode 100644
index 0000000..17278ef
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/gup/GupDashboardTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.settings.development.gup;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class GupDashboardTest {
+    private GupDashboard mDashboard;
+
+    @Before
+    public void setUp() {
+        mDashboard = new GupDashboard();
+    }
+
+    @Test
+    public void getHelpResource_shouldReturn0() {
+        assertThat(mDashboard.getHelpResource()).isEqualTo(0);
+    }
+
+    @Test
+    public void getMetricesCategory_shouldReturnGupDashboard() {
+        assertThat(mDashboard.getMetricsCategory())
+                .isEqualTo(MetricsProto.MetricsEvent.SETTINGS_GUP_DASHBOARD);
+    }
+
+    @Test
+    public void getPreferenceScreen_shouldReturnGupSettings() {
+        assertThat(mDashboard.getPreferenceScreenResId())
+                .isEqualTo(R.xml.gup_settings);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/display/DisplayWhiteBalancePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/DisplayWhiteBalancePreferenceControllerTest.java
new file mode 100644
index 0000000..0ce72fb
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/DisplayWhiteBalancePreferenceControllerTest.java
@@ -0,0 +1,78 @@
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.provider.Settings.Secure;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {
+    SettingsShadowResources.class
+})
+public class DisplayWhiteBalancePreferenceControllerTest {
+
+  private Context mContext;
+  private DisplayWhiteBalancePreferenceController mController;
+
+  @After
+  public void tearDown() {
+    SettingsShadowResources.reset();
+  }
+
+  @Before
+  public void setUp() {
+    mContext = RuntimeEnvironment.application;
+    mController = new DisplayWhiteBalancePreferenceController(mContext, "display_white_balance");
+  }
+
+  @Test
+  public void isAvailable_configuredAvailable() {
+    SettingsShadowResources.overrideResource(
+        com.android.internal.R.bool.config_displayWhiteBalanceAvailable, true);
+    assertThat(mController.isAvailable()).isTrue();
+  }
+
+  @Test
+  public void isAvailable_configuredUnavailable() {
+    SettingsShadowResources.overrideResource(
+        com.android.internal.R.bool.config_displayWhiteBalanceAvailable, false);
+    assertThat(mController.isAvailable()).isFalse();
+  }
+
+  @Test
+  public void setChecked_true() {
+    mController.setChecked(true);
+    assertThat(Settings.Secure
+        .getInt(mContext.getContentResolver(), Secure.DISPLAY_WHITE_BALANCE_ENABLED, 0) == 1)
+        .isTrue();
+  }
+
+  @Test
+  public void setChecked_false() {
+    mController.setChecked(false);
+    assertThat(Settings.Secure
+        .getInt(mContext.getContentResolver(), Secure.DISPLAY_WHITE_BALANCE_ENABLED, 0) == 1)
+        .isFalse();
+  }
+
+  @Test
+  public void isChecked_true() {
+    Settings.Secure.putInt(mContext.getContentResolver(), Secure.DISPLAY_WHITE_BALANCE_ENABLED, 1);
+    assertThat(mController.isChecked()).isTrue();
+  }
+
+  @Test
+  public void isChecked_false() {
+    Settings.Secure.putInt(mContext.getContentResolver(), Secure.DISPLAY_WHITE_BALANCE_ENABLED, 0);
+    assertThat(mController.isChecked()).isFalse();
+  }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index b22821b..5be7274 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -140,8 +140,9 @@
 
         assertThat(((BatteryMeterView) mBatteryLayoutPref.findViewById(
                 R.id.battery_header_icon)).getBatteryLevel()).isEqualTo(BATTERY_LEVEL);
-        assertThat(((TextView) mBatteryLayoutPref.findViewById(R.id.battery_percent)).getText())
-            .isEqualTo("60%");
+        assertThat(((TextView) mBatteryLayoutPref.findViewById(R.id.battery_percent))
+                .getText().toString())
+                .isEqualTo("60 %");
     }
 
     @Test
@@ -195,7 +196,7 @@
 
         assertThat(mBatteryMeterView.getBatteryLevel()).isEqualTo(BATTERY_LEVEL);
         assertThat(mBatteryMeterView.getCharging()).isTrue();
-        assertThat(mBatteryPercentText.getText()).isEqualTo("60%");
+        assertThat(mBatteryPercentText.getText().toString()).isEqualTo("60 %");
         assertThat(mSummary.getText()).isEqualTo(BATTERY_STATUS);
         assertThat(mSummary2.getText()).isEqualTo(BATTERY_STATUS);
     }
diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingGesturePreferenceControllerTest.java
index 84fef5d..956d8bf 100644
--- a/tests/robotests/src/com/android/settings/gestures/PreventRingingGesturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingGesturePreferenceControllerTest.java
@@ -18,44 +18,47 @@
 
 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.spy;
 import static org.mockito.Mockito.when;
-import static org.mockito.MockitoAnnotations.initMocks;
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.preference.PreferenceCategory;
 import android.provider.Settings;
 
-import androidx.preference.PreferenceScreen;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
 
 import com.android.settings.widget.RadioButtonPreference;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class PreventRingingGesturePreferenceControllerTest {
-
     private Context mContext;
     private Resources mResources;
     private PreventRingingGesturePreferenceController mController;
 
+    @Mock
+    private Preference mPreference;
+
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
         mResources = mock(Resources.class);
         when(mContext.getResources()).thenReturn(mResources);
         when(mResources.getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled))
                 .thenReturn(true);
         mController = new PreventRingingGesturePreferenceController(mContext, null);
+        mController.mPreferenceCategory = new PreferenceCategory(mContext);
         mController.mVibratePref = new RadioButtonPreference(mContext);
-        mController.mNonePref = new RadioButtonPreference(mContext);
         mController.mMutePref = new RadioButtonPreference(mContext);
     }
 
@@ -79,9 +82,10 @@
     public void testUpdateState_mute() {
         Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
                 Settings.Secure.VOLUME_HUSH_MUTE);
-        mController.updateState(null);
+        mController.updateState(mPreference);
+        assertThat(mController.mVibratePref.isEnabled()).isTrue();
+        assertThat(mController.mMutePref.isEnabled()).isTrue();
         assertThat(mController.mVibratePref.isChecked()).isFalse();
-        assertThat(mController.mNonePref.isChecked()).isFalse();
         assertThat(mController.mMutePref.isChecked()).isTrue();
     }
 
@@ -89,9 +93,21 @@
     public void testUpdateState_vibrate() {
         Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
                 Settings.Secure.VOLUME_HUSH_VIBRATE);
-        mController.updateState(null);
+        mController.updateState(mPreference);
+        assertThat(mController.mVibratePref.isEnabled()).isTrue();
+        assertThat(mController.mMutePref.isEnabled()).isTrue();
         assertThat(mController.mVibratePref.isChecked()).isTrue();
-        assertThat(mController.mNonePref.isChecked()).isFalse();
+        assertThat(mController.mMutePref.isChecked()).isFalse();
+    }
+
+    @Test
+    public void testUpdateState_off() {
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+                Settings.Secure.VOLUME_HUSH_OFF);
+        mController.updateState(mPreference);
+        assertThat(mController.mVibratePref.isEnabled()).isFalse();
+        assertThat(mController.mMutePref.isEnabled()).isFalse();
+        assertThat(mController.mVibratePref.isChecked()).isFalse();
         assertThat(mController.mMutePref.isChecked()).isFalse();
     }
 
@@ -99,9 +115,8 @@
     public void testUpdateState_other() {
         Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
                 7);
-        mController.updateState(null);
+        mController.updateState(mPreference);
         assertThat(mController.mVibratePref.isChecked()).isFalse();
-        assertThat(mController.mNonePref.isChecked()).isTrue();
         assertThat(mController.mMutePref.isChecked()).isFalse();
     }
 
@@ -132,19 +147,4 @@
                 Settings.Secure.getInt(mContext.getContentResolver(),
                         Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_OFF));
     }
-
-    @Test
-    public void testRadioButtonClicked_off() {
-        RadioButtonPreference rbPref = new RadioButtonPreference(mContext);
-        rbPref.setKey(PreventRingingGesturePreferenceController.KEY_NONE);
-
-        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
-                Settings.Secure.VOLUME_HUSH_MUTE);
-
-        mController.onRadioButtonClicked(rbPref);
-
-        assertThat(Settings.Secure.VOLUME_HUSH_OFF).isEqualTo(
-                Settings.Secure.getInt(mContext.getContentResolver(),
-                        Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_VIBRATE));
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingSwitchPreferenceControllerTest.java
new file mode 100644
index 0000000..5f221f5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingSwitchPreferenceControllerTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.gestures;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+
+import com.android.settings.widget.SwitchBar;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class PreventRingingSwitchPreferenceControllerTest {
+    private Context mContext;
+    private Resources mResources;
+    private PreventRingingSwitchPreferenceController mController;
+    private Preference mPreference = mock(Preference.class);
+
+    @Before
+    public void setUp() {
+        mContext = spy(RuntimeEnvironment.application);
+        mResources = mock(Resources.class);
+        when(mContext.getResources()).thenReturn(mResources);
+        when(mResources.getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled))
+                .thenReturn(true);
+        mController = new PreventRingingSwitchPreferenceController(mContext);
+        mController.mSwitch = mock(SwitchBar.class);
+    }
+
+    @Test
+    public void testIsAvailable_configIsTrue_shouldReturnTrue() {
+        when(mResources.getBoolean(
+                com.android.internal.R.bool.config_volumeHushGestureEnabled)).thenReturn(true);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void testIsAvailable_configIsFalse_shouldReturnFalse() {
+        when(mResources.getBoolean(
+                com.android.internal.R.bool.config_volumeHushGestureEnabled)).thenReturn(false);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void testOn_updateState_hushOff() {
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+                Settings.Secure.VOLUME_HUSH_OFF);
+        mController.updateState(mPreference);
+        verify(mController.mSwitch, times(1)).setChecked(false);
+    }
+
+    @Test
+    public void testOn_updateState_hushVibrate() {
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+                Settings.Secure.VOLUME_HUSH_VIBRATE);
+        mController.updateState(mPreference);
+        verify(mController.mSwitch, times(1)).setChecked(true);
+    }
+
+    @Test
+    public void testOn_updateState_hushMute() {
+        Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.VOLUME_HUSH_GESTURE,
+                Settings.Secure.VOLUME_HUSH_MUTE);
+        mController.updateState(mPreference);
+        verify(mController.mSwitch, times(1)).setChecked(true);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java
index 6379e44..bddd5fe 100644
--- a/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/AppLocationPermissionPreferenceControllerTest.java
@@ -3,10 +3,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.Context;
+import android.location.LocationManager;
 import android.provider.Settings;
 
 import androidx.lifecycle.LifecycleOwner;
 
+import com.android.settings.R;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
 import org.junit.Before;
@@ -27,6 +29,7 @@
 
     private LifecycleOwner mLifecycleOwner;
     private Lifecycle mLifecycle;
+    private LocationManager mLocationManager;
 
     @Before
     public void setUp() {
@@ -35,6 +38,7 @@
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
         mController = new AppLocationPermissionPreferenceController(mContext, mLifecycle);
+        mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
     }
 
     @Test
@@ -52,4 +56,40 @@
 
         assertThat(mController.isAvailable()).isTrue();
     }
+
+    @Test
+    public void getSummary_whenLocationIsOff_shouldReturnStringForOff() {
+        mLocationManager.setLocationEnabledForUser(false, android.os.Process.myUserHandle());
+
+        assertThat(mController.getSummary()).isEqualTo(
+                mContext.getString(R.string.location_app_permission_summary_location_off));
+    }
+
+    @Test
+    public void getSummary_whenLocationIsOn_shouldReturnLoadingString() {
+        mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
+
+        assertThat(mController.getSummary()).isEqualTo(
+                mContext.getString(R.string.location_settings_loading_app_permission_stats));
+    }
+
+    @Test
+    public void getSummary_whenLocationAppCountIsOne_shouldShowSingularString() {
+        mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
+        mController.mNumBackground = 1;
+        mController.mNumTotal = 1;
+
+        assertThat(mController.getSummary()).isEqualTo(mContext.getResources().getQuantityString(
+                R.plurals.location_app_permission_summary_location_on, 1, 1, 1));
+    }
+
+    @Test
+    public void getSummary_whenLocationAppCountIsGreaterThanOne_shouldShowPluralString() {
+        mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
+        mController.mNumBackground = 5;
+        mController.mNumTotal = 10;
+
+        assertThat(mController.getSummary()).isEqualTo(mContext.getResources().getQuantityString(
+                R.plurals.location_app_permission_summary_location_on, 5, 5, 10));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..3b33558
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settingslib.location.RecentLocationAccesses;
+import com.android.settingslib.widget.LayoutPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class RecentLocationAccessPreferenceControllerTest {
+    @Mock
+    private LayoutPreference mLayoutPreference;
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private RecentLocationAccesses mRecentLocationApps;
+
+    private Context mContext;
+    private RecentLocationAccessPreferenceController mController;
+    private View mAppEntitiesHeaderView;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        mController = spy(
+                new RecentLocationAccessPreferenceController(mContext, mRecentLocationApps));
+        final String key = mController.getPreferenceKey();
+        mAppEntitiesHeaderView = LayoutInflater.from(mContext).inflate(
+                R.layout.app_entities_header, null /* root */);
+        when(mScreen.findPreference(key)).thenReturn(mLayoutPreference);
+        when(mLayoutPreference.getKey()).thenReturn(key);
+        when(mLayoutPreference.getContext()).thenReturn(mContext);
+        when(mLayoutPreference.findViewById(R.id.app_entities_header)).thenReturn(
+                mAppEntitiesHeaderView);
+    }
+
+    /** Verifies the title text, details text are correct, and the click listener is set. */
+    @Test
+    public void updateState_whenAppListIsEmpty_shouldDisplayTitleTextAndDetailsText() {
+        doReturn(new ArrayList<>()).when(mRecentLocationApps).getAppListSorted();
+        mController.displayPreference(mScreen);
+        mController.updateState(mLayoutPreference);
+
+        final TextView title = mAppEntitiesHeaderView.findViewById(R.id.header_title);
+        assertThat(title.getText()).isEqualTo(
+                mContext.getText(R.string.location_category_recent_location_access));
+        final TextView details = mAppEntitiesHeaderView.findViewById(R.id.header_details);
+        assertThat(details.getText()).isEqualTo(
+                mContext.getText(R.string.location_recent_location_access_view_details));
+        assertThat(details.hasOnClickListeners()).isTrue();
+    }
+
+    @Test
+    public void updateState_whenAppListMoreThanThree_shouldDisplayTopThreeApps() {
+        final List<RecentLocationAccesses.Access> accesses = createMockAccesses(6);
+        doReturn(accesses).when(mRecentLocationApps).getAppListSorted();
+        mController.displayPreference(mScreen);
+        mController.updateState(mLayoutPreference);
+
+        // The widget can display the top 3 apps from the list when there're more than 3.
+        final View app1View = mAppEntitiesHeaderView.findViewById(R.id.app1_view);
+        final ImageView appIconView1 = app1View.findViewById(R.id.app_icon);
+        final TextView appTitle1 = app1View.findViewById(R.id.app_title);
+        final TextView appSummary1 = app1View.findViewById(R.id.app_summary);
+
+        assertThat(app1View.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(appIconView1.getDrawable()).isNotNull();
+        assertThat(appTitle1.getText()).isEqualTo("appTitle0");
+        assertThat(appSummary1.getText()).isEqualTo("appSummary0");
+
+        final View app2View = mAppEntitiesHeaderView.findViewById(R.id.app2_view);
+        final ImageView appIconView2 = app2View.findViewById(R.id.app_icon);
+        final TextView appTitle2 = app2View.findViewById(R.id.app_title);
+        final TextView appSummary2 = app2View.findViewById(R.id.app_summary);
+
+        assertThat(app2View.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(appIconView2.getDrawable()).isNotNull();
+        assertThat(appTitle2.getText()).isEqualTo("appTitle1");
+        assertThat(appSummary2.getText()).isEqualTo("appSummary1");
+
+        final View app3View = mAppEntitiesHeaderView.findViewById(R.id.app3_view);
+        final ImageView appIconView3 = app3View.findViewById(R.id.app_icon);
+        final TextView appTitle3 = app3View.findViewById(R.id.app_title);
+        final TextView appSummary3 = app3View.findViewById(R.id.app_summary);
+
+        assertThat(app3View.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(appIconView3.getDrawable()).isNotNull();
+        assertThat(appTitle3.getText()).isEqualTo("appTitle2");
+        assertThat(appSummary3.getText()).isEqualTo("appSummary2");
+    }
+
+    private List<RecentLocationAccesses.Access> createMockAccesses(int count) {
+        final List<RecentLocationAccesses.Access> accesses = new ArrayList<>();
+        for (int i = 0; i < count; i++) {
+            final Drawable icon = mock(Drawable.class);
+            // Add mock accesses
+            final RecentLocationAccesses.Access access = new RecentLocationAccesses.Access(
+                    "packageName", android.os.Process.myUserHandle(), icon,
+                    "appTitle" + i, "appSummary" + i, 1000 - i);
+            accesses.add(access);
+        }
+        return accesses;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/location/TopLevelLocationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/TopLevelLocationPreferenceControllerTest.java
new file mode 100644
index 0000000..68e7f88
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/location/TopLevelLocationPreferenceControllerTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.location.LocationManager;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class TopLevelLocationPreferenceControllerTest {
+    private static final String PREFERENCE_KEY = "top_level_location";
+    private Context mContext;
+    private TopLevelLocationPreferenceController mController;
+    private LocationManager mLocationManager;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mController = new TopLevelLocationPreferenceController(mContext, PREFERENCE_KEY);
+        mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
+    }
+
+    @Test
+    public void isAvailable_byDefault_shouldReturnTrue() {
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void getSummary_whenLocationIsOff_shouldReturnStringForOff() {
+        mLocationManager.setLocationEnabledForUser(false, android.os.Process.myUserHandle());
+        assertThat(mController.getSummary()).isEqualTo(
+                mContext.getString(R.string.location_settings_summary_location_off));
+    }
+
+    @Test
+    public void getSummary_whenLocationIsOn_shouldShowLoadingString() {
+        mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
+        assertThat(mController.getSummary()).isEqualTo(
+                mContext.getString(R.string.location_settings_loading_app_permission_stats));
+    }
+
+    @Test
+    public void getSummary_whenLocationAppCountIsOne_shouldShowSingularString() {
+        final int LOCATION_APP_COUNT = 1;
+        mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
+        mController.setLocationAppCount(LOCATION_APP_COUNT);
+        assertThat(mController.getSummary()).isEqualTo(
+                mContext.getResources().getQuantityString(
+                        R.plurals.location_settings_summary_location_on,
+                        LOCATION_APP_COUNT, LOCATION_APP_COUNT));
+    }
+
+    @Test
+    public void getSummary_whenLocationAppCountIsGreaterThanOne_shouldShowPluralString() {
+        final int LOCATION_APP_COUNT = 5;
+        mLocationManager.setLocationEnabledForUser(true, android.os.Process.myUserHandle());
+        mController.setLocationAppCount(LOCATION_APP_COUNT);
+        assertThat(mController.getSummary()).isEqualTo(
+                mContext.getResources().getQuantityString(
+                        R.plurals.location_settings_summary_location_on,
+                        LOCATION_APP_COUNT, LOCATION_APP_COUNT));
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
index 452e9b1..c0b1dab 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
@@ -32,6 +32,7 @@
 
 import com.android.ims.ImsConfig;
 import com.android.ims.ImsManager;
+import com.android.settings.core.BasePreferenceController;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -109,4 +110,12 @@
 
         assertThat(mPreferenceCategory.isVisible()).isFalse();
     }
+
+    @Test
+    public void getAvailabilityStatus_noWiFiCalling_shouldReturnUnsupported() {
+        mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java
index 8ed9dcc..cd70d66 100644
--- a/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.nfc.NfcAdapter;
 import android.nfc.NfcManager;
 import android.os.UserHandle;
@@ -57,6 +58,8 @@
     private UserManager mUserManager;
     @Mock
     private PreferenceScreen mScreen;
+    @Mock
+    private PackageManager mPackageManager;
 
     private RestrictedPreference mAndroidBeamPreference;
     private AndroidBeamPreferenceController mAndroidBeamController;
@@ -78,6 +81,8 @@
         mAndroidBeamPreference = new RestrictedPreference(RuntimeEnvironment.application);
         when(mScreen.findPreference(mAndroidBeamController.getPreferenceKey())).thenReturn(
                 mAndroidBeamPreference);
+        when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM)).thenReturn(true);
 
         Settings.Global.putString(mContext.getContentResolver(),
                 Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
@@ -95,6 +100,13 @@
     }
 
     @Test
+    public void isAvailable_noNfcFeature_shouldReturnFalse() {
+        when(mNfcAdapter.isEnabled()).thenReturn(true);
+        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM)).thenReturn(false);
+        assertThat(mAndroidBeamController.isAvailable()).isFalse();
+    }
+
+    @Test
     public void isAvailable_noNfcAdapter_shouldReturnFalse() {
         ReflectionHelpers.setField(mAndroidBeamController, "mNfcAdapter", null);
         assertThat(mAndroidBeamController.isAvailable()).isFalse();
diff --git a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
index 396b9df..4cd6be4 100644
--- a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
@@ -92,4 +92,13 @@
 
         verify(mMediaPlayer, never()).start();
     }
+
+    @Test
+    public void onViewInvisible_shouldReleaseMediaplayer() {
+        mVideoPreference.onViewVisible(false);
+
+        mVideoPreference.onViewInvisible();
+
+        verify(mMediaPlayer).release();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java
index 0ef0273..a57fefc 100644
--- a/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/qrcode/QrCameraTest.java
@@ -85,6 +85,11 @@
         public void setTransform(Matrix transform) {
             // Do nothing
         }
+
+        @Override
+        public boolean isValid(String qrCode) {
+            return true;
+        }
     }
 
     private ScannerTestCallback mScannerCallback;
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index 40d651e..cdc74b3 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -35,6 +35,9 @@
 import android.os.UserManager;
 import android.widget.TextView;
 
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.PreferenceScreen;
+
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowWifiManager;
 
@@ -51,15 +54,13 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import androidx.fragment.app.FragmentActivity;
-import androidx.preference.PreferenceScreen;
-
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowWifiManager.class})
 public class WifiTetherSettingsTest {
     private static final String[] WIFI_REGEXS = {"wifi_regexs"};
 
     private Context mContext;
+    private WifiTetherSettings mWifiTetherSettings;
 
     @Mock
     private ConnectivityManager mConnectivityManager;
@@ -75,6 +76,8 @@
                 .when(mContext).getSystemService(Context.CONNECTIVITY_SERVICE);
         doReturn(WIFI_REGEXS).when(mConnectivityManager).getTetherableWifiRegexs();
         doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
+
+        mWifiTetherSettings = new WifiTetherSettings();
     }
 
     @Test
@@ -136,6 +139,15 @@
         verify(screen).removeAll();
     }
 
+    @Test
+    public void createPreferenceControllers_hasAutoOffPreference() {
+        assertThat(mWifiTetherSettings.createPreferenceControllers(mContext)
+                .stream()
+                .filter(controller -> controller instanceof WifiTetherAutoOffPreferenceController)
+                .count())
+                .isEqualTo(1);
+    }
+
     private void setupIsTetherAvailable(boolean returnValue) {
         when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
 
diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
index 235f182..8e64f5f 100644
--- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
@@ -38,6 +38,7 @@
         Intent intent = new Intent(WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_SCANNER);
         intent.putExtra(WifiDppUtils.EXTRA_WIFI_SECURITY, "WEP");
         intent.putExtra(WifiDppUtils.EXTRA_WIFI_SSID, "GoogleGuest");
+        intent.putExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY, "password");
 
         mActivityRule.launchActivity(intent);
 
@@ -50,6 +51,7 @@
                 WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_GENERATOR);
         intent.putExtra(WifiDppUtils.EXTRA_WIFI_SECURITY, "WEP");
         intent.putExtra(WifiDppUtils.EXTRA_WIFI_SSID, "GoogleGuest");
+        intent.putExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY, "password");
 
         mActivityRule.launchActivity(intent);
 
@@ -59,7 +61,10 @@
     @Test
     public void launchActivity_chooseSavedWifiNetwork_shouldNotAutoFinish() {
         Intent intent = new Intent(
-                WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK);
+                WifiDppConfiguratorActivity.ACTION_PROCESS_WIFI_DPP_QR_CODE);
+        String qrCode = "DPP:I:SN=4774LH2b4044;M:010203040506;K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD"
+               + "IgADURzxmttZoIRIPWGoQMV00XHWCAQIhXruVWOz0NjlkIA=;;";
+        intent.putExtra(WifiDppUtils.EXTRA_QR_CODE, qrCode);
 
         mActivityRule.launchActivity(intent);
 
@@ -80,4 +85,20 @@
         assertThat(activity instanceof WifiDppQrCodeGeneratorFragment
                 .OnQrCodeGeneratorFragmentAddButtonClickedListener).isEqualTo(true);
     }
+
+    @Test
+    public void testActivity_shouldImplementsOnScanWifiDppSuccessCallback() {
+        WifiDppConfiguratorActivity activity = mActivityRule.getActivity();
+
+        assertThat(activity instanceof WifiDppQrCodeScannerFragment
+                .OnScanWifiDppSuccessListener).isEqualTo(true);
+    }
+
+    @Test
+    public void testActivity_shouldImplementsOnScanZxingWifiFormatSuccessCallback() {
+        WifiDppConfiguratorActivity activity = mActivityRule.getActivity();
+
+        assertThat(activity instanceof WifiDppQrCodeScannerFragment
+                .OnScanZxingWifiFormatSuccessListener).isEqualTo(true);
+    }
 }
diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
new file mode 100644
index 0000000..283da13
--- /dev/null
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.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.settings.wifi.dpp;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiDppEnrolleeActivityTest {
+    @Rule
+    public final ActivityTestRule<WifiDppEnrolleeActivity> mActivityRule =
+            new ActivityTestRule<>(WifiDppEnrolleeActivity.class);
+
+    @Test
+    public void testActivity_shouldImplementsOnScanWifiDppSuccessCallback() {
+        WifiDppEnrolleeActivity activity = mActivityRule.getActivity();
+
+        assertThat(activity instanceof WifiDppQrCodeScannerFragment
+                .OnScanWifiDppSuccessListener).isEqualTo(true);
+    }
+
+    @Test
+    public void testActivity_shouldImplementsOnScanZxingWifiFormatSuccessCallback() {
+        WifiDppEnrolleeActivity activity = mActivityRule.getActivity();
+
+        assertThat(activity instanceof WifiDppQrCodeScannerFragment
+                .OnScanZxingWifiFormatSuccessListener).isEqualTo(true);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiQrCodetest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiQrCodeTest.java
similarity index 83%
rename from tests/unit/src/com/android/settings/wifi/dpp/WifiQrCodetest.java
rename to tests/unit/src/com/android/settings/wifi/dpp/WifiQrCodeTest.java
index 775ca48..3595597 100644
--- a/tests/unit/src/com/android/settings/wifi/dpp/WifiQrCodetest.java
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiQrCodeTest.java
@@ -29,7 +29,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public class WifiQrCodetest {
+public class WifiQrCodeTest {
     // Valid Wi-Fi DPP QR code & it's parameters
     private static final String VALID_WIFI_DPP_QR_CODE = "DPP:I:SN=4774LH2b4044;M:010203040506;K:"
             + "MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADURzxmttZoIRIPWGoQMV00XHWCAQIhXruVWOz0NjlkIA=;;";
@@ -57,6 +57,13 @@
     private static final String SSID_OF_VALID_ZXING_WIFI_QR_CODE = "mynetwork";
     private static final String PASSWORD_OF_VALID_ZXING_WIFI_QR_CODE = "mypass";
 
+    // Valid ZXing reader library's Wi-Fi Network config format - escaped characters
+    private static final String VALID_ZXING_WIFI_QR_CODE_SPECIAL_CHARACTERS =
+            "WIFI:T:WPA;S:mynetwork;P:m\\;y\\:p\\\\a\\,ss;H:true;;";
+
+    private static final String PASSWORD_OF_VALID_ZXING_WIFI_QR_CODE_SPECIAL_CHARACTERS =
+            "m;y:p\\a,ss";
+
     // Invalid scheme QR code
     private static final String INVALID_SCHEME_QR_CODE = "BT:T:WPA;S:mynetwork;P:mypass;H:true;;";
 
@@ -118,19 +125,35 @@
 
         assertEquals(WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG, wifiQrCode.getScheme());
         assertNotNull(config);
-        assertNull(config.getSecurity());
+        assertEquals("", config.getSecurity());
         assertEquals(SSID_OF_VALID_ZXING_WIFI_QR_CODE, config.getSsid());
-        assertNull(config.getPreSharedKey());
+        assertEquals("", config.getPreSharedKey());
         assertEquals(false, config.getHiddenSsid());
     }
 
     @Test
+    public void parseValidZxingWifiQrCode_specialCharacters() {
+        WifiQrCode wifiQrCode = new WifiQrCode(VALID_ZXING_WIFI_QR_CODE_SPECIAL_CHARACTERS);
+        WifiNetworkConfig config = wifiQrCode.getWifiNetworkConfig();
+
+        assertEquals(WifiQrCode.SCHEME_ZXING_WIFI_NETWORK_CONFIG, wifiQrCode.getScheme());
+        assertNotNull(config);
+        assertEquals(SECURITY_OF_VALID_ZXING_WIFI_QR_CODE, config.getSecurity());
+        assertEquals(SSID_OF_VALID_ZXING_WIFI_QR_CODE, config.getSsid());
+        assertEquals(PASSWORD_OF_VALID_ZXING_WIFI_QR_CODE_SPECIAL_CHARACTERS,
+                config.getPreSharedKey());
+        assertEquals(true, config.getHiddenSsid());
+    }
+
+    @Test
     public void testRemoveBackSlash() {
-        assertEquals("\\", WifiQrCode.removeBackSlash("\\\\"));
-        assertEquals("ab", WifiQrCode.removeBackSlash("a\\b"));
-        assertEquals("a", WifiQrCode.removeBackSlash("\\a"));
-        assertEquals("\\b", WifiQrCode.removeBackSlash("\\\\b"));
-        assertEquals("c\\", WifiQrCode.removeBackSlash("c\\\\"));
+        WifiQrCode wifiQrCode = new WifiQrCode(VALID_WIFI_DPP_QR_CODE);
+
+        assertEquals("\\", wifiQrCode.removeBackSlash("\\\\"));
+        assertEquals("ab", wifiQrCode.removeBackSlash("a\\b"));
+        assertEquals("a", wifiQrCode.removeBackSlash("\\a"));
+        assertEquals("\\b", wifiQrCode.removeBackSlash("\\\\b"));
+        assertEquals("c\\", wifiQrCode.removeBackSlash("c\\\\"));
     }
 
     @Test