From 467196121cd51f298ef08aee1847d05270b46c81 Mon Sep 17 00:00:00 2001 From: Camera Software Integration Date: Wed, 28 Oct 2015 16:01:21 -0700 Subject: SnapdragonCamera: Implementing SelfieFlash feature Introducing SelfieFlash feature. Change-Id: I7b73d9db585038640b715092b01e037538ef68aa CRs-Fixed: 937232 --- src/com/android/camera/CameraSettings.java | 2 + src/com/android/camera/PhotoMenu.java | 2 + src/com/android/camera/PhotoModule.java | 45 +++++++++++++++- src/com/android/camera/PhotoUI.java | 31 +++++++++++ src/com/android/camera/ui/SelfieFlashView.java | 74 ++++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 src/com/android/camera/ui/SelfieFlashView.java (limited to 'src/com') diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index fb1048bd5..3d5f76549 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 4b158590d..271640d29 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 8a0533a1d..36fde8b06 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 19aa3a71b..d2827fce4 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 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; + } +} -- cgit v1.2.3