Merge "Pass in context when loading icons from Tile"
diff --git a/res/values/bools.xml b/res/values/bools.xml
index b406605..08bb08c 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -32,6 +32,9 @@
          Can be overridden for specific product builds. -->
     <bool name="auto_confirm_bluetooth_activation_dialog">false</bool>
 
+    <!-- Whether the device name is shown in About device or not -->
+    <bool name="config_show_device_name">true</bool>
+
     <!-- Whether to show a preference item for the manual in About phone -->
     <bool name="config_show_manual">false</bool>
     <!-- Whether to show a preference item for regulatory information in About phone -->
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index b70b613..22c1844 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -133,6 +133,14 @@
         android:summary="@string/summary_placeholder"
         android:selectable="false"/>
 
+    <!-- Device up time -->
+    <Preference
+        android:key="up_time"
+        android:order="37"
+        android:title="@string/status_up_time"
+        android:summary="@string/summary_placeholder"
+        android:selectable="false" />
+
     <!-- Safety & regulatory manual -->
     <Preference
         android:key="safety_info"
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
index 4ff67b7..b4db4ed 100644
--- a/res/xml/power_usage_summary.xml
+++ b/res/xml/power_usage_summary.xml
@@ -23,12 +23,16 @@
 
     <com.android.settings.applications.LayoutPreference
         android:key="battery_header"
+        android:title="@string/summary_placeholder"
         android:selectable="false"
-        android:layout="@layout/battery_header" />
+        android:layout="@layout/battery_header"
+        settings:controller="com.android.settings.fuelgauge.BatteryHeaderPreferenceController" />
 
     <PreferenceCategory
         android:key="battery_tip"
-        android:layout="@layout/preference_category_no_label" />
+        android:title="@string/summary_placeholder"
+        android:layout="@layout/preference_category_no_label"
+        settings:controller="com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController" />
 
     <Preference
         android:fragment="com.android.settings.fuelgauge.batterysaver.BatterySaverSettings"
@@ -47,7 +51,8 @@
     <SwitchPreference
         android:key="battery_percentage"
         android:title="@string/battery_percentage"
-        android:summary="@string/battery_percentage_description" />
+        android:summary="@string/battery_percentage_description"
+        settings:controller="com.android.settings.display.BatteryPercentagePreferenceController" />
 
 
     <com.android.settings.fuelgauge.PowerGaugePreference
diff --git a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
index 0d4df99..558e7cb 100644
--- a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
@@ -27,6 +27,7 @@
 
 import com.android.settings.bluetooth.BluetoothLengthDeviceNameFilter;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.R;
 import com.android.settings.widget.ValidatedEditTextPreference;
 import com.android.settings.wifi.tether.WifiDeviceNameTextValidator;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
@@ -90,7 +91,9 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return AVAILABLE;
+        return mContext.getResources().getBoolean(R.bool.config_show_device_name)
+                ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/UptimePreferenceController.java b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
new file mode 100644
index 0000000..4f02594
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/UptimePreferenceController.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.deviceinfo.AbstractUptimePreferenceController;
+
+/**
+ * Concrete subclass of uptime preference controller
+ */
+public class UptimePreferenceController extends AbstractUptimePreferenceController
+        implements PreferenceControllerMixin {
+    public UptimePreferenceController(Context context, Lifecycle lifecycle) {
+        super(context, lifecycle);
+    }
+
+    // This space intentionally left blank
+}
\ No newline at end of file
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index 976a254..29acf45 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -46,6 +46,7 @@
 import com.android.settings.deviceinfo.PhoneNumberPreferenceController;
 import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController;
 import com.android.settings.deviceinfo.SafetyInfoPreferenceController;
+import com.android.settings.deviceinfo.UptimePreferenceController;
 import com.android.settings.deviceinfo.WifiMacAddressPreferenceController;
 import com.android.settings.deviceinfo.firmwareversion.FirmwareVersionPreferenceController;
 import com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController;
@@ -134,6 +135,7 @@
         controllers.add(new FccEquipmentIdPreferenceController(context));
         controllers.add(
                 new BuildNumberPreferenceController(context, activity, fragment, lifecycle));
+        controllers.add(new UptimePreferenceController(context, lifecycle));
         return controllers;
     }
 
diff --git a/src/com/android/settings/display/BatteryPercentagePreferenceController.java b/src/com/android/settings/display/BatteryPercentagePreferenceController.java
index 0bd4445..50fbc64 100644
--- a/src/com/android/settings/display/BatteryPercentagePreferenceController.java
+++ b/src/com/android/settings/display/BatteryPercentagePreferenceController.java
@@ -21,8 +21,8 @@
 import android.provider.Settings;
 
 import com.android.internal.R;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
 
 import androidx.preference.Preference;
 import androidx.preference.SwitchPreference;
@@ -31,24 +31,18 @@
  * A controller to manage the switch for showing battery percentage in the status bar.
  */
 
-public class BatteryPercentagePreferenceController extends AbstractPreferenceController implements
+public class BatteryPercentagePreferenceController extends BasePreferenceController implements
         PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
 
-    private static final String KEY_BATTERY_PERCENTAGE = "battery_percentage";
-
-    public BatteryPercentagePreferenceController(Context context) {
-        super(context);
+    public BatteryPercentagePreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
     }
 
     @Override
-    public boolean isAvailable() {
-        return mContext.getResources()
-                .getBoolean(R.bool.config_battery_percentage_setting_available);
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_BATTERY_PERCENTAGE;
+    public int getAvailabilityStatus() {
+        return mContext.getResources().getBoolean(
+                R.bool.config_battery_percentage_setting_available) ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index 71eb554..5b5f50a 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -27,6 +27,7 @@
 
 import com.android.settings.R;
 import com.android.settings.applications.LayoutPreference;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.widget.EntityHeaderController;
 import com.android.settingslib.Utils;
@@ -42,7 +43,7 @@
 /**
  * Controller that update the battery header view
  */
-public class BatteryHeaderPreferenceController extends AbstractPreferenceController
+public class BatteryHeaderPreferenceController extends BasePreferenceController
         implements PreferenceControllerMixin, LifecycleObserver, OnStart {
     @VisibleForTesting
     static final String KEY_BATTERY_HEADER = "battery_header";
@@ -56,30 +57,35 @@
     @VisibleForTesting
     TextView mSummary2;
 
-    private final Activity mActivity;
-    private final PreferenceFragmentCompat mHost;
-    private final Lifecycle mLifecycle;
+    private Activity mActivity;
+    private PreferenceFragmentCompat mHost;
+    private Lifecycle mLifecycle;
     private final PowerManager mPowerManager;
 
     private LayoutPreference mBatteryLayoutPref;
 
-    public BatteryHeaderPreferenceController(Context context, Activity activity,
-            PreferenceFragmentCompat host, Lifecycle lifecycle) {
-        super(context);
-        mActivity = activity;
-        mHost = host;
-        mLifecycle = lifecycle;
-        if (mLifecycle != null) {
-            mLifecycle.addObserver(this);
-        }
+    public BatteryHeaderPreferenceController(Context context, String key) {
+        super(context, key);
         mPowerManager = context.getSystemService(PowerManager.class);
     }
 
+    public void setActivity(Activity activity) {
+        mActivity = activity;
+    }
+
+    public void setFragment(PreferenceFragmentCompat fragment) {
+        mHost = fragment;
+    }
+
+    public void setLifecycle(Lifecycle lifecycle) {
+        mLifecycle = lifecycle;
+    }
+
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mBatteryLayoutPref = (LayoutPreference) screen.findPreference(KEY_BATTERY_HEADER);
-        mBatteryMeterView = (BatteryMeterView) mBatteryLayoutPref
+        mBatteryLayoutPref = (LayoutPreference) screen.findPreference(getPreferenceKey());
+        mBatteryMeterView = mBatteryLayoutPref
                 .findViewById(R.id.battery_header_icon);
         mBatteryPercentText = mBatteryLayoutPref.findViewById(R.id.battery_percent);
         mSummary1 = mBatteryLayoutPref.findViewById(R.id.summary1);
@@ -89,13 +95,8 @@
     }
 
     @Override
-    public boolean isAvailable() {
-        return true;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_BATTERY_HEADER;
+    public int getAvailabilityStatus() {
+        return AVAILABLE_UNSEARCHABLE;
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 843aeec..2ae5876 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -25,7 +25,6 @@
 import android.provider.SearchIndexableResource;
 import android.text.BidiFormatter;
 import android.text.format.Formatter;
-import android.util.SparseArray;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -40,19 +39,15 @@
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.display.BatteryPercentagePreferenceController;
 import com.android.settings.fuelgauge.batterytip.BatteryTipLoader;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.search.SearchIndexable;
 import com.android.settingslib.utils.PowerUtil;
 import com.android.settingslib.utils.StringUtil;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -198,6 +193,22 @@
             };
 
     @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        final SettingsActivity activity = (SettingsActivity) getActivity();
+
+        mBatteryHeaderPreferenceController = use(BatteryHeaderPreferenceController.class);
+        mBatteryHeaderPreferenceController.setActivity(activity);
+        mBatteryHeaderPreferenceController.setFragment(this);
+        mBatteryHeaderPreferenceController.setLifecycle(getSettingsLifecycle());
+
+        mBatteryTipPreferenceController = use(BatteryTipPreferenceController.class);
+        mBatteryTipPreferenceController.setActivity(activity);
+        mBatteryTipPreferenceController.setFragment(this);
+        mBatteryTipPreferenceController.setBatteryTipListener(this::onBatteryTipHandled);
+    }
+
+    @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         setAnimationAllowed(true);
@@ -232,22 +243,6 @@
     }
 
     @Override
-    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        final Lifecycle lifecycle = getSettingsLifecycle();
-        final SettingsActivity activity = (SettingsActivity) getActivity();
-        final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        mBatteryHeaderPreferenceController = new BatteryHeaderPreferenceController(
-                context, activity, this /* host */, lifecycle);
-        controllers.add(mBatteryHeaderPreferenceController);
-        mBatteryTipPreferenceController = new BatteryTipPreferenceController(context,
-                KEY_BATTERY_TIP, (SettingsActivity) getActivity(), this /* fragment */, this /*
-                BatteryTipListener */);
-        controllers.add(mBatteryTipPreferenceController);
-        controllers.add(new BatteryPercentagePreferenceController(context));
-        return controllers;
-    }
-
-    @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         if (DEBUG) {
             menu.add(Menu.NONE, MENU_STATS_TYPE, Menu.NONE, R.string.menu_stats_total)
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
index 0a9a4c7..158ffd4 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
@@ -59,24 +59,27 @@
     InstrumentedPreferenceFragment mFragment;
 
     public BatteryTipPreferenceController(Context context, String preferenceKey) {
-        this(context, preferenceKey, null, null, null);
-    }
-
-    public BatteryTipPreferenceController(Context context, String preferenceKey,
-            SettingsActivity settingsActivity, InstrumentedPreferenceFragment fragment,
-            BatteryTipListener batteryTipListener) {
         super(context, preferenceKey);
-        mBatteryTipListener = batteryTipListener;
         mBatteryTipMap = new HashMap<>();
-        mFragment = fragment;
-        mSettingsActivity = settingsActivity;
         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
         mNeedUpdate = true;
     }
 
+    public void setActivity(SettingsActivity activity) {
+        mSettingsActivity = activity;
+    }
+
+    public void setFragment(InstrumentedPreferenceFragment fragment) {
+        mFragment = fragment;
+    }
+
+    public void setBatteryTipListener(BatteryTipListener lsn) {
+        mBatteryTipListener = lsn;
+    }
+
     @Override
     public int getAvailabilityStatus() {
-        return AVAILABLE;
+        return AVAILABLE_UNSEARCHABLE;
     }
 
     @Override
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index 27e1a98..d5ef9aa 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -24,6 +24,7 @@
 import android.icu.text.ListFormatter;
 import android.provider.SearchIndexableResource;
 import android.text.BidiFormatter;
+import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.internal.logging.nano.MetricsProto;
@@ -153,21 +154,25 @@
 
         private final Context mContext;
         private final SummaryLoader mSummaryLoader;
+        private final WifiMasterSwitchPreferenceController mWifiPreferenceController;
         private final MobileNetworkPreferenceController mMobileNetworkPreferenceController;
         private final TetherPreferenceController mTetherPreferenceController;
 
         public SummaryProvider(Context context, SummaryLoader summaryLoader) {
             this(context, summaryLoader,
+                    new WifiMasterSwitchPreferenceController(context, null),
                     new MobileNetworkPreferenceController(context),
                     new TetherPreferenceController(context, null /* lifecycle */));
         }
 
         @VisibleForTesting(otherwise = VisibleForTesting.NONE)
         SummaryProvider(Context context, SummaryLoader summaryLoader,
+                WifiMasterSwitchPreferenceController wifiPreferenceController,
                 MobileNetworkPreferenceController mobileNetworkPreferenceController,
                 TetherPreferenceController tetherPreferenceController) {
             mContext = context;
             mSummaryLoader = summaryLoader;
+            mWifiPreferenceController = wifiPreferenceController;
             mMobileNetworkPreferenceController = mobileNetworkPreferenceController;
             mTetherPreferenceController = tetherPreferenceController;
         }
@@ -176,20 +181,27 @@
         @Override
         public void setListening(boolean listening) {
             if (listening) {
-                final List<String> summaries = new ArrayList<>();
+                final String wifiSummary = BidiFormatter.getInstance()
+                    .unicodeWrap(mContext.getString(R.string.wifi_settings_title));
+                final String mobileSummary = mContext.getString(
+                    R.string.network_dashboard_summary_mobile);
+                final String dataUsageSummary = mContext.getString(
+                    R.string.network_dashboard_summary_data_usage);
+                final String hotspotSummary = mContext.getString(
+                    R.string.network_dashboard_summary_hotspot);
 
-                summaries.add(BidiFormatter.getInstance()
-                        .unicodeWrap(mContext.getString(R.string.wifi_settings_title)));
-                if (mMobileNetworkPreferenceController.isAvailable()) {
-                    summaries.add(mContext.getString(
-                            R.string.network_dashboard_summary_mobile));
+                final List<String> summaries = new ArrayList<>();
+                if (mWifiPreferenceController.isAvailable() && !TextUtils.isEmpty(wifiSummary)) {
+                    summaries.add(wifiSummary);
                 }
-                final String dataUsageSettingSummary = mContext.getString(
-                        R.string.network_dashboard_summary_data_usage);
-                summaries.add(dataUsageSettingSummary);
-                if (mTetherPreferenceController.isAvailable()) {
-                    summaries.add(mContext.getString(
-                            R.string.network_dashboard_summary_hotspot));
+                if (mMobileNetworkPreferenceController.isAvailable() && !TextUtils.isEmpty(mobileSummary)) {
+                    summaries.add(mobileSummary);
+                }
+                if (!TextUtils.isEmpty(dataUsageSummary)) {
+                    summaries.add(dataUsageSummary);
+                }
+                if (mTetherPreferenceController.isAvailable() && !TextUtils.isEmpty(hotspotSummary)) {
+                    summaries.add(hotspotSummary);
                 }
                 mSummaryLoader.setSummary(this, ListFormatter.getInstance().format(summaries));
             }
diff --git a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
index 156e230..1284b6a 100644
--- a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
@@ -84,8 +84,7 @@
     @Override
     public void updateState(Preference preference) {
         if (mPreference != null && mPreference instanceof GearPreference) {
-            if (mLockPatternUtils.isSecure(mUserId)
-                    || !mLockPatternUtils.isLockScreenDisabled(mUserId)) {
+            if (mLockPatternUtils.isSecure(mUserId)) {
                 ((GearPreference) mPreference).setOnGearClickListener(this);
             } else {
                 ((GearPreference) mPreference).setOnGearClickListener(null);
diff --git a/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider b/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
index b329072..e69de29 100644
--- a/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
+++ b/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
@@ -1 +0,0 @@
-com.android.settings.fuelgauge.PowerUsageSummary
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index 2d95b65..6d82451 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -61,6 +61,7 @@
     <bool name="config_show_wifi_ip_address">false</bool>
     <bool name="config_show_wifi_mac_address">false</bool>
     <bool name="config_disable_uninstall_update">true</bool>
+    <bool name="config_show_device_name">false</bool>
 
     <!-- List of a11y components on the device allowed to be enabled by Settings Slices -->
     <string-array name="config_settings_slices_accessibility_components" translatable="false">
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
index 0e6bf8d..68b48a8 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.deviceinfo;
 
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
@@ -41,6 +43,7 @@
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
 import androidx.preference.PreferenceScreen;
@@ -80,6 +83,17 @@
     }
 
     @Test
+    public void getAvailibilityStatus_availableByDefault() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void getAvailabilityStatus_unsupportedWhenSet() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
     public void constructor_defaultDeviceNameIsModelName() {
         assertThat(mController.getSummary()).isEqualTo(Build.MODEL);
     }
diff --git a/tests/robotests/src/com/android/settings/display/BatteryPercentagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BatteryPercentagePreferenceControllerTest.java
index 673abb0..140fc5c 100644
--- a/tests/robotests/src/com/android/settings/display/BatteryPercentagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/BatteryPercentagePreferenceControllerTest.java
@@ -32,13 +32,15 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 public class BatteryPercentagePreferenceControllerTest {
 
+    private static final String PREF_KEY = "battery_percentage";
+
     private Context mContext;
     private BatteryPercentagePreferenceController mController;
 
     @Before
     public void setup() {
         mContext = RuntimeEnvironment.application;
-        mController = new BatteryPercentagePreferenceController(mContext);
+        mController = new BatteryPercentagePreferenceController(mContext, PREF_KEY);
     }
 
     private int getPercentageSetting() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 91cb078..337b950 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -36,6 +36,7 @@
 
 import com.android.settings.R;
 import com.android.settings.applications.LayoutPreference;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
@@ -68,6 +69,7 @@
         })
 public class BatteryHeaderPreferenceControllerTest {
 
+    private static final String PREF_KEY = "battery_header";
     private static final int BATTERY_LEVEL = 60;
     private static final String TIME_LEFT = "2h30min";
     private static final String BATTERY_STATUS = "Charging";
@@ -121,8 +123,11 @@
 
         mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
 
-        mController = new BatteryHeaderPreferenceController(
-                mContext, mActivity, mPreferenceFragment, mLifecycle);
+        mController = new BatteryHeaderPreferenceController(mContext, PREF_KEY);
+        mLifecycle.addObserver(mController);
+        mController.setActivity(mActivity);
+        mController.setFragment(mPreferenceFragment);
+        mController.setLifecycle(mLifecycle);
         mController.mBatteryMeterView = mBatteryMeterView;
         mController.mBatteryPercentText = mBatteryPercentText;
         mController.mSummary1 = mSummary;
@@ -207,4 +212,10 @@
             assertThat(mBatteryMeterView.getPowerSave()).isEqualTo(value);
         }
     }
+
+    @Test
+    public void getAvailabilityStatus_returnAvailableUnsearchable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 97e272b..68d9994 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -223,21 +223,6 @@
     }
 
     @Test
-    public void preferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
-        final Context context = RuntimeEnvironment.application;
-        final PowerUsageSummary fragment = new PowerUsageSummary();
-        final List<String> preferenceScreenKeys =
-            XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId());
-        final List<String> preferenceKeys = new ArrayList<>();
-
-        for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
-            preferenceKeys.add(controller.getPreferenceKey());
-        }
-
-        assertThat(preferenceScreenKeys).containsAllIn(preferenceKeys);
-    }
-
-    @Test
     public void restartBatteryTipLoader() {
         //TODO: add policy logic here when BatteryTipPolicy is implemented
         doReturn(mLoaderManager).when(mFragment).getLoaderManager();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index 7e9ffeb..e7aafef 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -31,6 +31,7 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
@@ -100,8 +101,7 @@
         mNewBatteryTips = new ArrayList<>();
         mNewBatteryTips.add(new SummaryTip(BatteryTip.StateType.INVISIBLE, AVERAGE_TIME_MS));
 
-        mBatteryTipPreferenceController = new BatteryTipPreferenceController(mContext, KEY_PREF,
-                mSettingsActivity, mFragment, mBatteryTipListener);
+        mBatteryTipPreferenceController = buildBatteryTipPreferenceController();
         mBatteryTipPreferenceController.mPreferenceGroup = mPreferenceGroup;
         mBatteryTipPreferenceController.mPrefContext = mContext;
     }
@@ -139,8 +139,7 @@
         final Bundle bundle = new Bundle();
         mBatteryTipPreferenceController.saveInstanceState(bundle);
 
-        final BatteryTipPreferenceController controller = new BatteryTipPreferenceController(
-                mContext, KEY_PREF, mSettingsActivity, mFragment, mBatteryTipListener);
+        final BatteryTipPreferenceController controller = buildBatteryTipPreferenceController();
         controller.mPreferenceGroup = mPreferenceGroup;
         controller.mPrefContext = mContext;
         controller.restoreInstanceState(bundle);
@@ -154,8 +153,7 @@
         // Battery tip list is null at this time
         mBatteryTipPreferenceController.saveInstanceState(bundle);
 
-        final BatteryTipPreferenceController controller = new BatteryTipPreferenceController(
-                mContext, KEY_PREF, mSettingsActivity, mFragment, mBatteryTipListener);
+        final BatteryTipPreferenceController controller = buildBatteryTipPreferenceController();
 
         // Should not crash
         controller.restoreInstanceState(bundle);
@@ -176,6 +174,12 @@
         verify(mBatteryTipListener).onBatteryTipHandled(mBatteryTip);
     }
 
+    @Test
+    public void getAvailabilityStatus_returnAvailableUnsearchable() {
+        assertThat(mBatteryTipPreferenceController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+    }
+
     private void assertOnlyContainsSummaryTip(final PreferenceGroup preferenceGroup) {
         assertThat(preferenceGroup.getPreferenceCount()).isEqualTo(1);
 
@@ -185,4 +189,14 @@
         assertThat(preference.getSummary()).isEqualTo(
                 mContext.getString(R.string.battery_tip_summary_summary));
     }
+
+    private BatteryTipPreferenceController buildBatteryTipPreferenceController() {
+        final BatteryTipPreferenceController controller = new BatteryTipPreferenceController(
+                mContext, KEY_PREF);
+        controller.setActivity(mSettingsActivity);
+        controller.setFragment(mFragment);
+        controller.setBatteryTipListener(mBatteryTipListener);
+
+        return controller;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
index 187f0dc..d6310ab 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java
@@ -26,6 +26,7 @@
 
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.wifi.WifiMasterSwitchPreferenceController;
 import com.android.settingslib.drawer.CategoryKey;
 
 import org.junit.Before;
@@ -66,6 +67,8 @@
 
     @Test
     public void summaryProviderSetListening_hasMobileAndHotspot_shouldReturnMobileSummary() {
+        final WifiMasterSwitchPreferenceController wifiPreferenceController =
+                mock(WifiMasterSwitchPreferenceController.class);
         final MobileNetworkPreferenceController mobileNetworkPreferenceController =
                 mock(MobileNetworkPreferenceController.class);
         final TetherPreferenceController tetherPreferenceController =
@@ -74,12 +77,14 @@
         final SummaryLoader summaryLoader = mock(SummaryLoader.class);
         final SummaryLoader.SummaryProvider provider =
                 new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
-                        mobileNetworkPreferenceController, tetherPreferenceController);
+                        wifiPreferenceController, mobileNetworkPreferenceController,
+                        tetherPreferenceController);
 
         provider.setListening(false);
 
         verifyZeroInteractions(summaryLoader);
 
+        when(wifiPreferenceController.isAvailable()).thenReturn(true);
         when(mobileNetworkPreferenceController.isAvailable()).thenReturn(true);
         when(tetherPreferenceController.isAvailable()).thenReturn(true);
 
@@ -90,6 +95,8 @@
 
     @Test
     public void summaryProviderSetListening_noMobileOrHotspot_shouldReturnSimpleSummary() {
+        final WifiMasterSwitchPreferenceController wifiPreferenceController =
+                mock(WifiMasterSwitchPreferenceController.class);
         final MobileNetworkPreferenceController mobileNetworkPreferenceController =
                 mock(MobileNetworkPreferenceController.class);
         final TetherPreferenceController tetherPreferenceController =
@@ -98,12 +105,14 @@
         final SummaryLoader summaryLoader = mock(SummaryLoader.class);
         final SummaryLoader.SummaryProvider provider =
                 new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader,
-                        mobileNetworkPreferenceController, tetherPreferenceController);
+                        wifiPreferenceController, mobileNetworkPreferenceController,
+                        tetherPreferenceController);
 
         provider.setListening(false);
 
         verifyZeroInteractions(summaryLoader);
 
+        when(wifiPreferenceController.isAvailable()).thenReturn(true);
         when(mobileNetworkPreferenceController.isAvailable()).thenReturn(false);
         when(tetherPreferenceController.isAvailable()).thenReturn(false);
 
diff --git a/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java
index 6cc1704..fda5942 100644
--- a/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ChangeScreenLockPreferenceControllerTest.java
@@ -17,17 +17,28 @@
 package com.android.settings.security;
 
 import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.os.UserManager;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.PreferenceViewHolder;
 
 import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowUtils;
+import com.android.settings.widget.GearPreference;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -47,10 +58,15 @@
     private UserManager mUserManager;
     @Mock
     private DevicePolicyManager mDevicePolicyManager;
+    @Mock
+    private PreferenceScreen mPreferenceScreen;
 
     private Context mContext;
     private FakeFeatureFactory mFeatureFactory;
     private ChangeScreenLockPreferenceController mController;
+    private View mGearView;
+    private GearPreference mGearPreference;
+    private PreferenceViewHolder mPreferenceViewHolder;
 
     @Before
     public void setUp() {
@@ -75,4 +91,149 @@
     public void testDeviceAdministrators_ifDisabled_shouldNotBeShown() {
         assertThat(mController.isAvailable()).isFalse();
     }
+
+    @Test
+    public void updateState_notSecureDisableKeyguard_shouldNotShowGear() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true);
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearView.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void updateState_notSecureDisableKeyguard_summaryShouldShowOff() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true);
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_off));
+    }
+
+    @Test
+    public void updateState_notSecureWithSwipeKeyguard_shouldNotShowGear() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearView.getVisibility()).isEqualTo(View.GONE);
+    }
+
+    @Test
+    public void updateState_notSecureWithSwipeKeyguard_summaryShouldShowSwipe() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_none));
+    }
+
+    @Test
+    public void updateState_secureWithPinKeyguard_shouldShowGear() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        doReturn(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX).when(mLockPatternUtils)
+                .getKeyguardStoredPasswordQuality(anyInt());
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearView.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void updateState_secureWithPinKeyguard_summaryShouldShowPin() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        doReturn(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX).when(mLockPatternUtils)
+                .getKeyguardStoredPasswordQuality(anyInt());
+
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_pin));
+    }
+
+    @Test
+    public void updateState_secureWithPasswordKeyguard_shouldShowGear() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        doReturn(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX).when(mLockPatternUtils)
+                .getKeyguardStoredPasswordQuality(anyInt());
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearView.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void updateState_secureWithPasswordKeyguard_summaryShouldShowPassword() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        doReturn(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX).when(mLockPatternUtils)
+                .getKeyguardStoredPasswordQuality(anyInt());
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_password));
+    }
+
+    @Test
+    public void updateState_secureWithPatternKeyguard_shouldShowGear() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        doReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING).when(mLockPatternUtils)
+                .getKeyguardStoredPasswordQuality(anyInt());
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearView.getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
+    public void updateState_secureWithPatternKeyguard_summaryShouldShowPattern() {
+        when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+        when(mLockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(false);
+        doReturn(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING).when(mLockPatternUtils)
+                .getKeyguardStoredPasswordQuality(anyInt());
+        mockGearPreferenceAndViewHolder();
+
+        showPreference();
+
+        assertThat(mGearPreference.getSummary())
+                .isEqualTo(mContext.getString(R.string.unlock_set_unlock_mode_pattern));
+    }
+
+    private void mockGearPreferenceAndViewHolder() {
+        mGearPreference = new GearPreference(mContext, null);
+        mGearView = new View(mContext);
+        PreferenceViewHolder viewHolder = PreferenceViewHolder.createInstanceForTests(
+                LayoutInflater.from(mContext).inflate(
+                        mGearPreference.getLayoutResource(), null, false));
+        mPreferenceViewHolder = spy(viewHolder);
+        doReturn(mGearView).when(mPreferenceViewHolder).findViewById(R.id.settings_button);
+        when(mPreferenceScreen.findPreference(anyString())).thenReturn(mGearPreference);
+    }
+
+    private void showPreference() {
+        mController.displayPreference(mPreferenceScreen);
+        mController.updateState(mGearPreference);
+        mGearPreference.onBindViewHolder(mPreferenceViewHolder);
+    }
 }
\ No newline at end of file