diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 5f39738..be7a0ca 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -284,17 +284,27 @@
 
    <!-- Wi-Fi AP band settings.  Either Auto, 2.4GHz or 5GHz. -->
    <!-- Note that adding/removing/moving the items will need wifi settings code change. -->
-    <string-array name="wifi_ap_band_config_full">
+    <string-array translatable="false" name="wifi_ap_band_config_full">
+        <item>0</item>
+        <item>1</item>
+    </string-array>
+
+    <string-array translatable="false" name="wifi_ap_band_summary_full">
         <item>@string/wifi_ap_choose_2G</item>
         <item>@string/wifi_ap_choose_5G</item>
     </string-array>
 
-    <string-array name="wifi_ap_band_summary_full">
-        <item>@string/wifi_ap_2G</item>
-        <item>@string/wifi_ap_5G</item>
+    <string-array translatable="false" name="wifi_ap_band_dual_mode">
+        <item>0</item>
+        <item>-1</item>
     </string-array>
 
-    <string-array name="wifi_ap_band_config_2G_only">
+    <string-array translatable="false" name="wifi_ap_band_dual_mode_summary">
+        <item>@string/wifi_ap_choose_2G</item>
+        <item>@string/wifi_ap_prefer_5G</item>
+    </string-array>
+
+    <string-array translatable="false" name="wifi_ap_band_config_2G_only">
         <item>@string/wifi_ap_choose_auto</item>
         <item>@string/wifi_ap_choose_2G</item>
     </string-array>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1f06276..57448f5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1986,8 +1986,10 @@
     <string name="wifi_ap_choose_auto">Auto</string>
     <!-- Label for the radio button to choose wifi ap 2.4 GHz band -->
     <string name="wifi_ap_choose_2G">2.4 GHz Band</string>
-    <!-- Label for the radio button to choose wifi ap 5GHz band -->
+    <!-- Label for the radio button to only choose wifi ap 5GHz band -->
     <string name="wifi_ap_choose_5G">5.0 GHz Band</string>
+    <!-- Label for the radio button to prefer 5GHz wifi ap band  [CHAR LIMIT=80]-->
+    <string name="wifi_ap_prefer_5G">5.0 GHz Band preferred</string>
     <!-- Label for adding to the list of selected bands when 2.4 GHz is selected -->
     <string name="wifi_ap_2G">2.4 GHz</string>
     <!-- Label for adding to the list of selected bands when 5.0 GHz is selected -->
@@ -7417,7 +7419,7 @@
     <!-- Do not disturb settings, messages, events and reminders title [CHAR LIMIT=100]-->
     <string name="zen_msg_event_reminder_title">Messages, events &amp; reminders</string>
     <!-- Do not disturb settings, messages, events and reminders footer [CHAR LIMIT=NONE]-->
-    <string name="zen_msg_event_reminder_footer">When Do Not Disturb is on, messages, reminders, and events will muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you.</string>
+    <string name="zen_msg_event_reminder_footer">When Do Not Disturb is on, messages, reminders, and events will be muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you.</string>
 
     <!-- Do not disturb onboarding dialog, accept new settings [CHAR LIMIT=30]-->
     <string name="zen_onboarding_ok">Done</string>
@@ -9922,6 +9924,9 @@
     <!-- Help URI, smart battery page [DO NOT TRANSLATE] -->
     <string name="help_uri_smart_battery_settings" translatable="false"></string>
 
+    <!-- Help URI, prevent ringing gesture [DO NOT TRANSLATE] -->
+    <string name="help_uri_prevent_ringing_gesture" translatable="false"></string>
+
     <!-- Title label for dnd suggestion, which is displayed in Settings homepage [CHAR LIMIT=100] -->
     <string name="zen_suggestion_title">Update Do Not Disturb</string>
 
diff --git a/res/xml/wifi_tether_settings.xml b/res/xml/wifi_tether_settings.xml
index a609621..525870e 100644
--- a/res/xml/wifi_tether_settings.xml
+++ b/res/xml/wifi_tether_settings.xml
@@ -43,11 +43,7 @@
         android:title="@string/wifi_hotspot_auto_off_title"
         android:summary="@string/wifi_hotspot_auto_off_summary" />
 
-    <com.android.settings.widget.HotspotApBandSelectionPreference
+    <ListPreference
         android:key="wifi_tether_network_ap_band"
-        android:title="@string/wifi_hotspot_ap_band_title"
-        android:dialogLayout="@layout/hotspot_ap_band_selection_dialog"
-        android:dialogTitle="@string/wifi_hotspot_ap_band_title"
-        android:negativeButtonText="@string/cancel"
-        android:positiveButtonText="@string/apply" />
+        android:title="@string/wifi_hotspot_ap_band_title" />
 </PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/gestures/PreventRingingGestureSettings.java b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
index 09570df..241e5c0 100644
--- a/src/com/android/settings/gestures/PreventRingingGestureSettings.java
+++ b/src/com/android/settings/gestures/PreventRingingGestureSettings.java
@@ -58,7 +58,7 @@
 
     @Override
     public int getHelpResource() {
-        return 0;
+        return R.string.help_uri_prevent_ringing_gesture;
     }
 
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/search/DeviceIndexFeatureProvider.java b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
index c4d3abf..e6b3e93 100644
--- a/src/com/android/settings/search/DeviceIndexFeatureProvider.java
+++ b/src/com/android/settings/search/DeviceIndexFeatureProvider.java
@@ -21,7 +21,10 @@
 import android.app.job.JobScheduler;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
 import android.net.Uri;
+import android.os.Binder;
 import android.os.Build;
 import android.provider.Settings;
 import android.text.TextUtils;
@@ -36,7 +39,6 @@
 
 public interface DeviceIndexFeatureProvider {
 
-
     String TAG = "DeviceIndex";
 
     String INDEX_VERSION = "settings:index_version";
@@ -57,7 +59,7 @@
 
     default void updateIndex(Context context, boolean force) {
         if (!isIndexingEnabled()) {
-            Log.w(TAG, "Skipping: device index is not enabled");
+            Log.i(TAG, "Skipping: device index is not enabled");
             return;
         }
 
@@ -66,7 +68,29 @@
             return;
         }
 
+        final ComponentName jobComponent = new ComponentName(context.getPackageName(),
+                DeviceIndexUpdateJobService.class.getName());
+
+        try {
+            final int callerUid = Binder.getCallingUid();
+            final ServiceInfo si = context.getPackageManager().getServiceInfo(jobComponent,
+                    PackageManager.MATCH_DIRECT_BOOT_AWARE
+                            | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
+            if (si == null) {
+                Log.w(TAG, "Skipping: No such service " + jobComponent);
+                return;
+            }
+            if (si.applicationInfo.uid != callerUid) {
+                Log.w(TAG, "Skipping: Uid cannot schedule DeviceIndexUpdate: " + callerUid);
+                return;
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.w(TAG, "Skipping: error finding DeviceIndexUpdateJobService from packageManager");
+            return;
+        }
+
         if (!force && skipIndex(context)) {
+            Log.i(TAG, "Skipping: already indexed.");
             // No need to update.
             return;
         }
@@ -74,8 +98,6 @@
         // Prevent scheduling multiple jobs
         setIndexState(context);
 
-        final ComponentName jobComponent = new ComponentName(context.getPackageName(),
-                DeviceIndexUpdateJobService.class.getName());
         final int jobId = context.getResources().getInteger(R.integer.device_index_update);
         // Schedule a job so that we know it'll be able to complete, but try to run as
         // soon as possible.
diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java
index 6723660..11caf45 100644
--- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java
+++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java
@@ -170,12 +170,20 @@
 
     @Override
     public void onStart() {
+        if (mLocalBluetoothManager == null) {
+            Log.e(TAG, "Bluetooth is not supported on this device");
+            return;
+        }
         mLocalBluetoothManager.setForegroundActivity(mContext);
         register();
     }
 
     @Override
     public void onStop() {
+        if (mLocalBluetoothManager == null) {
+            Log.e(TAG, "Bluetooth is not supported on this device");
+            return;
+        }
         mLocalBluetoothManager.setForegroundActivity(null);
         unregister();
     }
diff --git a/src/com/android/settings/widget/HotspotApBandSelectionPreference.java b/src/com/android/settings/widget/HotspotApBandSelectionPreference.java
deleted file mode 100644
index 0a2405e..0000000
--- a/src/com/android/settings/widget/HotspotApBandSelectionPreference.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.widget;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.net.wifi.WifiConfiguration;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.VisibleForTesting;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.LinearLayout;
-
-import com.android.settings.R;
-import com.android.settingslib.CustomDialogPreference;
-
-import java.util.ArrayList;
-
-public class HotspotApBandSelectionPreference extends CustomDialogPreference implements
-        CompoundButton.OnCheckedChangeListener, DialogInterface.OnShowListener {
-    private static final int UNSET = Integer.MIN_VALUE;
-
-    @VisibleForTesting
-    static final String KEY_CHECKED_BANDS = "checked_bands";
-    @VisibleForTesting
-    static final String KEY_HOTSPOT_SUPER_STATE = "hotspot_super_state";
-
-    @VisibleForTesting
-    CheckBox mBox2G;
-    @VisibleForTesting
-    CheckBox mBox5G;
-    @VisibleForTesting
-    ArrayList<Integer> mRestoredBands;
-    @VisibleForTesting
-    boolean mShouldRestore;
-
-    private String[] mBandEntries;
-    private int mExistingConfigValue = UNSET;
-
-    public HotspotApBandSelectionPreference(Context context) {
-        super(context);
-    }
-
-    public HotspotApBandSelectionPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public HotspotApBandSelectionPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-    }
-
-    public HotspotApBandSelectionPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        SavedState myState = (SavedState) state;
-
-        super.onRestoreInstanceState(myState.getSuperState());
-
-        mShouldRestore = myState.shouldRestore;
-        if (mShouldRestore) {
-            mRestoredBands = new ArrayList<>();
-            if (myState.enabled2G) {
-                mRestoredBands.add(WifiConfiguration.AP_BAND_2GHZ);
-            }
-            if (myState.enabled5G) {
-                mRestoredBands.add(WifiConfiguration.AP_BAND_5GHZ);
-            }
-        } else {
-            mRestoredBands = null;
-        }
-        updatePositiveButton();
-    }
-
-    @Override
-    protected void onBindDialogView(View view) {
-        super.onBindDialogView(view);
-        final Context context = getContext();
-
-        // Register so we can adjust the buttons if needed once the dialog is available.
-        setOnShowListener(this);
-
-        mBandEntries = context.getResources().getStringArray(R.array.wifi_ap_band_config_full);
-        // add a checkbox for every band entry.
-        addApBandViews((LinearLayout) view);
-        // try to update the button just in case we already missed the onShow call.
-        updatePositiveButton();
-        // clear any saved state so it doesn't leak across multiple rotations/dialog closings
-        mRestoredBands = null;
-        mShouldRestore = false;
-    }
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        final Parcelable superState = super.onSaveInstanceState();
-
-        SavedState myState = new SavedState(superState);
-        myState.shouldRestore = getDialog() != null;
-        myState.enabled2G = mBox2G != null && mBox2G.isChecked();
-        myState.enabled5G = mBox5G != null && mBox5G.isChecked();
-        return myState;
-    }
-
-    @Override
-    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-        if (!(buttonView instanceof CheckBox)) {
-            return;
-        }
-        updatePositiveButton();
-    }
-
-    @Override
-    protected void onClick(DialogInterface dialog, int which) {
-        // we only want to persist our enabled bands if apply is clicked
-        if (which == DialogInterface.BUTTON_POSITIVE) {
-            if (mBox2G.isChecked() || mBox5G.isChecked()) {
-                int wifiBand = getWifiBand();
-                mExistingConfigValue = wifiBand;
-                callChangeListener(wifiBand);
-            }
-        }
-    }
-
-    /**
-     * Used to set the band selection for the preference if one already exists
-     * @param band the band to set it to from {@link WifiConfiguration}
-     */
-    public void setExistingConfigValue(int band) {
-        mExistingConfigValue = band;
-    }
-
-    private void addApBandViews(LinearLayout view) {
-        mBox2G = view.findViewById(R.id.box_2g);
-        mBox2G.setText(mBandEntries[WifiConfiguration.AP_BAND_2GHZ]);
-        mBox2G.setChecked(restoreBandIfNeeded(WifiConfiguration.AP_BAND_2GHZ));
-        mBox2G.setOnCheckedChangeListener(this);
-
-        mBox5G = view.findViewById(R.id.box_5g);
-        mBox5G.setText(mBandEntries[WifiConfiguration.AP_BAND_5GHZ]);
-        mBox5G.setChecked(restoreBandIfNeeded(WifiConfiguration.AP_BAND_5GHZ));
-        mBox5G.setOnCheckedChangeListener(this);
-    }
-
-    private boolean restoreBandIfNeeded(int band) {
-        // Only use the provided config if we aren't restoring, restore if state available
-        return (isBandPreviouslySelected(band) && !mShouldRestore)
-                || (mShouldRestore && mRestoredBands.contains(band));
-    }
-
-    private void updatePositiveButton() {
-        AlertDialog dialog = (AlertDialog) getDialog();
-        Button button = dialog == null ? null : dialog.getButton(DialogInterface.BUTTON_POSITIVE);
-        if (button != null && mBox5G != null && mBox2G != null) {
-            button.setEnabled(mBox2G.isChecked() || mBox5G.isChecked());
-        }
-    }
-
-    @VisibleForTesting
-    int getWifiBand() {
-        final boolean checked_2g = mBox2G.isChecked();
-        final boolean checked_5g = mBox5G.isChecked();
-        if (checked_2g && checked_5g) {
-            return WifiConfiguration.AP_BAND_ANY;
-        } else if (checked_2g && !checked_5g) {
-            return WifiConfiguration.AP_BAND_2GHZ;
-        } else if (checked_5g && !checked_2g) {
-            return WifiConfiguration.AP_BAND_5GHZ;
-        } else {
-            throw new IllegalStateException("Wifi Config only supports selecting one or all bands");
-        }
-    }
-
-    private boolean isBandPreviouslySelected(int bandIndex) {
-        switch(mExistingConfigValue) {
-            case WifiConfiguration.AP_BAND_ANY:
-                return true;
-            case WifiConfiguration.AP_BAND_2GHZ:
-                return bandIndex == 0;
-            case WifiConfiguration.AP_BAND_5GHZ:
-                return bandIndex == 1;
-            case UNSET:
-            default:
-                return false;
-        }
-    }
-
-    @Override
-    public void onShow(DialogInterface dialog) {
-        updatePositiveButton();
-    }
-
-    private static class SavedState extends BaseSavedState {
-        boolean shouldRestore;
-        boolean enabled2G;
-        boolean enabled5G;
-
-        public SavedState(Parcelable source) {
-            super(source);
-        }
-
-        private SavedState(Parcel in) {
-            super(in);
-            shouldRestore =  in.readByte() == 1;
-            enabled2G = in.readByte() == 1;
-            enabled5G = in.readByte() == 1;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-            dest.writeByte((byte) (shouldRestore ? 1 : 0));
-            dest.writeByte((byte) (enabled2G ? 1: 0));
-            dest.writeByte((byte) (enabled5G ? 1 : 0));
-        }
-
-        @Override
-        public String toString() {
-            return "HotspotApBandSelectionPreference.SavedState{"
-                    + Integer.toHexString(System.identityHashCode(this))
-                    + " shouldRestore=" + shouldRestore
-                    + " enabled2G=" + enabled2G
-                    + " enabled5G=" + enabled5G + "}";
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR
-                = new Parcelable.Creator<SavedState>() {
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in);
-            }
-
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
index b107777..2624c73 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
@@ -16,36 +16,31 @@
 
 package com.android.settings.wifi.tether;
 
-import static android.net.wifi.WifiConfiguration.AP_BAND_2GHZ;
-import static android.net.wifi.WifiConfiguration.AP_BAND_5GHZ;
-
 import android.content.Context;
 import android.content.res.Resources;
-import android.icu.text.ListFormatter;
 import android.net.wifi.WifiConfiguration;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
 import android.util.Log;
 
 import com.android.settings.R;
-import com.android.settings.widget.HotspotApBandSelectionPreference;
 
 public class WifiTetherApBandPreferenceController extends WifiTetherBasePreferenceController {
 
     private static final String TAG = "WifiTetherApBandPref";
     private static final String PREF_KEY = "wifi_tether_network_ap_band";
-    public static final String[] BAND_VALUES =
-            {String.valueOf(AP_BAND_2GHZ), String.valueOf(AP_BAND_5GHZ)};
 
-    private final String[] mBandEntries;
-    private final String[] mBandSummaries;
+    private String[] mBandEntries;
+    private String[] mBandSummaries;
     private int mBandIndex;
+    private boolean isDualMode;
 
     public WifiTetherApBandPreferenceController(Context context,
             OnTetherConfigUpdateListener listener) {
         super(context, listener);
-        Resources res = mContext.getResources();
-        mBandEntries = res.getStringArray(R.array.wifi_ap_band_config_full);
-        mBandSummaries = res.getStringArray(R.array.wifi_ap_band_summary_full);
+        isDualMode = mWifiManager.isDualModeSupported();
+        updatePreferenceEntries();
     }
 
     @Override
@@ -55,7 +50,7 @@
             mBandIndex = 0;
             Log.d(TAG, "Updating band index to 0 because no config");
         } else if (is5GhzBandSupported()) {
-            mBandIndex = config.apBand;
+            mBandIndex = validateSelection(config.apBand);
             Log.d(TAG, "Updating band index to " + mBandIndex);
         } else {
             config.apBand = 0;
@@ -63,21 +58,23 @@
             mBandIndex = config.apBand;
             Log.d(TAG, "5Ghz not supported, updating band index to " + mBandIndex);
         }
-        HotspotApBandSelectionPreference preference =
-                (HotspotApBandSelectionPreference) mPreference;
+        ListPreference preference =
+                (ListPreference) mPreference;
+        preference.setEntries(mBandSummaries);
+        preference.setEntryValues(mBandEntries);
 
         if (!is5GhzBandSupported()) {
             preference.setEnabled(false);
             preference.setSummary(R.string.wifi_ap_choose_2G);
         } else {
-            preference.setExistingConfigValue(config.apBand);
+            preference.setValue(Integer.toString(config.apBand));
             preference.setSummary(getConfigSummary());
         }
     }
 
     String getConfigSummary() {
         if (mBandIndex == WifiConfiguration.AP_BAND_ANY) {
-            return ListFormatter.getInstance().format((Object[]) mBandSummaries);
+           return mContext.getString(R.string.wifi_ap_prefer_5G);
         }
         return mBandSummaries[mBandIndex];
     }
@@ -89,13 +86,46 @@
 
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
-        mBandIndex = (Integer) newValue;
+        mBandIndex = validateSelection(Integer.parseInt((String) newValue));
         Log.d(TAG, "Band preference changed, updating band index to " + mBandIndex);
         preference.setSummary(getConfigSummary());
         mListener.onTetherConfigUpdated();
         return true;
     }
 
+    private int validateSelection(int band) {
+        // Reset the band to 2.4 GHz if we get a weird config back to avoid a crash.
+        final boolean isDualMode = mWifiManager.isDualModeSupported();
+
+        // unsupported states:
+        // 1: no dual mode means we can't have AP_BAND_ANY - default to 5GHZ
+        // 2: no 5 GHZ support means we can't have AP_BAND_5GHZ - default to 2GHZ
+        // 3: With Dual mode support we can't have AP_BAND_5GHZ - default to ANY
+        if (!isDualMode && WifiConfiguration.AP_BAND_ANY == band) {
+            return WifiConfiguration.AP_BAND_5GHZ;
+        } else if (!mWifiManager.is5GHzBandSupported() && WifiConfiguration.AP_BAND_5GHZ == band) {
+            return WifiConfiguration.AP_BAND_2GHZ;
+        } else if (isDualMode && WifiConfiguration.AP_BAND_5GHZ == band) {
+            return WifiConfiguration.AP_BAND_ANY;
+        }
+
+        return band;
+    }
+
+    @VisibleForTesting
+    void updatePreferenceEntries() {
+        Resources res = mContext.getResources();
+        int entriesRes = R.array.wifi_ap_band_config_full;
+        int summariesRes = R.array.wifi_ap_band_summary_full;
+        // change the list options if this is a dual mode device
+        if (isDualMode) {
+            entriesRes = R.array.wifi_ap_band_dual_mode;
+            summariesRes = R.array.wifi_ap_band_dual_mode_summary;
+        }
+        mBandEntries = res.getStringArray(entriesRes);
+        mBandSummaries = res.getStringArray(summariesRes);
+    }
+
     private boolean is5GhzBandSupported() {
         final String countryCode = mWifiManager.getCountryCode();
         if (!mWifiManager.isDualBandSupported() || countryCode == null) {
diff --git a/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java b/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java
index ebba3f3..b49ef1d 100644
--- a/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/DeviceIndexFeatureProviderTest.java
@@ -15,7 +15,6 @@
 package com.android.settings.search;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -23,27 +22,42 @@
 
 import android.app.Activity;
 import android.app.job.JobScheduler;
+import android.os.Binder;
 import android.provider.Settings;
 
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
+import org.robolectric.shadows.ShadowBinder;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 public class DeviceIndexFeatureProviderTest {
 
+    @Mock
+    private JobScheduler mJobScheduler;
     private DeviceIndexFeatureProvider mProvider;
     private Activity mActivity;
 
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowBinder.reset();
         FakeFeatureFactory.setupForTest();
         mActivity = spy(Robolectric.buildActivity(Activity.class).create().visible().get());
         mProvider = spy(new DeviceIndexFeatureProviderImpl());
+        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(mJobScheduler);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowBinder.reset();
     }
 
     @Test
@@ -51,7 +65,7 @@
         when(mProvider.isIndexingEnabled()).thenReturn(false);
 
         mProvider.updateIndex(mActivity, false);
-        verify(mProvider, never()).index(any(), any(), any(), any(), any());
+        verify(mJobScheduler, never()).schedule(any());
     }
 
     @Test
@@ -62,19 +76,17 @@
 
         mProvider.updateIndex(mActivity, false);
 
-        verify(mProvider, never()).index(any(), any(), any(), any(), any());
+        verify(mJobScheduler, never()).schedule(any());
     }
 
     @Test
     public void updateIndex_enabled_provisioned_shouldIndex() {
         Settings.Global.putInt(mActivity.getContentResolver(),
                 Settings.Global.DEVICE_PROVISIONED, 1);
-        JobScheduler jobScheduler = mock(JobScheduler.class);
         when(mProvider.isIndexingEnabled()).thenReturn(true);
-        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler);
 
         mProvider.updateIndex(mActivity, false);
-        verify(jobScheduler).schedule(any());
+        verify(mJobScheduler).schedule(any());
     }
 
     @Test
@@ -87,12 +99,22 @@
         Settings.Global.putString(mActivity.getContentResolver(),
                 DeviceIndexFeatureProvider.LANGUAGE.toString(),
                 DeviceIndexFeatureProvider.INDEX_LANGUAGE);
-        JobScheduler jobScheduler = mock(JobScheduler.class);
         when(mProvider.isIndexingEnabled()).thenReturn(true);
-        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler);
 
         mProvider.updateIndex(mActivity, false);
-        verify(jobScheduler).schedule(any());
+        verify(mJobScheduler).schedule(any());
+    }
+
+    @Test
+    public void updateIndex_enabled_provisioned_differentUid_shouldNotIndex() {
+        Settings.Global.putInt(mActivity.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
+        when(mProvider.isIndexingEnabled()).thenReturn(true);
+
+        ShadowBinder.setCallingUid(Binder.getCallingUid() + 2000);
+
+        mProvider.updateIndex(mActivity, false);
+        verify(mJobScheduler, never()).schedule(any());
     }
 
     @Test
@@ -102,12 +124,11 @@
         DeviceIndexFeatureProvider.setIndexState(mActivity);
         Settings.Global.putString(mActivity.getContentResolver(),
                 DeviceIndexFeatureProvider.INDEX_LANGUAGE, "new language");
-        JobScheduler jobScheduler = mock(JobScheduler.class);
+
         when(mProvider.isIndexingEnabled()).thenReturn(true);
-        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler);
 
         mProvider.updateIndex(mActivity, false);
-        verify(jobScheduler).schedule(any());
+        verify(mJobScheduler).schedule(any());
     }
 
     @Test
@@ -120,11 +141,8 @@
         // Same build and same language
         DeviceIndexFeatureProvider.setIndexState(mActivity);
 
-        final JobScheduler jobScheduler = mock(JobScheduler.class);
-        when(mActivity.getSystemService(JobScheduler.class)).thenReturn(jobScheduler);
-
         mProvider.updateIndex(mActivity, false);
 
-        verify(jobScheduler, never()).schedule(any());
+        verify(mJobScheduler, never()).schedule(any());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
index 1140aee..bd11a15 100644
--- a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java
@@ -186,6 +186,8 @@
 
         AudioSwitchPreferenceController controller = new AudioSwitchPreferenceControllerTestable(
                 mContext, TEST_KEY);
+        controller.onStart();
+        controller.onStop();
 
         assertThat(mLocalBluetoothManager).isNull();
     }
diff --git a/tests/robotests/src/com/android/settings/widget/HotspotApBandSelectionPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/HotspotApBandSelectionPreferenceTest.java
deleted file mode 100644
index 0ffda3b..0000000
--- a/tests/robotests/src/com/android/settings/widget/HotspotApBandSelectionPreferenceTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.widget;
-
-import static com.android.settingslib.CustomDialogPreference.CustomPreferenceDialogFragment;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.net.wifi.WifiConfiguration;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.LinearLayout;
-
-import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class HotspotApBandSelectionPreferenceTest {
-    private HotspotApBandSelectionPreference mPreference;
-    private Context mContext;
-    private Button mSaveButton;
-    private View mLayout;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mSaveButton = spy(new Button(mContext));
-
-        final CustomPreferenceDialogFragment fragment = mock(CustomPreferenceDialogFragment.class);
-        final AlertDialog dialog = mock(AlertDialog.class);
-        when(fragment.getDialog()).thenReturn(dialog);
-        when(dialog.getButton(anyInt())).thenReturn(mSaveButton);
-
-        mPreference = new HotspotApBandSelectionPreference(mContext);
-        ReflectionHelpers.setField(mPreference, "mFragment", fragment);
-
-        final LayoutInflater inflater = LayoutInflater.from(mContext);
-        mLayout = inflater.inflate(R.layout.hotspot_ap_band_selection_dialog,
-                new LinearLayout(mContext), false);
-    }
-
-    @Test
-    public void getWifiBand_updatesBandPresetConfigProvided() {
-        mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY);
-        mPreference.onBindDialogView(mLayout);
-
-        // check that the boxes are set correctly when a pre-existing config is set
-        assertThat(mPreference.getWifiBand()).isEqualTo(WifiConfiguration.AP_BAND_ANY);
-    }
-
-    @Test
-    public void getWifiBand_updatesBandWhenBoxesToggled() {
-        mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY);
-        mPreference.onBindDialogView(mLayout);
-
-        assertThat(mPreference.getWifiBand()).isEqualTo(WifiConfiguration.AP_BAND_ANY);
-
-        // make sure we have the expected box then toggle it
-        mPreference.mBox2G.setChecked(false);
-
-        // check that band is updated
-        assertThat(mPreference.getWifiBand()).isEqualTo(WifiConfiguration.AP_BAND_5GHZ);
-    }
-
-    @Test
-    public void onSaveInstanceState_skipWhenDialogGone() {
-        mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_2GHZ);
-        mPreference.onBindDialogView(mLayout);
-        // remove the fragment to make the dialog unavailable
-        ReflectionHelpers.setField(mPreference, "mFragment", null);
-
-        mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY);
-        mPreference.onBindDialogView(mLayout);
-
-        // state should only be saved when the dialog is available
-        Parcelable parcelable = mPreference.onSaveInstanceState();
-        mPreference.onRestoreInstanceState(parcelable);
-        assertThat(mPreference.mShouldRestore).isFalse();
-    }
-
-    @Test
-    public void onSaveInstanceState_doesNotCrashWhenViewGone() {
-        mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_2GHZ);
-        mPreference.onBindDialogView(mLayout);
-        // When the device dozes the view and dialog can become null
-        mPreference.mBox5G = null;
-        mPreference.mBox2G = null;
-        ReflectionHelpers.setField(mPreference, "mFragment", null);
-
-        // make sure it does not crash and state is not restored
-        Parcelable parcelable = mPreference.onSaveInstanceState();
-        mPreference.onRestoreInstanceState(parcelable);
-        assertThat(mPreference.mShouldRestore).isFalse();
-    }
-
-    @Test
-    public void onSaveInstanceState_presentWhenDialogPresent() {
-        mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_2GHZ);
-        mPreference.onBindDialogView(mLayout);
-
-        Parcelable parcelable = mPreference.onSaveInstanceState();
-        mPreference.onRestoreInstanceState(parcelable);
-        assertThat(mPreference.mShouldRestore).isTrue();
-    }
-
-    @Test
-    public void positiveButton_updatedCorrectly() {
-        mPreference.setExistingConfigValue(WifiConfiguration.AP_BAND_ANY);
-        mPreference.onBindDialogView(mLayout);
-
-        // button is enabled whole time so far since we have a pre-existing selection
-        verify(mSaveButton, never()).setEnabled(false);
-
-        // clear all boxes and make sure it stays enabled until empty
-        mPreference.mBox2G.setChecked(false);
-        mPreference.mBox5G.setChecked(false);
-
-        // button should be disabled now
-        verify(mSaveButton, times(1)).setEnabled(false);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java
index d9c867c..8df62c3 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceControllerTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -26,16 +27,15 @@
 import android.net.ConnectivityManager;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
+import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.R;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.widget.HotspotApBandSelectionPreference;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
@@ -43,8 +43,9 @@
 @RunWith(SettingsRobolectricTestRunner.class)
 public class WifiTetherApBandPreferenceControllerTest {
 
-    private static final String ALL_BANDS = "2.4 GHz and 5.0 GHz";
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private static final String ALL_BANDS = "5.0 GHz Band preferred";
+    private static final String TWO_GHZ_STRING = "2.4 GHz Band";
+    private static final String FIVE_GHZ_STRING = "5.0 GHz Band";
     private Context mContext;
     @Mock
     private ConnectivityManager mConnectivityManager;
@@ -56,12 +57,13 @@
     private PreferenceScreen mScreen;
 
     private WifiTetherApBandPreferenceController mController;
-    private HotspotApBandSelectionPreference mPreference;
+    private ListPreference mPreference;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mPreference = new HotspotApBandSelectionPreference(RuntimeEnvironment.application);
+        mContext = spy(RuntimeEnvironment.application);
+        mPreference = new ListPreference(RuntimeEnvironment.application);
         when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
         when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE))
                 .thenReturn(mConnectivityManager);
@@ -71,6 +73,7 @@
         WifiConfiguration config = new WifiConfiguration();
         config.apBand = WifiConfiguration.AP_BAND_ANY;
         when(mWifiManager.getWifiApConfiguration()).thenReturn(new WifiConfiguration());
+        when(mWifiManager.isDualModeSupported()).thenReturn(false);
 
         mController = new WifiTetherApBandPreferenceController(mContext, mListener);
     }
@@ -79,9 +82,10 @@
     public void display_5GhzSupported_shouldDisplayFullList() {
         when(mWifiManager.getCountryCode()).thenReturn("US");
         when(mWifiManager.isDualBandSupported()).thenReturn(true);
+        when(mWifiManager.isDualModeSupported()).thenReturn(true);
 
         mController.displayPreference(mScreen);
-        mController.onPreferenceChange(mPreference, -1);
+        mController.onPreferenceChange(mPreference, "-1");
 
         assertThat(mPreference.getSummary()).isEqualTo(ALL_BANDS);
     }
@@ -110,24 +114,54 @@
     }
 
     @Test
-    public void changePreference_shouldUpdateValue() {
+    public void changePreference_noDualModeWith5G_shouldUpdateValue() {
         when(mWifiManager.is5GHzBandSupported()).thenReturn(true);
 
         mController.displayPreference(mScreen);
 
+        // -1 is WifiConfiguration.AP_BAND_ANY, for 'Auto' option. This should be prevented from
+        // being set since it is invalid for this configuration
+        mController.onPreferenceChange(mPreference, "-1");
+        assertThat(mController.getBandIndex()).isEqualTo(1);
+        assertThat(mPreference.getSummary()).isEqualTo(FIVE_GHZ_STRING);
+        verify(mListener, times(1)).onTetherConfigUpdated();
+
+        // set to 5 Ghz
+        mController.onPreferenceChange(mPreference, "1");
+        assertThat(mController.getBandIndex()).isEqualTo(1);
+        assertThat(mPreference.getSummary()).isEqualTo(FIVE_GHZ_STRING);
+        verify(mListener, times(2)).onTetherConfigUpdated();
+
+        // set to 2 Ghz
+        mController.onPreferenceChange(mPreference, "0");
+        assertThat(mController.getBandIndex()).isEqualTo(0);
+        assertThat(mPreference.getSummary()).isEqualTo(TWO_GHZ_STRING);
+        verify(mListener, times(3)).onTetherConfigUpdated();
+    }
+
+    @Test
+    public void changePreference_dualModeWith5G_shouldUpdateValue() {
+        when(mWifiManager.is5GHzBandSupported()).thenReturn(true);
+        when(mWifiManager.isDualModeSupported()).thenReturn(true);
+
+        mController.displayPreference(mScreen);
+
         // -1 is WifiConfiguration.AP_BAND_ANY, for 'Auto' option.
-        mController.onPreferenceChange(mPreference, -1);
+        mController.onPreferenceChange(mPreference, "-1");
         assertThat(mController.getBandIndex()).isEqualTo(-1);
         assertThat(mPreference.getSummary()).isEqualTo(ALL_BANDS);
+        verify(mListener, times(1)).onTetherConfigUpdated();
 
-        mController.onPreferenceChange(mPreference, 1);
-        assertThat(mController.getBandIndex()).isEqualTo(1);
-        assertThat(mPreference.getSummary()).isEqualTo("5.0 GHz");
+        // should revert to the default for 5 Ghz only since this is not supported with this config
+        mController.onPreferenceChange(mPreference, "1");
+        assertThat(mController.getBandIndex()).isEqualTo(-1);
+        assertThat(mPreference.getSummary()).isEqualTo(ALL_BANDS);
+        verify(mListener, times(2)).onTetherConfigUpdated();
 
-        mController.onPreferenceChange(mPreference, 0);
+        // set to 2 Ghz
+        mController.onPreferenceChange(mPreference, "0");
         assertThat(mController.getBandIndex()).isEqualTo(0);
-        assertThat(mPreference.getSummary()).isEqualTo("2.4 GHz");
-
+        assertThat(mPreference.getSummary()).isEqualTo(TWO_GHZ_STRING);
         verify(mListener, times(3)).onTetherConfigUpdated();
     }
 
@@ -136,7 +170,7 @@
         // Set controller band index to 1 and verify is set.
         when(mWifiManager.is5GHzBandSupported()).thenReturn(true);
         mController.displayPreference(mScreen);
-        mController.onPreferenceChange(mPreference, 1);
+        mController.onPreferenceChange(mPreference, "1");
         assertThat(mController.getBandIndex()).isEqualTo(1);
 
         // Disable 5Ghz band
