Merge "Camera: Powerkey shutter (2/2)" into cm-11.0
diff --git a/Android.mk b/Android.mk
index bb2b0d8..fca4961 100644
--- a/Android.mk
+++ b/Android.mk
@@ -22,6 +22,7 @@
         --version-code $(version_code_package) \
 
 LOCAL_PACKAGE_NAME := Camera2
+LOCAL_CERTIFICATE := platform
 
 #LOCAL_SDK_VERSION := current
 
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7c4326b..4afc49d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -32,6 +32,7 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
+    <uses-permission android:name="android.permission.PREVENT_POWER_KEY" />
     <uses-permission android:name="com.android.gallery3d.permission.STORAGE_CHANGE" />
 
     <supports-screens
diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml
index 8180f03..4b01926 100644
--- a/res/values/cm_strings.xml
+++ b/res/values/cm_strings.xml
@@ -181,4 +181,7 @@
     <string name="camera_menu_effects_label">EFFECTS</string>
     <string name="camera_menu_asd_label">SMART SCENE</string>
 
+    <!-- More Settings screen, power button title -->
+    <string name="pref_camera_power_shutter_title">Power shutter</string>
+    <string name="pref_camera_power_shutter_default" translatable="false">off</string>
 </resources>
diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml
index 4a304ee..56abbd7 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -270,5 +270,10 @@
             camera:largeIcons="@array/pref_camera_asd_icons"
             camera:labelList="@array/pref_camera_asd_labels"
             camera:entryValues="@array/pref_switch_entryvalues" />
-
+    <ListPreference
+            camera:key="pref_power_shutter"
+            camera:defaultValue="@string/pref_camera_power_shutter_default"
+            camera:title="@string/pref_camera_power_shutter_title"
+            camera:entries="@array/pref_switch_entries"
+            camera:entryValues="@array/pref_switch_entryvalues" />
 </PreferenceGroup>
diff --git a/res/xml/video_preferences.xml b/res/xml/video_preferences.xml
index 7c563c6..6357d56 100644
--- a/res/xml/video_preferences.xml
+++ b/res/xml/video_preferences.xml
@@ -145,4 +145,10 @@
             camera:labelList="@array/pref_camera_beauty_mode_labels"
             camera:entries="@array/pref_switch_entries"
             camera:entryValues="@array/pref_switch_entryvalues" />
+    <ListPreference
+            camera:key="pref_power_shutter"
+            camera:defaultValue="@string/pref_camera_power_shutter_default"
+            camera:title="@string/pref_camera_power_shutter_title"
+            camera:entries="@array/pref_switch_entries"
+            camera:entryValues="@array/pref_switch_entryvalues" />
 </PreferenceGroup>
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 4ff5339..4763d93 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2013-2014 The CyanogenMod Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -165,6 +166,8 @@
     private long mStorageSpaceBytes = Storage.LOW_STORAGE_THRESHOLD_BYTES;
     private boolean mAutoRotateScreen;
     private boolean mSecureCamera;
+    // Keep track of powershutter state
+    public static boolean mPowerShutter = false;
     // This is a hack to speed up the start of SecureCamera.
     private static boolean sFirstStartAfterScreenOn = true;
     private int mLastRawOrientation;
@@ -1415,6 +1418,17 @@
         }
     }
 
+    protected void initPowerShutter(ComboPreferences prefs) {
+        String val = prefs.getString(CameraSettings.KEY_POWER_SHUTTER,
+                getResources().getString(R.string.pref_camera_power_shutter_default));
+        mPowerShutter = val.equals(CameraSettings.VALUE_ON);
+        if (mPowerShutter /*TODO: && mShowCameraAppView*/) {
+            getWindow().addFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY);
+        } else {
+            getWindow().clearFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY);
+        }
+    }
+
     protected void setResultEx(int resultCode) {
         mResultCodeForTesting = resultCode;
         setResult(resultCode);
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index b71f670..428765c 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2013 The CyanogenMod Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,6 +81,7 @@
     public static final String KEY_STARTUP_MODULE_INDEX = "camera.startup_module";
     public static final String KEY_STORAGE = "pref_camera_storage_key";
 
+    public static final String KEY_POWER_SHUTTER = "pref_power_shutter";
     public static final String KEY_VIDEO_ENCODER = "pref_camera_videoencoder_key";
     public static final String KEY_AUDIO_ENCODER = "pref_camera_audioencoder_key";
     public static final String KEY_VIDEO_DURATION = "pref_camera_video_duration_key";
@@ -140,6 +142,8 @@
     public static final String KEY_ASD = "pref_camera_asd";
 
     public static final String EXPOSURE_DEFAULT_VALUE = "0";
+    public static final String VALUE_ON = "on";
+    public static final String VALUE_OFF = "off";
 
     public static final int CURRENT_VERSION = 5;
     public static final int CURRENT_LOCAL_VERSION = 2;
diff --git a/src/com/android/camera/ComboPreferences.java b/src/com/android/camera/ComboPreferences.java
index b968ec7..69763f5 100644
--- a/src/com/android/camera/ComboPreferences.java
+++ b/src/com/android/camera/ComboPreferences.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013-2014 The CyanogenMod Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -153,6 +154,7 @@
                 || key.equals(CameraSettings.KEY_TIMER)
                 || key.equals(CameraSettings.KEY_TIMER_SOUND_EFFECTS)
                 || key.equals(CameraSettings.KEY_PHOTOSPHERE_PICTURESIZE)
+                || key.equals(CameraSettings.KEY_POWER_SHUTTER)
                 || key.equals(CameraSettings.KEY_STORAGE);
     }
 
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index 0ce5c71..97a3dd4 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -240,6 +240,7 @@
         // extra settings popup
         mOtherKeys = new String[] {
                 CameraSettings.KEY_STORAGE,
+                CameraSettings.KEY_POWER_SHUTTER,
                 CameraSettings.KEY_FOCUS_MODE,
                 CameraSettings.KEY_FOCUS_TIME,
                 CameraSettings.KEY_ISO,
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 4d40cb0..d83661e 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2013 The CyanogenMod Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -486,6 +487,9 @@
             mActivity.updateStorageSpaceAndHint();
         }
 
+        // Power shutter
+        mActivity.initPowerShutter(mPreferences);
+
         // we need to reset exposure for the preview
         resetExposureCompensation();
 
@@ -1809,6 +1813,9 @@
         // (e.g. onResume -> onPause -> onResume).
         stopPreview();
 
+        // Load the power shutter
+        mActivity.initPowerShutter(mPreferences);
+
         mNamedImages = null;
 
         if (mLocationManager != null) mLocationManager.recordLocation(false);
@@ -1937,6 +1944,9 @@
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
+        /*TODO: if (!mActivity.mShowCameraAppView) {
+            return false;
+        }*/
         switch (keyCode) {
             case KeyEvent.KEYCODE_VOLUME_UP:
                 if (/*TODO: mActivity.isInCameraApp() &&*/ mFirstTimeInitialized
@@ -1975,12 +1985,21 @@
                     mUI.pressShutterButton();
                 }
                 return true;
+            case KeyEvent.KEYCODE_POWER:
+                if (mFirstTimeInitialized && event.getRepeatCount() == 0
+                        && CameraActivity.mPowerShutter) {
+                    onShutterButtonFocus(true);
+                }
+                return true;
         }
         return false;
     }
 
     @Override
     public boolean onKeyUp(int keyCode, KeyEvent event) {
+        /*TODO: if (!mActivity.mShowCameraAppView) {
+            return false;
+        }*/
         switch (keyCode) {
             case KeyEvent.KEYCODE_VOLUME_UP:
             case KeyEvent.KEYCODE_VOLUME_DOWN:
@@ -1990,6 +2009,11 @@
                     onShutterButtonFocus(false);
                 }
                 return true;
+            case KeyEvent.KEYCODE_POWER:
+                if (CameraActivity.mPowerShutter && mFirstTimeInitialized) {
+                    onShutterButtonClick();
+                }
+                return true;
         }
         return false;
     }
@@ -2714,6 +2738,7 @@
             setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);
             mUI.updateOnScreenIndicators(mParameters, mPreferenceGroup,
                 mPreferences);
+            mActivity.initPowerShutter(mPreferences);
         } else {
             mHandler.sendEmptyMessage(SET_PHOTO_UI_PARAMS);
         }
diff --git a/src/com/android/camera/VideoMenu.java b/src/com/android/camera/VideoMenu.java
index f8fcae7..72b832a 100644
--- a/src/com/android/camera/VideoMenu.java
+++ b/src/com/android/camera/VideoMenu.java
@@ -192,6 +192,7 @@
         // extra settings popup
         mOtherKeys = new String[] {
                 CameraSettings.KEY_STORAGE,
+                CameraSettings.KEY_POWER_SHUTTER,
                 CameraSettings.KEY_VIDEO_ENCODER,
                 CameraSettings.KEY_AUDIO_ENCODER,
                 CameraSettings.KEY_FOCUS_TIME,
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 858e4f4..b62d26c 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2013 The CyanogenMod Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -435,6 +436,9 @@
             mActivity.updateStorageSpaceAndHint();
         }
 
+        // Power shutter
+        mActivity.initPowerShutter(mPreferences);
+
         /*
          * To reduce startup time, we start the preview in another thread.
          * We make sure the preview is started at the end of onCreate.
@@ -1196,6 +1200,11 @@
             case KeyEvent.KEYCODE_CAMERA:
                 mUI.pressShutter(false);
                 return true;
+            case KeyEvent.KEYCODE_POWER:
+                if (CameraActivity.mPowerShutter) {
+                    onShutterButtonClick();
+                }
+                return true;
         }
         return false;
     }
@@ -2135,6 +2144,7 @@
                 setCameraParameters();
             }
             mUI.updateOnScreenIndicators(mParameters, mPreferences);
+            mActivity.initPowerShutter(mPreferences);
         }
     }