diff --git a/res/layout-land/choose_lock_pattern.xml b/res/layout-land/choose_lock_pattern.xml
index 0743577..8e78b05 100644
--- a/res/layout-land/choose_lock_pattern.xml
+++ b/res/layout-land/choose_lock_pattern.xml
@@ -138,10 +138,12 @@
         </LinearLayout>
 
         <!-- right side: lock pattern -->
-        <FrameLayout
+        <com.android.setupwizardlib.view.FillContentLayout
+            style="@style/LockPatternContainerStyle"
             android:layout_width="0dp"
             android:layout_height="match_parent"
-            android:layout_weight="1.0">
+            android:layout_weight="1.0"
+            android:paddingStart="0dp">
 
             <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
                 android:layout_width="match_parent"
@@ -149,7 +151,7 @@
                 android:layout_gravity="center"
                 android:background="@color/lock_pattern_background" />
 
-        </FrameLayout>
+        </com.android.setupwizardlib.view.FillContentLayout>
 
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
 
diff --git a/res/layout-land/confirm_lock_pattern_internal.xml b/res/layout-land/confirm_lock_pattern_internal.xml
index 4e58f32..952ab49 100644
--- a/res/layout-land/confirm_lock_pattern_internal.xml
+++ b/res/layout-land/confirm_lock_pattern_internal.xml
@@ -96,10 +96,12 @@
 
         </ScrollView>
 
-        <FrameLayout
+        <com.android.setupwizardlib.view.FillContentLayout
+            style="@style/LockPatternContainerStyle"
             android:layout_width="0dp"
             android:layout_height="match_parent"
-            android:layout_weight="1">
+            android:layout_weight="1"
+            android:paddingStart="0dp">
 
             <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
                 android:layout_width="match_parent"
@@ -107,7 +109,7 @@
                 android:layout_gravity="center"
                 android:background="@color/lock_pattern_background" />
 
-        </FrameLayout>
+        </com.android.setupwizardlib.view.FillContentLayout>
 
     </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
 </com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 3ea960d..7dca27d 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -64,19 +64,31 @@
             android:gravity="center"
             android:clipChildren="false"
             android:clipToPadding="false"
-            android:orientation="vertical">
+            android:orientation="vertical"
+            android:paddingLeft="0dp"
+            android:paddingRight="0dp">
 
             <TextView android:id="@+id/headerText"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:minLines="2"
                 android:gravity="center"
+                android:paddingHorizontal="?attr/suwMarginSides"
                 android:textSize="18sp" />
 
-            <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
-                android:layout_width="match_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1" />
+            <com.android.setupwizardlib.view.FillContentLayout
+                style="@style/LockPatternContainerStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="0dp"
+                android:layout_weight="1">
+
+                <com.android.internal.widget.LockPatternView
+                    android:id="@+id/lockPattern"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center" />
+
+            </com.android.setupwizardlib.view.FillContentLayout>
 
         </LinearLayout>
 
diff --git a/res/layout/confirm_lock_pattern_internal_base.xml b/res/layout/confirm_lock_pattern_internal_base.xml
index 5109632..d0ce769 100644
--- a/res/layout/confirm_lock_pattern_internal_base.xml
+++ b/res/layout/confirm_lock_pattern_internal_base.xml
@@ -61,14 +61,23 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
-            android:gravity="center">
+            android:gravity="center"
+            android:paddingLeft="0dp"
+            android:paddingRight="0dp">
 
-            <com.android.internal.widget.LockPatternView
-                android:id="@+id/lockPattern"
-                android:layout_width="match_parent"
+            <com.android.setupwizardlib.view.FillContentLayout
+                style="@style/LockPatternContainerStyle"
+                android:layout_width="wrap_content"
                 android:layout_height="0dp"
-                android:layout_weight="4"
-                android:layout_gravity="center_horizontal"/>
+                android:layout_weight="1">
+
+                <com.android.internal.widget.LockPatternView
+                    android:id="@+id/lockPattern"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center" />
+
+            </com.android.setupwizardlib.view.FillContentLayout>
 
             <TextView
                 style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
@@ -77,9 +86,8 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
+                android:layout_marginHorizontal="?attr/suwMarginSides"
                 android:layout_marginTop="12dp"
-                android:layout_marginStart="12dp"
-                android:layout_marginEnd="12dp"
                 android:gravity="center_vertical"/>
 
             <ImageView
@@ -87,6 +95,7 @@
                 android:layout_gravity="center_horizontal"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginHorizontal="?attr/suwMarginSides"
                 android:layout_marginBottom="24dp"
                 android:contentDescription="@string/confirm_fingerprint_icon_content_description"
                 android:visibility="gone"/>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fcc0b6d..c58f6bb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4630,6 +4630,12 @@
     <string name="background_activity_summary_off">App\'s background activity is limited when not in use</string>
     <!-- Summary for the background activity when it is disabled [CHAR_LIMIT=120] -->
     <string name="background_activity_summary_disabled">App not allowed to run in background</string>
+    <!-- TODO: Pending UX review. Summary for the background activity when it is whitlisted [CHAR_LIMIT=120] -->
+    <string name="background_activity_summary_whitelisted">App can not be optimized for battery use</string>
+    <!-- TODO: Pending UX review. Title for the warning dialog to show to the user when limiting background activity for an app -->
+    <string name="background_activity_warning_dialog_title">Limit background activity?</string>
+    <!-- TODO: Pending UX review. Text for the warning dialog to show to the user when limiting background activity for an app -->
+    <string name="background_activity_warning_dialog_text">If you limit background activity for an app, it may misbehave</string>
 
     <!-- Title for the screen usage in power use UI [CHAR_LIMIT=60] -->
     <string name="device_screen_usage">Screen usage since full charge</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index a3bfcdf..fe92e6d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -427,6 +427,16 @@
 
     <style name="DreamStartButton" parent="android:Widget.Material.Button" />
 
+    <style name="LockPatternContainerStyle">
+        <item name="android:maxHeight">400dp</item>
+        <item name="android:maxWidth">420dp</item>
+        <item name="android:minHeight">0dp</item>
+        <item name="android:minWidth">0dp</item>
+        <item name="android:paddingBottom">0dp</item>
+        <item name="android:paddingHorizontal">44dp</item>
+        <item name="android:paddingTop">0dp</item>
+    </style>
+
     <style name="LockPatternStyle">
         <item name="*android:regularColor">@color/lock_pattern_view_regular_color</item>
         <item name="*android:successColor">@color/lock_pattern_view_success_color</item>
diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml
index 550ab36..5407947 100644
--- a/res/xml/wifi_network_details_fragment.xml
+++ b/res/xml/wifi_network_details_fragment.xml
@@ -22,14 +22,14 @@
         android:selectable="false"
         android:order="-10000"/>
 
+    <!-- Buttons -->
+    <com.android.settings.widget.ActionButtonPreference
+        android:key="buttons"
+        android:selectable="false" />
+
     <!-- General Details Category -->
     <PreferenceCategory
             android:key="general_details_category" >
-        <!-- Buttons -->
-        <com.android.settings.widget.ActionButtonPreference
-            android:key="buttons"
-            android:selectable="false" />
-
         <com.android.settings.wifi.WifiDetailPreference
                 android:key="signal_strength"
                 android:title="@string/wifi_signal"
@@ -87,5 +87,4 @@
                 android:key="ipv6_addresses"
                 android:selectable="false"/>
     </PreferenceCategory>
-
 </PreferenceScreen>
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 0142e62..66a0ca2 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -68,7 +68,8 @@
 public class AdvancedPowerUsageDetail extends DashboardFragment implements
         ButtonActionDialogFragment.AppButtonsDialogListener,
         AnomalyDialogFragment.AnomalyDialogListener,
-        LoaderManager.LoaderCallbacks<List<Anomaly>> {
+        LoaderManager.LoaderCallbacks<List<Anomaly>>,
+        BackgroundActivityPreferenceController.WarningConfirmationListener {
 
     public static final String TAG = "AdvancedPowerUsageDetail";
     public static final String EXTRA_UID = "extra_uid";
@@ -109,6 +110,7 @@
     @VisibleForTesting
     AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
     private AppButtonsPreferenceController mAppButtonsPreferenceController;
+    private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
 
     private DevicePolicyManagerWrapper mDpm;
     private UserManager mUserManager;
@@ -319,7 +321,9 @@
         final int uid = bundle.getInt(EXTRA_UID, 0);
         final String packageName = bundle.getString(EXTRA_PACKAGE_NAME);
 
-        controllers.add(new BackgroundActivityPreferenceController(context, uid));
+        mBackgroundActivityPreferenceController = new BackgroundActivityPreferenceController(
+                context, this, uid, packageName);
+        controllers.add(mBackgroundActivityPreferenceController);
         controllers.add(new BatteryOptimizationPreferenceController(
                 (SettingsActivity) getActivity(), this, packageName));
         mAppButtonsPreferenceController = new AppButtonsPreferenceController(
@@ -364,4 +368,10 @@
     public void onLoaderReset(Loader<List<Anomaly>> loader) {
 
     }
+
+    @Override
+    public void onLimitBackgroundActivity() {
+        mBackgroundActivityPreferenceController.setUnchecked(
+                findPreference(mBackgroundActivityPreferenceController.getPreferenceKey()));
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
index 4d1cf77..cea6d16 100644
--- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
@@ -14,12 +14,17 @@
 
 package com.android.settings.fuelgauge;
 
+import android.app.AlertDialog;
 import android.app.AppOpsManager;
+import android.app.Dialog;
+import android.app.Fragment;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Build;
+import android.os.Bundle;
 import android.os.UserManager;
 import android.support.annotation.VisibleForTesting;
 import android.support.v14.preference.SwitchPreference;
@@ -29,6 +34,7 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -45,54 +51,72 @@
     private final PackageManager mPackageManager;
     private final AppOpsManager mAppOpsManager;
     private final UserManager mUserManager;
-    private final String[] mPackages;
     private final int mUid;
     @VisibleForTesting
     DevicePolicyManagerWrapper mDpm;
-
+    private Fragment mFragment;
     private String mTargetPackage;
+    private boolean mIsPreOApp;
+    private PowerWhitelistBackend mPowerWhitelistBackend;
 
-    public BackgroundActivityPreferenceController(Context context, int uid) {
+    public BackgroundActivityPreferenceController(Context context, Fragment fragment,
+            int uid, String packageName) {
+        this(context, fragment, uid, packageName, PowerWhitelistBackend.getInstance());
+    }
+
+    @VisibleForTesting
+    BackgroundActivityPreferenceController(Context context, Fragment fragment,
+            int uid, String packageName, PowerWhitelistBackend backend) {
         super(context);
+        mPowerWhitelistBackend = backend;
         mPackageManager = context.getPackageManager();
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mDpm = new DevicePolicyManagerWrapperImpl(
                 (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE));
         mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mUid = uid;
-        mPackages = mPackageManager.getPackagesForUid(mUid);
+        mFragment = fragment;
+        mTargetPackage = packageName;
+        mIsPreOApp = isLegacyApp(packageName);
     }
 
     @Override
     public void updateState(Preference preference) {
         final int mode = mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
+                .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage);
+        final boolean whitelisted = mPowerWhitelistBackend.isWhitelisted(mTargetPackage);
         // Set checked or not before we may set it disabled
         if (mode != AppOpsManager.MODE_ERRORED) {
-            final boolean checked = mode != AppOpsManager.MODE_IGNORED;
+            final boolean checked = whitelisted || mode != AppOpsManager.MODE_IGNORED;
             ((SwitchPreference) preference).setChecked(checked);
         }
-        if (mode == AppOpsManager.MODE_ERRORED
+        if (whitelisted || mode == AppOpsManager.MODE_ERRORED
                 || Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mTargetPackage)) {
             preference.setEnabled(false);
+        } else {
+            preference.setEnabled(true);
         }
-
         updateSummary(preference);
     }
 
     @Override
     public boolean isAvailable() {
-        if (mPackages == null) {
-            return false;
-        }
-        for (final String packageName : mPackages) {
-            if (isLegacyApp(packageName)) {
-                mTargetPackage = packageName;
-                return true;
-            }
-        }
+        return mTargetPackage != null;
+    }
 
-        return false;
+    /**
+     * Called from the warning dialog, if the user decides to go ahead and disable background
+     * activity for this package
+     */
+    public void setUnchecked(Preference preference) {
+        if (mIsPreOApp) {
+            mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage,
+                    AppOpsManager.MODE_IGNORED);
+        }
+        mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage,
+                AppOpsManager.MODE_IGNORED);
+        ((SwitchPreference) preference).setChecked(false);
+        updateSummary(preference);
     }
 
     @Override
@@ -102,20 +126,24 @@
 
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
-        boolean switchOn = (Boolean) newValue;
-        mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage,
-                switchOn ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
-
+        final boolean switchOn = (Boolean) newValue;
+        if (!switchOn) {
+            final WarningDialogFragment dialogFragment = new WarningDialogFragment();
+            dialogFragment.setTargetFragment(mFragment, 0);
+            dialogFragment.show(mFragment.getFragmentManager(), TAG);
+            return false;
+        }
+        if (mIsPreOApp) {
+            mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage,
+                    AppOpsManager.MODE_ALLOWED);
+        }
+        mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage,
+                AppOpsManager.MODE_ALLOWED);
         updateSummary(preference);
         return true;
     }
 
     @VisibleForTesting
-    String getTargetPackage() {
-        return mTargetPackage;
-    }
-
-    @VisibleForTesting
     boolean isLegacyApp(final String packageName) {
         try {
             ApplicationInfo info = mPackageManager.getApplicationInfo(packageName,
@@ -131,8 +159,12 @@
 
     @VisibleForTesting
     void updateSummary(Preference preference) {
+        if (mPowerWhitelistBackend.isWhitelisted(mTargetPackage)) {
+            preference.setSummary(R.string.background_activity_summary_whitelisted);
+            return;
+        }
         final int mode = mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
+                .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage);
 
         if (mode == AppOpsManager.MODE_ERRORED) {
             preference.setSummary(R.string.background_activity_summary_disabled);
@@ -142,4 +174,37 @@
                     : R.string.background_activity_summary_off);
         }
     }
+
+    interface WarningConfirmationListener {
+        void onLimitBackgroundActivity();
+    }
+
+    /**
+     * Warning dialog to show to the user as turning off background activity can lead to
+     * apps misbehaving as their background task scheduling guarantees will no longer be honored.
+     */
+    public static class WarningDialogFragment extends InstrumentedDialogFragment {
+        @Override
+        public int getMetricsCategory() {
+            // TODO (b/65494831): add metric id
+            return 0;
+        }
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            final WarningConfirmationListener listener =
+                    (WarningConfirmationListener) getTargetFragment();
+            return new AlertDialog.Builder(getContext())
+                    .setTitle(R.string.background_activity_warning_dialog_title)
+                    .setMessage(R.string.background_activity_warning_dialog_text)
+                    .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            listener.onLimitBackgroundActivity();
+                        }
+                    })
+                    .setNegativeButton(R.string.dlg_cancel, null)
+                    .create();
+        }
+    }
 }
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 34e8cc3..d66b310 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -35,7 +35,6 @@
 import android.widget.Switch;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.DimmableIconPreference;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
@@ -43,6 +42,7 @@
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.widget.SwitchBar;
 import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.RestrictedSwitchPreference;
 import com.android.settingslib.location.RecentLocationApps;
 
@@ -207,8 +207,8 @@
 
         List<Preference> recentLocationPrefs = new ArrayList<>(recentLocationRequests.size());
         for (final RecentLocationApps.Request request : recentLocationRequests) {
-            DimmableIconPreference pref = new DimmableIconPreference(getPrefContext(),
-                    request.contentDescription);
+            RestrictedPreference pref = new RestrictedPreference(getPrefContext());
+            pref.setSummary(request.contentDescription);
             pref.setIcon(request.icon);
             pref.setTitle(request.label);
             pref.setOnPreferenceClickListener(
diff --git a/src/com/android/settings/widget/ValidatedEditTextPreference.java b/src/com/android/settings/widget/ValidatedEditTextPreference.java
index 76331d4..58c62eb 100644
--- a/src/com/android/settings/widget/ValidatedEditTextPreference.java
+++ b/src/com/android/settings/widget/ValidatedEditTextPreference.java
@@ -21,8 +21,10 @@
 import android.support.annotation.VisibleForTesting;
 import android.text.Editable;
 import android.text.InputType;
+import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.View;
 import android.widget.EditText;
 
@@ -61,17 +63,18 @@
     @Override
     protected void onBindDialogView(View view) {
         super.onBindDialogView(view);
-        if (mValidator != null) {
-            final EditText editText = view.findViewById(android.R.id.edit);
-            if (editText != null) {
-                editText.removeTextChangedListener(mTextWatcher);
-                if (mIsPassword) {
-                    editText.setInputType(
-                            InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
-                    editText.setMaxLines(1);
-                }
-                editText.addTextChangedListener(mTextWatcher);
+        final EditText editText = view.findViewById(android.R.id.edit);
+        if (editText != null && !TextUtils.isEmpty(editText.getText())) {
+            editText.setSelection(editText.getText().length());
+        }
+        if (mValidator != null && editText != null) {
+            editText.removeTextChangedListener(mTextWatcher);
+            if (mIsPassword) {
+                editText.setInputType(
+                        InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+                editText.setMaxLines(1);
             }
+            editText.addTextChangedListener(mTextWatcher);
         }
     }
 
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 5a3d426..3cf7f93 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -492,7 +492,7 @@
         }
     }
 
-    /* package */ WifiConfiguration getConfig() {
+    public WifiConfiguration getConfig() {
         if (mMode == WifiConfigUiBase.MODE_VIEW) {
             return null;
         }
diff --git a/src/com/android/settings/wifi/WifiDialog.java b/src/com/android/settings/wifi/WifiDialog.java
index 81f2a14..cb3f8df 100644
--- a/src/com/android/settings/wifi/WifiDialog.java
+++ b/src/com/android/settings/wifi/WifiDialog.java
@@ -27,8 +27,7 @@
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.wifi.AccessPoint;
 
-// TODO(b/64069122) Have this extend a dialogfragment to handle the fullscreen launch case.
-class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogInterface.OnClickListener {
+public class WifiDialog extends AlertDialog implements WifiConfigUiBase, DialogInterface.OnClickListener {
 
     public interface WifiDialogListener {
         void onForget(WifiDialog dialog);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index ef6a650..f3b08bf 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -884,17 +884,20 @@
      * {@link #mConnectedAccessPointPreferenceCategory}.
      */
     private void addConnectedAccessPointPreference(AccessPoint connectedAp) {
-        String key = connectedAp.getBssid();
-        LongPressAccessPointPreference pref = (LongPressAccessPointPreference)
-                getCachedPreference(key);
-        if (pref == null) {
-            pref = createLongPressActionPointPreference(connectedAp);
-        }
+        final LongPressAccessPointPreference pref = getOrCreatePreference(connectedAp);
 
         // Save the state of the current access point in the bundle so that we can restore it
         // in the Wifi Network Details Fragment
         pref.getAccessPoint().saveWifiState(pref.getExtras());
-        pref.setFragment(WifiNetworkDetailsFragment.class.getName());
+
+        // Launch details page on click.
+        pref.setOnPreferenceClickListener(preference -> {
+            SettingsActivity activity = (SettingsActivity) WifiSettings.this.getActivity();
+            activity.startPreferencePanel(this,
+                    WifiNetworkDetailsFragment.class.getName(), pref.getExtras(),
+                    R.string.wifi_details_title, null, null, 0);
+            return true;
+        });
         pref.refresh();
 
         mConnectedAccessPointPreferenceCategory.addPreference(pref);
@@ -905,6 +908,15 @@
         }
     }
 
+    private LongPressAccessPointPreference getOrCreatePreference(AccessPoint ap) {
+        LongPressAccessPointPreference pref = (LongPressAccessPointPreference)
+                getCachedPreference(AccessPointPreference.generatePreferenceKey(ap));
+        if (pref == null) {
+            pref = createLongPressActionPointPreference(ap);
+        }
+        return pref;
+    }
+
     /** Removes all preferences and hide the {@link #mConnectedAccessPointPreferenceCategory}. */
     private void removeConnectedAccessPointPreference() {
         mConnectedAccessPointPreferenceCategory.removeAll();
diff --git a/src/com/android/settings/wifi/details/WifiDetailActionBarObserver.java b/src/com/android/settings/wifi/details/WifiDetailActionBarObserver.java
deleted file mode 100644
index 81413d2..0000000
--- a/src/com/android/settings/wifi/details/WifiDetailActionBarObserver.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi.details;
-
-import android.app.Fragment;
-import android.content.Context;
-import android.os.Bundle;
-import com.android.settings.R;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnCreate;
-
-/**
- * ActionBar lifecycle observer for {@link WifiNetworkDetailsFragment}.
- */
-public class WifiDetailActionBarObserver implements LifecycleObserver, OnCreate {
-
-    private final Fragment mFragment;
-    private final Context mContext;
-
-    public WifiDetailActionBarObserver(Context context, Fragment fragment) {
-        mContext = context;
-        mFragment = fragment;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        if (mFragment.getActivity() != null) {
-            mFragment.getActivity().getActionBar()
-                    .setTitle(mContext.getString(R.string.wifi_details_title));
-        }
-    }
-}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 0996416..014fb0f 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -21,6 +21,7 @@
 
 import static com.android.settings.wifi.WifiSettings.isEditabilityLockedDown;
 
+import android.app.Activity;
 import android.app.Fragment;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -48,7 +49,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.ImageView;
-
+import android.widget.Toast;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -60,13 +61,14 @@
 import com.android.settings.widget.ActionButtonPreference;
 import com.android.settings.widget.EntityHeaderController;
 import com.android.settings.wifi.WifiDetailPreference;
+import com.android.settings.wifi.WifiDialog;
+import com.android.settings.wifi.WifiDialog.WifiDialogListener;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 import com.android.settingslib.wifi.AccessPoint;
-
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -79,7 +81,9 @@
  * {@link WifiNetworkDetailsFragment}.
  */
 public class WifiDetailPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnResume {
+        implements PreferenceControllerMixin, WifiDialogListener, LifecycleObserver, OnPause,
+        OnResume {
+
     private static final String TAG = "WifiDetailsPrefCtrl";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
@@ -121,7 +125,7 @@
     private NetworkCapabilities mNetworkCapabilities;
     private int mRssiSignalLevel = -1;
     private String[] mSignalStr;
-    private final WifiConfiguration mWifiConfig;
+    private WifiConfiguration mWifiConfig;
     private WifiInfo mWifiInfo;
     private final WifiManager mWifiManager;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
@@ -147,9 +151,21 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             switch (intent.getAction()) {
+                case WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION:
+                    if (!intent.getBooleanExtra(WifiManager.EXTRA_MULTIPLE_NETWORKS_CHANGED,
+                        false /* defaultValue */)) {
+                        // only one network changed
+                        WifiConfiguration wifiConfiguration = intent
+                            .getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
+                        if (mAccessPoint.matches(wifiConfiguration)) {
+                            mWifiConfig = wifiConfiguration;
+                        }
+                    }
+                    // fall through
                 case WifiManager.NETWORK_STATE_CHANGED_ACTION:
                 case WifiManager.RSSI_CHANGED_ACTION:
                     updateInfo();
+                    break;
             }
         }
     };
@@ -239,6 +255,8 @@
         mFilter = new IntentFilter();
         mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
         mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+
         lifecycle.addObserver(this);
     }
 
@@ -334,7 +352,7 @@
             return;
         }
 
-        // Update whether the forgot button should be displayed.
+        // Update whether the forget button should be displayed.
         mButtonsPref.setButton1Visible(canForgetNetwork());
 
         refreshNetworkState();
@@ -520,6 +538,32 @@
         mConnectivityManagerWrapper.startCaptivePortalApp(mNetwork);
     }
 
+    @Override
+    public void onForget(WifiDialog dialog) {
+        // can't forget network from a 'modify' dialog
+    }
+
+    @Override
+    public void onSubmit(WifiDialog dialog) {
+        if (dialog.getController() != null) {
+            mWifiManager.save(dialog.getController().getConfig(), new WifiManager.ActionListener() {
+                @Override
+                public void onSuccess() {
+                }
+
+                @Override
+                public void onFailure(int reason) {
+                    Activity activity = mFragment.getActivity();
+                    if (activity != null) {
+                        Toast.makeText(activity,
+                                R.string.wifi_failed_save_message,
+                                Toast.LENGTH_SHORT).show();
+                    }
+                }
+            });
+        }
+    }
+
     /**
      * Wrapper for testing compatibility.
      */
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index 4918889..765bebc 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -15,17 +15,25 @@
  */
 package com.android.settings.wifi.details;
 
+import static com.android.settings.wifi.WifiSettings.WIFI_DIALOG_ID;
+
+import android.app.Dialog;
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
-import com.android.settings.wifi.WifiDetailPreference;
+import com.android.settings.wifi.WifiConfigUiBase;
+import com.android.settings.wifi.WifiDialog;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.wifi.AccessPoint;
 import java.util.ArrayList;
@@ -44,13 +52,9 @@
 
     private AccessPoint mAccessPoint;
     private WifiDetailPreferenceController mWifiDetailPreferenceController;
-    private WifiDetailActionBarObserver mWifiDetailActionBarObserver;
 
     @Override
     public void onAttach(Context context) {
-        mWifiDetailActionBarObserver = new WifiDetailActionBarObserver(context, this);
-        getLifecycle().addObserver(mWifiDetailActionBarObserver);
-
         mAccessPoint = new AccessPoint(context, getArguments());
         super.onAttach(context);
     }
@@ -71,6 +75,44 @@
     }
 
     @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        if (dialogId == WIFI_DIALOG_ID) {
+            return MetricsEvent.DIALOG_WIFI_AP_EDIT;
+        }
+        return 0;
+    }
+
+    @Override
+    public Dialog onCreateDialog(int dialogId) {
+        if (getActivity() == null || mWifiDetailPreferenceController == null
+                || mAccessPoint == null) {
+            return null;
+        }
+        return WifiDialog.createModal(getActivity(), mWifiDetailPreferenceController, mAccessPoint,
+                WifiConfigUiBase.MODE_MODIFY);
+    }
+
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify);
+        item.setIcon(R.drawable.ic_mode_edit);
+        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+        super.onCreateOptionsMenu(menu, inflater);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem menuItem) {
+        switch (menuItem.getItemId()) {
+            case Menu.FIRST:
+                showDialog(WIFI_DIALOG_ID);
+                return true;
+            default:
+                return super.onOptionsItemSelected(menuItem);
+        }
+    }
+
+    @Override
     protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
         ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
         mWifiDetailPreferenceController = WifiDetailPreferenceController.newInstance(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
index 91f4a2b..86836f9 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
@@ -16,14 +16,25 @@
 
 package com.android.settings.fuelgauge;
 
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.AlertDialog;
 import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.UserManager;
 import android.support.v14.preference.SwitchPreference;
+import android.widget.Button;
 
 import com.android.settings.R;
 import com.android.settings.TestConfig;
@@ -38,22 +49,17 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
-
-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 org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowDialog;
+import org.robolectric.util.FragmentTestUtil;
 
 @RunWith(RobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class BackgroundActivityPreferenceControllerTest {
-    private static final int UID_NORMAL = 1234;
-    private static final int UID_SPECIAL = 2345;
+    private static final int UID_LOW_SDK = 1234;
+    private static final int UID_HIGH_SDK = 3456;
     private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
     private static final String LOW_SDK_PACKAGE = "com.android.package.low";
-    private static final String[] PACKAGES_NORMAL = {LOW_SDK_PACKAGE};
-    private static final String[] PACKAGES_SPECIAL = {HIGH_SDK_PACKAGE, LOW_SDK_PACKAGE};
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
@@ -71,6 +77,10 @@
     private DevicePolicyManager mDevicePolicyManager;
     @Mock
     private DevicePolicyManagerWrapper mDevicePolicyManagerWrapper;
+    @Mock
+    private AdvancedPowerUsageDetail mFragment;
+    @Mock
+    private PowerWhitelistBackend mPowerWhitelistBackend;
     private BackgroundActivityPreferenceController mController;
     private SwitchPreference mPreference;
     private Context mShadowContext;
@@ -85,19 +95,19 @@
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(
                 mDevicePolicyManager);
-        when(mPackageManager.getPackagesForUid(UID_NORMAL)).thenReturn(PACKAGES_NORMAL);
-        when(mPackageManager.getPackagesForUid(UID_SPECIAL)).thenReturn(PACKAGES_SPECIAL);
 
         when(mPackageManager.getApplicationInfo(HIGH_SDK_PACKAGE, PackageManager.GET_META_DATA))
                 .thenReturn(mHighApplicationInfo);
         when(mPackageManager.getApplicationInfo(LOW_SDK_PACKAGE, PackageManager.GET_META_DATA))
                 .thenReturn(mLowApplicationInfo);
+
+        when(mPowerWhitelistBackend.isWhitelisted(LOW_SDK_PACKAGE)).thenReturn(false);
         mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
         mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
 
         mPreference = new SwitchPreference(mShadowContext);
-        mController = spy(new BackgroundActivityPreferenceController(mContext, UID_NORMAL));
-        mController.isAvailable();
+        mController = spy(new BackgroundActivityPreferenceController(
+                mContext, mFragment, UID_LOW_SDK, LOW_SDK_PACKAGE, mPowerWhitelistBackend));
         mController.mDpm = mDevicePolicyManagerWrapper;
     }
 
@@ -105,49 +115,66 @@
     public void testOnPreferenceChange_TurnOnCheck_MethodInvoked() {
         mController.onPreferenceChange(mPreference, true);
 
-        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL,
-                mController.getTargetPackage(), AppOpsManager.MODE_ALLOWED);
-        verify(mController).updateSummary(mPreference);
+        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_LOW_SDK,
+                LOW_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+                LOW_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on));
     }
 
     @Test
-    public void testOnPreferenceChange_TurnOffCheck_MethodInvoked() {
-        mController.onPreferenceChange(mPreference, false);
-
-        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL,
-                mController.getTargetPackage(), AppOpsManager.MODE_IGNORED);
-        verify(mController).updateSummary(mPreference);
+    public void testOnPreferenceChange_TurnOnCheckHighSDK_MethodInvoked() {
+        mController = new BackgroundActivityPreferenceController(mContext, mFragment, UID_HIGH_SDK,
+                HIGH_SDK_PACKAGE, mPowerWhitelistBackend);
+        mController.onPreferenceChange(mPreference, true);
+        verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_HIGH_SDK,
+                HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+        verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_HIGH_SDK,
+                HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
+        assertThat(mPreference.getSummary())
+                .isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on));
     }
 
     @Test
     public void testUpdateState_CheckOn_SetCheckedTrue() {
-        when(mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
-                .thenReturn(AppOpsManager.MODE_DEFAULT);
+        when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+                LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_ALLOWED);
 
         mController.updateState(mPreference);
 
         assertThat(mPreference.isChecked()).isTrue();
+        assertThat(mPreference.isEnabled()).isTrue();
         verify(mController).updateSummary(mPreference);
     }
 
     @Test
     public void testUpdateState_CheckOff_SetCheckedFalse() {
-        when(mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
-                .thenReturn(AppOpsManager.MODE_IGNORED);
+        when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+                LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
 
         mController.updateState(mPreference);
 
         assertThat(mPreference.isChecked()).isFalse();
+        assertThat(mPreference.isEnabled()).isTrue();
         verify(mController).updateSummary(mPreference);
     }
 
     @Test
+    public void testUpdateState_whitelisted() {
+        when(mPowerWhitelistBackend.isWhitelisted(LOW_SDK_PACKAGE)).thenReturn(true);
+        mController.updateState(mPreference);
+        assertThat(mPreference.isChecked()).isTrue();
+        assertThat(mPreference.isEnabled()).isFalse();
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mShadowContext.getText(R.string.background_activity_summary_whitelisted));
+    }
+
+    @Test
     public void testUpdateSummary_modeError_showSummaryDisabled() {
-        when(mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
-                .thenReturn(AppOpsManager.MODE_ERRORED);
+        when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+                LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_ERRORED);
         final CharSequence expectedSummary = mShadowContext.getText(
                 R.string.background_activity_summary_disabled);
         mController.updateSummary(mPreference);
@@ -157,9 +184,8 @@
 
     @Test
     public void testUpdateSummary_modeDefault_showSummaryOn() {
-        when(mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
-                .thenReturn(AppOpsManager.MODE_DEFAULT);
+        when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+                LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_DEFAULT);
         final CharSequence expectedSummary = mShadowContext.getText(
                 R.string.background_activity_summary_on);
 
@@ -170,9 +196,8 @@
 
     @Test
     public void testUpdateSummary_modeIgnored_showSummaryOff() {
-        when(mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_NORMAL, LOW_SDK_PACKAGE))
-                .thenReturn(AppOpsManager.MODE_IGNORED);
+        when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
+                LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED);
         final CharSequence expectedSummary = mShadowContext.getText(
                 R.string.background_activity_summary_off);
 
@@ -182,31 +207,30 @@
     }
 
     @Test
-    public void testIsPackageAvailable_SdkLowerThanO_ReturnTrue() {
+    public void testIsLegacyApp_SdkLowerThanO_ReturnTrue() {
         assertThat(mController.isLegacyApp(LOW_SDK_PACKAGE)).isTrue();
     }
 
     @Test
-    public void testIsPackageAvailable_SdkLargerOrEqualThanO_ReturnFalse() {
+    public void testIsLegacyApp_SdkLargerOrEqualThanO_ReturnFalse() {
         assertThat(mController.isLegacyApp(HIGH_SDK_PACKAGE)).isFalse();
     }
 
     @Test
-    public void testMultiplePackages_ReturnStatusForTargetPackage() {
-        mController = new BackgroundActivityPreferenceController(mContext, UID_SPECIAL);
-        mController.mDpm = mDevicePolicyManagerWrapper;
-        when(mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_SPECIAL, LOW_SDK_PACKAGE))
-                .thenReturn(AppOpsManager.MODE_ALLOWED);
-        when(mAppOpsManager
-                .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_SPECIAL, HIGH_SDK_PACKAGE))
-                .thenReturn(AppOpsManager.MODE_IGNORED);
+    public void testIsAvailable_ReturnTrue() {
+        assertThat(mController.isAvailable()).isTrue();
+    }
 
-        final boolean available = mController.isAvailable();
-        mController.updateState(mPreference);
-
-        assertThat(available).isTrue();
-        // Should get status from LOW_SDK_PACKAGE
-        assertThat(mPreference.isChecked()).isTrue();
+    @Test
+    public void testWarningDialog() {
+        BackgroundActivityPreferenceController.WarningDialogFragment dialogFragment =
+                new BackgroundActivityPreferenceController.WarningDialogFragment();
+        dialogFragment.setTargetFragment(mFragment, 0);
+        FragmentTestUtil.startFragment(dialogFragment);
+        final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+        ShadowAlertDialog shadowDialog = shadowOf(dialog);
+        final Button okButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
+        shadowDialog.clickOn(okButton.getId());
+        verify(mFragment).onLimitBackgroundActivity();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
index 88a5147..e061787 100644
--- a/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
@@ -35,9 +35,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -58,10 +59,36 @@
     }
 
     @Test
-    public void bindDialogView_noTextWatcher_shouldDoNothing() {
+    public void bindDialogView_nullEditText_shouldNotCrash() {
+        when(mView.findViewById(android.R.id.edit)).thenReturn(null);
+        // should not crash trying to get the EditText text
+        mPreference.onBindDialogView(mView);
+    }
+
+    @Test
+    public void bindDialogView_emptyEditText_shouldNotSetSelection() {
+        final String testText = "";
+        final EditText editText = spy(new EditText(RuntimeEnvironment.application));
+        editText.setText(testText);
+        when(mView.findViewById(android.R.id.edit)).thenReturn(editText);
+
         mPreference.onBindDialogView(mView);
 
-        verifyZeroInteractions(mView);
+        // no need to setSelection if text was empty
+        verify(editText, never()).setSelection(anyInt());
+    }
+
+    @Test
+    public void bindDialogView_nonemptyEditText_shouldSetSelection() {
+        final String testText = "whatever";
+        final EditText editText = spy(new EditText(RuntimeEnvironment.application));
+        editText.setText(testText);
+        when(mView.findViewById(android.R.id.edit)).thenReturn(editText);
+
+        mPreference.onBindDialogView(mView);
+
+        // selection should be set to end of string
+        verify(editText).setSelection(testText.length());
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailActionBarObserverTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailActionBarObserverTest.java
deleted file mode 100644
index c573d3c..0000000
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailActionBarObserverTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi.details;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.ActionBar;
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class WifiDetailActionBarObserverTest {
-
-    @Mock private Bundle mockBundle;
-    @Mock private Activity mockActivity;
-    @Mock private ActionBar mockActionBar;
-    @Mock private WifiNetworkDetailsFragment mockFragment;
-
-    private Context mContext = RuntimeEnvironment.application;
-    private Lifecycle mLifecycle;
-    private WifiDetailActionBarObserver mObserver;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mLifecycle = new Lifecycle();
-
-        when(mockFragment.getActivity()).thenReturn(mockActivity);
-        when(mockActivity.getActionBar()).thenReturn(mockActionBar);
-
-        mObserver = new WifiDetailActionBarObserver(mContext, mockFragment);
-        mLifecycle.addObserver(mObserver);
-    }
-
-    @Test
-    public void actionBarIsSetToNetworkInfo() {
-        mLifecycle.onCreate(mockBundle);
-
-        verify(mockActionBar).setTitle(mContext.getString(R.string.wifi_details_title));
-    }
-}
