Merge "Add a new empty dashboard for Network & Internet."
diff --git a/res/values/config.xml b/res/values/config.xml
index 7513cef..6d56e18 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -52,6 +52,10 @@
     <string name="gesture_double_twist_sensor_name" translatable="false"></string>
     <string name="gesture_double_twist_sensor_vendor" translatable="false"></string>
 
+    <!-- Pickup sensor name and vendor used by gesture setting -->
+    <string name="gesture_pickup_sensor_name" translatable="false"></string>
+    <string name="gesture_pickup_sensor_vendor" translatable="false"></string>
+
     <!-- When true enable gesture setting. -->
     <bool name="config_gesture_settings_enabled">false</bool>
 
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index cd3c5ee..d84b008 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -328,11 +328,6 @@
             android:title="@string/strict_mode"
             android:summary="@string/strict_mode_summary"/>
 
-        <SwitchPreference
-            android:key="show_cpu_usage"
-            android:title="@string/show_cpu_usage"
-            android:summary="@string/show_cpu_usage_summary"/>
-
         <ListPreference
             android:key="track_frame_time"
             android:title="@string/track_frame_time"
diff --git a/res/xml/ia_display_settings.xml b/res/xml/ia_display_settings.xml
new file mode 100644
index 0000000..7f1af9a
--- /dev/null
+++ b/res/xml/ia_display_settings.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+        android:title="@string/display_settings"
+        settings:keywords="@string/keywords_display">
+
+        <PreferenceScreen
+                android:key="brightness"
+                android:title="@string/brightness"
+                settings:keywords="@string/keywords_display_brightness_level">
+            <intent android:action="android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
+        </PreferenceScreen>
+
+        <com.android.settingslib.RestrictedPreference
+            android:key="wallpaper"
+            android:title="@string/wallpaper_settings_title"
+            settings:keywords="@string/keywords_display_wallpaper"
+            settings:useAdminDisabledSummary="true" >
+                <intent
+                    android:targetPackage="@string/config_wallpaper_picker_package"
+                    android:targetClass="@string/config_wallpaper_picker_class" />
+        </com.android.settingslib.RestrictedPreference>
+
+        <com.android.settings.display.NightDisplayPreference
+            android:key="night_display"
+            android:title="@string/night_display_title"
+            android:fragment="com.android.settings.display.NightDisplaySettings"
+            android:widgetLayout="@null"
+            settings:keywords="@string/keywords_display_night_display" />
+
+        <com.android.settings.TimeoutListPreference
+            android:key="screen_timeout"
+            android:title="@string/screen_timeout"
+            android:summary="@string/screen_timeout_summary"
+            android:entries="@array/screen_timeout_entries"
+            android:entryValues="@array/screen_timeout_values" />
+
+        <DropDownPreference
+            android:key="auto_rotate"
+            android:summary="%s"
+            android:title="@string/display_auto_rotate_title" />
+
+        <SwitchPreference
+                android:key="auto_brightness"
+                android:title="@string/auto_brightness_title"
+                settings:keywords="@string/keywords_display_auto_brightness"
+                android:summary="@string/auto_brightness_summary" />
+
+        <PreferenceScreen
+            android:key="font_size"
+            android:title="@string/title_font_size"
+            android:fragment="com.android.settings.accessibility.ToggleFontSizePreferenceFragment"
+            settings:keywords="@string/keywords_display_font_size" />
+
+        <com.android.settings.display.ScreenZoomPreference
+            android:key="screen_zoom"
+            android:title="@string/screen_zoom_title"
+            settings:keywords="@string/screen_zoom_keywords" />
+
+        <PreferenceScreen
+            android:key="screensaver"
+            android:title="@string/screensaver_settings_title"
+            android:fragment="com.android.settings.DreamSettings" />
+
+        <!-- Hide night mode for now
+        <ListPreference
+            android:key="night_mode"
+            android:title="@string/night_mode_title"
+            settings:keywords="@string/keywords_display_night_mode"
+            android:summary="@string/night_mode_summary"
+            android:entries="@array/night_mode_entries"
+            android:entryValues="@array/night_mode_values" /> -->
+
+        <SwitchPreference
+                android:key="camera_gesture"
+                android:title="@string/camera_gesture_title"
+                android:summary="@string/camera_gesture_desc" />
+
+        <SwitchPreference
+                android:key="lift_to_wake"
+                android:title="@string/lift_to_wake_title" />
+
+        <SwitchPreference
+                android:key="doze"
+                android:title="@string/doze_title"
+                android:summary="@string/doze_summary" />
+
+        <SwitchPreference
+                android:key="tap_to_wake"
+                android:title="@string/tap_to_wake"
+                android:summary="@string/tap_to_wake_summary" />
+
+        <PreferenceScreen
+                android:key="wifi_display"
+                android:title="@string/wifi_display_settings_title"
+                settings:keywords="@string/keywords_display_cast_screen"
+                android:fragment="com.android.settings.wfd.WifiDisplaySettings" />
+
+        <DropDownPreference
+                android:key="vr_display_pref"
+                android:summary="%s"
+                android:title="@string/display_vr_pref_title" />
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index a9e48dc..9349c13 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -142,8 +142,7 @@
             super.onCreate(savedInstanceState);
 
             String chooseLockAction = getActivity().getIntent().getAction();
-            mFingerprintManager =
-                (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
+            mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity());
             mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
             mKeyStore = KeyStore.getInstance();
             mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index a4ced35..e41502c 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -144,7 +144,6 @@
     private static final String DISABLE_OVERLAYS_KEY = "disable_overlays";
     private static final String SIMULATE_COLOR_SPACE = "simulate_color_space";
     private static final String USB_AUDIO_KEY = "usb_audio";
-    private static final String SHOW_CPU_USAGE_KEY = "show_cpu_usage";
     private static final String FORCE_HARDWARE_UI_KEY = "force_hw_ui";
     private static final String FORCE_MSAA_KEY = "force_msaa";
     private static final String TRACK_FRAME_TIME_KEY = "track_frame_time";
@@ -274,7 +273,6 @@
     private SwitchPreference mShowTouches;
     private SwitchPreference mShowScreenUpdates;
     private SwitchPreference mDisableOverlays;
-    private SwitchPreference mShowCpuUsage;
     private SwitchPreference mForceHardwareUi;
     private SwitchPreference mForceMsaa;
     private SwitchPreference mShowHwScreenUpdates;
@@ -423,7 +421,6 @@
         mShowTouches = findAndInitSwitchPref(SHOW_TOUCHES_KEY);
         mShowScreenUpdates = findAndInitSwitchPref(SHOW_SCREEN_UPDATES_KEY);
         mDisableOverlays = findAndInitSwitchPref(DISABLE_OVERLAYS_KEY);
-        mShowCpuUsage = findAndInitSwitchPref(SHOW_CPU_USAGE_KEY);
         mForceHardwareUi = findAndInitSwitchPref(FORCE_HARDWARE_UI_KEY);
         mForceMsaa = findAndInitSwitchPref(FORCE_MSAA_KEY);
         mTrackFrameTime = addListPreference(TRACK_FRAME_TIME_KEY);
@@ -696,7 +693,6 @@
         updatePointerLocationOptions();
         updateShowTouchesOptions();
         updateFlingerOptions();
-        updateCpuUsageOptions();
         updateHardwareUiOptions();
         updateMsaaOptions();
         updateTrackFrameTimeOptions();
@@ -1719,25 +1715,6 @@
         }
     }
 
-    private void updateCpuUsageOptions() {
-        updateSwitchPreference(mShowCpuUsage,
-                Settings.Global.getInt(getActivity().getContentResolver(),
-                        Settings.Global.SHOW_PROCESSES, 0) != 0);
-    }
-
-    private void writeCpuUsageOptions() {
-        boolean value = mShowCpuUsage.isChecked();
-        Settings.Global.putInt(getActivity().getContentResolver(),
-                Settings.Global.SHOW_PROCESSES, value ? 1 : 0);
-        Intent service = (new Intent())
-                .setClassName("com.android.systemui", "com.android.systemui.LoadAverageService");
-        if (value) {
-            getActivity().startService(service);
-        } else {
-            getActivity().stopService(service);
-        }
-    }
-
     private void writeImmediatelyDestroyActivitiesOptions() {
         try {
             ActivityManagerNative.getDefault().setAlwaysFinish(
@@ -2026,8 +2003,6 @@
             writeShowUpdatesOption();
         } else if (preference == mDisableOverlays) {
             writeDisableOverlaysOption();
-        } else if (preference == mShowCpuUsage) {
-            writeCpuUsageOptions();
         } else if (preference == mImmediatelyDestroyActivities) {
             writeImmediatelyDestroyActivitiesOptions();
         } else if (preference == mShowAllANRs) {
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 2e8b926..d58f100 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -38,6 +38,7 @@
 import com.android.settings.display.TimeoutPreferenceController;
 import com.android.settings.display.VrDisplayPreferenceController;
 import com.android.settings.display.WallpaperPreferenceController;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settingslib.drawer.CategoryKey;
@@ -67,7 +68,11 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.display_settings;
+        if (mDashboardFeatureProvider.isEnabled()) {
+            return R.xml.ia_display_settings;
+        } else {
+            return R.xml.display_settings;
+        }
     }
 
     @Override
@@ -139,12 +144,18 @@
                 @Override
                 public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
                         boolean enabled) {
-                    ArrayList<SearchIndexableResource> result = new ArrayList<>();
+                    final ArrayList<SearchIndexableResource> result = new ArrayList<>();
 
-                    SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.display_settings;
+                    final SearchIndexableResource sir = new SearchIndexableResource(context);
+                    final boolean useNewIA = FeatureFactory.getFactory(context)
+                            .getDashboardFeatureProvider(context)
+                            .isEnabled();
+                    if (useNewIA) {
+                        sir.xmlResId = R.xml.ia_display_settings;
+                    } else {
+                        sir.xmlResId = R.xml.display_settings;
+                    }
                     result.add(sir);
-
                     return result;
                 }
 
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 9af91cc..5f90353 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -904,8 +904,7 @@
             }
 
             // Fingerprint
-            FingerprintManager fpm =
-                    (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
+            final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(context);
             if (fpm != null && fpm.isHardwareDetected()) {
                 // This catches the title which can be overloaded in an overlay
                 data = new SearchIndexableRaw(context);
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 1186c46..f8520d8 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -44,6 +44,7 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.hardware.fingerprint.FingerprintManager;
 import android.net.ConnectivityManager;
 import android.net.LinkProperties;
 import android.net.Uri;
@@ -1175,4 +1176,12 @@
         }
         return null;
     }
+
+    public static FingerprintManager getFingerprintManagerOrNull(Context context) {
+        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
+            return context.getSystemService(FingerprintManager.class);
+        } else {
+            return null;
+        }
+    }
 }
diff --git a/src/com/android/settings/applications/ProcStatsPackageEntry.java b/src/com/android/settings/applications/ProcStatsPackageEntry.java
index ef74bc6..dcf87fc 100644
--- a/src/com/android/settings/applications/ProcStatsPackageEntry.java
+++ b/src/com/android/settings/applications/ProcStatsPackageEntry.java
@@ -22,6 +22,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import android.util.Log;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -127,6 +128,7 @@
                 mUiLabel = mUiTargetApp.loadLabel(pm).toString();
             }
         } catch (PackageManager.NameNotFoundException e) {
+            Log.d(TAG, "could not find package: " + mPackage);
         }
     }
 
diff --git a/src/com/android/settings/applications/ProcessStatsPreference.java b/src/com/android/settings/applications/ProcessStatsPreference.java
index 996ed15..4ee0a04 100644
--- a/src/com/android/settings/applications/ProcessStatsPreference.java
+++ b/src/com/android/settings/applications/ProcessStatsPreference.java
@@ -22,9 +22,11 @@
 import android.text.TextUtils;
 import android.text.format.Formatter;
 
+import android.util.Log;
 import com.android.settings.AppProgressPreference;
 
 public class ProcessStatsPreference extends AppProgressPreference {
+    static final String TAG = "ProcessStatsPreference";
 
     private ProcStatsPackageEntry mEntry;
 
@@ -35,11 +37,15 @@
     public void init(ProcStatsPackageEntry entry, PackageManager pm, double maxMemory,
             double weightToRam, double totalScale, boolean avg) {
         mEntry = entry;
-        setTitle(TextUtils.isEmpty(entry.mUiLabel) ? entry.mPackage : entry.mUiLabel);
+        String title = TextUtils.isEmpty(entry.mUiLabel) ? entry.mPackage : entry.mUiLabel;
+        setTitle(title);
+        if (TextUtils.isEmpty(title)) {
+            Log.d(TAG, "PackageEntry contained no package name or uiLabel");
+        }
         if (entry.mUiTargetApp != null) {
             setIcon(entry.mUiTargetApp.loadIcon(pm));
         } else {
-            setIcon(new ColorDrawable(0));
+            setIcon(pm.getDefaultActivityIcon());
         }
         boolean statsForeground = entry.mRunWeight > entry.mBgWeight;
         double amount = avg ? (statsForeground ? entry.mRunWeight : entry.mBgWeight) * weightToRam
diff --git a/src/com/android/settings/dashboard/SuggestionsChecks.java b/src/com/android/settings/dashboard/SuggestionsChecks.java
index b816a79..78f21ea 100644
--- a/src/com/android/settings/dashboard/SuggestionsChecks.java
+++ b/src/com/android/settings/dashboard/SuggestionsChecks.java
@@ -35,6 +35,7 @@
 import com.android.settings.Settings.ScreenLockSuggestionActivity;
 import com.android.settings.Settings.WifiCallingSuggestionActivity;
 import com.android.settings.Settings.ZenModeAutomationSuggestionActivity;
+import com.android.settings.Utils;
 import com.android.settings.WallpaperSuggestionActivity;
 import com.android.settingslib.drawer.Tile;
 
@@ -75,7 +76,7 @@
     }
 
     private boolean isNotSingleFingerprintEnrolled() {
-        FingerprintManager manager = mContext.getSystemService(FingerprintManager.class);
+        FingerprintManager manager = Utils.getFingerprintManagerOrNull(mContext);
         return manager == null || manager.getEnrolledFingerprints().size() != 1;
     }
 
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
index 33768c5..f2fda6b 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
@@ -24,6 +24,7 @@
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.ChooseLockSettingsHelper;
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settings.fingerprint.FingerprintEnrollSidecar.Listener;
 
 /**
@@ -155,7 +156,7 @@
                 setResult(RESULT_TIMEOUT);
                 finish();
             } else {
-                FingerprintManager fpm = getSystemService(FingerprintManager.class);
+                FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
                 int enrolled = fpm.getEnrolledFingerprints().size();
                 int max = getResources().getInteger(
                         com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
@@ -172,7 +173,7 @@
     }
 
     private void launchConfirmLock() {
-        long challenge = getSystemService(FingerprintManager.class).preEnroll();
+        long challenge = Utils.getFingerprintManagerOrNull(this).preEnroll();
         ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
         boolean launchedConfirmationActivity = false;
         if (mUserId == UserHandle.USER_NULL) {
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java
index 75557a0..94d2570 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java
@@ -16,16 +16,16 @@
 
 package com.android.settings.fingerprint;
 
-import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
-import android.os.UserHandle;
 import android.view.View;
 import android.widget.Button;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.Utils;
 
 /**
  * Activity which concludes fingerprint enrollment.
@@ -39,7 +39,7 @@
         setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title);
         Button addButton = (Button) findViewById(R.id.add_another_button);
 
-        FingerprintManager fpm = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
+        final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
         int enrolled = fpm.getEnrolledFingerprints(mUserId).size();
         int max = getResources().getInteger(
                 com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
index b5be4b6..697c44a 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
@@ -32,6 +32,7 @@
 import com.android.settings.ChooseLockGeneric;
 import com.android.settings.ChooseLockSettingsHelper;
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.setupwizardlib.span.LinkSpan;
@@ -97,7 +98,7 @@
 
     private void launchChooseLock() {
         Intent intent = getChooseLockIntent();
-        long challenge = getSystemService(FingerprintManager.class).preEnroll();
+        long challenge = Utils.getFingerprintManagerOrNull(this).preEnroll();
         intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
                 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true);
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
index 9b574b6..24061b4 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
@@ -27,6 +27,7 @@
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.ChooseLockSettingsHelper;
+import com.android.settings.Utils;
 import com.android.settings.core.InstrumentedFragment;
 
 /**
@@ -54,7 +55,7 @@
     @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
-        mFingerprintManager = activity.getSystemService(FingerprintManager.class);
+        mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
         mToken = activity.getIntent().getByteArrayExtra(
                 ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
         mUserId = activity.getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL);
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index b044ce3..3c1be40 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -26,6 +26,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.hardware.fingerprint.Fingerprint;
@@ -290,8 +291,7 @@
                     Intent.EXTRA_USER_ID, UserHandle.myUserId());
 
             Activity activity = getActivity();
-            mFingerprintManager = (FingerprintManager) activity.getSystemService(
-                    Context.FINGERPRINT_SERVICE);
+            mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
 
             // Need to authenticate a session token if none
             if (mToken == null && mLaunchedConfirm == false) {
@@ -820,8 +820,7 @@
     }
 
     public static Preference getFingerprintPreferenceForUser(Context context, final int userId) {
-        FingerprintManager fpm = (FingerprintManager) context.getSystemService(
-                Context.FINGERPRINT_SERVICE);
+        final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(context);
         if (fpm == null || !fpm.isHardwareDetected()) {
             Log.v(TAG, "No fingerprint hardware detected!!");
             return null;
diff --git a/src/com/android/settings/fingerprint/FingerprintUiHelper.java b/src/com/android/settings/fingerprint/FingerprintUiHelper.java
index f7ec97b..655ce26 100644
--- a/src/com/android/settings/fingerprint/FingerprintUiHelper.java
+++ b/src/com/android/settings/fingerprint/FingerprintUiHelper.java
@@ -23,6 +23,7 @@
 import android.widget.TextView;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 
 /**
  * Small helper class to manage text/icon around fingerprint authentication UI.
@@ -41,7 +42,7 @@
 
     public FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback,
             int userId) {
-        mFingerprintManager = icon.getContext().getSystemService(FingerprintManager.class);
+        mFingerprintManager = Utils.getFingerprintManagerOrNull(icon.getContext());
         mIcon = icon;
         mErrorTextView = errorTextView;
         mCallback = callback;
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
index 32c8438..22cc496 100644
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -82,7 +82,7 @@
 
         // Ambient Display
         boolean dozeEnabled = isDozeAvailable(context);
-        if (dozeEnabled) {
+        if (dozeEnabled && isPickupAvailable(context)) {
             int pickup = Secure.getInt(getContentResolver(), Secure.DOZE_PULSE_ON_PICK_UP, 1);
             addPreference(PREF_KEY_PICK_UP, pickup != 0, PREF_ID_PICK_UP);
         } else {
@@ -204,9 +204,19 @@
     }
 
     private static boolean isDoubleTwistAvailable(Context context) {
+        return hasSensor(context, R.string.gesture_double_twist_sensor_name,
+                R.string.gesture_double_twist_sensor_vendor);
+    }
+
+    private static boolean isPickupAvailable(Context context) {
+        return hasSensor(context, R.string.gesture_pickup_sensor_name,
+                R.string.gesture_pickup_sensor_vendor);
+    }
+
+    private static boolean hasSensor(Context context, int nameResId, int vendorResId) {
         Resources resources = context.getResources();
-        String name = resources.getString(R.string.gesture_double_twist_sensor_name);
-        String vendor = resources.getString(R.string.gesture_double_twist_sensor_vendor);
+        String name = resources.getString(nameResId);
+        String vendor = resources.getString(vendorResId);
         if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(vendor)) {
             SensorManager sensorManager =
                     (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
@@ -253,10 +263,10 @@
                 if (!isCameraDoubleTapPowerGestureAvailable(context.getResources())) {
                     result.add(PREF_KEY_DOUBLE_TAP_POWER);
                 }
-                if (!isDozeAvailable(context)) {
+                if (!isDozeAvailable(context) || !isPickupAvailable(context)) {
                     result.add(PREF_KEY_PICK_UP);
-                    result.add(PREF_KEY_DOUBLE_TAP_SCREEN);
-                } else if (!isDoubleTapAvailable(context)) {
+                }
+                if (!isDozeAvailable(context) || !isDoubleTapAvailable(context)) {
                     result.add(PREF_KEY_DOUBLE_TAP_SCREEN);
                 }
                 if (!isSystemUINavigationAvailable(context)) {
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index ad3daae..4a3aac5 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -18,33 +18,30 @@
 
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.DialogFragment;
+import android.app.Fragment;
 import android.app.NotificationManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.pm.PackageManager;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService;
+import android.util.Log;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.utils.ManagedServiceSettings;
-import com.android.settings.utils.ServiceListing;
 
 public class NotificationAccessSettings extends ManagedServiceSettings {
     private static final String TAG = NotificationAccessSettings.class.getSimpleName();
     private static final Config CONFIG = getNotificationListenerConfig();
 
-    private NotificationManager mNm;
 
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-        mNm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
     }
 
     private static Config getNotificationListenerConfig() {
@@ -70,14 +67,6 @@
         return CONFIG;
     }
 
-    public static int getListenersCount(PackageManager pm) {
-        return ServiceListing.getServicesCount(CONFIG, pm);
-    }
-
-    public static int getEnabledListenersCount(Context context) {
-        return ServiceListing.getEnabledServicesCount(CONFIG, context);
-    }
-
     protected boolean setEnabled(ComponentName service, String title, boolean enable) {
         if (!enable) {
             if (!mServiceListing.isEnabled(service)) {
@@ -85,7 +74,7 @@
             }
             // show a friendly dialog
             new FriendlyWarningDialogFragment()
-                    .setServiceInfo(service, title)
+                    .setServiceInfo(service, title, this)
                     .show(getFragmentManager(), "friendlydialog");
             return false;
         } else {
@@ -93,25 +82,33 @@
         }
     }
 
-    private static void deleteRules(final Context context, final String pkg) {
+    private static void disable(final Context context, final NotificationAccessSettings parent,
+            final ComponentName cn) {
+        parent.mServiceListing.setEnabled(cn, false);
         AsyncTask.execute(new Runnable() {
             @Override
             public void run() {
                 final NotificationManager mgr = context.getSystemService(NotificationManager.class);
-                mgr.removeAutomaticZenRules(pkg);
+
+                if (!mgr.isNotificationPolicyAccessGrantedForPackage(
+                        cn.getPackageName())) {
+                    mgr.removeAutomaticZenRules(cn.getPackageName());
+                }
             }
         });
     }
 
-    public class FriendlyWarningDialogFragment extends InstrumentedDialogFragment {
+    public static class FriendlyWarningDialogFragment extends InstrumentedDialogFragment {
         static final String KEY_COMPONENT = "c";
         static final String KEY_LABEL = "l";
 
-        public FriendlyWarningDialogFragment setServiceInfo(ComponentName cn, String label) {
+        public FriendlyWarningDialogFragment setServiceInfo(ComponentName cn, String label,
+                Fragment target) {
             Bundle args = new Bundle();
             args.putString(KEY_COMPONENT, cn.flattenToString());
             args.putString(KEY_LABEL, label);
             setArguments(args);
+            setTargetFragment(target, 0);
             return this;
         }
 
@@ -122,25 +119,21 @@
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
             final Bundle args = getArguments();
             final String label = args.getString(KEY_LABEL);
             final ComponentName cn = ComponentName.unflattenFromString(args
                     .getString(KEY_COMPONENT));
+            NotificationAccessSettings parent = (NotificationAccessSettings) getTargetFragment();
 
             final String summary = getResources().getString(
                     R.string.notification_listener_disable_warning_summary, label);
-            return new AlertDialog.Builder(mContext)
+            return new AlertDialog.Builder(getContext())
                     .setMessage(summary)
                     .setCancelable(true)
                     .setPositiveButton(R.string.notification_listener_disable_warning_confirm,
                             new DialogInterface.OnClickListener() {
                                 public void onClick(DialogInterface dialog, int id) {
-                                    mServiceListing.setEnabled(cn, false);
-                                    if (!mNm.isNotificationPolicyAccessGrantedForPackage(
-                                            cn.getPackageName())) {
-                                        deleteRules(mContext, cn.getPackageName());
-                                    }
+                                    disable(getContext(), parent, cn);
                                 }
                             })
                     .setNegativeButton(R.string.notification_listener_disable_warning_cancel,
diff --git a/src/com/android/settings/password/SetNewPasswordController.java b/src/com/android/settings/password/SetNewPasswordController.java
index 470723b..03afa76 100644
--- a/src/com/android/settings/password/SetNewPasswordController.java
+++ b/src/com/android/settings/password/SetNewPasswordController.java
@@ -30,6 +30,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.ChooseLockGeneric;
 import com.android.settings.ChooseLockSettingsHelper;
+import com.android.settings.Utils;
 
 /**
  * Business logic for {@link SetNewPasswordActivity}.
@@ -54,7 +55,7 @@
     public SetNewPasswordController(Context context, Ui ui) {
         this(context.getUserId(),
                 context.getPackageManager(),
-                (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE),
+                Utils.getFingerprintManagerOrNull(context),
                 (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE),
                 ui);
     }
diff --git a/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java
index bd839c8..31158b7 100644
--- a/src/com/android/settings/utils/ManagedServiceSettings.java
+++ b/src/com/android/settings/utils/ManagedServiceSettings.java
@@ -49,7 +49,6 @@
     protected Context mContext;
     private PackageManager mPM;
     protected ServiceListing mServiceListing;
-    private TextView mEmpty;
 
     abstract protected Config getConfig();
 
@@ -153,7 +152,6 @@
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
             final Bundle args = getArguments();
             final String label = args.getString(KEY_LABEL);
             final ComponentName cn = ComponentName.unflattenFromString(args