Merge "Fix crash when changing data restriction for non-app UID."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8c469ad..25fc62b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3013,6 +3013,18 @@
                        android:value="true" />
         </activity>
 
+        <activity android:name="Settings$AutomaticStorageManagerSettingsActivity"
+                  android:exported="@bool/config_has_storage_manager"
+                  android:label="@string/automatic_storage_manager_settings"
+                  android:taskAffinity="">
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.STORAGE_MANAGER_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.deletionhelper.AutomaticStorageManagerSettings" />
+        </activity>
+
         <service
             android:name=".SettingsDumpService"
             android:exported="true"
diff --git a/res/layout/gesture_preference.xml b/res/layout/gesture_preference.xml
index 883b94e..d5685ea 100644
--- a/res/layout/gesture_preference.xml
+++ b/res/layout/gesture_preference.xml
@@ -51,6 +51,7 @@
     </LinearLayout>
 
     <LinearLayout
+        android:id="@+id/gesture_animation_view"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="@color/gestures_setting_background_color"
@@ -58,7 +59,6 @@
         android:orientation="horizontal">
 
         <com.android.settings.widget.AspectRatioFrameLayout
-            android:id="@+id/gesture_animation_frame"
             android:layout_width="0dp"
             android:layout_height="match_parent"
             android:layout_weight="1"
diff --git a/res/layout/trusted_credential.xml b/res/layout/trusted_credential.xml
index cc146f8..acef60b 100644
--- a/res/layout/trusted_credential.xml
+++ b/res/layout/trusted_credential.xml
@@ -21,14 +21,15 @@
     android:background="?android:attr/selectableItemBackground"
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="15dip"
-    android:paddingBottom="15dip"
+    android:descendantFocusability="blocksDescendants"
     android:orientation="horizontal">
 
     <LinearLayout
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_weight="1"
+        android:paddingTop="15dip"
+        android:paddingBottom="15dip"
         android:orientation="vertical">
 
         <TextView
@@ -53,8 +54,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:visibility="invisible"
-        android:clickable="false"
-        android:focusable="false"
+        android:padding="8dp"
         android:layout_weight="0" />
 
 </LinearLayout>
diff --git a/res/raw/gesture_ambient_lift.mp4 b/res/raw/gesture_ambient_lift.mp4
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/res/raw/gesture_ambient_lift.mp4
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 07cd527..d2212f2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2178,7 +2178,7 @@
     <!-- Night display screen, setting option name to enable night display (renamed "Night Light" with title caps). [CHAR LIMIT=30] -->
     <string name="night_display_title">Night Light</string>
     <!-- Night display screen, description of night display feature (renamed "Night Light" with title caps). [CHAR LIMIT=NONE] -->
-    <string name="night_display_text">Night Light tints your screen red. This makes it easier to look at your screen or read in dim light, and may help you fall asleep more easily.</string>
+    <string name="night_display_text">Night Light tints your screen amber. This makes it easier to look at your screen or read in dim light, and may help you fall asleep more easily.</string>
     <!-- Night display screen, category title for settings to schedule when night display activates automatically. [CHAR LIMIT=30] -->
     <string name="night_display_category_schedule">Schedule</string>
     <!-- Night display screen, category title for settings to manually activate night display. [CHAR LIMIT=30] -->
@@ -2253,7 +2253,7 @@
     <!-- [CHAR LIMIT=30] Display settings screen, setting option name to change whether the ambient display feature is enabled. -->
     <string name="doze_title">Ambient display</string>
     <!-- [CHAR LIMIT=NONE] Display settings screen, setting description for the ambient display feature. -->
-    <string name="doze_summary">Wake screen when you double-tap it or get new notifications. See how</string>
+    <string name="doze_summary">Wake screen when you receive notifications</string>
     <!-- [CHAR LIMIT=30] Sound & display settings screen, setting option name to change font size -->
     <string name="title_font_size">Font size</string>
     <!-- Summary for Font size. Lets the user know that this will make text larger or smaller. Appears in the accessibility portion of setup wizard. [CHAR LIMIT=NONE] -->
@@ -7364,7 +7364,7 @@
     <string name="condition_night_display_title">Night Light is on</string>
 
     <!-- Summary of condition that night display is on (renamed "Night Light" with title caps) [CHAR LIMIT=NONE] -->
-    <string name="condition_night_display_summary">Screen is tinted red. This may help you fall asleep.</string>
+    <string name="condition_night_display_summary">Screen is tinted amber. This may help you fall asleep.</string>
 
     <!-- Title for the suggestions section on the dashboard [CHAR LIMIT=30] -->
     <string name="suggestions_title">Suggestions</string>
@@ -7820,11 +7820,25 @@
     <!-- Summary text for double twist for camera mode  [CHAR LIMIT=160]-->
     <string name="double_twist_for_camera_mode_summary"></string>
 
-    <!-- Title text for ambient display [CHAR LIMIT=60]-->
-    <string name="ambient_display_title">Quick screen check</string>
+    <!-- Title text for ambient display double tap [CHAR LIMIT=60]-->
+    <string name="ambient_display_title">Quick screen check - Double Tap</string>
 
-    <!-- Summary text for ambient display [CHAR LIMIT=160]-->
-    <string name="ambient_display_summary">To check your phone without waking it up fully, double-tap it or pick it up</string>
+    <!-- Summary text for ambient display double tap (phone) [CHAR LIMIT=160]-->
+    <string name="ambient_display_summary" product="default">To check your phone without waking it up fully, double-tap it</string>
+    <!-- Summary text for ambient display double tap (tablet) [CHAR LIMIT=160]-->
+    <string name="ambient_display_summary" product="tablet">To check your tablet without waking it up fully, double-tap it</string>
+    <!-- Summary text for ambient display double tap (device) [CHAR LIMIT=160]-->
+    <string name="ambient_display_summary" product="device">To check your device without waking it up fully, double-tap it</string>
+
+    <!-- Title text for ambient display pick up [CHAR LIMIT=60]-->
+    <string name="ambient_display_pickup_title">Quick screen check - Pickup notifications</string>
+
+    <!-- Summary text for ambient display (phone) [CHAR LIMIT=160]-->
+    <string name="ambient_display_pickup_summary" product="default">To check your phone without waking it up fully, pick it up</string>
+    <!-- Summary text for ambient display (tablet) [CHAR LIMIT=160]-->
+    <string name="ambient_display_pickup_summary" product="tablet">To check your tablet without waking it up fully, pick it up</string>
+    <!-- Summary text for ambient display (device) [CHAR LIMIT=160]-->
+    <string name="ambient_display_pickup_summary" product="device">To check your device without waking it up fully, pick it up</string>
 
     <!-- Title text for fingerprint swipe for notifications [CHAR LIMIT=60]-->
     <string name="fingerprint_swipe_for_notifications_title">Swipe for notifications</string>
diff --git a/res/xml/device_info_settings.xml b/res/xml/device_info_settings.xml
index b8fee49..66cf8f4 100644
--- a/res/xml/device_info_settings.xml
+++ b/res/xml/device_info_settings.xml
@@ -15,6 +15,7 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:settings="http://schemas.android.com/apk/res-auto"
         android:title="@string/about_settings">
 
         <!-- System update settings - launches activity -->
@@ -70,11 +71,15 @@
         </PreferenceScreen>
 
         <!-- Device hardware model -->
-        <Preference android:key="device_model"
+        <com.android.settings.DividerPreference
+                android:key="device_model"
                 android:enabled="false"
                 android:shouldDisableView="false"
+                android:selectable="false"
                 android:title="@string/model_info"
-                android:summary="@string/device_info_default"/>
+                android:summary="@string/device_info_default"
+                settings:allowDividerAbove="true"
+                settings:allowDividerBelow="true"/>
 
         <!-- Device firmware version -->
         <Preference android:key="firmware_version"
@@ -92,25 +97,37 @@
         </PreferenceScreen>
 
         <!-- Device FCC equipment id -->
-        <Preference android:key="fcc_equipment_id"
+        <com.android.settings.DividerPreference
+                android:key="fcc_equipment_id"
                 android:enabled="false"
                 android:shouldDisableView="false"
+                android:selectable="false"
                 android:title="@string/fcc_equipment_id"
-                android:summary="@string/device_info_default"/>
+                android:summary="@string/device_info_default"
+                settings:allowDividerAbove="true"
+                settings:allowDividerBelow="true"/>
 
         <!-- Device Baseband version -->
-        <Preference android:key="baseband_version"
+        <com.android.settings.DividerPreference
+                android:key="baseband_version"
                 android:enabled="false"
                 android:shouldDisableView="false"
+                android:selectable="false"
                 android:title="@string/baseband_version"
-                android:summary="@string/device_info_default"/>
+                android:summary="@string/device_info_default"
+                settings:allowDividerAbove="true"
+                settings:allowDividerBelow="true"/>
 
         <!-- Device Kernel version -->
-        <Preference android:key="kernel_version"
+        <com.android.settings.DividerPreference
+                android:key="kernel_version"
                 android:enabled="false"
                 android:shouldDisableView="false"
+                android:selectable="false"
                 android:title="@string/kernel_version"
-                android:summary="@string/device_info_default"/>
+                android:summary="@string/device_info_default"
+                settings:allowDividerAbove="true"
+                settings:allowDividerBelow="true"/>
 
         <!-- Detailed build version -->
         <Preference android:key="build_number"
@@ -120,10 +137,14 @@
                 android:summary="@string/device_info_default"/>
 
         <!-- SELinux status information -->
-        <Preference android:key="selinux_status"
+        <com.android.settings.DividerPreference
+                android:key="selinux_status"
                 android:enabled="false"
                 android:shouldDisableView="false"
+                android:selectable="false"
                 android:title="@string/selinux_status"
-                android:summary="@string/selinux_status_enforcing"/>
+                android:summary="@string/selinux_status_enforcing"
+                settings:allowDividerAbove="true"
+                settings:allowDividerBelow="true"/>
 
 </PreferenceScreen>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index e797b4f..b5e2848 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -79,19 +79,10 @@
                 android:key="lift_to_wake"
                 android:title="@string/lift_to_wake_title" />
 
-        <PreferenceScreen
+        <SwitchPreference
                 android:key="doze"
-                android:title="@string/ambient_display_title"
-                android:summary="@string/doze_summary" >
-                <intent
-                    android:targetPackage="com.android.settings"
-                    android:targetClass="com.android.settings.Settings$GestureSettingsActivity" >
-                    <extra android:name="show_drawer_menu"
-                           android:value="true" />
-                    <extra android:name="gesture_scroll_to_preference"
-                           android:value="gesture_pick_up_and_nudge" />
-                </intent>
-        </PreferenceScreen>
+                android:title="@string/doze_title"
+                android:summary="@string/doze_summary" />
 
         <SwitchPreference
                 android:key="tap_to_wake"
diff --git a/res/xml/gesture_settings.xml b/res/xml/gesture_settings.xml
index c5d4ab4..af365bf 100644
--- a/res/xml/gesture_settings.xml
+++ b/res/xml/gesture_settings.xml
@@ -20,10 +20,10 @@
     settings:keywords="@string/keywords_gesture">
 
     <com.android.settings.gestures.GesturePreference
-            android:key="gesture_swipe_down_fingerprint"
-            android:title="@string/fingerprint_swipe_for_notifications_title"
-            android:summary="@string/fingerprint_swipe_for_notifications_summary"
-            settings:animation="@raw/gesture_fingerprint_swipe"/>
+        android:key="gesture_swipe_down_fingerprint"
+        android:title="@string/fingerprint_swipe_for_notifications_title"
+        android:summary="@string/fingerprint_swipe_for_notifications_summary"
+        settings:animation="@raw/gesture_fingerprint_swipe"/>
 
     <com.android.settings.gestures.GesturePreference
         android:key="gesture_double_tap_power"
@@ -38,9 +38,15 @@
         settings:animation="@raw/gesture_twist"/>
 
     <com.android.settings.gestures.GesturePreference
-        android:key="gesture_pick_up_and_nudge"
+        android:key="gesture_double_tap_screen"
         android:title="@string/ambient_display_title"
         android:summary="@string/ambient_display_summary"
         settings:animation="@raw/gesture_ambient_tap"/>
 
+    <com.android.settings.gestures.GesturePreference
+        android:key="gesture_pick_up"
+        android:title="@string/ambient_display_pickup_title"
+        android:summary="@string/ambient_display_pickup_summary"
+        settings:animation="@raw/gesture_ambient_lift"/>
+
 </PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/BackupSettingsActivity.java b/src/com/android/settings/BackupSettingsActivity.java
index 94e9691..a4cc4b7 100644
--- a/src/com/android/settings/BackupSettingsActivity.java
+++ b/src/com/android/settings/BackupSettingsActivity.java
@@ -17,8 +17,13 @@
 package com.android.settings;
 
 import android.app.Activity;
+import android.app.backup.BackupManager;
+import android.app.backup.IBackupManager;
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.ServiceManager;
+import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -43,6 +48,17 @@
                 Intent intent = Intent.parseUri(backup, 0);
                 if (intent.resolveActivity(getPackageManager()) != null) {
                     // use startActivityForResult to let the activity check the caller signature
+                    IBackupManager bmgr = IBackupManager.Stub.asInterface(
+                            ServiceManager.getService(Context.BACKUP_SERVICE));
+                    boolean backupOkay;
+                    try {
+                        backupOkay = bmgr.isBackupServiceActive(UserHandle.myUserId());
+                    } catch (Exception e) {
+                        // things go wrong talking to the backup system => ignore and
+                        // pass the default 'false' as the "backup is a thing?" state.
+                        backupOkay = false;
+                    }
+                    intent.putExtra(BackupManager.EXTRA_BACKUP_SERVICES_AVAILABLE, backupOkay);
                     startActivityForResult(intent, -1);
                 } else {
                     Log.e(TAG, "Backup component not found!");
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
index 5d5d54e..1fed189 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -38,6 +38,7 @@
 import android.text.format.DateFormat;
 import android.widget.DatePicker;
 import android.widget.TimePicker;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -235,6 +236,18 @@
         }
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        switch (dialogId) {
+            case DIALOG_DATEPICKER:
+                return MetricsEvent.DIALOG_DATE_PICKER;
+            case DIALOG_TIMEPICKER:
+                return MetricsEvent.DIALOG_TIME_PICKER;
+            default:
+                return 0;
+        }
+    }
+
     static void configureDatePicker(DatePicker datePicker) {
         // The system clock can't represent dates outside this range.
         Calendar t = Calendar.getInstance();
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 5614767..0e680bc 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -39,7 +39,6 @@
 import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -58,6 +57,7 @@
 
 import static android.provider.Settings.Secure.CAMERA_GESTURE_DISABLED;
 import static android.provider.Settings.Secure.DOUBLE_TAP_TO_WAKE;
+import static android.provider.Settings.Secure.DOZE_ENABLED;
 import static android.provider.Settings.Secure.WAKE_GESTURE_ENABLED;
 import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE;
 import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
@@ -92,10 +92,10 @@
     private ListPreference mNightModePreference;
     private Preference mScreenSaverPreference;
     private SwitchPreference mLiftToWakePreference;
+    private SwitchPreference mDozePreference;
     private SwitchPreference mTapToWakePreference;
     private SwitchPreference mAutoBrightnessPreference;
     private SwitchPreference mCameraGesturePreference;
-    private PreferenceScreen mDozePreference;
 
     @Override
     public int getMetricsCategory() {
@@ -139,10 +139,11 @@
             removePreference(KEY_LIFT_TO_WAKE);
         }
 
-        if (!isDozeAvailable(activity)) {
-            removePreference(KEY_DOZE);
+        if (isDozeAvailable(activity)) {
+            mDozePreference = (SwitchPreference) findPreference(KEY_DOZE);
+            mDozePreference.setOnPreferenceChangeListener(this);
         } else {
-            mDozePreference = (PreferenceScreen) findPreference(KEY_DOZE);
+            removePreference(KEY_DOZE);
         }
 
         if (isTapToWakeAvailable(getResources())) {
@@ -360,6 +361,12 @@
             mTapToWakePreference.setChecked(value != 0);
         }
 
+        // Update doze if it is available.
+        if (mDozePreference != null) {
+            int value = Settings.Secure.getInt(getContentResolver(), DOZE_ENABLED, 1);
+            mDozePreference.setChecked(value != 0);
+        }
+
         // Update camera gesture #1 if it is available.
         if (mCameraGesturePreference != null) {
             int value = Settings.Secure.getInt(getContentResolver(), CAMERA_GESTURE_DISABLED, 0);
@@ -407,6 +414,10 @@
             boolean value = (Boolean) objValue;
             Settings.Secure.putInt(getContentResolver(), WAKE_GESTURE_ENABLED, value ? 1 : 0);
         }
+        if (preference == mDozePreference) {
+            boolean value = (Boolean) objValue;
+            Settings.Secure.putInt(getContentResolver(), DOZE_ENABLED, value ? 1 : 0);
+        }
         if (preference == mTapToWakePreference) {
             boolean value = (Boolean) objValue;
             Settings.Secure.putInt(getContentResolver(), DOUBLE_TAP_TO_WAKE, value ? 1 : 0);
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 01b0632..559b9ce 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -120,6 +120,7 @@
     public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class OtherSoundSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ManageDomainUrlsActivity extends SettingsActivity { /* empty */ }
+    public static class AutomaticStorageManagerSettingsActivity extends SettingsActivity { /* empty */ }
 
     public static class TopLevelSettings extends SettingsActivity { /* empty */ }
     public static class ApnSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 222e6eb..69b86fe 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -76,6 +76,7 @@
 import com.android.settings.dashboard.DashboardContainerFragment;
 import com.android.settings.dashboard.SearchResultsSummary;
 import com.android.settings.datausage.DataUsageSummary;
+import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
 import com.android.settings.deviceinfo.ImeiInformation;
 import com.android.settings.deviceinfo.PrivateVolumeForget;
 import com.android.settings.deviceinfo.PrivateVolumeSettings;
@@ -356,6 +357,7 @@
             MasterClear.class.getName(),
             NightDisplaySettings.class.getName(),
             ManageDomainUrls.class.getName(),
+            AutomaticStorageManagerSettings.class.getName()
     };
 
 
diff --git a/src/com/android/settings/TrustedCredentialsDialogBuilder.java b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
index 31042cb..03414bd 100644
--- a/src/com/android/settings/TrustedCredentialsDialogBuilder.java
+++ b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
@@ -138,7 +138,7 @@
                     onClickOk();
                 }
             } else if (view == mNegativeButton) {
-                onClickRemove();
+                onClickEnableOrDisable();
             }
         }
 
@@ -155,21 +155,26 @@
             }
         }
 
-        private void onClickRemove() {
+        private void onClickEnableOrDisable() {
             final CertHolder certHolder = getCurrentCertInfo();
-            new AlertDialog.Builder(mActivity)
-                    .setMessage(getButtonConfirmation(certHolder))
-                    .setPositiveButton(android.R.string.yes,
-                            new DialogInterface.OnClickListener() {
-                                @Override
-                                public void onClick(DialogInterface dialog, int id) {
-                                    mDelegate.removeOrInstallCert(certHolder);
-                                    dialog.dismiss();
-                                    nextOrDismiss();
-                                }
-                            })
-                    .setNegativeButton(android.R.string.no, null)
-                    .show();
+            DialogInterface.OnClickListener onConfirm = new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int id) {
+                    mDelegate.removeOrInstallCert(certHolder);
+                    nextOrDismiss();
+                }
+            };
+            if (certHolder.isSystemCert()) {
+                // Removing system certs is reversible, so skip confirmation.
+                onConfirm.onClick(null, -1);
+            } else {
+                new AlertDialog.Builder(mActivity)
+                        .setMessage(R.string.trusted_credentials_remove_confirmation)
+                        .setPositiveButton(android.R.string.yes, onConfirm)
+                        .setNegativeButton(android.R.string.no, null)
+                        .show();
+
+            }
         }
 
         private void onCredentialConfirmed(int userId) {
@@ -314,13 +319,6 @@
             return certLayout;
         }
 
-        private static int getButtonConfirmation(CertHolder certHolder) {
-            return certHolder.isSystemCert() ? ( certHolder.isDeleted()
-                        ? R.string.trusted_credentials_enable_confirmation
-                        : R.string.trusted_credentials_disable_confirmation )
-                    : R.string.trusted_credentials_remove_confirmation;
-        }
-
         private static int getButtonLabel(CertHolder certHolder) {
             return certHolder.isSystemCert() ? ( certHolder.isDeleted()
                         ? R.string.trusted_credentials_enable_label
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java
index 4cefc74..bae0a92 100644
--- a/src/com/android/settings/TrustedCredentialsSettings.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -318,7 +318,8 @@
      * whereas children correspond to certificates.
      */
     private class GroupAdapter extends BaseExpandableListAdapter implements
-            ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener {
+            ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener,
+            View.OnClickListener {
         private final AdapterData mData;
 
         private GroupAdapter(Tab tab) {
@@ -402,6 +403,16 @@
             return true;
         }
 
+        /**
+         * Called when the switch on a system certificate is clicked. This will toggle whether it
+         * is trusted as a credential.
+         */
+        @Override
+        public void onClick(View view) {
+            CertHolder holder = (CertHolder) view.getTag();
+            removeOrInstallCert(holder);
+        }
+
         @Override
         public boolean onGroupClick(ExpandableListView expandableListView, View view,
                 int groupPosition, long id) {
@@ -459,16 +470,17 @@
                 ViewGroup parent) {
             ViewHolder holder;
             if (convertView == null) {
+                holder = new ViewHolder();
                 LayoutInflater inflater = LayoutInflater.from(getActivity());
                 convertView = inflater.inflate(R.layout.trusted_credential, parent, false);
-                holder = new ViewHolder();
+                convertView.setTag(holder);
                 holder.mSubjectPrimaryView = (TextView)
                         convertView.findViewById(R.id.trusted_credential_subject_primary);
                 holder.mSubjectSecondaryView = (TextView)
                         convertView.findViewById(R.id.trusted_credential_subject_secondary);
                 holder.mSwitch = (Switch) convertView.findViewById(
                         R.id.trusted_credential_status);
-                convertView.setTag(holder);
+                holder.mSwitch.setOnClickListener(this);
             } else {
                 holder = (ViewHolder) convertView.getTag();
             }
@@ -480,6 +492,7 @@
                         UserManager.DISALLOW_CONFIG_CREDENTIALS,
                         new UserHandle(certHolder.mProfileId)));
                 holder.mSwitch.setVisibility(View.VISIBLE);
+                holder.mSwitch.setTag(certHolder);
             }
             return convertView;
         }
@@ -576,6 +589,7 @@
             mListView = (ListView) mContainerView.findViewById(R.id.cert_list);
             mListView.setAdapter(this);
             mListView.setOnItemClickListener(this);
+            mListView.setItemsCanFocus(true);
 
             mHeaderView = (ViewGroup) mContainerView.findViewById(R.id.header_view);
             mHeaderView.setOnClickListener(this);
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index fc572fb..b73795f 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -202,6 +202,14 @@
         return super.onCreateDialog(dialogId);
     }
 
+    @Override
+    public int getDialogMetricsCategory(int dialogId) {
+        if (MANAGE_MOBILE_PLAN_DIALOG_ID == dialogId) {
+            return MetricsEvent.DIALOG_MANAGE_MOBILE_PLAN;
+        }
+        return 0;
+    }
+
     private void log(String s) {
         Log.d(TAG, s);
     }
diff --git a/src/com/android/settings/dashboard/conditional/DndCondition.java b/src/com/android/settings/dashboard/conditional/DndCondition.java
index dcab279..49d67c2 100644
--- a/src/com/android/settings/dashboard/conditional/DndCondition.java
+++ b/src/com/android/settings/dashboard/conditional/DndCondition.java
@@ -139,8 +139,11 @@
         public void onReceive(Context context, Intent intent) {
             if (NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED_INTERNAL
                     .equals(intent.getAction())) {
-                ConditionManager.get(context).getCondition(DndCondition.class)
-                        .refreshState();
+                final Condition condition =
+                        ConditionManager.get(context).getCondition(DndCondition.class);
+                if (condition != null) {
+                    condition.refreshState();
+                }
             }
         }
     }
diff --git a/src/com/android/settings/gestures/GesturePreference.java b/src/com/android/settings/gestures/GesturePreference.java
index 2d921bf..4536aa2 100644
--- a/src/com/android/settings/gestures/GesturePreference.java
+++ b/src/com/android/settings/gestures/GesturePreference.java
@@ -58,7 +58,6 @@
     public GesturePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContext = context;
-        setLayoutResource(R.layout.gesture_preference);
         TypedArray attributes = context.getTheme().obtainStyledAttributes(
                 attrs,
                 R.styleable.GesturePreference,
@@ -70,7 +69,8 @@
                     .appendPath(String.valueOf(animation))
                     .build();
             mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
-            if (mMediaPlayer != null) {
+            if (mMediaPlayer != null && mMediaPlayer.getDuration() > 0) {
+                setLayoutResource(R.layout.gesture_preference);
                 mMediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
                     @Override
                     public void onSeekComplete(MediaPlayer mp) {
@@ -84,9 +84,8 @@
                         mediaPlayer.setLooping(true);
                     }
                 });
+                mAnimationAvailable = true;
             }
-            mAnimationAvailable = true;
-
         } catch (Exception e) {
             Log.w(TAG, "Animation resource not found. Will not show animation.");
         } finally {
@@ -97,15 +96,14 @@
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
+
+        if (!mAnimationAvailable) {
+            return;
+        }
+
         final TextureView video = (TextureView) holder.findViewById(R.id.gesture_video);
         final ImageView imageView = (ImageView) holder.findViewById(R.id.gesture_image);
         final ImageView playButton = (ImageView) holder.findViewById(R.id.gesture_play_button);
-        final View animationFrame = holder.findViewById(R.id.gesture_animation_frame);
-
-        if (!mAnimationAvailable) {
-            animationFrame.setVisibility(View.GONE);
-            return;
-        }
 
         video.setOnClickListener(new View.OnClickListener() {
             @Override
@@ -182,7 +180,9 @@
     }
 
     void loadPreview(LoaderManager manager, int id) {
-        Loader<Bitmap> loader = manager.initLoader(id, Bundle.EMPTY, this);
+        if (mAnimationAvailable) {
+            Loader<Bitmap> loader = manager.initLoader(id, Bundle.EMPTY, this);
+        }
     }
 
     void onViewVisible() {
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
index 9f127b5..8cb329b 100644
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -52,16 +52,16 @@
     private static final String TAG = "GestureSettings";
     private static final String PREF_KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power";
     private static final String PREF_KEY_DOUBLE_TWIST = "gesture_double_twist";
-    private static final String PREF_KEY_PICK_UP_AND_NUDGE = "gesture_pick_up_and_nudge";
+    private static final String PREF_KEY_PICK_UP = "gesture_pick_up";
     private static final String PREF_KEY_SWIPE_DOWN_FINGERPRINT = "gesture_swipe_down_fingerprint";
+    private static final String PREF_KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen";
     private static final String DEBUG_DOZE_COMPONENT = "debug.doze.component";
-    private static final String ARG_SCROLL_TO_PREFERENCE = "gesture_scroll_to_preference";
     private static final int PREF_ID_DOUBLE_TAP_POWER = 0;
     private static final int PREF_ID_DOUBLE_TWIST = 1;
-    private static final int PREF_ID_PICK_UP_AND_NUDG = 2;
+    private static final int PREF_ID_PICK_UP = 2;
     private static final int PREF_ID_SWIPE_DOWN_FINGERPRINT = 3;
+    private static final int PREF_ID_DOUBLE_TAP_SCREEN = 4;
 
-    private int mScrollPosition = -1;
     private List<GesturePreference> mPreferences;
 
     @Override
@@ -82,16 +82,19 @@
 
         // Ambient Display
         if (isDozeAvailable(context)) {
-            int dozeEnabled = Secure.getInt(getContentResolver(), Secure.DOZE_ENABLED, 1);
-            addPreference(PREF_KEY_PICK_UP_AND_NUDGE, dozeEnabled != 0, PREF_ID_DOUBLE_TWIST);
+            int pickup = Secure.getInt(getContentResolver(), Secure.DOZE_PULSE_ON_PICK_UP, 1);
+            addPreference(PREF_KEY_PICK_UP, pickup != 0, PREF_ID_PICK_UP);
+            int doubleTap = Secure.getInt(getContentResolver(), Secure.DOZE_PULSE_ON_DOUBLE_TAP, 1);
+            addPreference(PREF_KEY_DOUBLE_TAP_SCREEN, doubleTap != 0, PREF_ID_DOUBLE_TAP_SCREEN);
         } else {
-            removePreference(PREF_KEY_PICK_UP_AND_NUDGE);
+            removePreference(PREF_KEY_PICK_UP);
+            removePreference(PREF_KEY_DOUBLE_TAP_SCREEN);
         }
 
         // Fingerprint slide for notifications
         if (isSystemUINavigationAvailable(context)) {
             addPreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT, isSystemUINavigationEnabled(context),
-                    PREF_ID_PICK_UP_AND_NUDG);
+                    PREF_ID_SWIPE_DOWN_FINGERPRINT);
         } else {
             removePreference(PREF_KEY_SWIPE_DOWN_FINGERPRINT);
         }
@@ -100,23 +103,11 @@
         if (isDoubleTwistAvailable(context)) {
             int doubleTwistEnabled = Secure.getInt(
                     getContentResolver(), Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1);
-            addPreference(PREF_KEY_DOUBLE_TWIST, doubleTwistEnabled != 0,
-                    PREF_ID_SWIPE_DOWN_FINGERPRINT);
+            addPreference(PREF_KEY_DOUBLE_TWIST, doubleTwistEnabled != 0, PREF_ID_DOUBLE_TWIST);
         } else {
             removePreference(PREF_KEY_DOUBLE_TWIST);
         }
 
-        if (savedInstanceState == null) {
-            final Bundle args = getArguments();
-            if (args != null && args.containsKey(ARG_SCROLL_TO_PREFERENCE)) {
-                String prefKey = args.getString(ARG_SCROLL_TO_PREFERENCE);
-                GesturePreference pref = (GesturePreference) findPreference(prefKey);
-                if (pref != null) {
-                    mScrollPosition = pref.getOrder();
-                }
-            }
-        }
-
     }
 
     @Override
@@ -124,9 +115,6 @@
                              Bundle savedInstanceState) {
         View view = super.onCreateView(inflater, container, savedInstanceState);
         RecyclerView listview = getListView();
-        if (mScrollPosition >= 0) {
-            listview.scrollToPosition(mScrollPosition);
-        }
         listview.addOnScrollListener(new RecyclerView.OnScrollListener() {
             @Override
             public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
@@ -163,8 +151,10 @@
         if (PREF_KEY_DOUBLE_TAP_POWER.equals(key)) {
             Secure.putInt(getContentResolver(),
                     Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, enabled ? 0 : 1);
-        } else if (PREF_KEY_PICK_UP_AND_NUDGE.equals(key)) {
-            Secure.putInt(getContentResolver(), Secure.DOZE_ENABLED, enabled ? 1 : 0);
+        } else if (PREF_KEY_PICK_UP.equals(key)) {
+            Secure.putInt(getContentResolver(), Secure.DOZE_PULSE_ON_PICK_UP, enabled ? 1 : 0);
+        } else if (PREF_KEY_DOUBLE_TAP_SCREEN.equals(key)) {
+            Secure.putInt(getContentResolver(), Secure.DOZE_PULSE_ON_DOUBLE_TAP, enabled ? 1 : 0);
         } else if (PREF_KEY_SWIPE_DOWN_FINGERPRINT.equals(key)) {
             Secure.putInt(getContentResolver(),
                     Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, enabled ? 1 : 0);
@@ -255,7 +245,8 @@
                     result.add(PREF_KEY_DOUBLE_TAP_POWER);
                 }
                 if (!isDozeAvailable(context)) {
-                    result.add(PREF_KEY_PICK_UP_AND_NUDGE);
+                    result.add(PREF_KEY_PICK_UP);
+                    result.add(PREF_KEY_DOUBLE_TAP_SCREEN);
                 }
                 if (!isSystemUINavigationAvailable(context)) {
                     result.add(PREF_KEY_SWIPE_DOWN_FINGERPRINT);
@@ -267,4 +258,4 @@
             }
         };
 
-}
\ No newline at end of file
+}
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
index a641648..979c27d 100644
--- a/tests/app/Android.mk
+++ b/tests/app/Android.mk
@@ -7,15 +7,13 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
 
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-    android-support-v4
-
 LOCAL_STATIC_JAVA_LIBRARIES := \
     android-support-test \
     mockito-target \
     espresso-core \
-    espresso-contrib \
-    espresso-intents
+    espresso-contrib-nodep \
+    espresso-intents-nodep \
+    ub-uiautomator
 
 # Include all test java files.
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/tests/app/src/com/android/settings/gesture/GestureSettingsTest.java b/tests/app/src/com/android/settings/gesture/GestureSettingsTest.java
new file mode 100644
index 0000000..4f3a524
--- /dev/null
+++ b/tests/app/src/com/android/settings/gesture/GestureSettingsTest.java
@@ -0,0 +1,195 @@
+/*
+ * 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.
+ */
+package com.android.settings.gesture;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings.Secure;
+import android.support.test.filters.MediumTest;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject;
+import android.support.test.uiautomator.UiSelector;
+import android.support.test.uiautomator.UiScrollable;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+import android.widget.RelativeLayout;
+import android.widget.Switch;
+
+import com.android.settings.R;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+import org.junit.Test;
+
+/**
+ * Test for Gesture preferences.
+ */
+@MediumTest
+public class GestureSettingsTest extends InstrumentationTestCase {
+
+    private static final String TAG = "GestureSettingsTest";
+
+    private UiDevice mDevice;
+    private Context mTargetContext;
+    private String mTargetPackage;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = UiDevice.getInstance(getInstrumentation());
+        mTargetContext = getInstrumentation().getTargetContext();
+        mTargetPackage = mTargetContext.getPackageName();
+    }
+
+    @Test
+    public void testAmbientDisplaySwitchPreference() throws Exception {
+        launchSettings();
+        UiObject dozeSwitch = getDozeSwitch();
+        assertNotNull(dozeSwitch);
+        assertTrue(dozeSwitch.exists());
+        assertToggleStateMatchesSettingValue(dozeSwitch, Secure.DOZE_ENABLED, 1, 1);
+    }
+
+    @Test
+    public void testGestureSettingsExists() throws Exception {
+        launchMoves();
+        UiObject titleObj = mDevice.findObject(new UiSelector().text(
+                mTargetContext.getResources().getString(R.string.gesture_preference_title)));
+        assertNotNull(titleObj);
+        assertTrue(titleObj.exists());
+    }
+
+    @Test
+    public void testCameraDoubleTapToggle() throws Exception {
+        assertSwitchToggle(mTargetContext.getResources().getString(
+                R.string.double_tap_power_for_camera_title),
+                Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, 0);
+    }
+
+    @Test
+    public void testCameraDoubleTwistToggle() throws Exception {
+        assertSwitchToggle(mTargetContext.getResources().getString(
+                R.string.double_twist_for_camera_mode_title),
+                Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1, 1);
+    }
+
+    @Test
+    public void testFingerprintSwipeToggle() throws Exception {
+        assertSwitchToggle(mTargetContext.getResources().getString(
+                R.string.fingerprint_swipe_for_notifications_title),
+                Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0, 1);
+    }
+
+    @Test
+    public void testDozeDoubleTapToggle() throws Exception {
+        assertSwitchToggle(mTargetContext.getResources().getString(
+                R.string.ambient_display_title),
+                Secure.DOZE_PULSE_ON_DOUBLE_TAP, 1, 1);
+    }
+
+    @Test
+    public void testDozePickupToggle() throws Exception {
+        assertSwitchToggle(mTargetContext.getResources().getString(
+                R.string.ambient_display_pickup_title),
+                Secure.DOZE_PULSE_ON_PICK_UP, 1, 1);
+    }
+
+    private void launchSettings() {
+        Intent settingsIntent = new Intent(Intent.ACTION_MAIN)
+                .addCategory(Intent.CATEGORY_LAUNCHER)
+                .setPackage(mTargetPackage)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        getInstrumentation().getContext().startActivity(settingsIntent);
+    }
+
+    private void launchMoves() throws Exception  {
+        launchSettings();
+        UiScrollable settings = new UiScrollable(
+                new UiSelector().packageName(mTargetPackage).scrollable(true));
+        String titleMoves =
+                mTargetContext.getResources().getString(R.string.gesture_preference_title);
+        settings.scrollTextIntoView(titleMoves);
+        mDevice.findObject(new UiSelector().text(titleMoves)).click();
+    }
+
+    private void navigateToMovesSetting(String title) throws Exception {
+        launchMoves();
+        UiScrollable moves = new UiScrollable(
+                new UiSelector().packageName(mTargetPackage).scrollable(true));
+        moves.scrollTextIntoView(title);
+    }
+
+    private UiScrollable navigateToAmbientDisplay() throws Exception {
+        UiScrollable settings = new UiScrollable(
+                new UiSelector().packageName(mTargetPackage).scrollable(true));
+        String titleDisplay =
+                mTargetContext.getResources().getString(R.string.display_settings_title);
+        settings.scrollTextIntoView(titleDisplay);
+        mDevice.findObject(new UiSelector().text(titleDisplay)).click();
+        settings.scrollTextIntoView(mTargetContext.getResources().getString(R.string.doze_title));
+        return settings;
+    }
+
+    private UiObject getGestureSwitch(String title) throws Exception {
+        UiObject titleView = mDevice.findObject(new UiSelector().text(title));
+        UiObject gestureSwitch =
+            titleView.getFromParent(new UiSelector().className(Switch.class.getName()));
+        assertNotNull(gestureSwitch);
+        assertTrue(gestureSwitch.exists());
+        return gestureSwitch;
+    }
+
+    private UiObject getDozeSwitch() throws Exception {
+        UiScrollable settings = navigateToAmbientDisplay();
+        UiObject dozeSwitch = null;
+        UiSelector relativeLayoutSelector =
+                new UiSelector().className(RelativeLayout.class.getName());
+        String titleDoze = mTargetContext.getResources().getString(R.string.doze_title);
+        for (int i = 0; i <= settings.getChildCount(relativeLayoutSelector); i++) {
+            UiObject relativeLayout = settings.getChild(relativeLayoutSelector.instance(i));
+            if (relativeLayout.getChildCount() != 2) {
+                continue;
+            }
+            UiObject obj1 = relativeLayout.getChild(new UiSelector().index(0));
+            if (obj1.getText() == titleDoze) {
+                return relativeLayout.getFromParent(
+                        new UiSelector().className(Switch.class.getName()));
+            }
+        }
+        return null;
+    }
+
+    private void assertSwitchToggle(String title, String key, int defaultVal, int enabledVal)
+            throws Exception {
+        navigateToMovesSetting(title);
+        assertToggleStateMatchesSettingValue(getGestureSwitch(title), key, defaultVal, enabledVal);
+    }
+
+    private void assertToggleStateMatchesSettingValue (
+            UiObject testSwitch, String key, int defaultVal, int enabledVal) throws Exception {
+        // check initial state
+        int currentValue = Secure.getInt(mTargetContext.getContentResolver(), key, defaultVal);
+        boolean enabled = currentValue == enabledVal;
+        assertEquals(enabled, testSwitch.isChecked());
+        // toggle the preference
+        testSwitch.click();
+        assertEquals(!enabled, testSwitch.isChecked());
+        int newValue = currentValue == 1 ? 0 : 1;
+        assertEquals(newValue, Secure.getInt(mTargetContext.getContentResolver(), key, defaultVal));
+    }
+
+}