summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorYu Yang <yuyang@codeaurora.org>2013-08-30 10:31:52 +0800
committerSteve Kondik <shade@chemlab.org>2013-10-18 15:54:49 -0700
commite9643f7d46dca93634afffcd32908793eb231041 (patch)
treee19fd64e17979339942379cf87700cf0795f5127 /src/com
parentf7e02fecb29bee4743191ea7c91feac20af63d37 (diff)
downloadandroid_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.java82
-rw-r--r--src/com/android/camera/VideoController.java3
-rw-r--r--src/com/android/camera/VideoModule.java41
-rw-r--r--src/com/android/camera/VideoUI.java36
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);
+ }
}