From b7c7d9a067cd52a27cfbaf0714a2074f972d836d Mon Sep 17 00:00:00 2001 From: Andy Huibers Date: Wed, 18 Jun 2014 22:26:14 -0700 Subject: [PATCH] Add metadata to capture and tap to focus events. Bug: 15646701 Change-Id: Id290935839a81cfe86e9a503849207d828f33225 --- src/com/android/camera/FocusOverlayManager.java | 14 ++++++ src/com/android/camera/PhotoModule.java | 21 +++++++- src/com/android/camera/ShutterButton.java | 17 +++++-- src/com/android/camera/VideoModule.java | 9 +++- src/com/android/camera/app/CameraAppUI.java | 6 +++ src/com/android/camera/ui/FocusOverlay.java | 6 --- src/com/android/camera/ui/TouchCoordinate.java | 57 ++++++++++++++++++++++ .../android/camera/widget/ModeOptionsOverlay.java | 6 +++ .../com/android/camera/util/UsageStatistics.java | 8 ++- 9 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 src/com/android/camera/ui/TouchCoordinate.java diff --git a/src/com/android/camera/FocusOverlayManager.java b/src/com/android/camera/FocusOverlayManager.java index 53d4d3389..96c84afd9 100644 --- a/src/com/android/camera/FocusOverlayManager.java +++ b/src/com/android/camera/FocusOverlayManager.java @@ -33,6 +33,7 @@ import com.android.camera.app.MotionManager; import com.android.camera.debug.Log; import com.android.camera.settings.SettingsManager; import com.android.camera.ui.PreviewStatusListener; +import com.android.camera.ui.TouchCoordinate; import com.android.camera.util.CameraUtil; import com.android.camera.util.UsageStatistics; @@ -100,6 +101,10 @@ public class FocusOverlayManager implements PreviewStatusListener.PreviewAreaCha private final Rect mPreviewRect = new Rect(0, 0, 0, 0); private boolean mFocusLocked; + /** Manual tap to focus parameters */ + private TouchCoordinate mTouchCoordinate; + private long mTouchTime; + public interface FocusUI { public boolean hasFaces(); public void clearFocus(); @@ -363,6 +368,9 @@ public class FocusOverlayManager implements PreviewStatusListener.PreviewAreaCha // Use margin to set the focus indicator to the touched area. mUI.setFocusPosition(x, y, false); + // Log manual tap to focus. + mTouchCoordinate = new TouchCoordinate(x, y, mPreviewRect.width(), mPreviewRect.height()); + mTouchTime = System.currentTimeMillis(); // Stop face detection because we want to specify focus and metering area. mListener.stopFaceDetection(); @@ -532,6 +540,12 @@ public class FocusOverlayManager implements PreviewStatusListener.PreviewAreaCha // Initialize mFocusArea. mFocusArea = null; mMeteringArea = null; + + if (mTouchCoordinate != null) { + UsageStatistics.instance().tapToFocus(mTouchCoordinate, + 0.001f * (System.currentTimeMillis() - mTouchTime)); + mTouchCoordinate = null; + } } private void calculateTapArea(int x, int y, float areaMultiple, Rect rect) { diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index 43e93b4d0..a10c297fd 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -76,6 +76,7 @@ import com.android.camera.settings.ResolutionUtil; import com.android.camera.settings.SettingsManager; import com.android.camera.settings.SettingsUtil; import com.android.camera.ui.CountDownView; +import com.android.camera.ui.TouchCoordinate; import com.android.camera.util.ApiHelper; import com.android.camera.util.CameraUtil; import com.android.camera.util.GcamHelper; @@ -153,6 +154,8 @@ public class PhotoModule private int mZoomValue; // The current zoom value. private int mTimerDuration; + /** Set when a volume button is clicked to take photo */ + private boolean mVolumeButtonClickedFlag = false; private Parameters mInitialParams; private boolean mFocusAreaSupported; @@ -234,6 +237,9 @@ public class PhotoModule private long mJpegPictureCallbackTime; private long mOnResumeTime; private byte[] mJpegImageData; + /** Touch coordinate for shutter button press. */ + private TouchCoordinate mShutterTouchCoordinate; + // These latency time are for the CameraLatency test. public long mAutoFocusTime; @@ -1062,7 +1068,9 @@ public class PhotoModule eventprotos.NavigationChange.Mode.PHOTO_CAPTURE, mNamedImages.mQueue.lastElement().title + ".jpg", exif, isCameraFrontFacing(), hdrOn, zoomValue, flashSetting, gridLinesOn, - (float) mTimerDuration); + (float) mTimerDuration, mShutterTouchCoordinate, mVolumeButtonClickedFlag); + mShutterTouchCoordinate = null; + mVolumeButtonClickedFlag = false; if (!mIsImageCaptureIntent) { // Calculate the width and the height of the jpeg. @@ -1440,6 +1448,11 @@ public class PhotoModule } @Override + public void onShutterCoordinate(TouchCoordinate coord) { + mShutterTouchCoordinate = coord; + } + + @Override public void onShutterButtonFocus(boolean pressed) { // Do nothing. We don't support half-press to focus anymore. } @@ -1448,6 +1461,7 @@ public class PhotoModule public void onShutterButtonClick() { if (mPaused || (mCameraState == SWITCHING_CAMERA) || (mCameraState == PREVIEW_STOPPED)) { + mVolumeButtonClickedFlag = false; return; } @@ -1455,9 +1469,11 @@ public class PhotoModule if (mActivity.getStorageSpaceBytes() <= Storage.LOW_STORAGE_THRESHOLD_BYTES) { Log.i(TAG, "Not enough space or storage not ready. remaining=" + mActivity.getStorageSpaceBytes()); + mVolumeButtonClickedFlag = false; return; } - Log.d(TAG, "onShutterButtonClick: mCameraState=" + mCameraState); + Log.d(TAG, "onShutterButtonClick: mCameraState=" + mCameraState + + " mVolumeButtonClickedFlag=" + mVolumeButtonClickedFlag); int countDownDuration = Integer.parseInt(mActivity.getSettingsManager() .get(SettingsManager.SETTING_COUNTDOWN_DURATION)); @@ -1761,6 +1777,7 @@ public class PhotoModule case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: if (/* mActivity.isInCameraApp() && */mFirstTimeInitialized) { + mVolumeButtonClickedFlag = true; onShutterButtonClick(); return true; } diff --git a/src/com/android/camera/ShutterButton.java b/src/com/android/camera/ShutterButton.java index 2a0296eb7..05a612698 100755 --- a/src/com/android/camera/ShutterButton.java +++ b/src/com/android/camera/ShutterButton.java @@ -17,11 +17,15 @@ package com.android.camera; import android.content.Context; +import android.text.method.Touch; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; +import com.android.camera.debug.Log; +import com.android.camera.ui.TouchCoordinate; + import java.util.List; import java.util.ArrayList; @@ -31,11 +35,11 @@ import java.util.ArrayList; * pressed state changes. */ public class ShutterButton extends ImageView { - + private static final Log.Tag TAG = new Log.Tag("ShutterButton"); public static final float ALPHA_WHEN_ENABLED = 1f; public static final float ALPHA_WHEN_DISABLED = 0.2f; private boolean mTouchEnabled = true; - + private TouchCoordinate mTouchCoordinate; /** * A callback to be invoked when a ShutterButton's pressed state changes. */ @@ -46,6 +50,7 @@ public class ShutterButton extends ImageView { * @param pressed The ShutterButton that was pressed. */ void onShutterButtonFocus(boolean pressed); + void onShutterCoordinate(TouchCoordinate coord); void onShutterButtonClick(); } @@ -78,6 +83,10 @@ public class ShutterButton extends ImageView { @Override public boolean dispatchTouchEvent(MotionEvent m) { if (mTouchEnabled) { + if (m.getActionMasked() == MotionEvent.ACTION_UP) { + mTouchCoordinate = new TouchCoordinate(m.getX(), m.getY(), this.getMeasuredWidth(), + this.getMeasuredHeight()); + } return super.dispatchTouchEvent(m); } else { return false; @@ -140,10 +149,12 @@ public class ShutterButton extends ImageView { } @Override - public boolean performClick() { + public boolean performClick() { boolean result = super.performClick(); if (getVisibility() == View.VISIBLE) { for (OnShutterButtonListener listener : mListeners) { + listener.onShutterCoordinate(mTouchCoordinate); + mTouchCoordinate = null; listener.onShutterButtonClick(); } } diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 03795f7ae..65589ccb7 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -67,6 +67,7 @@ import com.android.camera.hardware.HardwareSpecImpl; import com.android.camera.module.ModuleController; import com.android.camera.settings.SettingsManager; import com.android.camera.settings.SettingsUtil; +import com.android.camera.ui.TouchCoordinate; import com.android.camera.util.ApiHelper; import com.android.camera.util.CameraUtil; import com.android.camera.util.Size; @@ -680,6 +681,11 @@ public class VideoModule extends CameraModule } @Override + public void onShutterCoordinate(TouchCoordinate coord) { + // Do nothing. + } + + @Override public void onShutterButtonFocus(boolean pressed) { // TODO: Remove this when old camera controls are removed from the UI. } @@ -1841,7 +1847,8 @@ public class VideoModule extends CameraModule Boolean gridLinesOn = mActivity.getSettingsManager().areGridLinesOn(); UsageStatistics.instance().photoCaptureDoneEvent( eventprotos.NavigationChange.Mode.VIDEO_STILL, title + ".jpeg", exif, - isCameraFrontFacing(), false, currentZoomValue(), flashSetting, gridLinesOn, null); + isCameraFrontFacing(), false, currentZoomValue(), flashSetting, gridLinesOn, + null, null, null); getServices().getMediaSaver().addImage( data, title, dateTaken, loc, orientation, diff --git a/src/com/android/camera/app/CameraAppUI.java b/src/com/android/camera/app/CameraAppUI.java index 93a2f499d..3de1db1f4 100644 --- a/src/com/android/camera/app/CameraAppUI.java +++ b/src/com/android/camera/app/CameraAppUI.java @@ -58,6 +58,7 @@ import com.android.camera.ui.ModeListView; import com.android.camera.ui.ModeTransitionView; import com.android.camera.ui.PreviewOverlay; import com.android.camera.ui.PreviewStatusListener; +import com.android.camera.ui.TouchCoordinate; import com.android.camera.util.ApiHelper; import com.android.camera.util.CameraUtil; import com.android.camera.util.Gusterpolator; @@ -1360,6 +1361,11 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener, } @Override + public void onShutterCoordinate(TouchCoordinate coord) { + // Do nothing. + } + + @Override public void onShutterButtonFocus(boolean pressed) { // noop } diff --git a/src/com/android/camera/ui/FocusOverlay.java b/src/com/android/camera/ui/FocusOverlay.java index 27acd1907..6d95e074d 100644 --- a/src/com/android/camera/ui/FocusOverlay.java +++ b/src/com/android/camera/ui/FocusOverlay.java @@ -26,9 +26,7 @@ import android.view.View; import com.android.camera.FocusOverlayManager; import com.android.camera.debug.Log; -import com.android.camera.util.UsageStatistics; import com.android.camera2.R; -import com.google.common.logging.eventprotos; /** * Displays a focus indicator. @@ -84,10 +82,6 @@ public class FocusOverlay extends View implements FocusOverlayManager.FocusUI { if (getVisibility() != VISIBLE) { setVisibility(VISIBLE); } - // Log manual tap to focus. - if (isAutoFocus == false) { - UsageStatistics.instance().controlUsed(eventprotos.ControlEvent.ControlType.TAP_TO_FOCUS); - } } @Override diff --git a/src/com/android/camera/ui/TouchCoordinate.java b/src/com/android/camera/ui/TouchCoordinate.java new file mode 100644 index 000000000..54efdb113 --- /dev/null +++ b/src/com/android/camera/ui/TouchCoordinate.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.camera.ui; + +/** + * Touch coordinate. + */ +public class TouchCoordinate { + private float x; + private float y; + private float maxX; + private float maxY; + + /** + * Constructor. + * @param x X value for the touch, with 0 typically the lowest value. + * @param y Y value for the touch, with 0 typically the lowest value. + * @param maxX Highest X value possible for any touch. + * @param maxY Highest Y value possible for any touch. + */ + public TouchCoordinate(float x, float y, float maxX, float maxY) { + this.x = x; + this.y = y; + this.maxX = maxX; + this.maxY = maxY; + } + + public float getX() { + return this.x; + } + + public float getY() { + return this.y; + } + + public float getMaxX() { + return this.maxX; + } + + public float getMaxY() { + return this.maxY; + } +} diff --git a/src/com/android/camera/widget/ModeOptionsOverlay.java b/src/com/android/camera/widget/ModeOptionsOverlay.java index bcb901796..4da24d517 100644 --- a/src/com/android/camera/widget/ModeOptionsOverlay.java +++ b/src/com/android/camera/widget/ModeOptionsOverlay.java @@ -32,6 +32,7 @@ import com.android.camera.CaptureLayoutHelper; import com.android.camera.ShutterButton; import com.android.camera.debug.Log; import com.android.camera.ui.PreviewOverlay; +import com.android.camera.ui.TouchCoordinate; import com.android.camera2.R; /** @@ -104,6 +105,11 @@ public class ModeOptionsOverlay extends FrameLayout } @Override + public void onShutterCoordinate(TouchCoordinate coord) { + // Do nothing. + } + + @Override public void onShutterButtonFocus(boolean pressed) { // noop } diff --git a/src_pd/com/android/camera/util/UsageStatistics.java b/src_pd/com/android/camera/util/UsageStatistics.java index ea1c6e5cd..d68dec904 100644 --- a/src_pd/com/android/camera/util/UsageStatistics.java +++ b/src_pd/com/android/camera/util/UsageStatistics.java @@ -18,7 +18,9 @@ package com.android.camera.util; import android.content.Context; + import com.android.camera.exif.ExifInterface; +import com.android.camera.ui.TouchCoordinate; import java.util.HashMap; @@ -60,7 +62,8 @@ public class UsageStatistics { public void photoCaptureDoneEvent(int mode, String fileRef, ExifInterface exifRef, boolean front, boolean isHDR, float zoom, String flashSetting, boolean gridLinesOn, - Float timerSeconds) { + Float timerSeconds, TouchCoordinate touch, + Boolean volumeButtonShutter) { } public void cameraFailure(int cause, String info) { @@ -72,6 +75,9 @@ public class UsageStatistics { public void controlUsed(int control) { } + public void tapToFocus(TouchCoordinate touch, Float duration) { + } + public void reportMemoryConsumed(HashMap memoryData, String reportType) { } } -- 2.11.0