Added new setting for gestures.

Added a new entry to the top level Settings' Device section to
enable/disable gestures.

Bug: 28565958

Change-Id: Icf642b6a3058c692fb2be9914579996598f03b7d
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8b9f368..3f9978c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2925,6 +2925,24 @@
                        android:value="com.android.settings.deletionhelper.DeletionHelperFragment" />
         </activity>
 
+        <!-- activity for gesture settings -->
+        <activity android:name="Settings$GestureSettingsActivity"
+                  android:label="@string/gesture_preference_title"
+                  android:icon="@drawable/ic_settings_gestures"
+                  android:taskAffinity="">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="com.android.settings.action.SETTINGS" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.category"
+                       android:value="com.android.settings.category.device" />
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                       android:value="com.android.settings.gestures.GestureSettings" />
+        </activity>
+
         <service
             android:name=".SettingsDumpService"
             android:exported="true"
diff --git a/res/drawable/ic_settings_gestures.xml b/res/drawable/ic_settings_gestures.xml
new file mode 100644
index 0000000..9537bed
--- /dev/null
+++ b/res/drawable/ic_settings_gestures.xml
@@ -0,0 +1,25 @@
+<!--
+    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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorAccent">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M9,11.24L9,7.5C9,6.12 10.12,5 11.5,5S14,6.12 14,7.5v3.74c1.21,-0.81 2,-2.18 2,-3.74C16,5.01 13.99,3 11.5,3S7,5.01 7,7.5c0,1.56 0.79,2.93 2,3.74zM18.84,15.87l-4.54,-2.26c-0.17,-0.07 -0.35,-0.11 -0.54,-0.11L13,13.5v-6c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,6.67 10,7.5v10.74l-3.43,-0.72c-0.08,-0.01 -0.15,-0.03 -0.24,-0.03 -0.31,0 -0.59,0.13 -0.79,0.33l-0.79,0.8 4.94,4.94c0.27,0.27 0.65,0.44 1.06,0.44h6.79c0.75,0 1.33,-0.55 1.44,-1.28l0.75,-5.27c0.01,-0.07 0.02,-0.14 0.02,-0.2 0,-0.62 -0.38,-1.16 -0.91,-1.38z"/>
+</vector>
\ No newline at end of file
diff --git a/res/layout/gesture_preference.xml b/res/layout/gesture_preference.xml
new file mode 100644
index 0000000..9a388c5
--- /dev/null
+++ b/res/layout/gesture_preference.xml
@@ -0,0 +1,93 @@
+<?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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:gravity="center_vertical"
+    android:background="?android:attr/activatedBackgroundIndicator"
+    android:clipToPadding="false"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:orientation="horizontal"
+        android:paddingTop="16dp"
+        android:paddingBottom="16dp"
+        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:singleLine="true"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            android:ellipsize="marquee"/>
+
+        <Switch
+            android:id="@android:id/switch_widget"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="end|center_vertical"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:background="@color/gestures_setting_backgroud_color"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+        android:orientation="horizontal">
+
+        <FrameLayout
+            android:layout_width="@dimen/gestures_settings_video_width"
+            android:layout_height="@dimen/gestures_settings_video_height">
+
+            <TextureView
+                android:id="@+id/gesture_video"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_gravity="center"/>
+
+            <ImageView
+                android:id="@+id/gesture_image"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:visibility="gone"/>
+
+        </FrameLayout>
+
+        <TextView
+            android:id="@android:id/summary"
+            android:layout_width="@dimen/gestures_settings_summary_width"
+            android:layout_height="@dimen/gestures_settings_summary_height"
+            android:layout_weight="1"
+            android:paddingTop="@dimen/gestures_settings_padding_top_bottom"
+            android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+            android:textColor="?android:attr/textColorSecondary"
+            android:maxLines="10"
+            android:ellipsize="end"/>
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/res/raw/gesture_ambient_move_lift.mp4 b/res/raw/gesture_ambient_move_lift.mp4
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/res/raw/gesture_ambient_move_lift.mp4
diff --git a/res/raw/gesture_ambient_tap.mp4 b/res/raw/gesture_ambient_tap.mp4
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/res/raw/gesture_ambient_tap.mp4
diff --git a/res/raw/gesture_double_tap.mp4 b/res/raw/gesture_double_tap.mp4
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/res/raw/gesture_double_tap.mp4
diff --git a/res/raw/gesture_fingerprint_swipe.mp4 b/res/raw/gesture_fingerprint_swipe.mp4
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/res/raw/gesture_fingerprint_swipe.mp4
diff --git a/res/raw/gesture_twist.mp4 b/res/raw/gesture_twist.mp4
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/res/raw/gesture_twist.mp4
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index ca3d247..ffc233b 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -137,4 +137,10 @@
         <attr name="allowDividerAbove" format="boolean" />
         <attr name="allowDividerBelow" format="boolean" />
     </declare-styleable>
+
+    <!-- For GesturePreference -->
+    <declare-styleable name="GesturePreference">
+        <attr name="animation" format="reference" />
+    </declare-styleable>
+
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index a462edc..b2d043f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -131,4 +131,7 @@
     <color name="accent_color">@color/accent_material_light</color>
     <color name="accent_color_lighter">#ff7fcac3</color>
 
+    <!-- Gestures settings -->
+    <color name="gestures_setting_backgroud_color">#f5f5f5</color>
+
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index c50e226..c4e471f 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -296,4 +296,11 @@
     <!-- Padding between the radio buttons/checkbox and text on the redaction interstitial -->
     <dimen name="redaction_padding_start">16dp</dimen>
 
+    <!-- Padding for Gestures settings screen -->
+    <dimen name="gestures_settings_title_height">56dp</dimen>
+    <dimen name="gestures_settings_video_height">206dp</dimen>
+    <dimen name="gestures_settings_video_width">206dp</dimen>
+    <dimen name="gestures_settings_summary_height">206dp</dimen>
+    <dimen name="gestures_settings_summary_width">206dp</dimen>
+    <dimen name="gestures_settings_padding_top_bottom">20dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4a5650f..971ec82 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7660,4 +7660,35 @@
     <!-- Automatic storage management service label. [CHAR LIMIT=40]-->
     <string name="automatic_storage_manager_service_label">Automatic Storage Management Service</string>
 
+    <!-- Preference title for gesture settings [CHAR LIMIT=25]-->
+    <string name="gesture_preference_title">Gestures</string>
+
+    <!-- Title text for double tap power for camera [CHAR LIMIT=60]-->
+    <string name="double_tap_power_for_camera_title">Jump to Camera</string>
+
+    <!-- Summary text for double tap power for camera [CHAR LIMIT=160]-->
+    <string name="double_tap_power_for_camera_summary">To quickly open camera, just double-tap the power button. Works from any screen.</string>
+
+    <!-- Title text for double twist for camera mode [CHAR LIMIT=60]-->
+    <string name="double_twist_for_camera_mode_title">Flip camera</string>
+
+    <!-- Summary text for double twist for camera mode  [CHAR LIMIT=160]-->
+    <string name="double_twist_for_camera_mode_summary">To switch between front and back cameras, double-twist.</string>
+
+    <!-- Title text for ambient display [CHAR LIMIT=60]-->
+    <string name="ambient_display_title">Quick screen check</string>
+
+    <!-- Summary text for ambient display [CHAR LIMIT=160]-->
+    <string name="ambient_display_summary">To check your phone without waking it up fully, nudge or 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>
+
+    <!-- Summary text for fingerprint swipe for notifications [CHAR LIMIT=160]-->
+    <string name="fingerprint_swipe_for_notifications_summary">To check your notifications from any screen, swipe down on the fingerprint sensor.</string>
+
+    <!-- Switch text for each gesture setting state -->
+    <string name="gesture_setting_on">On</string>
+    <string name="gesture_setting_off">Off</string>
+
 </resources>
diff --git a/res/xml/gesture_settings.xml b/res/xml/gesture_settings.xml
new file mode 100644
index 0000000..e68d8f5
--- /dev/null
+++ b/res/xml/gesture_settings.xml
@@ -0,0 +1,45 @@
+<?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-auto"
+    android:title="@string/gesture_preference_title">
+
+    <com.android.settings.gestures.GesturePreference
+        android:key="gesture_double_tap_power"
+        android:title="@string/double_tap_power_for_camera_title"
+        android:summary="@string/double_tap_power_for_camera_summary"
+        settings:animation="@raw/gesture_double_tap"/>
+
+    <com.android.settings.gestures.GesturePreference
+        android:key="gesture_double_twist"
+        android:title="@string/double_twist_for_camera_mode_title"
+        android:summary="@string/double_twist_for_camera_mode_summary"
+        settings:animation="@raw/gesture_twist"/>
+
+    <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"/>
+
+    <com.android.settings.gestures.GesturePreference
+        android:key="gesture_pick_up_and_nudge"
+        android:title="@string/ambient_display_title"
+        android:summary="@string/ambient_display_summary"
+        settings:animation="@raw/gesture_ambient_move_lift"/>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 1bf1e0e..f4a407a 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -84,6 +84,7 @@
     public static class AccountSyncSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
+    public static class GestureSettingsActivity extends SettingsActivity { /* empty */ }
     public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 330c9ea..223d536 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -85,6 +85,7 @@
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageDetail;
 import com.android.settings.fuelgauge.PowerUsageSummary;
+import com.android.settings.gestures.GestureSettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
 import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
@@ -242,6 +243,7 @@
             Settings.StorageSettingsActivity.class.getName(),
             Settings.ManageApplicationsActivity.class.getName(),
             Settings.PowerUsageSummaryActivity.class.getName(),
+            Settings.GestureSettingsActivity.class.getName(),
             //personal_section
             Settings.LocationSettingsActivity.class.getName(),
             Settings.SecuritySettingsActivity.class.getName(),
@@ -301,6 +303,7 @@
             PowerUsageSummary.class.getName(),
             AccountSyncSettings.class.getName(),
             AccountSettings.class.getName(),
+            GestureSettings.class.getName(),
             CryptKeeperSettings.class.getName(),
             DataUsageSummary.class.getName(),
             DreamSettings.class.getName(),
diff --git a/src/com/android/settings/gestures/GesturePreference.java b/src/com/android/settings/gestures/GesturePreference.java
new file mode 100644
index 0000000..1541aec
--- /dev/null
+++ b/src/com/android/settings/gestures/GesturePreference.java
@@ -0,0 +1,139 @@
+/*
+ * 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.gestures;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.SurfaceTexture;
+import android.media.MediaMetadataRetriever;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.Surface;
+import android.view.TextureView;
+import android.widget.ImageView;
+import android.util.AttributeSet;
+import android.util.Log;
+
+import com.android.settings.R;
+
+/**
+ * Preference item for a gesture with a switch to signify if it should be enabled.
+ * This shows the title and description of the gesture along with an animation showing how to do
+ * the gesture
+ */
+public class GesturePreference extends SwitchPreference {
+    private static final String TAG = "GesturePreference";
+    private Uri mVideoPath;
+    private Context mContext;
+    private MediaPlayer mMediaPlayer;
+    private MediaMetadataRetriever mMediaMetadata;
+
+    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,
+                0, 0);
+        try {
+            int animation = attributes.getResourceId(R.styleable.GesturePreference_animation, 0);
+            mVideoPath = Uri.parse(
+                "android.resource://" + context.getPackageName() + "/" + animation);
+            mMediaMetadata = new MediaMetadataRetriever();
+            mMediaMetadata.setDataSource(mContext, mVideoPath);
+        } catch (Exception e) {
+            // resource not available, show blank view
+        } finally {
+            attributes.recycle();
+        }
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        final TextureView video = (TextureView) holder.findViewById(R.id.gesture_video);
+        final ImageView imageView = (ImageView) holder.findViewById(R.id.gesture_image);
+
+        video.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                    if (mMediaPlayer != null) {
+                        if (mMediaPlayer.isPlaying()) {
+                            mMediaPlayer.pause();
+                        } else {
+                            mMediaPlayer.start();
+                            imageView.setVisibility(View.GONE);
+                        }
+                    }
+                    return true;
+                }
+                return false;
+            }
+        });
+
+        video.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
+            @Override
+            public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
+                mMediaPlayer = MediaPlayer.create(mContext, mVideoPath);
+                if (mMediaPlayer != null) {
+                    mMediaPlayer.setSurface(new Surface(surfaceTexture));
+                    mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+                        @Override
+                        public void onPrepared(MediaPlayer mediaPlayer) {
+                            mediaPlayer.setLooping(true);
+                        }
+                    });
+                }
+            }
+
+            @Override
+            public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
+            }
+
+            @Override
+            public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
+                imageView.setVisibility(View.VISIBLE);
+                if (mMediaPlayer != null) {
+                    mMediaPlayer.stop();
+                    mMediaPlayer.reset();
+                    mMediaPlayer.release();
+                }
+                return false;
+            }
+
+            @Override
+            public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
+            }
+        });
+
+        if (mMediaPlayer == null) {
+            Bitmap bitmap = mMediaMetadata.getFrameAtTime(0);
+            if (bitmap != null) {
+                imageView.setImageDrawable(new BitmapDrawable(bitmap));
+            }
+            imageView.setVisibility(View.VISIBLE);
+        }
+
+    }
+
+}
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
new file mode 100644
index 0000000..56f4184
--- /dev/null
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -0,0 +1,73 @@
+/*
+ * 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.gestures;
+
+import android.os.Bundle;
+import android.support.v7.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.util.Log;
+
+import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+/**
+ * Top level fragment for gesture settings.
+ * This will create individual switch preference for each gesture and handle updates when each
+ * preference is updated
+ */
+public class GestureSettings extends SettingsPreferenceFragment implements
+        Preference.OnPreferenceChangeListener {
+
+    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_SWIPE_DOWN_FINGERPRINT = "gesture_swipe_down_fingerprint";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.gesture_settings);
+
+        // Double tap power for camera
+        int cameraDisabled = Settings.Secure.getInt(getActivity().getContentResolver(),
+                Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 1);
+        GesturePreference preference =
+            (GesturePreference) findPreference(PREF_KEY_DOUBLE_TAP_POWER);
+        preference.setChecked(cameraDisabled == 0);
+        preference.setOnPreferenceChangeListener(this);
+
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean enabled = (boolean) newValue;
+        if (PREF_KEY_DOUBLE_TAP_POWER.equals(preference.getKey())) {
+            Settings.Secure.putInt(getActivity().getContentResolver(),
+                    Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, enabled ? 0 : 1);
+        }
+        return true;
+    }
+
+    @Override
+    protected int getMetricsCategory() {
+        return MetricsEvent.SETTINGS_GESTURES;
+    }
+
+}
\ No newline at end of file