Camera: Cleanup hardware key handling
* Fix power shutter behaviour in camcorder mode
* Disable volume change while in panorama mode, volume buttons should only
handle camera operations while in the camera
* Add camera/power/volume key shutter handling in panorama mode
On devices with a hardware camera key:
* Disable power & volume shutter features
* Volume buttons control the zoom
On devices without a hardware camera key:
* When power shutter is disabled, volume buttons control the shutter (like AOSP)
* When power shutter is enabled, volume buttons control the zoom
Change-Id: I141946d5b6f5aec8b1e9a9f99270d30295596079
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 4763d93..eee1191 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -1421,7 +1421,9 @@
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 (!CameraUtil.hasCameraKey()) {
+ mPowerShutter = val.equals(CameraSettings.VALUE_ON);
+ }
if (mPowerShutter /*TODO: && mShowCameraAppView*/) {
getWindow().addFlags(WindowManager.LayoutParams.PREVENT_POWER_KEY);
} else {
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index 428765c..e4f3db4 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -413,6 +413,7 @@
ListPreference cameraHdr = group.findPreference(KEY_CAMERA_HDR);
ListPreference disMode = group.findPreference(KEY_DIS);
ListPreference cameraHdrPlus = group.findPreference(KEY_CAMERA_HDR_PLUS);
+ ListPreference powerShutter = group.findPreference(KEY_POWER_SHUTTER);
ListPreference beautyMode = group.findPreference(KEY_BEAUTY_MODE);
ListPreference slowShutter = group.findPreference(KEY_SLOW_SHUTTER);
ListPreference asd = group.findPreference(KEY_ASD);
@@ -473,6 +474,9 @@
!GcamHelper.hasGcamCapture() || isFrontCamera)) {
removePreference(group, cameraHdrPlus.getKey());
}
+ if (powerShutter != null && CameraUtil.hasCameraKey()) {
+ removePreference(group, powerShutter.getKey());
+ }
if (beautyMode != null) {
if (!isBeautyModeSupported(mParameters)) {
removePreference(group, beautyMode.getKey());
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 930a160..2250e28 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -1951,13 +1951,21 @@
case KeyEvent.KEYCODE_VOLUME_UP:
if (/*TODO: mActivity.isInCameraApp() &&*/ mFirstTimeInitialized
&& (mUI.mMenuInitialized)) {
- mUI.onScaleStepResize(true);
+ if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
+ onShutterButtonFocus(true);
+ } else {
+ mUI.onScaleStepResize(true);
+ }
}
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (/*TODO: mActivity.isInCameraApp() &&*/ mFirstTimeInitialized
&& (mUI.mMenuInitialized)) {
- mUI.onScaleStepResize(false);
+ if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
+ onShutterButtonFocus(true);
+ } else {
+ mUI.onScaleStepResize(false);
+ }
}
return true;
case KeyEvent.KEYCODE_FOCUS:
@@ -1987,7 +1995,7 @@
return true;
case KeyEvent.KEYCODE_POWER:
if (mFirstTimeInitialized && event.getRepeatCount() == 0
- && CameraActivity.mPowerShutter) {
+ && CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
onShutterButtonFocus(true);
}
return true;
@@ -2003,6 +2011,10 @@
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
+ if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()
+ && mFirstTimeInitialized) {
+ onShutterButtonClick();
+ }
return true;
case KeyEvent.KEYCODE_FOCUS:
if (mFirstTimeInitialized) {
@@ -2010,7 +2022,8 @@
}
return true;
case KeyEvent.KEYCODE_POWER:
- if (CameraActivity.mPowerShutter && mFirstTimeInitialized) {
+ if (CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()
+ && mFirstTimeInitialized) {
onShutterButtonClick();
}
return true;
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index b62d26c..9097389 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -1167,26 +1167,42 @@
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
- mUI.onScaleStepResize(true);
+ if (event.getRepeatCount() == 0 && !CameraActivity.mPowerShutter &&
+ !CameraUtil.hasCameraKey()) {
+ mUI.clickShutter();
+ } else {
+ mUI.onScaleStepResize(true);
+ }
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
- mUI.onScaleStepResize(false);
+ if (event.getRepeatCount() == 0 && !CameraActivity.mPowerShutter &&
+ !CameraUtil.hasCameraKey()) {
+ mUI.clickShutter();
+ } else {
+ mUI.onScaleStepResize(false);
+ }
return true;
case KeyEvent.KEYCODE_CAMERA:
if (event.getRepeatCount() == 0) {
mUI.clickShutter();
- return true;
}
- break;
+ return true;
case KeyEvent.KEYCODE_DPAD_CENTER:
if (event.getRepeatCount() == 0) {
mUI.clickShutter();
+ }
+ return true;
+ case KeyEvent.KEYCODE_POWER:
+ if (event.getRepeatCount() == 0 && CameraActivity.mPowerShutter &&
+ !CameraUtil.hasCameraKey()) {
+ mUI.clickShutter();
+ }
+ return true;
+ case KeyEvent.KEYCODE_MENU:
+ if (mMediaRecorderRecording) {
return true;
}
break;
- case KeyEvent.KEYCODE_MENU:
- if (mMediaRecorderRecording) return true;
- break;
}
return false;
}
@@ -1195,14 +1211,21 @@
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
+ if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
+ mUI.pressShutter(false);
+ }
+ return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
+ if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
+ mUI.pressShutter(false);
+ }
return true;
case KeyEvent.KEYCODE_CAMERA:
mUI.pressShutter(false);
return true;
case KeyEvent.KEYCODE_POWER:
- if (CameraActivity.mPowerShutter) {
- onShutterButtonClick();
+ if (CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
+ mUI.pressShutter(false);
}
return true;
}
diff --git a/src/com/android/camera/WideAnglePanoramaModule.java b/src/com/android/camera/WideAnglePanoramaModule.java
index 3487835..faacf74 100644
--- a/src/com/android/camera/WideAnglePanoramaModule.java
+++ b/src/com/android/camera/WideAnglePanoramaModule.java
@@ -271,6 +271,9 @@
mActivity.updateStorageSpaceAndHint();
}
+ // Power shutter
+ mActivity.initPowerShutter(mPreferences);
+
mMainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -840,6 +843,10 @@
}
mUI.showPreviewCover();
releaseCamera();
+
+ // Load the power shutter
+ mActivity.initPowerShutter(mPreferences);
+
synchronized (mRendererLock) {
mCameraTexture = null;
@@ -1101,14 +1108,38 @@
public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
-
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ return true;
+ case KeyEvent.KEYCODE_CAMERA:
+ if (event.getRepeatCount() == 0) {
+ onShutterButtonClick();
+ }
+ return true;
+ case KeyEvent.KEYCODE_POWER:
+ return true;
+ }
return false;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
+ onShutterButtonClick();
+ }
+ return true;
+ case KeyEvent.KEYCODE_POWER:
+ if (CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) {
+ onShutterButtonClick();
+ }
+ return true;
+ }
return false;
}
diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java
index 8bf9074..3788e95 100644
--- a/src/com/android/camera/util/CameraUtil.java
+++ b/src/com/android/camera/util/CameraUtil.java
@@ -118,6 +118,9 @@
public static final String TRUE = "true";
public static final String FALSE = "false";
+ // Hardware camera key mask
+ private static final int KEY_MASK_CAMERA = 0x20;
+
private static boolean sEnableZSL;
// Do not change the focus mode when TTF is used
@@ -161,6 +164,10 @@
return (supported != null) && supported.contains(SCENE_MODE_ASD) && (params.get("asd-mode") != null);
}
+ public static boolean hasCameraKey() {
+ return (sDeviceKeysPresent & KEY_MASK_CAMERA) != 0;
+ }
+
public static boolean isMeteringAreaSupported(Parameters params) {
return params.getMaxNumMeteringAreas() > 0;
}
@@ -196,6 +203,9 @@
// Use samsung HDR format
private static boolean sSamsungHDRFormat;
+ // Get available hardware keys
+ private static int sDeviceKeysPresent;
+
private CameraUtil() {
}
@@ -211,6 +221,8 @@
sNoFocusModeChangeForTouch = context.getResources().getBoolean(
R.bool.useContinuosFocusForTouch);
sSamsungHDRFormat = context.getResources().getBoolean(R.bool.needsSamsungHDRFormat);
+ sDeviceKeysPresent = context.getResources().getInteger(
+ com.android.internal.R.integer.config_deviceHardwareKeys);
}
public static int dpToPixel(int dp) {