summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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.xml10
-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, 217 insertions, 1 deletions
diff --git a/res/layout/photo_module.xml b/res/layout/photo_module.xml
index afc637773..c6d0a8def 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 000000000..14ac8eae8
--- /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 156c8d456..f54c22971 100644
--- a/res/values/qcomarrays.xml
+++ b/res/values/qcomarrays.xml
@@ -465,6 +465,17 @@
<item>@string/pref_camera_histogram_value_enable</item>
</string-array>
+ <!-- Camera Preferences selfie flash entries -->
+ <string-array name="pref_selfie_flash_entries">
+ <item>@string/pref_selfie_flash_entry_off</item>
+ <item>@string/pref_selfie_flash_entry_on</item>
+ </string-array>
+
+ <string-array name="pref_selfie_flash_entryvalues" translatable="false">
+ <item>off</item>
+ <item>on</item>
+ </string-array>
+
<!-- Camera Preferences Face Detection dialog box entries -->
<string-array name="pref_camera_facedetection_entries">
<item>@string/pref_camera_facedetection_entry_off</item>
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
index 48c043af9..414d8f9c8 100644
--- a/res/values/qcomstrings.xml
+++ b/res/values/qcomstrings.xml
@@ -291,6 +291,16 @@
<string name="pref_camera_facedetection_entry_off">Off</string>
<string name="pref_camera_facedetection_entry_on">On</string>
+ <!-- Default Selfie Flash setting. -->
+ <string name="pref_selfie_flash_default" translatable="false">on</string>
+
+ <!-- Settings screen, Selfie Flash Detection -->
+ <string name="pref_selfie_flash_title">Selfie Flash</string>
+
+ <!-- Settings menu, Selfie Flash choices -->
+ <string name="pref_selfie_flash_entry_off">Off</string>
+ <string name="pref_selfie_flash_entry_on">On</string>
+
<!-- Default redeye reduction setting. -->
<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 8d101c71e..c6e625835 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -231,6 +231,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 80115b238..2f9764aec 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -245,6 +245,8 @@ public class CameraSettings {
public static final String KEY_REFOCUS_PROMPT = "refocus-prompt";
+ public static final String KEY_SELFIE_FLASH = "pref_selfie_flash_key";
+
public static final String EXPOSURE_DEFAULT_VALUE = "0";
public static final int CURRENT_VERSION = 5;
diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java
index ef4308611..f61ffda32 100644
--- a/src/com/android/camera/PhotoMenu.java
+++ b/src/com/android/camera/PhotoMenu.java
@@ -174,6 +174,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,
@@ -191,6 +192,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 77d613940..f72c75e7a 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -361,6 +361,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() {
@@ -1170,6 +1187,7 @@ public class PhotoModule
@Override
public void onPictureTaken(final byte [] jpegData, CameraProxy camera) {
+ mUI.stopSelfieFlash();
mUI.enableShutter(true);
if (mPaused) {
return;
@@ -1850,6 +1868,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,
@@ -2161,8 +2182,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();
}
}
@@ -2350,6 +2388,11 @@ public class PhotoModule
mSoundPool = null;
}
+ if(selfieThread != null) {
+ selfieThread.interrupt();
+ }
+ mUI.stopSelfieFlash();
+
Log.d(TAG, "remove idle handleer in onPause");
removeIdleHandler();
}
@@ -4457,7 +4500,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 f6d803d49..6f050d70a 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;
@@ -72,6 +74,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.util.CameraUtil;
@@ -96,6 +99,7 @@ public class PhotoUI implements PieListener,
private PopupWindow mPopup;
private ShutterButton mShutterButton;
private CountDownView mCountDownView;
+ private SelfieFlashView mSelfieView;
private FaceView mFaceView;
private RenderOverlay mRenderOverlay;
@@ -151,6 +155,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);
@@ -1152,6 +1157,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 000000000..8e73bef7d
--- /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;
+ }
+}