Merge "Prevent a larger title from displaying incompletely" into sc-dev
diff --git a/res/drawable/one_handed_guideline.xml b/res/drawable/one_handed_guideline.xml
new file mode 100644
index 0000000..2c1a158
--- /dev/null
+++ b/res/drawable/one_handed_guideline.xml
@@ -0,0 +1,45 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="412dp"
+    android:height="264dp"
+    android:viewportWidth="412"
+    android:viewportHeight="264">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v264h-412z"/>
+    <path
+        android:pathData="M126,-246C109.431,-246 96,-232.569 96,-216V195C96,211.569 109.431,225 126,225H284.5C301.069,225 314.5,211.569 314.5,195V-216C314.5,-232.569 301.069,-246 284.5,-246H126ZM122,-235C110.954,-235 102,-226.046 102,-215V189.5C102,200.546 110.954,209.5 122,209.5H288C299.046,209.5 308,200.546 308,189.5V-215C308,-226.046 299.046,-235 288,-235H122Z"
+        android:fillColor="#000000"
+        android:fillType="evenOdd"/>
+    <path
+        android:pathData="M122.12,-233L288.12,-233A20,20 0,0 1,308.12 -213L308.12,191.5A20,20 0,0 1,288.12 211.5L122.12,211.5A20,20 0,0 1,102.12 191.5L102.12,-213A20,20 0,0 1,122.12 -233z"
+        android:fillColor="#EAF1FF"/>
+    <path
+        android:pathData="M102.16,193.12H308.08C308.08,203.326 299.806,211.6 289.6,211.6H120.64C110.434,211.6 102.16,203.326 102.16,193.12Z"
+        android:fillColor="#B5CFFC"/>
+    <path
+        android:pathData="M187.5,202.72L222.5,202.72A0.5,0.5 0,0 1,223 203.22L223,203.22A0.5,0.5 0,0 1,222.5 203.72L187.5,203.72A0.5,0.5 0,0 1,187 203.22L187,203.22A0.5,0.5 0,0 1,187.5 202.72z"
+        android:fillColor="#666666"/>
+    <path
+        android:pathData="M197,115h36v94.684h-36z"
+        android:strokeAlpha="0.8"
+        android:fillAlpha="0.8">
+      <aapt:attr name="android:fillColor">
+        <gradient 
+            android:startY="189.19"
+            android:startX="212.951"
+            android:endY="168.637"
+            android:endX="212.447"
+            android:type="linear">
+          <item android:offset="0" android:color="#FF4285F4"/>
+          <item android:offset="1" android:color="#004385F5"/>
+        </gradient>
+      </aapt:attr>
+    </path>
+    <path
+        android:pathData="M197,206.899a18,18.101 0,1 0,36 0a18,18.101 0,1 0,-36 0z"
+        android:strokeAlpha="0.8"
+        android:fillColor="#3B7BE4"
+        android:fillAlpha="0.8"/>
+  </group>
+</vector>
diff --git a/res/layout/one_handed_header.xml b/res/layout/one_handed_header.xml
new file mode 100644
index 0000000..2104e40
--- /dev/null
+++ b/res/layout/one_handed_header.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="wrap_content">
+
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:scaleType="centerCrop"
+        android:cropToPadding="true"
+        android:src="@drawable/one_handed_guideline"
+        android:contentDescription="@null" />
+
+</FrameLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9bae3a5..9fe106b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10496,8 +10496,6 @@
     <string name="disabled_by_policy_title_suspend_packages">Can’t open this app</string>
     <!-- Dialog title. This dialog lets a user know that a specific setting is blocked by their credit provider. Since the user purchased the device from the credit provider, the credit provider controls what they can access. [CHAR LIMIT=50] -->
     <string name="disabled_by_policy_title_financed_device">Blocked by your credit provider</string>
-    <!-- Shown when the user tries to change a settings locked by an admin [CHAR LIMIT=200] -->
-    <string name="default_admin_support_msg">If you have questions, contact your IT admin</string>
     <!-- Shown in dialog to allow user to see more information about the device admin [CHAR LIMIT=30] -->
     <string name="admin_support_more_info">More details</string>
     <!-- Shown in admin details page to warn user about policies the admin can set in a work profile. [CHAR LIMIT=NONE] -->
@@ -12725,10 +12723,8 @@
     <string name="view_airplane_safe_networks">View airplane mode networks</string>
     <!-- Text of message for viewing the networks that are available in airplane mode. [CHAR LIMIT=60] -->
     <string name="viewing_airplane_mode_networks">Viewing airplane mode networks</string>
-    <!-- Slice title text for turning on networks (e.g. Wi-Fi). [CHAR LIMIT=40] -->
-    <string name="turn_on_networks">Turn on networks</string>
-    <!-- Slice title text for turning off networks (e.g. Wi-Fi). [CHAR LIMIT=40] -->
-    <string name="turn_off_networks">Turn off networks</string>
+    <!-- Slice title text for turning on the Wi-Fi networks. [CHAR LIMIT=40] -->
+    <string name="turn_on_wifi">Turn on Wi\u2011Fi</string>
     <!-- Title for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
     <string name="reset_your_internet_title">Reset your internet?</string>
     <!-- Description for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
diff --git a/res/xml/one_handed_settings.xml b/res/xml/one_handed_settings.xml
index 3508d8a..9382657 100644
--- a/res/xml/one_handed_settings.xml
+++ b/res/xml/one_handed_settings.xml
@@ -21,6 +21,14 @@
     android:persistent="false"
     android:title="@string/one_handed_title">
 
+    <com.android.settingslib.widget.LayoutPreference
+        android:key="one_handed_header"
+        android:layout="@layout/one_handed_header"
+        android:persistent="false"
+        android:selectable="false"
+        settings:allowDividerBelow="false"
+        settings:searchable="false"/>
+
     <SwitchPreference
         android:key="gesture_one_handed_mode_enabled"
         android:title="@string/one_handed_mode_enabled"
diff --git a/src/com/android/settings/applications/AppDashboardFragment.java b/src/com/android/settings/applications/AppDashboardFragment.java
index fc4bcd0..3b1a977 100644
--- a/src/com/android/settings/applications/AppDashboardFragment.java
+++ b/src/com/android/settings/applications/AppDashboardFragment.java
@@ -48,7 +48,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return SettingsEnums.SETTINGS_APP_NOTIF_CATEGORY;
+        return SettingsEnums.MANAGE_APPLICATIONS;
     }
 
     @Override
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index c90fe48..95c94ce 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -30,6 +30,7 @@
 import android.util.Log;
 
 import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleObserver;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
@@ -38,6 +39,7 @@
 import com.android.settings.slices.SliceData;
 import com.android.settings.slices.Sliceable;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.search.SearchIndexableRaw;
 
 import java.lang.annotation.Retention;
@@ -50,6 +52,9 @@
  * Abstract class to consolidate utility between preference controllers and act as an interface
  * for Slices. The abstract classes that inherit from this class will act as the direct interfaces
  * for each type when plugging into Slices.
+ * <p>
+ * Controllers defined in xml are automatically {@link Lifecycle#addObserver(LifecycleObserver)
+ * wired up} to the settings lifecycle if they implement {@link LifecycleObserver}.
  */
 public abstract class BasePreferenceController extends AbstractPreferenceController implements
         Sliceable {
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 1b2be80..7acbd19 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -27,6 +27,7 @@
 
 import androidx.annotation.CallSuper;
 import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.LifecycleObserver;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceManager;
@@ -44,7 +45,6 @@
 import com.android.settings.widget.PrimarySwitchPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.ProviderTile;
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index 15b5466..f9bb99e 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -85,6 +85,12 @@
     @VisibleForTesting
     AdaptiveSleepPreferenceController mAdaptiveSleepController;
 
+    public ScreenTimeoutSettings() {
+        super();
+        mMetricsFeatureProvider = FeatureFactory.getFactory(getContext())
+                .getMetricsFeatureProvider();
+    }
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -105,7 +111,6 @@
         mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy);
         mPrivacyPreference.setSelectable(false);
         mPrivacyPreference.setLayoutResource(R.layout.preference_footer);
-        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
     @Override
diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
index 685da03..cf23c94 100644
--- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
+++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
@@ -233,8 +233,6 @@
         final TextView textView = root.findViewById(R.id.admin_support_msg);
         if (supportMessage != null) {
             textView.setText(supportMessage);
-        } else if (!isFinancedDevice()) {
-            textView.setText(R.string.default_admin_support_msg);
         }
     }
 
diff --git a/src/com/android/settings/network/AirplaneSafeNetworksSlice.java b/src/com/android/settings/network/AirplaneSafeNetworksSlice.java
deleted file mode 100644
index 763e0c7..0000000
--- a/src/com/android/settings/network/AirplaneSafeNetworksSlice.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.network;
-
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.net.wifi.WifiManager;
-import android.util.Log;
-
-import androidx.annotation.IntDef;
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.slice.Slice;
-import androidx.slice.builders.ListBuilder;
-import androidx.slice.builders.ListBuilder.RowBuilder;
-import androidx.slice.builders.SliceAction;
-import androidx.slice.core.SliceHints;
-
-import com.android.settings.AirplaneModeEnabler;
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.slices.CustomSliceRegistry;
-import com.android.settings.slices.CustomSliceable;
-import com.android.settings.slices.SliceBackgroundWorker;
-import com.android.settings.slices.SliceBroadcastReceiver;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * {@link CustomSliceable} for airplane-safe networks, used by generic clients.
- */
-public class AirplaneSafeNetworksSlice implements CustomSliceable,
-        AirplaneModeEnabler.OnAirplaneModeChangedListener {
-
-    private static final String TAG = "AirplaneSafeNetworksSlice";
-
-    public static final String ACTION_INTENT_EXTRA = "action";
-
-    /**
-     * Annotation for different action of the slice.
-     *
-     * {@code TURN_ON_NETWORKS} for action of turning on Wi-Fi networks.
-     * {@code TURN_OFF_NETWORKS} for action of turning off Wi-Fi networks.
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(value = {
-            Action.TURN_ON_NETWORKS,
-            Action.TURN_OFF_NETWORKS,
-    })
-    public @interface Action {
-        int TURN_ON_NETWORKS = 1;
-        int TURN_OFF_NETWORKS = 2;
-    }
-
-    private final Context mContext;
-    private final AirplaneModeEnabler mAirplaneModeEnabler;
-    private final WifiManager mWifiManager;
-
-    private boolean mIsAirplaneModeOn;
-
-    public AirplaneSafeNetworksSlice(Context context) {
-        mContext = context;
-        mAirplaneModeEnabler = new AirplaneModeEnabler(context, this);
-        mIsAirplaneModeOn = mAirplaneModeEnabler.isAirplaneModeOn();
-        mWifiManager = mContext.getSystemService(WifiManager.class);
-    }
-
-    private static void logd(String s) {
-        Log.d(TAG, s);
-    }
-
-    @Override
-    public Slice getSlice() {
-        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY);
-        if (mIsAirplaneModeOn) {
-            listBuilder.addRow(new RowBuilder()
-                    .setTitle(getTitle())
-                    .addEndItem(getEndIcon(), SliceHints.ICON_IMAGE)
-                    .setPrimaryAction(getSliceAction()));
-        }
-        return listBuilder.build();
-    }
-
-    @Override
-    public Uri getUri() {
-        return CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI;
-    }
-
-    @Override
-    public void onNotifyChange(Intent intent) {
-        final int action = intent.getIntExtra(ACTION_INTENT_EXTRA, 0);
-        if (action == Action.TURN_ON_NETWORKS) {
-            if (!mWifiManager.isWifiEnabled()) {
-                logd("Action: turn on Wi-Fi networks");
-                mWifiManager.setWifiEnabled(true);
-            }
-        } else if (action == Action.TURN_OFF_NETWORKS) {
-            if (mWifiManager.isWifiEnabled()) {
-                logd("Action: turn off Wi-Fi networks");
-                mWifiManager.setWifiEnabled(false);
-            }
-        }
-    }
-
-    @Override
-    public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
-        mIsAirplaneModeOn = isAirplaneModeOn;
-        final AirplaneSafeNetworksWorker worker = SliceBackgroundWorker.getInstance(getUri());
-        if (worker != null) {
-            worker.updateSlice();
-        }
-    }
-
-    @Override
-    public Intent getIntent() {
-        return new Intent(getUri().toString())
-                .setData(getUri())
-                .setClass(mContext, SliceBroadcastReceiver.class)
-                .putExtra(ACTION_INTENT_EXTRA, getAction());
-    }
-
-    @Action
-    private int getAction() {
-        return mWifiManager.isWifiEnabled()
-                ? Action.TURN_OFF_NETWORKS
-                : Action.TURN_ON_NETWORKS;
-    }
-
-    private String getTitle() {
-        return mContext.getText(
-                (getAction() == Action.TURN_ON_NETWORKS)
-                        ? R.string.turn_on_networks
-                        : R.string.turn_off_networks).toString();
-    }
-
-    private IconCompat getEndIcon() {
-        final Drawable drawable = mContext.getDrawable(
-                (getAction() == Action.TURN_ON_NETWORKS) ? R.drawable.ic_airplane_safe_networks_24dp
-                        : R.drawable.ic_airplanemode_active);
-        if (drawable == null) {
-            return Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT));
-        }
-        drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorAccent));
-        return Utils.createIconWithDrawable(drawable);
-    }
-
-    private SliceAction getSliceAction() {
-        final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
-                0 /* requestCode */, getIntent(),
-                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
-        final IconCompat icon = Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT));
-        return SliceAction.create(pendingIntent, icon, ListBuilder.ACTION_WITH_LABEL, getTitle());
-    }
-
-    @Override
-    public Class getBackgroundWorkerClass() {
-        return AirplaneSafeNetworksWorker.class;
-    }
-
-    public static class AirplaneSafeNetworksWorker extends SliceBackgroundWorker {
-
-        private final IntentFilter mIntentFilter;
-        private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
-                    notifySliceChange();
-                }
-            }
-        };
-
-        public AirplaneSafeNetworksWorker(Context context, Uri uri) {
-            super(context, uri);
-            mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
-        }
-
-        @Override
-        protected void onSlicePinned() {
-            getContext().registerReceiver(mBroadcastReceiver, mIntentFilter);
-        }
-
-        @Override
-        protected void onSliceUnpinned() {
-            getContext().unregisterReceiver(mBroadcastReceiver);
-        }
-
-        @Override
-        public void close() {
-            // Do nothing.
-        }
-
-        public void updateSlice() {
-            notifySliceChange();
-        }
-    }
-}
diff --git a/src/com/android/settings/network/TurnOnWifiSlice.java b/src/com/android/settings/network/TurnOnWifiSlice.java
new file mode 100644
index 0000000..05a873f
--- /dev/null
+++ b/src/com/android/settings/network/TurnOnWifiSlice.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.network;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.util.Log;
+
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.slice.Slice;
+import androidx.slice.builders.ListBuilder;
+import androidx.slice.builders.ListBuilder.RowBuilder;
+import androidx.slice.builders.SliceAction;
+import androidx.slice.core.SliceHints;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.slices.CustomSliceRegistry;
+import com.android.settings.slices.CustomSliceable;
+import com.android.settings.slices.SliceBackgroundWorker;
+import com.android.settings.slices.SliceBroadcastReceiver;
+
+/**
+ * {@link CustomSliceable} for turning on Wi-Fi, used by generic clients.
+ */
+public class TurnOnWifiSlice implements CustomSliceable {
+
+    private static final String TAG = "TurnOnWifiSlice";
+
+    private final Context mContext;
+    private final WifiManager mWifiManager;
+
+    public TurnOnWifiSlice(Context context) {
+        mContext = context;
+        mWifiManager = mContext.getSystemService(WifiManager.class);
+    }
+
+    private static void logd(String s) {
+        Log.d(TAG, s);
+    }
+
+    @Override
+    public Slice getSlice() {
+        if (mWifiManager.isWifiEnabled()) {
+            return null;
+        }
+        final String title = mContext.getText(R.string.turn_on_wifi).toString();
+        final SliceAction primaryAction = SliceAction.create(getBroadcastIntent(mContext),
+                getEndIcon(), ListBuilder.ICON_IMAGE, title);
+        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
+                .addRow(new RowBuilder()
+                        .setTitle(title)
+                        .addEndItem(getEndIcon(), SliceHints.ICON_IMAGE)
+                        .setPrimaryAction(primaryAction));
+        return listBuilder.build();
+    }
+
+    @Override
+    public Uri getUri() {
+        return CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI;
+    }
+
+    @Override
+    public void onNotifyChange(Intent intent) {
+        logd("Action: turn on Wi-Fi networks");
+        mWifiManager.setWifiEnabled(true);
+    }
+
+    @Override
+    public Intent getIntent() {
+        return new Intent(getUri().toString())
+                .setData(getUri())
+                .setClass(mContext, SliceBroadcastReceiver.class);
+    }
+
+    private IconCompat getEndIcon() {
+        final Drawable drawable = mContext.getDrawable(R.drawable.ic_settings_wireless);
+        if (drawable == null) {
+            return Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT));
+        }
+        drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorAccent));
+        return Utils.createIconWithDrawable(drawable);
+    }
+
+    @Override
+    public Class getBackgroundWorkerClass() {
+        return TurnOnWifiWorker.class;
+    }
+
+    /**
+     * The Slice background worker {@link SliceBackgroundWorker} is used to listen the Wi-Fi
+     * status change, and then notifies the Slice {@link Uri} to update.
+     */
+    public static class TurnOnWifiWorker extends SliceBackgroundWorker {
+
+        private final IntentFilter mIntentFilter;
+        private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
+                    notifySliceChange();
+                }
+            }
+        };
+
+        public TurnOnWifiWorker(Context context, Uri uri) {
+            super(context, uri);
+            mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
+        }
+
+        @Override
+        protected void onSlicePinned() {
+            getContext().registerReceiver(mBroadcastReceiver, mIntentFilter);
+        }
+
+        @Override
+        protected void onSliceUnpinned() {
+            getContext().unregisterReceiver(mBroadcastReceiver);
+        }
+
+        @Override
+        public void close() {
+            // Do nothing.
+        }
+    }
+}
diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java
index bdaa849..46843b0 100644
--- a/src/com/android/settings/panel/InternetConnectivityPanel.java
+++ b/src/com/android/settings/panel/InternetConnectivityPanel.java
@@ -113,7 +113,7 @@
         final List<Uri> uris = new ArrayList<>();
         if (mIsProviderModelEnabled) {
             uris.add(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI);
-            uris.add(CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI);
+            uris.add(CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI);
         } else {
             uris.add(CustomSliceRegistry.WIFI_SLICE_URI);
             uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI);
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index e40b164..713d61a 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -39,8 +39,8 @@
 import com.android.settings.location.LocationSlice;
 import com.android.settings.media.MediaOutputIndicatorSlice;
 import com.android.settings.media.RemoteMediaSlice;
-import com.android.settings.network.AirplaneSafeNetworksSlice;
 import com.android.settings.network.ProviderModelSlice;
+import com.android.settings.network.TurnOnWifiSlice;
 import com.android.settings.network.telephony.MobileDataSlice;
 import com.android.settings.notification.zen.ZenModeButtonPreferenceController;
 import com.android.settings.wifi.calling.WifiCallingSliceHelper;
@@ -307,13 +307,13 @@
             .build();
 
     /**
-     * Backing Uri for the Always On Slice.
+     * Backing Uri for the Turn on Wi-Fi Slice.
      */
-    public static final Uri AIRPLANE_SAFE_NETWORKS_SLICE_URI = new Uri.Builder()
+    public static final Uri TURN_ON_WIFI_SLICE_URI = new Uri.Builder()
             .scheme(ContentResolver.SCHEME_CONTENT)
             .authority(SettingsSliceProvider.SLICE_AUTHORITY)
             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
-            .appendPath("airplane_safe_networks")
+            .appendPath("turn_on_wifi")
             .build();
 
     @VisibleForTesting
@@ -337,7 +337,7 @@
         sUriToSlice.put(DARK_THEME_SLICE_URI, DarkThemeSlice.class);
         sUriToSlice.put(REMOTE_MEDIA_SLICE_URI, RemoteMediaSlice.class);
         sUriToSlice.put(ALWAYS_ON_SLICE_URI, AlwaysOnDisplaySlice.class);
-        sUriToSlice.put(AIRPLANE_SAFE_NETWORKS_SLICE_URI, AirplaneSafeNetworksSlice.class);
+        sUriToSlice.put(TURN_ON_WIFI_SLICE_URI, TurnOnWifiSlice.class);
     }
 
     public static Class<? extends CustomSliceable> getSliceClassByUri(Uri uri) {
diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
index f0bf95c..771a863 100644
--- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java
@@ -40,6 +40,7 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.RestrictedLockUtils;
 
 import org.junit.Before;
@@ -78,6 +79,7 @@
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
+        FakeFeatureFactory.setupForTest();
         mContext = spy(getApplicationContext());
         mSettings = spy(new ScreenTimeoutSettings());
         mContentResolver = mContext.getContentResolver();
diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
index 1ff1d79..b245017 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
@@ -195,6 +195,27 @@
     }
 
     @Test
+    public void testSetAdminSupportDetails_shortSupportMessageIsNull() {
+        final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
+        final UserManager userManager = RuntimeEnvironment.application.getSystemService(
+                UserManager.class);
+        final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
+        final ViewGroup view = new FrameLayout(mActivity);
+        final ComponentName component = new ComponentName("some.package.name",
+                "some.package.name.SomeClass");
+        final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
+        final TextView textView = createAdminSupportTextView(view, mActivity);
+        dpmShadow.setShortSupportMessageForUser(component, 123, null);
+        dpmShadow.setIsAdminActiveAsUser(true);
+        createShadowWorkProfile(userManagerShadow);
+
+        mHelper.setAdminSupportDetails(mActivity, view, admin);
+
+        assertNotNull(admin.component);
+        assertEquals("", Shadows.shadowOf(textView).innerText());
+    }
+
+    @Test
     public void testSetAdminSupportDetailsNotAdmin() {
         final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
         final UserManager userManager = RuntimeEnvironment.application.getSystemService(
@@ -212,27 +233,6 @@
         mHelper.setAdminSupportDetails(mActivity, textView, admin);
 
         assertNull(admin.component);
-        assertEquals(mActivity.getString(R.string.default_admin_support_msg),
-                Shadows.shadowOf(textView).innerText());
-    }
-
-    @Test
-    public void testSetAdminSupportDetailsForFinancedDevice_shortSupportMessageIsNull() {
-        final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
-        final UserManager userManager = RuntimeEnvironment.application.getSystemService(
-                UserManager.class);
-        final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
-        final ViewGroup view = new FrameLayout(mActivity);
-        final ComponentName component = new ComponentName("some.package.name",
-                "some.package.name.SomeClass");
-        final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
-        final TextView textView = createAdminSupportTextView(view, mActivity);
-        setupFinancedDevice(dpmShadow);
-        createShadowWorkProfile(userManagerShadow);
-
-        mHelper.setAdminSupportDetails(mActivity, view, admin);
-
-        assertNotNull(admin.component);
         assertEquals("", Shadows.shadowOf(textView).innerText());
     }
 
diff --git a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java b/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java
deleted file mode 100644
index a90b89d..0000000
--- a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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.network;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.wifi.WifiManager;
-
-import androidx.slice.Slice;
-import androidx.slice.SliceItem;
-import androidx.slice.SliceMetadata;
-import androidx.slice.SliceProvider;
-import androidx.slice.widget.SliceLiveData;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.testutils.ResourcesUtils;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-@RunWith(AndroidJUnit4.class)
-public class AirplaneSafeNetworksSliceTest {
-
-    @Rule
-    public MockitoRule mMocks = MockitoJUnit.rule();
-    @Mock
-    private WifiManager mWifiManager;
-
-    private Context mContext;
-    private AirplaneSafeNetworksSlice mAirplaneSafeNetworksSlice;
-
-    @Before
-    public void setUp() {
-        mContext = spy(ApplicationProvider.getApplicationContext());
-        when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
-
-        // Set-up specs for SliceMetadata.
-        SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
-
-        mAirplaneSafeNetworksSlice = new AirplaneSafeNetworksSlice(mContext);
-        mAirplaneSafeNetworksSlice.onAirplaneModeChanged(true);
-    }
-
-    @Test
-    public void getSlice_airplaneModeOff_shouldBeNotNull() {
-        mAirplaneSafeNetworksSlice.onAirplaneModeChanged(false);
-
-        assertThat(mAirplaneSafeNetworksSlice.getSlice()).isNotNull();
-    }
-
-    @Test
-    public void getSlice_wifiDisabled_shouldShowTurnOnNetworks() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(false);
-
-        final Slice slice = mAirplaneSafeNetworksSlice.getSlice();
-
-        assertThat(slice).isNotNull();
-        final SliceItem sliceTitle =
-                SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
-        assertThat(sliceTitle.getText()).isEqualTo(
-                ResourcesUtils.getResourcesString(mContext, "turn_on_networks"));
-    }
-
-    @Test
-    public void getSlice_wifiEnabled_shouldShowTurnOffNetworks() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(true);
-
-        final Slice slice = mAirplaneSafeNetworksSlice.getSlice();
-
-        assertThat(slice).isNotNull();
-        final SliceItem sliceTitle =
-                SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem();
-        assertThat(sliceTitle.getText()).isEqualTo(
-                ResourcesUtils.getResourcesString(mContext, "turn_off_networks"));
-    }
-
-    @Test
-    public void onNotifyChange_turnOnNetworks_shouldSetWifiEnabled() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(false);
-        Intent intent = mAirplaneSafeNetworksSlice.getIntent();
-
-        mAirplaneSafeNetworksSlice.onNotifyChange(intent);
-
-        verify(mWifiManager).setWifiEnabled(true);
-    }
-
-    @Test
-    public void onNotifyChange_turnOffNetworks_shouldSetWifiDisabled() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(true);
-        Intent intent = mAirplaneSafeNetworksSlice.getIntent();
-
-        mAirplaneSafeNetworksSlice.onNotifyChange(intent);
-
-        verify(mWifiManager).setWifiEnabled(false);
-    }
-}
diff --git a/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java b/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java
new file mode 100644
index 0000000..befa655
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS 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.network;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+
+import androidx.slice.SliceProvider;
+import androidx.slice.widget.SliceLiveData;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class TurnOnWifiSliceTest {
+
+    @Rule
+    public MockitoRule mMocks = MockitoJUnit.rule();
+    @Mock
+    private WifiManager mWifiManager;
+
+    private Context mContext;
+    private TurnOnWifiSlice mSlice;
+
+    @Before
+    public void setUp() {
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
+
+        // Set-up specs for SliceMetadata.
+        SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
+        mSlice = new TurnOnWifiSlice(mContext);
+    }
+
+    @Test
+    public void getSlice_wifiEnabled_shouldBeNull() {
+        when(mWifiManager.isWifiEnabled()).thenReturn(true);
+
+        assertThat(mSlice.getSlice()).isNull();
+    }
+
+    @Test
+    public void getSlice_wifiDisabled_shouldBeNotNull() {
+        when(mWifiManager.isWifiEnabled()).thenReturn(false);
+
+        assertThat(mSlice.getSlice()).isNotNull();
+    }
+
+    @Test
+    public void onNotifyChange_shouldSetWifiEnabled() {
+        Intent intent = mSlice.getIntent();
+
+        mSlice.onNotifyChange(intent);
+
+        verify(mWifiManager).setWifiEnabled(true);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
index 4b4ec32..5d95d9a 100644
--- a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
+++ b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
@@ -157,7 +157,7 @@
 
         assertThat(uris).containsExactly(
                 CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI,
-                CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI);
+                CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI);
     }
 
     @Test