summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCamera Software Integration <camswint@localhost>2015-10-28 16:01:21 -0700
committerGerrit Code Review <gerrit@cyanogenmod.org>2016-02-17 12:54:54 -0800
commit467196121cd51f298ef08aee1847d05270b46c81 (patch)
tree9206bb03da223bb633d5ec4e2de25512789f09e9
parent22c9b14239c5fd517f2ebff84d499e3b30a36551 (diff)
downloadandroid_packages_apps_Snap-467196121cd51f298ef08aee1847d05270b46c81.zip
android_packages_apps_Snap-467196121cd51f298ef08aee1847d05270b46c81.tar.gz
android_packages_apps_Snap-467196121cd51f298ef08aee1847d05270b46c81.tar.bz2
SnapdragonCamera: Implementing SelfieFlash feature
Introducing SelfieFlash feature. Change-Id: I7b73d9db585038640b715092b01e037538ef68aa CRs-Fixed: 937232
-rw-r--r--res/layout/photo_module.xml1
-rw-r--r--res/layout/selfie_flash_view.xml35
-rw-r--r--res/values/qcomarrays.xml11
-rw-r--r--res/values/qcomstrings.xml4
-rw-r--r--res/xml/camera_preferences.xml7
-rw-r--r--src/com/android/camera/CameraSettings.java2
-rw-r--r--src/com/android/camera/PhotoMenu.java2
-rw-r--r--src/com/android/camera/PhotoModule.java45
-rw-r--r--src/com/android/camera/PhotoUI.java31
-rw-r--r--src/com/android/camera/ui/SelfieFlashView.java74
10 files changed, 211 insertions, 1 deletions
diff --git a/res/layout/photo_module.xml b/res/layout/photo_module.xml
index 7487e73..e1211ba 100644
--- a/res/layout/photo_module.xml
+++ b/res/layout/photo_module.xml
@@ -25,6 +25,7 @@
android:layout_height="match_parent"
android:layout_gravity="center" >
<include layout="@layout/count_down_to_capture" />
+ <include layout="@layout/selfie_flash_view" />
<FrameLayout
android:id="@+id/preview_container"
android:layout_width="match_parent"
diff --git a/res/layout/selfie_flash_view.xml b/res/layout/selfie_flash_view.xml
new file mode 100644
index 0000000..14ac8ea
--- /dev/null
+++ b/res/layout/selfie_flash_view.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2015, The Linux Foundation. All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<com.android.camera.ui.SelfieFlashView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/selfie_flash"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="invisible" >
+</com.android.camera.ui.SelfieFlashView>
diff --git a/res/values/qcomarrays.xml b/res/values/qcomarrays.xml
index 3124eaa..6ae1926 100644
--- a/res/values/qcomarrays.xml
+++ b/res/values/qcomarrays.xml
@@ -498,6 +498,17 @@
<item>enable</item>
</string-array>
+ <!-- Selfie flash -->
+ <string-array name="pref_selfie_flash_entries" translatable="false">
+ <item>@string/setting_off</item>
+ <item>@string/setting_on</item>
+ </string-array>
+
+ <string-array name="pref_selfie_flash_entryvalues" translatable="false">
+ <item>off</item>
+ <item>on</item>
+ </string-array>
+
<!-- Face detection -->
<string-array name="pref_camera_facedetection_entries" translatable="false">
<item>@string/setting_off</item>
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
index 856fc24..d96375f 100644
--- a/res/values/qcomstrings.xml
+++ b/res/values/qcomstrings.xml
@@ -156,6 +156,10 @@
<string name="pref_camera_facedetection_title">Face detection</string>
<string name="pref_camera_facedetection_default" translatable="false">on</string>
+ <!-- Selfie Flash -->
+ <string name="pref_selfie_flash_title">Selfie flash</string>
+ <string name="pref_selfie_flash_default" translatable="false">off</string>
+
<!-- Red eye reduction -->
<string name="pref_camera_redeyereduction_title">Red eye reduction</string>
<string name="pref_camera_redeyereduction_default" translatable="false">disable</string>
diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml
index 70bcfa0..8711443 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -240,6 +240,13 @@
camera:entries="@array/pref_camera_skinToneEnhancement_entries"
camera:entryValues="@array/pref_camera_skinToneEnhancement_entryvalues" />
<IconListPreference
+ camera:key="pref_selfie_flash_key"
+ camera:defaultValue="@string/pref_selfie_flash_default"
+ camera:entries="@array/pref_selfie_flash_entries"
+ camera:entryValues="@array/pref_selfie_flash_entryvalues"
+ camera:singleIcon="@drawable/ic_settings_flash"
+ camera:title="@string/pref_selfie_flash_title" />
+ <IconListPreference
camera:key="pref_camera_facedetection_key"
camera:defaultValue="@string/pref_camera_facedetection_default"
camera:title="@string/pref_camera_facedetection_title"
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index fb1048b..3d5f765 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -238,6 +238,8 @@ public class CameraSettings {
public static final String KEY_QC_SUPPORTED_MANUAL_EXPOSURE_MODES = "manual-exposure-modes";
public static final String KEY_QC_SUPPORTED_MANUAL_WB_MODES = "manual-wb-modes";
+ public static final String KEY_SELFIE_FLASH = "pref_selfie_flash_key";
+
public static final String EXPOSURE_DEFAULT_VALUE = "0";
public static final String VALUE_ON = "on";
public static final String VALUE_OFF = "off";
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index 4b15859..271640d 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -142,6 +142,7 @@ public class PhotoMenu extends MenuController
}
mOtherKeys1 = new String[] {
+ CameraSettings.KEY_SELFIE_FLASH,
CameraSettings.KEY_FLASH_MODE,
CameraSettings.KEY_RECORD_LOCATION,
CameraSettings.KEY_PICTURE_SIZE,
@@ -162,6 +163,7 @@ public class PhotoMenu extends MenuController
};
mOtherKeys2 = new String[] {
+ CameraSettings.KEY_SELFIE_FLASH,
CameraSettings.KEY_FLASH_MODE,
CameraSettings.KEY_RECORD_LOCATION,
CameraSettings.KEY_PICTURE_SIZE,
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 8a0533a..36fde8b 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -351,6 +351,23 @@ public class PhotoModule
private int mJpegFileSizeEstimation = 0;
private int mRemainingPhotos = -1;
+ private static final int SELFIE_FLASH_DURATION = 680;
+
+ private class SelfieThread extends Thread {
+ public void run() {
+ try {
+ Thread.sleep(SELFIE_FLASH_DURATION);
+ mActivity.runOnUiThread(new Runnable() {
+ public void run() {
+ mFocusManager.doSnap();
+ }
+ });
+ } catch(InterruptedException e) {
+ }
+ selfieThread = null;
+ }
+ }
+ private SelfieThread selfieThread;
private MediaSaveService.OnMediaSavedListener mOnMediaSavedListener =
new MediaSaveService.OnMediaSavedListener() {
@@ -1157,6 +1174,7 @@ public class PhotoModule
public void onPictureTaken(final byte [] jpegData, CameraProxy camera) {
Log.d(TAG, "JpegPictureCallback: onPictureTaken()");
if (mCameraState != LONGSHOT) {
+ mUI.stopSelfieFlash();
mUI.enableShutter(true);
}
if (mPaused) {
@@ -1864,6 +1882,9 @@ public class PhotoModule
}
mUI.overrideSettings(CameraSettings.KEY_FLASH_MODE, flashMode);
}
+
+ if(mCameraId != CameraHolder.instance().getFrontCameraId())
+ CameraSettings.removePreferenceFromScreen(mPreferenceGroup, CameraSettings.KEY_SELFIE_FLASH);
}
private void overrideCameraSettings(final String flashMode,
@@ -2152,8 +2173,25 @@ public class PhotoModule
mActivity.getString(R.string.pref_camera_zsl_default));
mUI.overrideSettings(CameraSettings.KEY_ZSL, zsl);
mUI.startCountDown(seconds, playSound);
+
} else {
mSnapshotOnIdle = false;
+ initiateSnap();
+ }
+ }
+
+ private void initiateSnap()
+ {
+ if(mPreferences.getString(CameraSettings.KEY_SELFIE_FLASH,
+ mActivity.getString(R.string.pref_selfie_flash_default))
+ .equalsIgnoreCase("on") &&
+ mCameraId == CameraHolder.instance().getFrontCameraId()) {
+ mUI.startSelfieFlash();
+ if(selfieThread == null) {
+ selfieThread = new SelfieThread();
+ selfieThread.start();
+ }
+ } else {
mFocusManager.doSnap();
}
mShutterPressing = false;
@@ -2324,6 +2362,11 @@ public class PhotoModule
mSensorManager.unregisterListener(this, msensor);
}
+ if(selfieThread != null) {
+ selfieThread.interrupt();
+ }
+ mUI.stopSelfieFlash();
+
Log.d(TAG, "remove idle handleer in onPause");
removeIdleHandler();
}
@@ -4301,7 +4344,7 @@ public class PhotoModule
@Override
public void onCountDownFinished() {
mSnapshotOnIdle = false;
- mFocusManager.doSnap();
+ initiateSnap();
mFocusManager.onShutterUp();
mUI.overrideSettings(CameraSettings.KEY_ZSL, null);
mUI.showUIAfterCountDown();
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index 19aa3a7..d2827fc 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -47,6 +47,8 @@ import android.view.View.OnClickListener;
import android.view.View.OnLayoutChangeListener;
import android.view.ViewGroup;
import android.view.ViewStub;
+import android.view.Window;
+import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.ImageView;
@@ -70,6 +72,7 @@ import com.android.camera.ui.PieRenderer.PieListener;
import com.android.camera.ui.RenderOverlay;
import com.android.camera.ui.RotateLayout;
import com.android.camera.ui.RotateTextToast;
+import com.android.camera.ui.SelfieFlashView;
import com.android.camera.ui.ZoomRenderer;
import com.android.camera.ui.focus.FocusRing;
import com.android.camera.util.CameraUtil;
@@ -95,6 +98,7 @@ public class PhotoUI implements PieListener,
private PopupWindow mPopup;
private ShutterButton mShutterButton;
private CountDownView mCountDownView;
+ private SelfieFlashView mSelfieView;
private FaceView mFaceView;
private RenderOverlay mRenderOverlay;
@@ -146,6 +150,7 @@ public class PhotoUI implements PieListener,
private int mBottomMargin = 0;
private int mOrientation;
+ private float mScreenBrightness = 0.0f;
public interface SurfaceTextureSizeChangedListener {
public void onSurfaceTextureSizeChanged(int uncroppedWidth, int uncroppedHeight);
@@ -1109,6 +1114,32 @@ public class PhotoUI implements PieListener,
hideUIWhileCountDown();
}
+ public void startSelfieFlash() {
+ if(mSelfieView == null)
+ mSelfieView = (SelfieFlashView) (mRootView.findViewById(R.id.selfie_flash));
+ mSelfieView.bringToFront();
+ mSelfieView.open();
+ mScreenBrightness = setScreenBrightness(1F);
+ }
+
+ public void stopSelfieFlash() {
+ if(mSelfieView == null)
+ mSelfieView = (SelfieFlashView) (mRootView.findViewById(R.id.selfie_flash));
+ mSelfieView.close();
+ if(mScreenBrightness != 0.0f)
+ setScreenBrightness(mScreenBrightness);
+ }
+
+ private float setScreenBrightness(float brightness) {
+ float originalBrightness;
+ Window window = mActivity.getWindow();
+ WindowManager.LayoutParams layout = window.getAttributes();
+ originalBrightness = layout.screenBrightness;
+ layout.screenBrightness = brightness;
+ window.setAttributes(layout);
+ return originalBrightness;
+ }
+
public void showPreferencesToast() {
if (mNotSelectableToast == null) {
String str = mActivity.getResources().getString(R.string.not_selectable_in_scene_mode);
diff --git a/src/com/android/camera/ui/SelfieFlashView.java b/src/com/android/camera/ui/SelfieFlashView.java
new file mode 100644
index 0000000..8e73bef
--- /dev/null
+++ b/src/com/android/camera/ui/SelfieFlashView.java
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2015, The Linux Foundation. All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.android.camera.ui;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+public class SelfieFlashView extends View {
+
+ private static final String TAG = "CAM_SelfieFlashView";
+ private Paint targetPaint;
+ private RectF rectF;
+
+ public SelfieFlashView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ targetPaint = new Paint();
+ targetPaint.setColor(Color.WHITE);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ rectF = new RectF();
+ rectF.left = 0;
+ rectF.right = canvas.getWidth();
+ rectF.top = 0;
+ rectF.bottom = canvas.getHeight();
+ canvas.drawRect(rectF, targetPaint);
+ }
+
+ public void open() {
+ setVisibility(View.VISIBLE);
+ }
+
+ public void close() {
+ setVisibility(View.GONE);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent e){
+ return true;
+ }
+}