From 59b05fd1d75943f037aec41def16cdceb6443ecf Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Tue, 5 May 2015 10:37:52 -0700 Subject: SnapdragonCamera: Use floating components during video record. During recording, there are only 2 widgets on UI. Directly attaching them to window manager and making main UI layer fully transparent can reduce power consumption. Change-Id: I8c4f4768ab91d50fc72080f0f6d7316ee2e60ef4 --- src/com/android/camera/CameraActivity.java | 8 +++ src/com/android/camera/CameraSettings.java | 2 + src/com/android/camera/VideoMenu.java | 3 +- src/com/android/camera/VideoModule.java | 5 ++ src/com/android/camera/VideoUI.java | 81 ++++++++++++++++++++++++++-- src/com/android/camera/ui/FilmStripView.java | 8 --- src/com/android/camera/util/CameraUtil.java | 14 +++++ 7 files changed, 109 insertions(+), 12 deletions(-) (limited to 'src/com') diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 69a1182b0..a4873b5f8 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -674,6 +674,14 @@ public class CameraActivity extends Activity } } + public void hideAboveFilmStripControlLayout() { + mAboveFilmstripControlLayout.setVisibility(View.INVISIBLE); + } + + public void showAboveFilmStripControlLayout() { + mAboveFilmstripControlLayout.setVisibility(View.VISIBLE); + } + private void hidePanoStitchingProgress() { mPanoStitchingPanel.setVisibility(View.GONE); } diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index 7aa96d52d..da3dbfda3 100644 --- a/src/com/android/camera/CameraSettings.java +++ b/src/com/android/camera/CameraSettings.java @@ -122,6 +122,8 @@ public class CameraSettings { public static final String KEY_LONGSHOT = "pref_camera_longshot_key"; + public static final String KEY_VIDEO_PARTIAL_UI = "pref_camera_video_partial_ui_key"; + private static final String KEY_QC_SUPPORTED_AE_BRACKETING_MODES = "ae-bracket-hdr-values"; private static final String KEY_QC_SUPPORTED_AF_BRACKETING_MODES = "af-bracket-values"; private static final String KEY_QC_SUPPORTED_RE_FOCUS_MODES = "re-focus-values"; diff --git a/src/com/android/camera/VideoMenu.java b/src/com/android/camera/VideoMenu.java index b914f2cf8..8dbc4f2aa 100644 --- a/src/com/android/camera/VideoMenu.java +++ b/src/com/android/camera/VideoMenu.java @@ -133,7 +133,8 @@ public class VideoMenu extends MenuController CameraSettings.KEY_POWER_MODE, CameraSettings.KEY_VIDEO_ROTATION, CameraSettings.KEY_VIDEO_CDS_MODE, - CameraSettings.KEY_VIDEO_TNR_MODE + CameraSettings.KEY_VIDEO_TNR_MODE, + CameraSettings.KEY_VIDEO_PARTIAL_UI }; mFrontBackSwitcher.setVisibility(View.INVISIBLE); initSwitchItem(CameraSettings.KEY_CAMERA_ID, mFrontBackSwitcher); diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 2bd5e1584..72adee0b7 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -2314,6 +2314,11 @@ public class VideoModule implements CameraModule, mParameters.setVideoRotation(videoRotation); } + //partial ui setting + String partialUi = mPreferences.getString(CameraSettings.KEY_VIDEO_PARTIAL_UI, + mActivity.getString(R.string.pref_camera_video_partial_ui_default)); + mUI.setPartialUiRecording(Boolean.valueOf(partialUi)); + //set power mode settings updatePowerMode(); } diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index bac1e3c11..fcd07449a 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -20,6 +20,7 @@ import java.util.List; import org.codeaurora.snapcam.R; +import android.content.Context; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Color; @@ -27,6 +28,7 @@ import android.graphics.Point; import android.graphics.drawable.ColorDrawable; import android.hardware.Camera.Parameters; import android.util.Log; +import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.SurfaceHolder; @@ -35,6 +37,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.ImageView; @@ -101,6 +104,11 @@ public class VideoUI implements PieRenderer.PieListener, private RotateLayout mSubMenuLayout; private LinearLayout mPreviewMenuLayout; + private ShutterButton mFloatingShutter; + private RotateLayout mFloatingRecordingTimeRect; + private View mFloatingTimeLapse; + private boolean mPartialUiRecording; + private View mPreviewCover; private SurfaceView mSurfaceView = null; private int mMaxPreviewWidth = 0; @@ -885,6 +893,28 @@ public class VideoUI implements PieRenderer.PieListener, if (recording) { mShutterButton.setImageResource(R.drawable.shutter_button_video_stop); hideSwitcher(); + + if(mPartialUiRecording) { + mActivity.hideAboveFilmStripControlLayout(); + mCameraControls.setVisibility(View.INVISIBLE); + mRenderOverlay.setVisibility(View.INVISIBLE); + mFloatingTimeLapse.setVisibility(mIsTimeLapse ? View.VISIBLE : View.GONE); + + ((ViewGroup)mRootView).requestTransparentRegion((View) mSurfaceView.getParent()); + + int leftOffset = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, mActivity.getResources().getDisplayMetrics()); + CameraUtil.addView(mActivity, mRecordingTimeRect, leftOffset, 0, + Gravity.TOP | Gravity.LEFT, + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT); + + mShutterButton.setVisibility(View.GONE); + + int shutterBottomOffset = (int)mActivity.getResources().getDimension(R.dimen.shutter_offset); + CameraUtil.addView(mActivity, mFloatingShutter, 0, shutterBottomOffset, Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, + mShutterButton.getMeasuredWidth(), mShutterButton.getMeasuredHeight()); + } + mRecordingTimeView.setText(""); mRecordingTimeView.setVisibility(View.VISIBLE); mPauseButton.setVisibility(View.VISIBLE); @@ -893,8 +923,20 @@ public class VideoUI implements PieRenderer.PieListener, if (!mController.isVideoCaptureIntent()) { showSwitcher(); } - mRecordingTimeView.setVisibility(View.GONE); - mPauseButton.setVisibility(View.GONE); + + if(mPartialUiRecording) { + mShutterButton.setVisibility(View.VISIBLE); + WindowManager wm = (WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE); + wm.removeView(mRecordingTimeRect); + wm.removeView(mFloatingShutter); + + mActivity.showAboveFilmStripControlLayout(); + mCameraControls.setVisibility(View.VISIBLE); + mRenderOverlay.setVisibility(View.VISIBLE); + } else { + mRecordingTimeView.setVisibility(View.GONE); + mPauseButton.setVisibility(View.GONE); + } } } @@ -979,7 +1021,10 @@ public class VideoUI implements PieRenderer.PieListener, } public void clickShutter() { - mShutterButton.performClick(); + if(mRecordingStarted && mPartialUiRecording) + mFloatingShutter.performClick(); + else + mShutterButton.performClick(); } public void pressShutter(boolean pressed) { @@ -1132,4 +1177,34 @@ public class VideoUI implements PieRenderer.PieListener, public void adjustOrientation() { setOrientation(mOrientation, false); } + + public void setPartialUiRecording(boolean enable) { + mPartialUiRecording = enable; + + if(mPartialUiRecording) { + if(mFloatingShutter == null) { + mFloatingShutter = (ShutterButton)View.inflate(mActivity, R.layout.floating_shutter_icon, null); + mFloatingShutter.setOnShutterButtonListener(mController); + } + + if(mFloatingRecordingTimeRect == null) { + mFloatingRecordingTimeRect = new RotateLayout(mActivity, null); + mFloatingRecordingTimeRect.addView(View.inflate(mActivity, R.layout.floating_recording_time, null)); + mFloatingTimeLapse = mFloatingRecordingTimeRect.findViewById(R.id.time_lapse_label); + } + + mRootView.findViewById(R.id.recording_time_rect).setVisibility(View.GONE); + mRecordingTimeRect = mFloatingRecordingTimeRect; + + mRecordingTimeView = (TextView) mRecordingTimeRect.findViewById(R.id.recording_time); + mPauseButton = (PauseButton) mRecordingTimeRect.findViewById(R.id.video_pause); + mPauseButton.setOnPauseButtonListener(this); + } else { + mRecordingTimeRect = (RotateLayout) mRootView.findViewById(R.id.recording_time_rect); + mRecordingTimeRect.setVisibility(View.VISIBLE); + + mRecordingTimeView = (TextView) mRootView.findViewById(R.id.recording_time); + initializePauseButton(); + } + } } diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index 01469baeb..d254acff3 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -685,7 +685,6 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { } private void init(CameraActivity cameraActivity) { - setWillNotDraw(false); mActivity = cameraActivity; mScale = 1.0f; mDataIdOnUserScrolling = 0; @@ -1422,13 +1421,6 @@ public class FilmStripView extends ViewGroup implements BottomControlsListener { mLastItemId = getCurrentId(); } - @Override - public void onDraw(Canvas c) { - // TODO: remove layoutViewItems() here. - layoutViewItems(false); - super.onDraw(c); - } - @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { mDrawArea.left = l; diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java index 5fb00ca65..daa190f85 100644 --- a/src/com/android/camera/util/CameraUtil.java +++ b/src/com/android/camera/util/CameraUtil.java @@ -28,6 +28,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; +import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; @@ -60,6 +61,7 @@ import com.android.camera.CameraManager; import com.android.camera.CameraSettings; import com.android.camera.ui.RotateTextToast; import com.android.camera.util.IntentHelper; + import org.codeaurora.snapcam.R; import java.io.Closeable; @@ -1164,4 +1166,16 @@ public class CameraUtil { return retRatio; } + public static WindowManager.LayoutParams addView(Context context, View v, int x, int y, + int gravity, int width, int height) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + WindowManager.LayoutParams params = new WindowManager.LayoutParams(width, height, + WindowManager.LayoutParams.TYPE_APPLICATION_PANEL, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); + params.gravity = gravity; + params.x = x; + params.y = y; + wm.addView(v, params); + return params; + } } -- cgit v1.2.3