diff options
| author | Yu Yang <yuyang@codeaurora.org> | 2013-08-30 10:31:52 +0800 |
|---|---|---|
| committer | Steve Kondik <shade@chemlab.org> | 2013-10-18 15:54:49 -0700 |
| commit | e9643f7d46dca93634afffcd32908793eb231041 (patch) | |
| tree | e19fd64e17979339942379cf87700cf0795f5127 /src/com | |
| parent | f7e02fecb29bee4743191ea7c91feac20af63d37 (diff) | |
| download | android_packages_apps_Gallery2-e9643f7d46dca93634afffcd32908793eb231041.tar.gz android_packages_apps_Gallery2-e9643f7d46dca93634afffcd32908793eb231041.tar.bz2 android_packages_apps_Gallery2-e9643f7d46dca93634afffcd32908793eb231041.zip | |
Camera: Add camcorder pause feature
Add Camcorder pause/resume feature, recording can pause,
then resume to go on recording.
Change-Id: I64840a982535f481655723bc7e03302d8b765132
Diffstat (limited to 'src/com')
| -rw-r--r-- | src/com/android/camera/PauseButton.java | 82 | ||||
| -rw-r--r-- | src/com/android/camera/VideoController.java | 3 | ||||
| -rw-r--r-- | src/com/android/camera/VideoModule.java | 41 | ||||
| -rw-r--r-- | src/com/android/camera/VideoUI.java | 36 |
4 files changed, 155 insertions, 7 deletions
diff --git a/src/com/android/camera/PauseButton.java b/src/com/android/camera/PauseButton.java new file mode 100644 index 000000000..a785050fd --- /dev/null +++ b/src/com/android/camera/PauseButton.java @@ -0,0 +1,82 @@ +/* Copyright (c) 2013, 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; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ImageView; +import android.view.MotionEvent; +import android.view.View; +import android.util.Log; + +/** + * A button designed to be used for the on-screen recording + * pausing-continue button. + */ +public class PauseButton extends ImageView { + + public interface OnPauseButtonListener { + void onButtonPause(); + void onButtonContinue(); + } + + public PauseButton(Context context, AttributeSet attrs) { + super(context, attrs); + setClickable(true); + setSelected(false); + } + + public void setPaused(boolean paused) { + setSelected(paused); + } + + @Override + public boolean performClick() { + boolean result = super.performClick(); + if (isSelected()) { + setSelected(false); + if (mListener != null && getVisibility() == View.VISIBLE) { + mListener.onButtonContinue(); + } + } else { + setSelected(true); + if (mListener != null && getVisibility() == View.VISIBLE) { + mListener.onButtonPause(); + } + } + return result; + } + + public void setOnPauseButtonListener(OnPauseButtonListener listener) { + mListener = listener; + } + + private OnPauseButtonListener mListener; +} diff --git a/src/com/android/camera/VideoController.java b/src/com/android/camera/VideoController.java index f2601c104..99ba748a3 100644 --- a/src/com/android/camera/VideoController.java +++ b/src/com/android/camera/VideoController.java @@ -19,8 +19,9 @@ package com.android.camera; import android.view.View; import com.android.camera.ShutterButton.OnShutterButtonListener; +import com.android.camera.PauseButton.OnPauseButtonListener; -public interface VideoController extends OnShutterButtonListener { +public interface VideoController extends OnShutterButtonListener, OnPauseButtonListener { public void onReviewDoneClicked(View view); public void onReviewCancelClicked(View viwe); diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index bd5f2ccd7..9a58985ab 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -145,7 +145,9 @@ public class VideoModule implements CameraModule, private boolean mSwitchingCamera; private boolean mMediaRecorderRecording = false; + private boolean mMediaRecorderPausing = false; private long mRecordingStartTime; + private long mRecordingTotalTime; private boolean mRecordingTimeCountsDown = false; private long mOnResumeTime; // The video file that the hardware camera is about to record into @@ -531,6 +533,8 @@ public class VideoModule implements CameraModule, } } + //If recording pause, ignore livesnapshot + if (mMediaRecorderPausing) return; if (mMediaRecorderRecording && effectsActive()) { new RotateTextToast(mActivity, R.string.disable_video_snapshot_hint, mOrientation).show(); @@ -1562,7 +1566,7 @@ public class VideoModule implements CameraModule, private void saveVideo() { if (mVideoFileDescriptor == null) { - long duration = SystemClock.uptimeMillis() - mRecordingStartTime; + long duration = SystemClock.uptimeMillis() - mRecordingStartTime + mRecordingTotalTime; if (duration > 0) { if (mCaptureTimeLapse) { duration = getTimeLapseVideoLength(duration); @@ -1711,9 +1715,12 @@ public class VideoModule implements CameraModule, mUI.enableCameraControls(false); mMediaRecorderRecording = true; + mMediaRecorderPausing = false; + mUI.resetPauseButton(); if (!Util.systemRotationLocked(mActivity)) { mActivity.getOrientationManager().lockOrientation(); } + mRecordingTotalTime = 0L; mRecordingStartTime = SystemClock.uptimeMillis(); mUI.showRecordingUI(true, mParameters.isZoomSupported()); @@ -1755,6 +1762,21 @@ public class VideoModule implements CameraModule, } } + private void pauseVideoRecording() { + Log.v(TAG, "pauseVideoRecording"); + mMediaRecorderPausing = true; + mRecordingTotalTime += SystemClock.uptimeMillis() - mRecordingStartTime; + mMediaRecorder.pause(); + } + + private void resumeVideoRecording() { + Log.v(TAG, "resumeVideoRecording"); + mMediaRecorderPausing = false; + mRecordingStartTime = SystemClock.uptimeMillis(); + updateRecordingTime(); + mMediaRecorder.start(); + } + private boolean stopVideoRecording() { Log.v(TAG, "stopVideoRecording"); mActivity.setSwipingEnabled(true); @@ -1842,7 +1864,7 @@ public class VideoModule implements CameraModule, UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, fail ? UsageStatistics.ACTION_CAPTURE_FAIL : UsageStatistics.ACTION_CAPTURE_DONE, "Video", - SystemClock.uptimeMillis() - mRecordingStartTime); + SystemClock.uptimeMillis() - mRecordingStartTime + mRecordingTotalTime); return fail; } @@ -1918,8 +1940,11 @@ public class VideoModule implements CameraModule, if (!mMediaRecorderRecording) { return; } + if (mMediaRecorderPausing) { + return; + } long now = SystemClock.uptimeMillis(); - long delta = now - mRecordingStartTime; + long delta = now - mRecordingStartTime + mRecordingTotalTime; // Starting a minute before reaching the max duration // limit, we'll countdown the remaining time instead. @@ -2559,4 +2584,14 @@ public class VideoModule implements CameraModule, public void onMediaSaveServiceConnected(MediaSaveService s) { // do nothing. } + + @Override + public void onButtonPause() { + pauseVideoRecording(); + } + + @Override + public void onButtonContinue() { + resumeVideoRecording(); + } } diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index b5559c69d..5ab9ec006 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -41,15 +41,15 @@ import com.android.camera.ui.PreviewSurfaceView; import com.android.camera.ui.RenderOverlay; import com.android.camera.ui.RotateLayout; import com.android.camera.ui.ZoomRenderer; +import com.android.camera.PauseButton.OnPauseButtonListener; import com.android.gallery3d.R; import com.android.gallery3d.common.ApiHelper; import java.util.List; public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, - PreviewGestures.SingleTapListener, - PreviewGestures.SwipeListener, - FocusUI { + FocusUI, PreviewGestures.SingleTapListener, PreviewGestures.SwipeListener, + PauseButton.OnPauseButtonListener { private final static String TAG = "CAM_VideoUI"; // module fields private CameraActivity mActivity; @@ -64,6 +64,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, private View mReviewDoneButton; private View mReviewPlayButton; private ShutterButton mShutterButton; + private PauseButton mPauseButton; private TextView mRecordingTimeView; private LinearLayout mLabelsLinearLayout; private View mTimeLapseLabel; @@ -95,6 +96,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, initializeMiscControls(); initializeControlByIntent(); initializeOverlay(); + initializePauseButton(); } private OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() { @@ -290,6 +292,12 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, mLabelsLinearLayout = (LinearLayout) mRootView.findViewById(R.id.labels); } + private void initializePauseButton() { + mPauseButton = (PauseButton) mRootView.findViewById(R.id.video_pause); + mGestures.addUnclickableArea(mPauseButton); + mPauseButton.setOnPauseButtonListener(this); + } + public void updateOnScreenIndicators(Parameters param, ComboPreferences prefs) { mOnScreenIndicators.updateVideoHDROnScreenIndicator(param.getVideoHDRMode()); mOnScreenIndicators.updateFlashOnScreenIndicator(param.getFlashMode()); @@ -432,6 +440,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, mActivity.hideSwitcher(); mRecordingTimeView.setText(""); mRecordingTimeView.setVisibility(View.VISIBLE); + mPauseButton.setVisibility(View.VISIBLE); // The camera is not allowed to be accessed in older api levels during // recording. It is therefore necessary to hide the zoom UI on older // platforms. @@ -444,6 +453,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, mShutterButton.setImageResource(R.drawable.btn_new_shutter_video); mActivity.showSwitcher(); mRecordingTimeView.setVisibility(View.GONE); + mPauseButton.setVisibility(View.GONE); if (!ApiHelper.HAS_ZOOM_WHEN_RECORDING && zoomSupported) { // TODO: enable zoom UI here. } @@ -621,4 +631,24 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener, mPreviewThumb.setVisibility(View.GONE); } } + + @Override + public void onButtonPause() { + mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.ic_pausing_indicator, 0, 0, 0); + mController.onButtonPause(); + } + + @Override + public void onButtonContinue() { + mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.ic_recording_indicator, 0, 0, 0); + mController.onButtonContinue(); + } + + public void resetPauseButton() { + mRecordingTimeView.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.ic_recording_indicator, 0, 0, 0); + mPauseButton.setPaused(false); + } } |
