diff --git a/Android.mk b/Android.mk
index e385b34..906cfc7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -47,6 +47,7 @@
     guava \
     jsr305 \
     settings-contextual-card-protos-lite \
+    settings-log-bridge-protos-lite \
     contextualcards \
     settings-logtags \
     zxing-core-1.7
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4166d6f..cea4835 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1381,7 +1381,7 @@
         <activity android:name=".accessibility.AccessibilitySettingsForSetupWizardActivity"
                 android:icon="@drawable/ic_accessibility_suggestion"
                 android:label="@string/vision_settings_title"
-                android:theme="@style/SetupWizardAccessibilityTheme">
+                android:theme="@style/GlifTheme.Light">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.ACCESSIBILITY_SETTINGS_FOR_SUW" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -3042,9 +3042,8 @@
         <activity android:name=".panel.SettingsPanelActivity"
             android:label="@string/settings_panel_title"
             android:theme="@style/Theme.BottomDialog"
+            android:documentLaunchMode="always"
             android:excludeFromRecents="true"
-            android:launchMode="singleTop"
-            android:taskAffinity=".panel.SettingsPanelActivity"
             android:exported="true">
                  <intent-filter>
                      <action android:name="android.settings.panel.action.INTERNET_CONNECTIVITY" />
diff --git a/protos/Android.bp b/protos/Android.bp
index 533dbca..5184218 100644
--- a/protos/Android.bp
+++ b/protos/Android.bp
@@ -5,4 +5,13 @@
         type: "lite",
     },
     srcs: ["contextual_card_list.proto"],
+}
+
+java_library_static {
+    name: "settings-log-bridge-protos-lite",
+    host_supported: true,
+    proto: {
+        type: "lite",
+    },
+    srcs: ["settings_log_bridge.proto"],
 }
\ No newline at end of file
diff --git a/protos/settings_log_bridge.proto b/protos/settings_log_bridge.proto
new file mode 100644
index 0000000..7b28e0d
--- /dev/null
+++ b/protos/settings_log_bridge.proto
@@ -0,0 +1,37 @@
+syntax = "proto2";
+
+package com.android.settings.intelligence;
+option java_outer_classname = "LogProto";
+
+message SettingsLog {
+  /**
+   * Where this SettingsUIChange event comes from. For example, if
+   * it's a PAGE_VISIBLE event, where the page is opened from.
+   */
+  optional int32 attribution = 1;
+
+  /**
+   * What the UI action is.
+   */
+  optional int32 action = 2;
+
+  /**
+   * Where the action is happening
+   */
+  optional int32 page_id = 3;
+
+  /**
+   * What preference changed in this event.
+   */
+  optional string changed_preference_key = 4;
+
+  /**
+   * The new value of the changed preference.
+   */
+  optional int32 changed_preference_int_value = 5;
+
+  /**
+   * The timestamp of a log event
+   */
+  optional string timestamp = 6;
+}
diff --git a/res/drawable/ic_cellular_1_bar.xml b/res/drawable/ic_cellular_1_bar.xml
new file mode 100644
index 0000000..b3d2624
--- /dev/null
+++ b/res/drawable/ic_cellular_1_bar.xml
@@ -0,0 +1,29 @@
+<!--
+  Copyright (C) 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48"
+    android:tint="?android:attr/colorControlNormal">
+  <path
+      android:pathData="M4,44h40V4z"
+      android:fillColor="#000000"
+      android:fillAlpha=".3"/>
+  <path
+      android:pathData="M24,24L4,44h20z"
+      android:fillColor="#000000"/>
+</vector>
diff --git a/res/drawable/ic_color_inversion.xml b/res/drawable/ic_color_inversion.xml
index aa59f5a..5d20d05 100644
--- a/res/drawable/ic_color_inversion.xml
+++ b/res/drawable/ic_color_inversion.xml
@@ -13,8 +13,8 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector android:height="192dp" android:viewportHeight="192.0"
-    android:viewportWidth="192.0" android:width="192dp"
+<vector android:height="32dp" android:viewportHeight="192.0"
+    android:viewportWidth="192.0" android:width="32dp"
     xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
     <path android:fillColor="#546E7A" android:pathData="M37.2,173.6l-28.5,-90c-1.7,-5.8 0.3,-12 5,-15.6l73.6,-57.1c5.2,-4 12.5,-4 17.6,0.1L178.6,70c4.6,3.7 6.5,9.9 4.8,15.6l-28.5,88.2c-1.9,6.1 -7.4,10.2 -13.7,10.2H50.8C44.5,183.9 39,179.7 37.2,173.6z"/>
     <path android:fillAlpha="0.2" android:fillColor="#263238"
diff --git a/res/drawable/ic_daltonizer.xml b/res/drawable/ic_daltonizer.xml
index 04e397d..38cce69 100644
--- a/res/drawable/ic_daltonizer.xml
+++ b/res/drawable/ic_daltonizer.xml
@@ -13,8 +13,8 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector android:height="192dp" android:viewportHeight="192.0"
-    android:viewportWidth="192.0" android:width="192dp"
+<vector android:height="32dp" android:viewportHeight="192.0"
+    android:viewportWidth="192.0" android:width="32dp"
     xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
     <path android:fillColor="#00BCD4" android:pathData="M37.1,173.5l-28.5,-90c-1.7,-5.8 0.3,-12 5,-15.6l73.6,-57.1c5.2,-4 12.5,-4 17.6,0.1l73.8,58.9c4.6,3.7 6.5,9.9 4.8,15.6l-28.5,88.2c-1.9,6.1 -7.4,10.2 -13.7,10.2H50.8C44.5,183.8 39,179.6 37.1,173.5z"/>
     <path android:fillAlpha="0.2" android:fillColor="#263238"
diff --git a/res/drawable/ic_settings_aod.xml b/res/drawable/ic_settings_aod.xml
index 8d91349..b238e3a 100644
--- a/res/drawable/ic_settings_aod.xml
+++ b/res/drawable/ic_settings_aod.xml
@@ -18,7 +18,8 @@
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24"
-        android:viewportHeight="24">
+        android:viewportHeight="24"
+        android:tint="?android:attr/colorControlNormal">
 
     <path
         android:fillColor="#000000"
diff --git a/res/drawable/ic_settings_camera.xml b/res/drawable/ic_settings_camera.xml
index 5309270..3c85532 100644
--- a/res/drawable/ic_settings_camera.xml
+++ b/res/drawable/ic_settings_camera.xml
@@ -20,7 +20,8 @@
     android:height="24dp"
     android:viewportWidth="48"
     android:viewportHeight="48"
-    android:autoMirrored="true">
+    android:autoMirrored="true"
+    android:tint="?android:attr/colorControlNormal">
 
     <path android:fillColor="#000000"
           android:pathData="M18.8 21l9.53-16.51C26.94 4.18 25.49 4 24 4c-4.8 0-9.19 1.69-12.64
diff --git a/res/drawable/ic_settings_disable.xml b/res/drawable/ic_settings_disable.xml
new file mode 100644
index 0000000..d0edf4a
--- /dev/null
+++ b/res/drawable/ic_settings_disable.xml
@@ -0,0 +1,25 @@
+<!--
+  Copyright (C) 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M12,2c-1.78,0 -3.44,0.46 -4.89,1.28l1.48,1.48C9.63,4.28 10.78,4 12,4c4.41,0 8,3.59 8,8c0,1.22 -0.28,2.37 -0.76,3.41l1.48,1.48C21.54,15.44 22,13.78 22,12C22,6.48 17.52,2 12,2zM18.12,17.13L6.87,5.87L3.31,2.31L1.89,3.72l2.19,2.19C2.77,7.59 2,9.71 2,12c0,5.52 4.48,10 10,10c2.29,0 4.41,-0.77 6.09,-2.08l2.19,2.19l1.41,-1.41L18.12,17.13zM12,20c-4.41,0 -8,-3.59 -8,-8c0,-1.74 0.56,-3.35 1.51,-4.66l11.15,11.15C15.35,19.44 13.74,20 12,20zM8.59,4.76L7.11,3.28"/>
+</vector>
diff --git a/res/drawable/ic_settings_enable.xml b/res/drawable/ic_settings_enable.xml
new file mode 100644
index 0000000..560daef
--- /dev/null
+++ b/res/drawable/ic_settings_enable.xml
@@ -0,0 +1,25 @@
+<!--
+  Copyright (C) 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M15.59,10.09L13,12.67V2h-2v10.67l-2.59,-2.58L7,11.5l5,5l5,-5L15.59,10.09zM15,2.46v2.13c2.93,1.19 5,4.06 5,7.41c0,4.41 -3.59,8 -8,8s-8,-3.59 -8,-8c0,-3.35 2.07,-6.22 5,-7.41V2.46C4.94,3.74 2,7.53 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10C22,7.53 19.06,3.74 15,2.46z"/>
+</vector>
diff --git a/res/drawable/ic_settings_phone_idle.xml b/res/drawable/ic_settings_phone_idle.xml
new file mode 100644
index 0000000..7bb6c31
--- /dev/null
+++ b/res/drawable/ic_settings_phone_idle.xml
@@ -0,0 +1,25 @@
+<!--
+  Copyright (C) 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48"
+    android:tint="?android:attr/colorControlNormal">
+  <path
+      android:pathData="M14,48h4v-4h-4v4zM22,48h4v-4h-4v4zM26,4h-4v20h4L26,4zM33.13,8.87l-2.89,2.89C33.69,13.87 36,17.66 36,22c0,6.63 -5.37,12 -12,12s-12,-5.37 -12,-12c0,-4.34 2.31,-8.13 5.76,-10.24l-2.89,-2.89C10.72,11.76 8,16.56 8,22c0,8.84 7.16,16 16,16s16,-7.16 16,-16c0,-5.44 -2.72,-10.24 -6.87,-13.13zM30,48h4v-4h-4v4z"
+      android:fillColor="#000000"/>
+</vector>
diff --git a/res/drawable/ic_settings_voice_calls.xml b/res/drawable/ic_settings_voice_calls.xml
new file mode 100644
index 0000000..b455f0a
--- /dev/null
+++ b/res/drawable/ic_settings_voice_calls.xml
@@ -0,0 +1,25 @@
+<!--
+  Copyright (C) 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48"
+    android:tint="?android:attr/colorControlNormal">
+  <path
+      android:pathData="M40,31c-2.49,0 -4.89,-0.4 -7.14,-1.14 -0.69,-0.22 -1.48,-0.06 -2.03,0.49l-4.4,4.41c-5.67,-2.88 -10.29,-7.51 -13.18,-13.17l4.4,-4.41c0.55,-0.55 0.71,-1.34 0.49,-2.03C17.4,12.9 17,10.49 17,8c0,-1.11 -0.89,-2 -2,-2L8,6c-1.11,0 -2,0.89 -2,2 0,18.78 15.22,34 34,34 1.11,0 2,-0.89 2,-2v-7c0,-1.11 -0.89,-2 -2,-2zM38,24h4c0,-9.94 -8.06,-18 -18,-18v4c7.73,0 14,6.27 14,14zM30,24h4c0,-5.52 -4.48,-10 -10,-10v4c3.31,0 6,2.69 6,6z"
+      android:fillColor="#000000"/>
+</vector>
diff --git a/res/layout/encryption_interstitial.xml b/res/layout/encryption_interstitial.xml
index 3e227cb1..a2305f8 100644
--- a/res/layout/encryption_interstitial.xml
+++ b/res/layout/encryption_interstitial.xml
@@ -17,7 +17,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:icon="@drawable/ic_lock">
diff --git a/res/layout/face_enroll_enrolling.xml b/res/layout/face_enroll_enrolling.xml
index e7af493..7e1863b 100644
--- a/res/layout/face_enroll_enrolling.xml
+++ b/res/layout/face_enroll_enrolling.xml
@@ -17,7 +17,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
diff --git a/res/layout/face_enroll_finish.xml b/res/layout/face_enroll_finish.xml
index 62176a7..d3c0479 100644
--- a/res/layout/face_enroll_finish.xml
+++ b/res/layout/face_enroll_finish.xml
@@ -17,7 +17,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     style="?attr/face_layout_theme"
     android:layout_width="match_parent"
diff --git a/res/layout/fingerprint_enroll_enrolling_base.xml b/res/layout/fingerprint_enroll_enrolling_base.xml
index 3a476fa..eed6fab 100644
--- a/res/layout/fingerprint_enroll_enrolling_base.xml
+++ b/res/layout/fingerprint_enroll_enrolling_base.xml
@@ -17,7 +17,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
diff --git a/res/layout/fingerprint_enroll_find_sensor_base.xml b/res/layout/fingerprint_enroll_find_sensor_base.xml
index c03ac5a..2bef539 100644
--- a/res/layout/fingerprint_enroll_find_sensor_base.xml
+++ b/res/layout/fingerprint_enroll_find_sensor_base.xml
@@ -17,7 +17,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     style="?attr/fingerprint_layout_theme"
     android:layout_width="match_parent"
diff --git a/res/layout/fingerprint_enroll_finish_base.xml b/res/layout/fingerprint_enroll_finish_base.xml
index 2fa5da6..d85c56c 100644
--- a/res/layout/fingerprint_enroll_finish_base.xml
+++ b/res/layout/fingerprint_enroll_finish_base.xml
@@ -17,7 +17,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     style="?attr/fingerprint_layout_theme"
     android:layout_width="match_parent"
diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml
index 4ee7057..47d2f02 100644
--- a/res/layout/fingerprint_enroll_introduction.xml
+++ b/res/layout/fingerprint_enroll_introduction.xml
@@ -17,7 +17,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     style="?attr/fingerprint_layout_theme"
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
diff --git a/res/layout/storage_wizard_generic.xml b/res/layout/storage_wizard_generic.xml
index 2b96101..e7881d3 100644
--- a/res/layout/storage_wizard_generic.xml
+++ b/res/layout/storage_wizard_generic.xml
@@ -16,7 +16,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
diff --git a/res/layout/storage_wizard_init.xml b/res/layout/storage_wizard_init.xml
index d02e871..8d9870f 100644
--- a/res/layout/storage_wizard_init.xml
+++ b/res/layout/storage_wizard_init.xml
@@ -16,7 +16,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
diff --git a/res/layout/storage_wizard_progress.xml b/res/layout/storage_wizard_progress.xml
index cf5bc43..577ec3c 100644
--- a/res/layout/storage_wizard_progress.xml
+++ b/res/layout/storage_wizard_progress.xml
@@ -16,7 +16,6 @@
 
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e51734c..11281c2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10924,7 +10924,7 @@
     <!-- Title for the top level Privacy Settings [CHAR LIMIT=30]-->
     <string name="privacy_dashboard_title">Privacy</string>
     <!-- Summary for the top level Privacy Settings [CHAR LIMIT=NONE]-->
-    <string name="privacy_dashboard_summary">Permissions, web activity, personal data</string>
+    <string name="privacy_dashboard_summary">Permissions, account activity, personal data</string>
 
     <!-- Label for button in contextual card for users to remove the card [CHAR LIMIT=30] -->
     <string name="contextual_card_dismiss_remove">Remove</string>
@@ -10955,17 +10955,15 @@
     <string name="permission_bar_chart_empty_text">0 apps used permissions</string>
 
     <!-- Text for permission bar chart title in Privacy page.  [CHAR LIMIT=NONE] -->
-    <string name="permission_bar_chart_title">Most-used permissions in last 24 hours</string>
-    <!-- Text for permission bar chart title in Privacy page.  [CHAR LIMIT=NONE] -->
-    <string name="permission_bar_chart_title_v2">In last 24 hr, apps on this device accessed</string>
+    <string name="permission_bar_chart_title">Permission usage in last 24 hours</string>
 
     <!-- Text for permission bar chart details in Privacy page.  [CHAR LIMIT=NONE] -->
-    <string name="permission_bar_chart_details">View Permissions Dashboard</string>
+    <string name="permission_bar_chart_details">See all in Dashboard</string>
 
-    <!-- Text for permission bar chart details in Privacy page.  [CHAR LIMIT=NONE] -->
-    <string name="permission_bar_chart_details_v2">See all permission usage in Dashboard</string>
-    <!-- Text for permission bar chart details in Privacy page.  [CHAR LIMIT=NONE] -->
-    <string name="permission_bar_chart_details_v3">+ <xliff:g id="permissionCount" example="3">%1$d</xliff:g> other permissions</string>
+    <plurals name="permission_bar_chart_label">
+        <item quantity="one">1 app</item>
+        <item quantity="other"><xliff:g id="number" example="7">%s</xliff:g> apps</item>
+    </plurals>
 
     <!-- Title for the accessibility usage preference in the Privacy page.  [CHAR LIMIT=NONE] -->
     <string name="accessibility_usage_title">Accessibility usage</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 8fde9a0..02db995 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -533,4 +533,9 @@
         <item name="android:paddingEnd">8dp</item>
     </style>
 
+    <style name="SetupWizardPartnerResource">
+        <!-- Disable to use partner overlay theme for outside setupwizard flow. -->
+        <item name="sucUsePartnerResource">false</item>
+    </style>
+
 </resources>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index a9af2d4..908529e 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -36,6 +36,10 @@
             android:dialogTitle="@*android:string/bugreport_title" />
 
         <Preference
+            android:key="system_server_heap_dump"
+            android:title="@string/capture_system_heap_dump_title" />
+
+        <Preference
             android:key="local_backup_password"
             android:title="@string/local_backup_password_title"
             android:summary="@string/local_backup_password_summary_none"
@@ -151,6 +155,11 @@
             android:title="@string/bugreport_in_power"
             android:summary="@string/bugreport_in_power_summary" />
 
+        <SwitchPreference
+            android:key="automatic_system_server_heap_dumps"
+            android:title="@string/automatic_system_heap_dump_title"
+            android:summary="@string/automatic_system_heap_dump_summary" />
+
         <Preference android:key="mock_location_app"
                     android:title="@string/mock_location_app" />
 
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 001e65b..92a0f73 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -27,6 +27,7 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources.Theme;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.UserHandle;
@@ -334,6 +335,12 @@
     }
 
     @Override
+    protected void onApplyThemeResource(Theme theme, int resid, boolean first) {
+        theme.applyStyle(R.style.SetupWizardPartnerResource, true);
+        super.onApplyThemeResource(theme, resid, first);
+    }
+
+    @Override
     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         final List<Fragment> fragments = getSupportFragmentManager().getFragments();
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index b9b9538..4ba605f 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -18,6 +18,8 @@
 
 import static android.os.Vibrator.VibrationIntensity;
 
+import static com.android.settingslib.TwoTargetPreference.ICON_SIZE_MEDIUM;
+
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.admin.DevicePolicyManager;
 import android.app.settings.SettingsEnums;
@@ -594,6 +596,7 @@
             preference.setKey(componentName.flattenToString());
 
             preference.setTitle(title);
+            preference.setIconSize(ICON_SIZE_MEDIUM);
             Utils.setSafeIcon(preference, icon);
             final boolean serviceEnabled = enabledServices.contains(componentName);
             String description = info.loadDescription(getPackageManager());
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
index 46a6371..16f5fcd 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
@@ -23,13 +23,19 @@
 import android.content.pm.ServiceInfo;
 import android.os.Bundle;
 import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
 
 import androidx.preference.Preference;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
+import com.google.android.setupdesign.GlifPreferenceLayout;
+
 import java.util.List;
 
 /**
@@ -64,6 +70,23 @@
     }
 
     @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
+        layout.setDividerInsets(Integer.MAX_VALUE, 0);
+
+        layout.setHeaderText(R.string.vision_settings_title);
+    }
+
+    @Override
+    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+        Bundle savedInstanceState) {
+        GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
+        return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         addPreferencesFromResource(R.xml.accessibility_settings_for_setup_wizard);
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index 9512f01..fc68d2c 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -34,14 +34,6 @@
     private static final String SAVE_KEY_TITLE = "activity_title";
 
     @Override
-    protected void onCreate(Bundle savedState) {
-        super.onCreate(savedState);
-
-        // Finish configuring the content view.
-        getActionBar().setDisplayHomeAsUpEnabled(true);
-    }
-
-    @Override
     protected void onSaveInstanceState(Bundle savedState) {
         savedState.putCharSequence(SAVE_KEY_TITLE, getTitle());
         super.onSaveInstanceState(savedState);
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index e118ed6..d9ddc2f 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -560,15 +560,15 @@
                 || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) {
             // Disable button for core system applications.
             mButtonsPref.setButton2Text(R.string.disable_text)
-                    .setButton2Icon(R.drawable.ic_settings_delete);
+                    .setButton2Icon(R.drawable.ic_settings_disable);
         } else if (mAppEntry.info.enabled && !isDisabledUntilUsed()) {
             mButtonsPref.setButton2Text(R.string.disable_text)
-                    .setButton2Icon(R.drawable.ic_settings_delete);
+                    .setButton2Icon(R.drawable.ic_settings_disable);
             disableable = !mApplicationFeatureProvider.getKeepEnabledPackages()
                     .contains(mAppEntry.info.packageName);
         } else {
             mButtonsPref.setButton2Text(R.string.enable_text)
-                    .setButton2Icon(R.drawable.ic_settings_install);
+                    .setButton2Icon(R.drawable.ic_settings_enable);
             disableable = true;
         }
 
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 9c9f4fa..a961921 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -21,6 +21,7 @@
 import android.annotation.Nullable;
 import android.content.Intent;
 import android.content.res.Resources;
+import android.content.res.Resources.Theme;
 import android.graphics.Color;
 import android.os.Bundle;
 import android.os.UserHandle;
@@ -97,6 +98,7 @@
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
         resid = SetupWizardUtils.getTheme(getIntent());
+        theme.applyStyle(R.style.SetupWizardPartnerResource, true);
         super.onApplyThemeResource(theme, resid, first);
     }
 
diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java
index 2c4db1f..1d2d793 100644
--- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java
@@ -62,6 +62,7 @@
     @VisibleForTesting
     final Map<String, Bitmap> mIconCache;
     private CachedBluetoothDevice mCachedDevice;
+    private BluetoothDevice mBluetoothDevice;
     @VisibleForTesting
     BluetoothAdapter mBluetoothAdapter;
     @VisibleForTesting
@@ -102,6 +103,9 @@
 
     @Override
     public void onStart() {
+        if (!isAvailable()) {
+            return;
+        }
         mCachedDevice.registerCallback(this::onDeviceAttributesChanged);
         mBluetoothAdapter.registerMetadataListener(mCachedDevice.getDevice(), mMetadataListener,
                 mHandler);
@@ -109,6 +113,9 @@
 
     @Override
     public void onStop() {
+        if (!isAvailable()) {
+            return;
+        }
         mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged);
         mBluetoothAdapter.unregisterMetadataListener(mCachedDevice.getDevice());
 
@@ -123,6 +130,7 @@
 
     public void init(CachedBluetoothDevice cachedBluetoothDevice) {
         mCachedDevice = cachedBluetoothDevice;
+        mBluetoothDevice = mCachedDevice.getDevice();
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriter.java b/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriter.java
new file mode 100644
index 0000000..9498732
--- /dev/null
+++ b/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriter.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.core.instrumentation;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Process;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.text.format.DateUtils;
+import android.util.Log;
+import android.util.Pair;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.R;
+import com.android.settings.intelligence.LogProto.SettingsLog;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.LogWriter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.LinkedList;
+import java.util.List;
+
+public class SettingsIntelligenceLogWriter implements LogWriter {
+    private static final String TAG = "IntelligenceLogWriter";
+
+    private static final String LOG = "logs";
+    private static final long MESSAGE_DELAY = DateUtils.MINUTE_IN_MILLIS; // 1 minute
+
+    private List<SettingsLog> mSettingsLogList;
+    private SendLogHandler mLogHandler;
+
+    public SettingsIntelligenceLogWriter() {
+        mSettingsLogList = new LinkedList<>();
+        final HandlerThread workerThread = new HandlerThread("SettingsIntelligenceLogWriter",
+                Process.THREAD_PRIORITY_BACKGROUND);
+        workerThread.start();
+        mLogHandler = new SendLogHandler(workerThread.getLooper());
+    }
+
+    @Override
+    public void visible(Context context, int attribution, int pageId) {
+        action(attribution /* attribution */,
+                SettingsEnums.PAGE_VISIBLE /* action */,
+                pageId /* pageId */,
+                "" /* changedPreferenceKey */,
+                0 /* changedPreferenceIntValue */);
+    }
+
+    @Override
+    public void hidden(Context context, int pageId) {
+        action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
+                SettingsEnums.PAGE_HIDE /* action */,
+                pageId /* pageId */,
+                "" /* changedPreferenceKey */,
+                0 /* changedPreferenceIntValue */);
+    }
+
+    @Override
+    public void action(Context context, int action, Pair<Integer, Object>... taggedData) {
+        action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
+                action,
+                SettingsEnums.PAGE_UNKNOWN /* pageId */,
+                "" /* changedPreferenceKey */,
+                0 /* changedPreferenceIntValue */);
+    }
+
+    @Override
+    public void action(Context context, int action, int value) {
+        action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
+                action,
+                SettingsEnums.PAGE_UNKNOWN /* pageId */,
+                "" /* changedPreferenceKey */,
+                value /* changedPreferenceIntValue */);
+    }
+
+    @Override
+    public void action(Context context, int action, boolean value) {
+        action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
+                action,
+                SettingsEnums.PAGE_UNKNOWN /* pageId */,
+                "" /* changedPreferenceKey */,
+                value ? 1 : 0 /* changedPreferenceIntValue */);
+    }
+
+    @Override
+    public void action(Context context, int action, String pkg) {
+        action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
+                action,
+                SettingsEnums.PAGE_UNKNOWN /* pageId */,
+                pkg /* changedPreferenceKey */,
+                1 /* changedPreferenceIntValue */);
+    }
+
+    @Override
+    public void action(int attribution, int action, int pageId, String key, int value) {
+        final ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
+        final SettingsLog settingsLog = SettingsLog.newBuilder()
+                .setAttribution(attribution)
+                .setAction(action)
+                .setPageId(pageId)
+                .setChangedPreferenceKey(key != null ? key : "")
+                .setChangedPreferenceIntValue(value)
+                .setTimestamp(now.toString())
+                .build();
+        mLogHandler.post(() -> {
+            mSettingsLogList.add(settingsLog);
+        });
+        mLogHandler.scheduleSendLog();
+    }
+
+    @VisibleForTesting
+    static byte[] serialize(List<SettingsLog> settingsLogs) {
+        final int size = settingsLogs.size();
+        final ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        final DataOutputStream output = new DataOutputStream(bout);
+        // Data is "size, length, bytearray, length, bytearray ..."
+        try {
+            output.writeInt(size);
+            for (SettingsLog settingsLog : settingsLogs) {
+                final byte[] data = settingsLog.toByteArray();
+                output.writeInt(data.length);
+                output.write(data);
+            }
+            return bout.toByteArray();
+        } catch (Exception e) {
+            Log.e(TAG, "serialize error", e);
+            return null;
+        } finally {
+            try {
+                output.close();
+            } catch (Exception e) {
+                Log.e(TAG, "close error", e);
+            }
+        }
+    }
+
+    private class SendLogHandler extends Handler {
+
+        public SendLogHandler(Looper looper) {
+            super(looper);
+        }
+
+        public void scheduleSendLog() {
+            removeCallbacks(mSendLogsRunnable);
+            postDelayed(mSendLogsRunnable, MESSAGE_DELAY);
+        }
+    }
+
+    private final Runnable mSendLogsRunnable = () -> {
+        final Context context = FeatureFactory.getAppContext();
+        if (context == null) {
+            Log.e(TAG, "context is null");
+            return;
+        }
+        final String action = context.getString(R.string
+                .config_settingsintelligence_log_action);
+        if (!TextUtils.isEmpty(action) && !mSettingsLogList.isEmpty()) {
+            final Intent intent = new Intent();
+            intent.setPackage(context.getString(R.string
+                    .config_settingsintelligence_package_name));
+            intent.setAction(action);
+            intent.putExtra(LOG, serialize(mSettingsLogList));
+            context.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+            mSettingsLogList.clear();
+        }
+    };
+}
diff --git a/src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java b/src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java
index 93a5163..ec05757 100644
--- a/src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java
+++ b/src/com/android/settings/core/instrumentation/SettingsMetricsFeatureProvider.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.core.instrumentation;
 
+import android.content.Context;
+
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 public class SettingsMetricsFeatureProvider extends MetricsFeatureProvider {
@@ -23,5 +25,6 @@
     protected void installLogWriters() {
         super.installLogWriters();
         mLoggerWriters.add(new StatsLogWriter());
+        mLoggerWriters.add(new SettingsIntelligenceLogWriter());
     }
 }
diff --git a/src/com/android/settings/development/AutomaticSystemServerHeapDumpPreferenceController.java b/src/com/android/settings/development/AutomaticSystemServerHeapDumpPreferenceController.java
new file mode 100644
index 0000000..aa76bb8
--- /dev/null
+++ b/src/com/android/settings/development/AutomaticSystemServerHeapDumpPreferenceController.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.UserManager;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class AutomaticSystemServerHeapDumpPreferenceController extends
+        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
+        PreferenceControllerMixin {
+
+    private static final String KEY_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS =
+            "automatic_system_server_heap_dumps";
+
+    private static final int SETTING_VALUE_OFF = 0;
+    private static final int SETTING_VALUE_ON = 1;
+
+    private final UserManager mUserManager;
+    private final boolean mIsConfigEnabled;
+
+    public AutomaticSystemServerHeapDumpPreferenceController(Context context) {
+        super(context);
+        mIsConfigEnabled = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_debugEnableAutomaticSystemServerHeapDumps);
+        mUserManager = context.getSystemService(UserManager.class);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return Build.IS_DEBUGGABLE && mIsConfigEnabled
+                && !mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final boolean isEnabled = (Boolean) newValue;
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS,
+                isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        final int mode = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS, SETTING_VALUE_ON);
+        ((SwitchPreference) mPreference).setChecked(mode != SETTING_VALUE_OFF);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        super.onDeveloperOptionsSwitchDisabled();
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Global.ENABLE_AUTOMATIC_SYSTEM_SERVER_HEAP_DUMPS, SETTING_VALUE_OFF);
+        ((SwitchPreference) mPreference).setChecked(false);
+    }
+}
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index adc23a8..e9fc759 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -404,6 +404,7 @@
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         controllers.add(new MemoryUsagePreferenceController(context));
         controllers.add(new BugReportPreferenceController(context));
+        controllers.add(new SystemServerHeapDumpPreferenceController(context));
         controllers.add(new LocalBackupPasswordPreferenceController(context));
         controllers.add(new StayAwakePreferenceController(context, lifecycle));
         controllers.add(new HdcpCheckingPreferenceController(context));
@@ -418,6 +419,7 @@
         controllers.add(new ClearAdbKeysPreferenceController(context, fragment));
         controllers.add(new LocalTerminalPreferenceController(context));
         controllers.add(new BugReportInPowerPreferenceController(context));
+        controllers.add(new AutomaticSystemServerHeapDumpPreferenceController(context));
         controllers.add(new MockLocationAppPreferenceController(context, fragment));
         controllers.add(new DebugViewAttributesPreferenceController(context));
         controllers.add(new SelectDebugAppPreferenceController(context, fragment));
diff --git a/src/com/android/settings/development/SystemServerHeapDumpPreferenceController.java b/src/com/android/settings/development/SystemServerHeapDumpPreferenceController.java
new file mode 100644
index 0000000..599162e
--- /dev/null
+++ b/src/com/android/settings/development/SystemServerHeapDumpPreferenceController.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.os.Build;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.os.UserManager;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class SystemServerHeapDumpPreferenceController extends DeveloperOptionsPreferenceController
+        implements PreferenceControllerMixin {
+
+    private static final String KEY_SYSTEM_SERVER_HEAP_DUMP = "system_server_heap_dump";
+
+    /** How long to keep the preference disabled before re-enabling. */
+    private static final long ENABLE_TIMEOUT_MILLIS = 5000L;
+
+    private final UserManager mUserManager;
+
+    private Handler mHandler;
+
+    public SystemServerHeapDumpPreferenceController(Context context) {
+        super(context);
+
+        mUserManager = context.getSystemService(UserManager.class);
+        mHandler = new Handler();
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return Build.IS_DEBUGGABLE
+                && !mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES);
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_SYSTEM_SERVER_HEAP_DUMP;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (!KEY_SYSTEM_SERVER_HEAP_DUMP.equals(preference.getKey())) {
+            return false;
+        }
+        try {
+            // Temporarily disable the preference so the user doesn't start two dumps in a row.
+            preference.setEnabled(false);
+            Toast.makeText(mContext, R.string.capturing_system_heap_dump_message,
+                    Toast.LENGTH_SHORT).show();
+            ActivityManager.getService().requestSystemServerHeapDump();
+            mHandler.postDelayed(() -> preference.setEnabled(true), ENABLE_TIMEOUT_MILLIS);
+            return true;
+        } catch (RemoteException e) {
+            Log.e(TAG, "error taking system heap dump", e);
+            Toast.makeText(mContext, R.string.error_capturing_system_heap_dump_message,
+                    Toast.LENGTH_SHORT).show();
+        }
+        return false;
+    }
+}
diff --git a/src/com/android/settings/deviceinfo/StorageWizardBase.java b/src/com/android/settings/deviceinfo/StorageWizardBase.java
index 48cdeeb..3873389 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardBase.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardBase.java
@@ -24,6 +24,7 @@
 import android.annotation.LayoutRes;
 import android.annotation.NonNull;
 import android.content.Intent;
+import android.content.res.Resources.Theme;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.SystemClock;
@@ -123,6 +124,12 @@
         super.onDestroy();
     }
 
+    @Override
+    protected void onApplyThemeResource(Theme theme, int resid, boolean first) {
+        theme.applyStyle(R.style.SetupWizardPartnerResource, true);
+        super.onApplyThemeResource(theme, resid, first);
+    }
+
     protected FooterButton getBackButton() {
         return mBack;
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java
index c91cc8f..38ae2b2 100644
--- a/src/com/android/settings/fuelgauge/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryEntry.java
@@ -145,7 +145,7 @@
                 break;
             case CELL:
                 name = context.getResources().getString(R.string.power_cell);
-                iconId = R.drawable.ic_settings_cell_standby;
+                iconId = R.drawable.ic_cellular_1_bar;
                 break;
             case PHONE:
                 name = context.getResources().getString(R.string.power_phone);
@@ -199,11 +199,11 @@
             } break;
             case UNACCOUNTED:
                 name = context.getResources().getString(R.string.power_unaccounted);
-                iconId = R.drawable.ic_power_system;
+                iconId = R.drawable.ic_android;
                 break;
             case OVERCOUNTED:
                 name = context.getResources().getString(R.string.power_overcounted);
-                iconId = R.drawable.ic_power_system;
+                iconId = R.drawable.ic_android;
                 break;
             case CAMERA:
                 name = context.getResources().getString(R.string.power_camera);
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java
index 241834d..d6df380 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsAdapter.java
@@ -28,6 +28,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.homepage.contextualcards.conditional.ConditionContextualCardRenderer;
+import com.android.settings.homepage.contextualcards.slices.SwipeDismissalDelegate.DismissalItemTouchHelperListener;
 import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
 
 import java.util.ArrayList;
@@ -35,7 +36,7 @@
 import java.util.Map;
 
 public class ContextualCardsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
-        implements ContextualCardUpdateListener {
+        implements ContextualCardUpdateListener, DismissalItemTouchHelperListener {
     static final int SPAN_COUNT = 2;
 
     private static final String TAG = "ContextualCardsAdapter";
@@ -136,4 +137,9 @@
 
         //TODO(b/119465242): flickering conditional cards after collapsing/expanding
     }
+
+    @Override
+    public void onSwiped(int position) {
+
+    }
 }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
index bd25866..0cf553c 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
@@ -27,9 +27,11 @@
 
 import androidx.loader.app.LoaderManager;
 import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.ItemTouchHelper;
 
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.homepage.contextualcards.slices.SwipeDismissalDelegate;
 import com.android.settings.overlay.FeatureFactory;
 
 public class ContextualCardsFragment extends InstrumentedFragment implements
@@ -41,6 +43,7 @@
     private GridLayoutManager mLayoutManager;
     private ContextualCardsAdapter mContextualCardsAdapter;
     private ContextualCardManager mContextualCardManager;
+    private ItemTouchHelper mItemTouchHelper;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -63,16 +66,20 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
+        final Context context = getContext();
         final View rootView = inflater.inflate(R.layout.settings_homepage, container, false);
         mCardsContainer = rootView.findViewById(R.id.card_container);
         mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT,
                 GridLayoutManager.VERTICAL, false /* reverseLayout */);
         mCardsContainer.setLayoutManager(mLayoutManager);
-        mContextualCardsAdapter = new ContextualCardsAdapter(getContext(),
-                this /* lifecycleOwner */, mContextualCardManager);
+        mContextualCardsAdapter = new ContextualCardsAdapter(context, this /* lifecycleOwner */,
+                mContextualCardManager);
         mCardsContainer.setAdapter(mContextualCardsAdapter);
         mContextualCardManager.setListener(mContextualCardsAdapter);
         mCardsContainer.setListener(this);
+        mItemTouchHelper = new ItemTouchHelper(
+                new SwipeDismissalDelegate(context, mContextualCardsAdapter));
+        mItemTouchHelper.attachToRecyclerView(mCardsContainer);
 
         return rootView;
     }
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java b/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
new file mode 100644
index 0000000..a4186b0
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.homepage.contextualcards.slices;
+
+import android.content.Context;
+import android.graphics.Canvas;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.ItemTouchHelper;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class SwipeDismissalDelegate extends ItemTouchHelper.Callback {
+
+    private static final String TAG = "DismissItemTouchHelper";
+
+    public interface DismissalItemTouchHelperListener {
+        void onSwiped(int position);
+    }
+
+    private final Context mContext;
+    private final DismissalItemTouchHelperListener mListener;
+
+    public SwipeDismissalDelegate(Context context, DismissalItemTouchHelperListener listener) {
+        mContext = context;
+        mListener = listener;
+    }
+
+    @Override
+    public int getMovementFlags(@NonNull RecyclerView recyclerView,
+            @NonNull RecyclerView.ViewHolder viewHolder) {
+        return 0;
+    }
+
+    @Override
+    public boolean onMove(@NonNull RecyclerView recyclerView,
+            @NonNull RecyclerView.ViewHolder viewHolder,
+            @NonNull RecyclerView.ViewHolder target) {
+        return false;
+    }
+
+    @Override
+    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
+        mListener.onSwiped(viewHolder.getAdapterPosition());
+    }
+
+    @Override
+    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
+            @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
+            boolean isCurrentlyActive) {
+        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
index 7c55b51..b47ad9c 100644
--- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
+++ b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
@@ -163,12 +163,13 @@
 
         for (int index = 0; index < barViewInfos.length; index++) {
             final RuntimePermissionUsageInfo permissionGroupInfo = usageInfos.get(index);
+            final int count = permissionGroupInfo.getAppAccessCount();
+            final CharSequence permLabel = getPermissionGroupLabel(permissionGroupInfo.getName());
 
             barViewInfos[index] = new BarViewInfo(
-                    getPermissionGroupIcon(permissionGroupInfo.getName()),
-                    permissionGroupInfo.getAppAccessCount(),
-                    R.string.storage_detail_apps,
-                    getPermissionGroupLabel(permissionGroupInfo.getName()));
+                    getPermissionGroupIcon(permissionGroupInfo.getName()), count, permLabel,
+                    mContext.getResources().getQuantityString(R.plurals.permission_bar_chart_label,
+                            count, count), permLabel);
 
             // Set the click listener for each bar view.
             // The listener will navigate user to permission usage app.
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 5fc350b..955525d 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -41,6 +41,7 @@
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
+import android.os.CountDownTimer;
 import android.os.Handler;
 import android.text.TextUtils;
 import android.util.FeatureFlagUtils;
@@ -84,6 +85,7 @@
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.time.Duration;
 import java.util.StringJoiner;
 import java.util.stream.Collectors;
 
@@ -127,6 +129,19 @@
     @VisibleForTesting
     static final String KEY_IPV6_ADDRESSES_PREF = "ipv6_addresses";
 
+    private static final int STATE_NONE = 1;
+    private static final int STATE_ENABLE_WIFI = 2;
+    private static final int STATE_ENABLE_WIFI_FAILED = 3;
+    private static final int STATE_CONNECTING = 4;
+    private static final int STATE_CONNECTED = 5;
+    private static final int STATE_FAILED = 6;
+    private static final int STATE_NOT_IN_RANGE = 7;
+    private static final int STATE_DISCONNECTED = 8;
+    private static final long TIMEOUT = Duration.ofSeconds(10).toMillis();
+
+    // Be static to avoid too much object not be reset.
+    private static CountDownTimer mTimer;
+
     private AccessPoint mAccessPoint;
     private final ConnectivityManager mConnectivityManager;
     private final Fragment mFragment;
@@ -143,6 +158,9 @@
     private final WifiTracker mWifiTracker;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
     private boolean mIsOutOfRange;
+    private boolean mConnected;
+    private int mConnectingState;
+    private WifiManager.ActionListener mConnectListener;
 
     // UI elements - in order of appearance
     private ActionButtonsPreference mButtonsPref;
@@ -182,7 +200,7 @@
                     // fall through
                 case WifiManager.NETWORK_STATE_CHANGED_ACTION:
                 case WifiManager.RSSI_CHANGED_ACTION:
-                    updateNetworkInfo();
+                    refreshPage();
                     break;
             }
         }
@@ -197,7 +215,7 @@
         public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
             if (network.equals(mNetwork) && !lp.equals(mLinkProperties)) {
                 mLinkProperties = lp;
-                updateIpLayerInfo();
+                refreshIpLayerInfo();
             }
         }
 
@@ -224,12 +242,17 @@
                 }
                 mNetworkCapabilities = nc;
                 refreshButtons();
-                updateIpLayerInfo();
+                refreshIpLayerInfo();
             }
         }
 
         @Override
         public void onLost(Network network) {
+            // If support detail page for saved network, should update as disconnect but not exit.
+            if (SavedAccessPointsWifiSettings.usingDetailsFragment(mContext)) {
+                return;
+            }
+
             if (network.equals(mNetwork)) {
                 exitActivity();
             }
@@ -240,13 +263,23 @@
         /** Called when the state of Wifi has changed. */
         public void onWifiStateChanged(int state) {
             Log.d(TAG, "onWifiStateChanged(" + state + ")");
-            // Do nothing.
+            if (mConnectingState == STATE_ENABLE_WIFI && state == WifiManager.WIFI_STATE_ENABLED) {
+                updateConnectingState(STATE_CONNECTING);
+            }
         }
 
         /** Called when the connection state of wifi has changed. */
         public void onConnectedChanged() {
-            Log.d(TAG, "onConnectedChanged");
-            // Do nothing.
+            updateAccessPointFromScannedList();
+            if (mConnected != mAccessPoint.isActive()) {
+                Log.d(TAG, "Connection state changed!");
+                mConnected = mAccessPoint.isActive();
+                if (mAccessPoint.isActive()) {
+                    updateConnectingState(STATE_CONNECTED);
+                } else {
+                    updateConnectingState(STATE_DISCONNECTED);
+                }
+            }
         }
 
         /**
@@ -254,8 +287,7 @@
          * {@link WifiTracker#getAccessPoints()} should be called to get the updated list.
          */
         public void onAccessPointsChanged() {
-            Log.d(TAG, "onAccessPointsChanged");
-            updateNetworkInfo();
+            refreshPage();
         }
     };
 
@@ -314,6 +346,19 @@
         } else {
             mWifiTracker = null;
         }
+        mConnected = mAccessPoint.isActive();
+        mConnectingState = STATE_NONE;
+        mConnectListener = new WifiManager.ActionListener() {
+            @Override
+            public void onSuccess() {
+                // Do nothing
+            }
+
+            @Override
+            public void onFailure(int reason) {
+                updateConnectingState(STATE_FAILED);
+            }
+        };
     }
 
     @Override
@@ -339,10 +384,14 @@
                 .setButton1OnClickListener(view -> forgetNetwork())
                 .setButton2Text(R.string.wifi_sign_in_button_text)
                 .setButton2OnClickListener(view -> signIntoNetwork())
-                .setButton3Text(R.string.share)
-                .setButton3Icon(R.drawable.ic_qrcode_24dp)
-                .setButton3OnClickListener(view -> shareNetwork())
-                .setButton3Visible(WifiDppUtils.isSupportConfiguratorQrCodeGenerator(mAccessPoint));
+                .setButton3Text(R.string.wifi_connect)
+                .setButton3Icon(R.drawable.ic_settings_wireless)
+                .setButton3OnClickListener(view -> connectNetwork())
+                .setButton3Enabled(true)
+                .setButton4Text(R.string.share)
+                .setButton4Icon(R.drawable.ic_qrcode_24dp)
+                .setButton4OnClickListener(view -> shareNetwork())
+                .setButton4Visible(WifiDppUtils.isSupportConfiguratorQrCodeGenerator(mAccessPoint));
 
         mSignalStrengthPref = screen.findPreference(KEY_SIGNAL_STRENGTH_PREF);
         mTxLinkSpeedPref = screen.findPreference(KEY_TX_LINK_SPEED);
@@ -397,14 +446,18 @@
         }
     }
 
+    private void updateNetworkInfo() {
+        mNetwork = mWifiManager.getCurrentNetwork();
+        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
+        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
+    }
+
     @Override
     public void onResume() {
         // Ensure mNetwork is set before any callbacks above are delivered, since our
         // NetworkCallback only looks at changes to mNetwork.
-        mNetwork = mWifiManager.getCurrentNetwork();
-        mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
-        mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
         updateNetworkInfo();
+        refreshPage();
         mContext.registerReceiver(mReceiver, mFilter);
         mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback,
                 mHandler);
@@ -421,11 +474,13 @@
         mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
     }
 
-    private void updateNetworkInfo() {
+    private void refreshPage() {
         if(!updateAccessPoint()) {
             return;
         }
 
+        Log.d(TAG, "Update UI!");
+
         // refresh header
         refreshEntityHeader();
 
@@ -441,26 +496,37 @@
         // Receive Link Speed Pref
         refreshRxSpeed();
         // IP related information
-        updateIpLayerInfo();
+        refreshIpLayerInfo();
         // MAC Address Pref
         refreshMacAddress();
-
     }
 
     private boolean updateAccessPoint() {
         boolean changed = false;
         if (mWifiTracker != null) {
+            // remember mIsOutOfRange as old before updated
+            boolean oldState = mIsOutOfRange;
             updateAccessPointFromScannedList();
             // refresh UI if signal level changed for disconnect network.
             changed = mRssiSignalLevel != mAccessPoint.getLevel();
+            changed |= oldState != mIsOutOfRange;
         }
 
         if (mAccessPoint.isActive()) {
-            // No need to fetch LinkProperties and NetworkCapabilities, they are updated by the
-            // callbacks. mNetwork doesn't change except in onResume.
+            // Sometimes {@link WifiManager#getCurrentNetwork()} return null after connected,
+            // refresh it if needed.
+            if (mNetwork == null) {
+                updateNetworkInfo();
+            }
             mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork);
             mWifiInfo = mWifiManager.getConnectionInfo();
             if (mNetwork == null || mNetworkInfo == null || mWifiInfo == null) {
+                // Once connected, can't get mNetworkInfo immediately, return false and wait for
+                // next time to update UI.
+                if (SavedAccessPointsWifiSettings.usingDetailsFragment(mContext)) {
+                    return false;
+                }
+
                 exitActivity();
                 return false;
             }
@@ -474,6 +540,8 @@
     }
 
     private void updateAccessPointFromScannedList() {
+        if (mWifiTracker == null) return;
+
         mIsOutOfRange = true;
 
         if (mAccessPoint.getConfig() == null) {
@@ -484,7 +552,7 @@
             if (ap.getConfig() != null
                     && mAccessPoint.matches(ap.getConfig())) {
                 mAccessPoint = ap;
-                mIsOutOfRange = false;
+                mIsOutOfRange = !mAccessPoint.isReachable();
                 return;
             }
         }
@@ -543,6 +611,11 @@
             band = mContext.getResources().getString(R.string.wifi_band_5ghz);
         } else {
             Log.e(TAG, "Unexpected frequency " + frequency);
+            // Connecting state is unstable, make it disappeared if unexpected
+            if (mConnectingState == STATE_CONNECTING) {
+                mFrequencyPref.setVisible(false);
+            }
+            return;
         }
         mFrequencyPref.setSummary(band);
         mFrequencyPref.setVisible(true);
@@ -616,12 +689,21 @@
     private void refreshButtons() {
         mButtonsPref.setButton1Visible(canForgetNetwork());
         mButtonsPref.setButton2Visible(canSignIntoNetwork());
-        mButtonsPref.setButton3Visible(canShareNetwork());
-        mButtonsPref.setVisible(
-                canSignIntoNetwork() || canForgetNetwork() || canShareNetwork());
+        mButtonsPref.setButton3Visible(canConnectNetwork());
+        mButtonsPref.setButton4Visible(canShareNetwork());
+        mButtonsPref.setVisible(canSignIntoNetwork()
+                || canForgetNetwork()
+                || canShareNetwork()
+                || canConnectNetwork());
     }
 
-    private void updateIpLayerInfo() {
+    private boolean canConnectNetwork() {
+        // Display connect button for disconnected AP even not in the range.
+        return SavedAccessPointsWifiSettings.usingDetailsFragment(mContext)
+                && !mAccessPoint.isActive();
+    }
+
+    private void refreshIpLayerInfo() {
         // Hide IP layer info if not a connected network.
         if (!mAccessPoint.isActive() || mNetwork == null || mLinkProperties == null) {
             mIpAddressPref.setVisible(false);
@@ -823,4 +905,169 @@
     private boolean usingDataUsageHeader(Context context) {
         return FeatureFlagUtils.isEnabled(context, FeatureFlags.WIFI_DETAILS_DATAUSAGE_HEADER);
     }
+
+    private void connectNetwork() {
+        final Activity activity = mFragment.getActivity();
+        // error handling, connected/saved network should have mWifiConfig.
+        if (mWifiConfig == null) {
+            Toast.makeText(activity,
+                    R.string.wifi_failed_connect_message,
+                    Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        // init state before connect
+        mConnectingState = STATE_NONE;
+
+        if (mWifiManager.isWifiEnabled()) {
+            updateConnectingState(STATE_CONNECTING);
+        } else {
+            // Enable Wi-Fi automatically to connect AP
+            updateConnectingState(STATE_ENABLE_WIFI);
+        }
+    }
+
+    private void updateConnectingState(int state) {
+        final Activity activity = mFragment.getActivity();
+        Log.d(TAG, "updateConnectingState from " + mConnectingState + " to " + state);
+        switch (mConnectingState) {
+            case STATE_NONE:
+            case STATE_ENABLE_WIFI:
+                if (state == STATE_ENABLE_WIFI) {
+                    Log.d(TAG, "Turn on Wi-Fi automatically!");
+                    updateConnectedButton(STATE_ENABLE_WIFI);
+                    Toast.makeText(activity,
+                            R.string.wifi_turned_on_message,
+                            Toast.LENGTH_SHORT).show();
+                    mWifiManager.setWifiEnabled(true);
+                    // start timer for error handling
+                    startTimer();
+                } else if (state == STATE_CONNECTING) {
+                    Log.d(TAG, "connecting...");
+                    updateConnectedButton(STATE_CONNECTING);
+                    mWifiManager.connect(mWifiConfig.networkId, mConnectListener);
+                    // start timer for error handling since framework didn't call back if failed
+                    startTimer();
+                } else if (state == STATE_ENABLE_WIFI_FAILED) {
+                    Log.e(TAG, "Wi-Fi failed to enable network!");
+                    stopTimer();
+                    // reset state
+                    state = STATE_NONE;
+                    Toast.makeText(activity,
+                            R.string.wifi_failed_connect_message,
+                            Toast.LENGTH_SHORT).show();
+                    updateConnectedButton(STATE_ENABLE_WIFI_FAILED);
+                }
+                // Do not break here for disconnected event.
+            case STATE_CONNECTED:
+                if (state == STATE_DISCONNECTED) {
+                    Log.d(TAG, "disconnected");
+                    // reset state
+                    state = STATE_NONE;
+                    updateConnectedButton(STATE_DISCONNECTED);
+                    refreshPage();
+                    // clear for getting MAC Address from saved configuration
+                    mWifiInfo = null;
+                }
+                break;
+            case STATE_CONNECTING:
+                if (state == STATE_CONNECTED) {
+                    Log.d(TAG, "connected");
+                    stopTimer();
+                    updateConnectedButton(STATE_CONNECTED);
+                    Toast.makeText(activity,
+                            mContext.getString(R.string.wifi_connected_to_message,
+                                    mAccessPoint.getTitle()),
+                            Toast.LENGTH_SHORT).show();
+
+                    updateNetworkInfo();
+                    refreshPage();
+                } else if (state == STATE_NOT_IN_RANGE) {
+                    Log.d(TAG, "AP not in range");
+                    stopTimer();
+                    // reset state
+                    state = STATE_NONE;
+                    Toast.makeText(activity,
+                            R.string.wifi_not_in_range_message,
+                            Toast.LENGTH_SHORT).show();
+                    updateConnectedButton(STATE_NOT_IN_RANGE);
+                } else if (state == STATE_FAILED) {
+                    Log.d(TAG, "failed");
+                    stopTimer();
+                    // reset state
+                    state = STATE_NONE;
+                    Toast.makeText(activity,
+                            R.string.wifi_failed_connect_message,
+                            Toast.LENGTH_SHORT).show();
+                    updateConnectedButton(STATE_FAILED);
+                }
+                break;
+            default:
+                Log.e(TAG, "Invalid state : " + mConnectingState);
+                // don't update invalid state
+                return;
+        }
+
+        mConnectingState = state;
+    }
+
+    private void updateConnectedButton(int state) {
+        switch (state) {
+            case STATE_ENABLE_WIFI:
+            case STATE_CONNECTING:
+                mButtonsPref.setButton3Text(R.string.wifi_connecting)
+                        .setButton3Enabled(false);
+                break;
+            case STATE_CONNECTED:
+                mButtonsPref.setButton3Visible(false);
+                break;
+            case STATE_DISCONNECTED:
+            case STATE_NOT_IN_RANGE:
+            case STATE_FAILED:
+            case STATE_ENABLE_WIFI_FAILED:
+                mButtonsPref.setButton3Text(R.string.wifi_connect)
+                        .setButton3Icon(R.drawable.ic_settings_wireless)
+                        .setButton3Enabled(true)
+                        .setButton3Visible(true);
+                break;
+            default:
+                Log.e(TAG, "Invalid connect button state : " + state);
+                break;
+        }
+    }
+
+    private void startTimer() {
+        if (mTimer != null) {
+            stopTimer();
+        }
+
+        mTimer = new CountDownTimer(TIMEOUT, TIMEOUT + 1) {
+            @Override
+            public void onTick(long millisUntilFinished) {
+                // Do nothing
+            }
+            @Override
+            public void onFinish() {
+                Log.e(TAG, "Timeout for state:" + mConnectingState);
+                if (mConnectingState == STATE_ENABLE_WIFI) {
+                    updateConnectingState(STATE_ENABLE_WIFI_FAILED);
+                } else if (mConnectingState == STATE_CONNECTING) {
+                    updateAccessPointFromScannedList();
+                    if (mIsOutOfRange) {
+                        updateConnectingState(STATE_NOT_IN_RANGE);
+                    } else {
+                        updateConnectingState(STATE_FAILED);
+                    }
+                }
+            }
+        };
+        mTimer.start();
+    }
+
+    private void stopTimer() {
+        if (mTimer == null) return;
+
+        mTimer.cancel();
+        mTimer = null;
+    }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java b/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java
index 84f1c36..2bf411a 100644
--- a/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java
@@ -34,7 +34,6 @@
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.wifi.AddNetworkFragment;
-import com.android.settings.wifi.savedaccesspoints.SavedNetworkComparator;
 import com.android.settingslib.wifi.AccessPoint;
 import com.android.settingslib.wifi.AccessPointPreference;
 import com.android.settingslib.wifi.WifiSavedConfigUtils;
@@ -43,6 +42,7 @@
 
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class WifiNetworkListFragment extends SettingsPreferenceFragment implements
         WifiTracker.WifiListener, AccessPoint.AccessPointListener {
@@ -282,27 +282,38 @@
             return;
         }
 
-        // TODO(b/128942314): Lists reachable AccessPoints on top of the list
-        final List<AccessPoint> savedAccessPoints =
+        List<AccessPoint> savedAccessPoints =
                 WifiSavedConfigUtils.getAllConfigs(getContext(), mWifiManager);
-        Collections.sort(savedAccessPoints, SavedNetworkComparator.INSTANCE);
+
+        savedAccessPoints = savedAccessPoints.stream()
+                .filter(accessPoint -> isValidForDppConfiguration(accessPoint))
+                .map(accessPoint -> getScannedAccessPointIfAvailable(accessPoint))
+                .sorted((ap1, ap2) -> {
+                    // orders reachable Wi-Fi networks on top
+                    if (ap1.isReachable() && !ap2.isReachable()) {
+                        return -1;
+                    } else if (!ap1.isReachable() && ap2.isReachable()) {
+                        return 1;
+                    }
+
+                    String ap1Title = nullToEmpty(ap1.getTitle());
+                    String ap2Title = nullToEmpty(ap2.getTitle());
+
+                    return ap1Title.compareToIgnoreCase(ap2Title);
+                }).collect(Collectors.toList());
 
         int index = 0;
         mAccessPointsPreferenceCategory.removeAll();
         for (AccessPoint savedAccessPoint : savedAccessPoints) {
-            if (isValidForDppConfiguration(savedAccessPoint)) {
-                // Replaces with an AccessPoint from scanned result for signal information
-                savedAccessPoint = getScannedAccessPointIfAvailable(savedAccessPoint);
-                final AccessPointPreference preference =
-                        createAccessPointPreference(savedAccessPoint);
+            final AccessPointPreference preference =
+                    createAccessPointPreference(savedAccessPoint);
 
-                preference.setOrder(index++);
-                preference.setEnabled(savedAccessPoint.isReachable());
-                savedAccessPoint.setListener(this);
+            preference.setOrder(index++);
+            preference.setEnabled(savedAccessPoint.isReachable());
+            savedAccessPoint.setListener(this);
 
-                preference.refresh();
-                mAccessPointsPreferenceCategory.addPreference(preference);
-            }
+            preference.refresh();
+            mAccessPointsPreferenceCategory.addPreference(preference);
         }
         mAddPreference.setOrder(index);
         mAccessPointsPreferenceCategory.addPreference(mAddPreference);
@@ -312,6 +323,11 @@
         }
     }
 
+    private String nullToEmpty(String string) {
+        return (string == null) ? "" : string;
+    }
+
+    // Replaces with an AccessPoint from scanned result for signal information
     private AccessPoint getScannedAccessPointIfAvailable(AccessPoint savedAccessPoint) {
         final List<AccessPoint> scannedAccessPoints = mWifiTracker.getAccessPoints();
         final WifiConfiguration savedWifiConfiguration = savedAccessPoint.getConfig();
diff --git a/src/com/android/settings/wifi/qrcode/QrDecorateView.java b/src/com/android/settings/wifi/qrcode/QrDecorateView.java
index 2be1eab..5df0cd0 100644
--- a/src/com/android/settings/wifi/qrcode/QrDecorateView.java
+++ b/src/com/android/settings/wifi/qrcode/QrDecorateView.java
@@ -46,6 +46,7 @@
     final private Paint mBackgroundPaint;
 
     final private float mRadius;
+    final private float mInnerRidus;
 
     private Bitmap mMaskBitmap;
     private Canvas mMaskCanvas;
@@ -73,6 +74,9 @@
         mFocused = false;
         mRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS,
                 getResources().getDisplayMetrics());
+        // Inner radius needs to minus stroke width for keeping the width of border consistent.
+        mInnerRidus = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                CORNER_RADIUS - CORNER_STROKE_WIDTH, getResources().getDisplayMetrics());
 
         mCornerColor = context.getResources().getColor(R.color.qr_corner_line_color);
         mFocusedCornerColor = context.getResources().getColor(R.color.qr_focused_corner_line_color);
@@ -111,7 +115,7 @@
         // Draw outer corner.
         mMaskCanvas.drawRoundRect(mOuterFrame, mRadius, mRadius, mStrokePaint);
         // Draw inner transparent corner.
-        mMaskCanvas.drawRoundRect(mInnerFrame, mRadius, mRadius, mTransparentPaint);
+        mMaskCanvas.drawRoundRect(mInnerFrame, mInnerRidus, mInnerRidus, mTransparentPaint);
 
         canvas.drawBitmap(mMaskBitmap, 0, 0, mBackgroundPaint);
         super.onDraw(canvas);
@@ -123,7 +127,7 @@
         final float cornerLineLength = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                 CORNER_LINE_LENGTH, getResources().getDisplayMetrics()) / 2;
         final float strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
-                CORNER_STROKE_WIDTH, getResources().getDisplayMetrics()) / 2;
+                CORNER_STROKE_WIDTH, getResources().getDisplayMetrics());
 
         mOuterFrame = new RectF(centralX - cornerLineLength, centralY - cornerLineLength,
                 centralX + cornerLineLength, centralY + cornerLineLength);
@@ -131,7 +135,7 @@
                 mOuterFrame.right - strokeWidth, mOuterFrame.bottom - strokeWidth);
     }
 
-    // Draws green lines if focued. Otherwise, draws white lines.
+    // Draws green lines if focused. Otherwise, draws white lines.
     public void setFocused(boolean focused) {
         mFocused = focused;
         invalidate();
diff --git a/tests/robotests/Android.mk b/tests/robotests/Android.mk
index b0733f4..727da06 100644
--- a/tests/robotests/Android.mk
+++ b/tests/robotests/Android.mk
@@ -49,6 +49,7 @@
     guava \
     jsr305 \
     settings-contextual-card-protos-lite \
+    settings-log-bridge-protos-lite \
     contextualcards \
     settings-logtags \
     zxing-core-1.7
diff --git a/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor b/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
index a723842..675108d 100644
--- a/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
+++ b/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
@@ -10,8 +10,5 @@
 com.android.settings.fuelgauge.RestrictAppPreferenceController
 com.android.settings.fuelgauge.batterysaver.BatterySaverButtonPreferenceController
 com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController
-com.android.settings.gestures.SystemNavigationEdgeToEdgePreferenceController
-com.android.settings.gestures.SystemNavigationLegacyPreferenceController
-com.android.settings.gestures.SystemNavigationSwipeUpPreferenceController
 com.android.settings.security.VisiblePatternProfilePreferenceController
 com.android.settings.wifi.details.WifiMeteredPreferenceController
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
new file mode 100644
index 0000000..d6b12c3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Intent;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.settings.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+@SmallTest
+public class AccessibilitySettingsForSetupWizardActivityTest {
+
+  @Test
+  public void createSetupAccessibilityActivity_shouldBeSUWTheme() {
+    final Intent intent = new Intent();
+    AccessibilitySettingsForSetupWizardActivity activity =
+        Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class, intent).get();
+
+    assertThat(activity.getThemeResId()).isEqualTo(R.style.GlifTheme_Light);
+  }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java
index 5538155..b961669 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -78,6 +79,7 @@
 
         mContext = RuntimeEnvironment.application;
         mController = new AdvancedBluetoothDetailsHeaderController(mContext, "pref_Key");
+        when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice);
         mController.init(mCachedDevice);
         mLayoutPreference = new LayoutPreference(mContext,
                 LayoutInflater.from(mContext).inflate(R.layout.advanced_bt_entity_header, null));
@@ -166,7 +168,10 @@
     }
 
     @Test
-    public void onStart_registerCallback() {
+    public void onStart_isAvailable_registerCallback() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
+                .thenReturn("true");
+
         mController.onStart();
 
         verify(mBluetoothAdapter).registerMetadataListener(mBluetoothDevice,
@@ -174,12 +179,36 @@
     }
 
     @Test
-    public void onStop_unregisterCallback() {
+    public void onStop_isAvailable_unregisterCallback() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
+                .thenReturn("true");
+
         mController.onStop();
 
         verify(mBluetoothAdapter).unregisterMetadataListener(mBluetoothDevice);
     }
 
+    @Test
+    public void onStart_notAvailable_registerCallback() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
+                .thenReturn("false");
+
+        mController.onStart();
+
+        verify(mBluetoothAdapter, never()).registerMetadataListener(mBluetoothDevice,
+                mController.mMetadataListener, mController.mHandler);
+    }
+
+    @Test
+    public void onStop_notAvailable_unregisterCallback() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
+                .thenReturn("false");
+
+        mController.onStop();
+
+        verify(mBluetoothAdapter, never()).unregisterMetadataListener(mBluetoothDevice);
+    }
+
     private void assertBatteryLevel(LinearLayout linearLayout, int batteryLevel) {
         final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary);
         assertThat(textView.getText().toString()).isEqualTo(
diff --git a/tests/robotests/src/com/android/settings/core/BasePreferenceControllerSignatureInspector.java b/tests/robotests/src/com/android/settings/core/BasePreferenceControllerSignatureInspector.java
index 28e394f..2d1dc5c 100644
--- a/tests/robotests/src/com/android/settings/core/BasePreferenceControllerSignatureInspector.java
+++ b/tests/robotests/src/com/android/settings/core/BasePreferenceControllerSignatureInspector.java
@@ -58,12 +58,17 @@
             if (constructors == null || constructors.length == 0) {
                 badClasses.append(c.getName()).append(",");
             }
+
+            boolean hasValidConstructor = false;
             for (Constructor constructor : constructors) {
-                if (!hasValidConstructorSignature(constructor)) {
-                    badClasses.append(className).append(",");
-                    continue;
+                if (hasValidConstructorSignature(constructor)) {
+                    hasValidConstructor = true;
+                    break;
                 }
             }
+            if (!hasValidConstructor) {
+                badClasses.append(className).append(",");
+            }
         }
 
         assertWithMessage("All BasePreferenceController (and subclasses) constructor must either"
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriterTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriterTest.java
new file mode 100644
index 0000000..30a2594
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/SettingsIntelligenceLogWriterTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.core.instrumentation;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import com.android.settings.intelligence.LogProto.SettingsLog;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SettingsIntelligenceLogWriterTest {
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+    }
+
+    @Test
+    public void serialize_hasSizeOne_returnCorrectData() throws IOException {
+        final SettingsLog event = SettingsLog.newBuilder()
+                .setAttribution(SettingsEnums.DASHBOARD_SUMMARY)
+                .setAction(SettingsEnums.ACTION_SET_NEW_PASSWORD)
+                .setPageId(SettingsEnums.SET_NEW_PASSWORD_ACTIVITY)
+                .setChangedPreferenceKey("package")
+                .setChangedPreferenceIntValue(100)
+                .build();
+        List<SettingsLog> events = new ArrayList<>();
+        events.add(event);
+
+        // execute
+        final byte[] data = SettingsIntelligenceLogWriter.serialize(events);
+
+        // parse data
+        final ByteArrayInputStream bin = new ByteArrayInputStream(data);
+        final DataInputStream inputStream = new DataInputStream(bin);
+        final int size = inputStream.readInt();
+        final byte[] change = new byte[inputStream.readInt()];
+        inputStream.read(change);
+        inputStream.close();
+        final SettingsLog settingsLog = SettingsLog.parseFrom(change);
+
+        // assert
+        assertThat(events.size()).isEqualTo(size);
+        assertThat(settingsLog.getAttribution()).isEqualTo(SettingsEnums.DASHBOARD_SUMMARY);
+        assertThat(settingsLog.getAction()).isEqualTo(SettingsEnums.ACTION_SET_NEW_PASSWORD);
+        assertThat(settingsLog.getPageId()).isEqualTo(SettingsEnums.SET_NEW_PASSWORD_ACTIVITY);
+        assertThat(settingsLog.getChangedPreferenceKey()).isEqualTo("package");
+        assertThat(settingsLog.getChangedPreferenceIntValue()).isEqualTo(100);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 947d618..0a565cd 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -53,6 +53,7 @@
 import android.net.wifi.WifiManager;
 import android.os.Handler;
 import android.provider.Settings;
+import android.util.FeatureFlagUtils;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.ImageView;
@@ -77,7 +78,6 @@
 import com.android.settingslib.wifi.AccessPoint;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -99,7 +99,6 @@
 
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowDevicePolicyManager.class, ShadowEntityHeaderController.class})
-@Ignore("b/129292549")
 public class WifiDetailPreferenceControllerTest {
 
     private static final int LEVEL = 1;
@@ -274,6 +273,11 @@
         when(mockIconInjector.getIcon(anyInt())).thenReturn(new ColorDrawable());
 
         setupMockedPreferenceScreen();
+
+        // Disable saved network detail page feature for this test
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.WIFI_DETAILS_SAVED_SCREEN, false);
+        when(mockAccessPoint.isActive()).thenReturn(true);
+
         mController = newWifiDetailPreferenceController();
     }
 
@@ -948,6 +952,12 @@
         when(pref.setButton3Visible(anyBoolean())).thenReturn(pref);
         when(pref.setButton3OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
 
+        when(pref.setButton4Text(anyInt())).thenReturn(pref);
+        when(pref.setButton4Icon(anyInt())).thenReturn(pref);
+        when(pref.setButton4Enabled(anyBoolean())).thenReturn(pref);
+        when(pref.setButton4Visible(anyBoolean())).thenReturn(pref);
+        when(pref.setButton4OnClickListener(any(View.OnClickListener.class))).thenReturn(pref);
+
         return pref;
     }
 }
