summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Yoo <jyoo@codeaurora.org>2016-10-12 09:50:47 -0700
committerJack Yoo <jyoo@codeaurora.org>2016-10-20 11:24:37 -0700
commite5638a1b4697191588438be133102f61b67a3985 (patch)
treeb127b3484af48db5d576d320b3807250fc190166
parentc250484c375484e70a1c8e64eb8bd956b3f1c15d (diff)
downloadandroid_packages_apps_Snap-e5638a1b4697191588438be133102f61b67a3985.tar.gz
android_packages_apps_Snap-e5638a1b4697191588438be133102f61b67a3985.tar.bz2
android_packages_apps_Snap-e5638a1b4697191588438be133102f61b67a3985.zip
SnapdragonCamera: PanoramaUI and filter change
1. Adjusting Panorama UI 2. Adjusting Chormaflash filter 3. Changing Ubifocus focus timeout value 4. ZSL Flash mode change Change-Id: Ia46fdc827cd5529a8b7c6f5cfafc44bb3cf00d06 CRs-Fixed: 1080317
-rw-r--r--assets/dependency.json3
-rw-r--r--res/values/qcomstrings.xml4
-rw-r--r--src/com/android/camera/CaptureModule.java8
-rw-r--r--src/com/android/camera/CaptureUI.java3
-rw-r--r--src/com/android/camera/PanoCaptureModule.java7
-rw-r--r--src/com/android/camera/PanoCaptureUI.java30
-rw-r--r--src/com/android/camera/imageprocessor/PostProcessor.java33
-rw-r--r--src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java57
-rw-r--r--src/com/android/camera/imageprocessor/filter/UbifocusFilter.java10
-rw-r--r--src/com/android/camera/ui/PanoCaptureProcessView.java36
10 files changed, 134 insertions, 57 deletions
diff --git a/assets/dependency.json b/assets/dependency.json
index bee8f41be..ebb9c6a25 100644
--- a/assets/dependency.json
+++ b/assets/dependency.json
@@ -48,6 +48,9 @@
{"pref_camera2_clearsight_key":"off",
"pref_camera2_mono_preview_key":"off",
"pref_camera2_mpo_key":"off"}
+ ,
+ "105":
+ {"pref_camera2_flashmode_key":"off"}
},
"pref_camera2_clearsight_key":
{
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
index 986ff8b3d..72fab56e0 100644
--- a/res/values/qcomstrings.xml
+++ b/res/values/qcomstrings.xml
@@ -1046,7 +1046,9 @@
<string name="pref_camera2_timer_value_2sec" translatable="false">2</string>
<string name="pref_camera2_timer_value_5sec" translatable="false">5</string>
<string name="pref_camera2_timer_value_10sec" translatable="false">10</string>
- <string name="panocapture_direction_is_not_determined" translatable="true">Direction is not detected.</string>
+ <string name="panocapture_direction_is_not_determined" translatable="true">Move constantly in one direciton.</string>
+ <string name="panocapture_intro" translatable="true">Press camera button to start.</string>
+ <string name="panocapture_direction_is_changed" translatable="true">Direction is changed. Stopping now...</string>
<string name="makeup_ui_title" translatable="true">Please choose the strength of the beautification.</string>
<string name="makeup_ui_ok_button" translatable="true">OK</string>
<string name="makeup_seekbar_low" translatable="true">low</string>
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java
index c800c6e4e..e81a34c6f 100644
--- a/src/com/android/camera/CaptureModule.java
+++ b/src/com/android/camera/CaptureModule.java
@@ -925,7 +925,7 @@ public class CaptureModule implements CameraModule, PhotoController,
public void setFlashModeToPreview(int id, boolean isFlashOn) {
Log.d(TAG, "setFlashModeToPreview " + isFlashOn);
if(isFlashOn) {
- mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
+ mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
mPreviewRequestBuilder[id].set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
} else {
mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
@@ -1507,6 +1507,7 @@ public class CaptureModule implements CameraModule, PhotoController,
});
}
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+ applyFlash(mPreviewRequestBuilder[id], id);
applySettingsForUnlockExposure(mPreviewRequestBuilder[id], id);
setAFModeToPreview(id, mControlAFMode);
mTakingPicture[id] = false;
@@ -3055,6 +3056,7 @@ public class CaptureModule implements CameraModule, PhotoController,
mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest
.CONTROL_AF_TRIGGER_IDLE);
applyCommonSettings(mPreviewRequestBuilder[id], id);
+ applyFlash(mPreviewRequestBuilder[id], id);
}
public float getZoomValue() {
@@ -3106,10 +3108,6 @@ public class CaptureModule implements CameraModule, PhotoController,
updatePreview = true;
applyFaceDetection(mPreviewRequestBuilder[cameraId]);
break;
- case SettingsManager.KEY_FLASH_MODE:
- updatePreview = true;
- applyFlash(mPreviewRequestBuilder[cameraId], cameraId);
- break;
}
return updatePreview;
}
diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java
index ffec736b8..1710dc975 100644
--- a/src/com/android/camera/CaptureUI.java
+++ b/src/com/android/camera/CaptureUI.java
@@ -248,7 +248,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI,
mSceneModeSwitcher = mRootView.findViewById(R.id.scene_mode_switcher);
mFrontBackSwitcher = mRootView.findViewById(R.id.front_back_switcher);
mMakeupButton = (ImageView) mRootView.findViewById(R.id.ts_makeup_switcher);
- setMakeupButtonIcon();
mMakeupSeekBarLayout = mRootView.findViewById(R.id.makeup_seekbar_layout);
mSeekbarBody = mRootView.findViewById(R.id.seekbar_body);
mSeekbarToggleButton = (Button) mRootView.findViewById(R.id.seekbar_toggle);
@@ -282,6 +281,7 @@ public class CaptureUI implements FocusOverlayManager.FocusUI,
toggleMakeup();
}
});
+ setMakeupButtonIcon();
mFlashButton = (FlashToggleButton) mRootView.findViewById(R.id.flash_button);
initFilterModeButton();
initSceneModeButton();
@@ -388,6 +388,7 @@ public class CaptureUI implements FocusOverlayManager.FocusUI,
public void run() {
if(value != null && !value.equals("0")) {
mMakeupButton.setImageResource(R.drawable.beautify_on);
+ mMakeupSeekBarLayout.setVisibility(View.VISIBLE);
} else {
mMakeupButton.setImageResource(R.drawable.beautify);
}
diff --git a/src/com/android/camera/PanoCaptureModule.java b/src/com/android/camera/PanoCaptureModule.java
index 4821c9774..ff5715e20 100644
--- a/src/com/android/camera/PanoCaptureModule.java
+++ b/src/com/android/camera/PanoCaptureModule.java
@@ -278,12 +278,7 @@ public class PanoCaptureModule implements CameraModule, PhotoController {
}
public void changePanoStatus(boolean newStatus, boolean isCancelling) {
- if(newStatus) {
- mUI.setThumbnailVisibility(View.GONE);
- } else {
- mUI.setThumbnailVisibility(View.VISIBLE);
- }
-
+ mUI.onPanoStatusChange(newStatus);
if(mFrameProcessor != null) {
mFrameProcessor.changePanoStatus(newStatus, isCancelling);
}
diff --git a/src/com/android/camera/PanoCaptureUI.java b/src/com/android/camera/PanoCaptureUI.java
index 4a3a1bb94..3ab43f915 100644
--- a/src/com/android/camera/PanoCaptureUI.java
+++ b/src/com/android/camera/PanoCaptureUI.java
@@ -91,15 +91,27 @@ public class PanoCaptureUI implements
mPreviewProcessView.onFrameAvailable(bitmap, isCancelling);
}
- public void setThumbnailVisibility(final int visibility) {
- if(mThumbnail != null) {
- mActivity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mThumbnail.setVisibility(visibility);
+ public void onPanoStatusChange(final boolean isStarting) {
+ mActivity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if(isStarting) {
+ if (mThumbnail != null) {
+ mThumbnail.setVisibility(View.GONE);
+ }
+ if (mShutterButton != null) {
+ mShutterButton.setImageResource(R.drawable.shutter_button_video_stop);
+ }
+ } else {
+ if (mThumbnail != null) {
+ mThumbnail.setVisibility(View.VISIBLE);
+ }
+ if (mShutterButton != null) {
+ mShutterButton.setImageResource(R.drawable.btn_new_shutter_panorama);
+ }
}
- });
- }
+ }
+ });
}
/*
@@ -329,7 +341,7 @@ public class PanoCaptureUI implements
public void onResume() {
mPreviewProcessView.onResume();
- setThumbnailVisibility(View.VISIBLE);
+ onPanoStatusChange(false);
mCameraControls.getPanoramaExitButton().setVisibility(View.VISIBLE);
mCameraControls.getPanoramaExitButton().setOnClickListener(new OnClickListener() {
@Override
diff --git a/src/com/android/camera/imageprocessor/PostProcessor.java b/src/com/android/camera/imageprocessor/PostProcessor.java
index 75dfa6ac7..228c0816f 100644
--- a/src/com/android/camera/imageprocessor/PostProcessor.java
+++ b/src/com/android/camera/imageprocessor/PostProcessor.java
@@ -129,6 +129,8 @@ public class PostProcessor{
private HandlerThread mZSLHandlerThread;
private ImageHandlerTask mImageHandlerTask;
private LinkedList<TotalCaptureResult> mTotalCaptureResultList = new LinkedList<TotalCaptureResult>();
+ private TotalCaptureResult mZSLFallOffResult = null;
+ private boolean mIsZSLFallOffForFlash = false;
public boolean isZSLEnabled() {
return mUseZSL;
@@ -173,6 +175,19 @@ public class PostProcessor{
public void onImageAvailable(ImageReader reader) {
try {
if(mUseZSL) {
+ if(mIsZSLFallOffForFlash && mZSLFallOffResult != null) {
+ Image image = reader.acquireNextImage();
+ if((mZSLFallOffResult.get(CaptureResult.SENSOR_TIMESTAMP)).longValue() <= image.getTimestamp()) {
+ Log.d(TAG,"ZSL fall off for flash image");
+ mIsZSLFallOffForFlash = false;
+ reprocessImage(image, mZSLFallOffResult);
+ mZSLFallOffResult = null;
+ } else {
+ image.close();
+ }
+ return;
+ }
+
Image image = reader.acquireLatestImage();
if (image == null) {
return;
@@ -200,6 +215,8 @@ public class PostProcessor{
}
} catch (IllegalStateException e) {
Log.e(TAG, "Max images has been already acquired. ");
+ mIsZSLFallOffForFlash = false;
+ mZSLFallOffResult = null;
}
}
@@ -234,7 +251,11 @@ public class PostProcessor{
if(mTotalCaptureResultList.size() <= PostProcessor.MAX_REQUIRED_IMAGE_NUM) {
mTotalCaptureResultList.add(result);
}
- onMetaAvailable(result);
+ if(mIsZSLFallOffForFlash) {
+ mZSLFallOffResult = result;
+ } else {
+ onMetaAvailable(result);
+ }
}
@Override
@@ -246,7 +267,9 @@ public class PostProcessor{
@Override
public void onCaptureSequenceCompleted(CameraCaptureSession session, int
sequenceId, long frameNumber) {
- mController.unlockFocus(mController.getMainCameraId());
+ if(!isFilterOn()) {
+ mController.unlockFocus(mController.getMainCameraId());
+ }
}
};
@@ -275,6 +298,7 @@ public class PostProcessor{
if(mController.getPreviewCaptureResult() == null ||
mController.getPreviewCaptureResult().get(CaptureResult.CONTROL_AE_STATE) == CameraMetadata.CONTROL_AE_STATE_FLASH_REQUIRED) {
if(DEBUG_ZSL) Log.d(TAG, "Flash required image");
+ mIsZSLFallOffForFlash = true;
imageItem = null;
}
if (mController.isSelfieFlash()) {
@@ -286,7 +310,9 @@ public class PostProcessor{
return true;
} else {
if(DEBUG_ZSL) Log.d(TAG, "No good item in queue, register the request for the future");
- mZSLQueue.addPictureRequest();
+ if(!mIsZSLFallOffForFlash) {
+ mZSLQueue.addPictureRequest();
+ }
return false;
}
}
@@ -325,6 +351,7 @@ public class PostProcessor{
private void onImageToProcess(Image image) {
addImage(image);
if (isReadyToProcess()) {
+ mController.unlockFocus(mController.getMainCameraId());
long captureStartTime = System.currentTimeMillis();
mNamedImages.nameNewImage(captureStartTime);
PhotoModule.NamedImages.NamedEntity name = mNamedImages.getNextNameEntity();
diff --git a/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java b/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java
index ad4c9933a..e244c1040 100644
--- a/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java
+++ b/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java
@@ -44,7 +44,7 @@ import java.util.ArrayList;
import java.util.List;
public class ChromaflashFilter implements ImageFilter{
- public static final int NUM_REQUIRED_IMAGE = 3;
+ public static final int NUM_REQUIRED_IMAGE = 6;
private int mWidth;
private int mHeight;
private int mStrideY;
@@ -105,6 +105,10 @@ public class ChromaflashFilter implements ImageFilter{
@Override
public void addImage(ByteBuffer bY, ByteBuffer bVU, int imageNum, Object param) {
Log("addImage");
+ if(imageNum == 1 || imageNum == 2 || imageNum == 4) {
+ mImageNum = imageNum;
+ return;
+ }
int yActualSize = bY.remaining();
int vuActualSize = bVU.remaining();
mImageNum = imageNum;
@@ -143,19 +147,46 @@ public class ChromaflashFilter implements ImageFilter{
}
@Override
- public void manualCapture(CaptureRequest.Builder builder, CameraCaptureSession captureSession,
- CameraCaptureSession.CaptureCallback callback, Handler handler) throws CameraAccessException {
- for(int i=0; i < NUM_REQUIRED_IMAGE; i++) {
- if(i == 1) {
- mModule.setFlashModeToPreview(mModule.getMainCameraId(), true);
- builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
- builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
- } else {
- mModule.setFlashModeToPreview(mModule.getMainCameraId(), false);
- builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
- builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
+ public void manualCapture(final CaptureRequest.Builder builder, final CameraCaptureSession captureSession,
+ final CameraCaptureSession.CaptureCallback callback, final Handler handler) throws CameraAccessException {
+ new Thread() {
+ public void run() {
+ try {
+ for (int i = 0; i < NUM_REQUIRED_IMAGE; i++) {
+ if (i == 0) {
+ captureSession.capture(builder.build(), callback, handler);
+ } else if (i == 1) { //To change the setting
+ builder.set(CaptureRequest.CONTROL_AE_LOCK, Boolean.FALSE);
+ captureSession.capture(builder.build(), callback, handler);
+ waitForImage(i);
+ } else if (i == 2) { //To change the setting
+ builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
+ builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
+ builder.set(CaptureRequest.CONTROL_AE_LOCK, Boolean.TRUE);
+ captureSession.capture(builder.build(), callback, handler);
+ waitForImage(i);
+ } else if (i == 3) {
+ captureSession.capture(builder.build(), callback, handler);
+ } else if (i == 4) { //To change the setting
+ builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
+ captureSession.capture(builder.build(), callback, handler);
+ waitForImage(i);
+ } else if (i == 5) {
+ captureSession.capture(builder.build(), callback, handler);
+ }
+ }
+ } catch(CameraAccessException e) {}
+
+ }
+ }.start();
+ }
+
+ private void waitForImage(int index) {
+ try {
+ while(mImageNum < index) {
+ Thread.sleep(50);
}
- captureSession.capture(builder.build(), callback, handler);
+ } catch (InterruptedException e) {
}
}
diff --git a/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java b/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java
index 57da5c441..f32832dd8 100644
--- a/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java
+++ b/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java
@@ -64,7 +64,7 @@ public class UbifocusFilter implements ImageFilter {
private int mStrideVU;
private static String TAG = "UbifocusFilter";
private static final boolean DEBUG = false;
- private static final int FOCUS_ADJUST_TIME_OUT = 200;
+ private static final int FOCUS_ADJUST_TIME_OUT = 400;
private static final int META_BYTES_SIZE = 25;
private int temp;
private static boolean mIsSupported = true;
@@ -206,6 +206,8 @@ public class UbifocusFilter implements ImageFilter {
float value = (i * step);
mModule.setAFModeToPreview(mModule.getMainCameraId(), CaptureRequest.CONTROL_AF_MODE_OFF);
mModule.setFocusDistanceToPreview(mModule.getMainCameraId(), value);
+ Log("Request: " + value);
+ float focusDistance;
try {
int count = FOCUS_ADJUST_TIME_OUT;
do {
@@ -214,15 +216,15 @@ public class UbifocusFilter implements ImageFilter {
if(count <= 0) {
break;
}
- } while(Math.abs(mModule.getPreviewCaptureResult().get(CaptureResult.LENS_FOCUS_DISTANCE)
- - value) >= 0.5f);
+ focusDistance = mModule.getPreviewCaptureResult().get(CaptureResult.LENS_FOCUS_DISTANCE);
+ Log("Taken focus value :"+focusDistance);
+ } while(Math.abs(focusDistance - value) >= 1f);
} catch (InterruptedException e) {
} catch (NullPointerException e) {
}
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
builder.set(CaptureRequest.LENS_FOCUS_DISTANCE, value);
captureSession.capture(builder.build(), callback, handler);
- Log.d(TAG, "Request: " + value);
}
}
diff --git a/src/com/android/camera/ui/PanoCaptureProcessView.java b/src/com/android/camera/ui/PanoCaptureProcessView.java
index e73dc9604..2b37fd61e 100644
--- a/src/com/android/camera/ui/PanoCaptureProcessView.java
+++ b/src/com/android/camera/ui/PanoCaptureProcessView.java
@@ -144,6 +144,7 @@ public class PanoCaptureProcessView extends View implements SensorEventListener
private ProgressDialog mProgressDialog;
private String mCompleteSentence = "";
private String mProgressSentence = "";
+ private String mIntroSentence = "";
private Paint mCompleteSentencePaint = new Paint();
private int mFinalDoneLength;
@@ -327,10 +328,11 @@ public class PanoCaptureProcessView extends View implements SensorEventListener
mCenterRectPaint.setStrokeWidth(2f);
mCenterRectPaint.setStyle(Paint.Style.STROKE);
mCompleteSentencePaint.setColor(Color.WHITE);
- mCompleteSentencePaint.setTextSize(60f);
+ mCompleteSentencePaint.setTextSize(45f);
mQueueProcessor = new PanoQueueProcessor();
mQueueProcessor.start();
mHandler = new Handler();
+ mIntroSentence = mActivity.getResources().getString(R.string.panocapture_intro);
}
public void onPause() {
@@ -371,24 +373,24 @@ public class PanoCaptureProcessView extends View implements SensorEventListener
@Override
protected void onDraw(Canvas canvas) {
+ if (mOrientation == 0 || mOrientation == 180) {
+ rectF.left = canvas.getWidth() / 2 - mPreviewThumbWidth;
+ rectF.right = canvas.getWidth() / 2 + mPreviewThumbWidth;
+ rectF.top = canvas.getHeight() / 2 - mPreviewThumbHeight;
+ rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbHeight;
+ } else {
+ rectF.left = canvas.getWidth() / 2 - mPreviewThumbHeight;
+ rectF.right = canvas.getWidth() / 2 + mPreviewThumbHeight;
+ rectF.top = canvas.getHeight() / 2 - mPreviewThumbWidth;
+ rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbWidth;
+ }
+
if(mPanoStatus != PANO_STATUS.INACTIVE) {
canvas.rotate(-mOrientation, canvas.getWidth() / 2, canvas.getHeight() / 2);
- if (mOrientation == 0 || mOrientation == 180) {
- rectF.left = canvas.getWidth() / 2 - mPreviewThumbWidth;
- rectF.right = canvas.getWidth() / 2 + mPreviewThumbWidth;
- rectF.top = canvas.getHeight() / 2 - mPreviewThumbHeight;
- rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbHeight;
- } else {
- rectF.left = canvas.getWidth() / 2 - mPreviewThumbHeight;
- rectF.right = canvas.getWidth() / 2 + mPreviewThumbHeight;
- rectF.top = canvas.getHeight() / 2 - mPreviewThumbWidth;
- rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbWidth;
- }
-
if(!mProgressSentence.equals("")) {
int textWidth = (int) mCompleteSentencePaint.measureText(mProgressSentence);
- canvas.drawText(mProgressSentence, rectF.centerX() - textWidth / 2, canvas.getHeight()/4, mCompleteSentencePaint);
+ canvas.drawText(mProgressSentence, rectF.centerX() - textWidth / 2, canvas.getHeight()*4/5, mCompleteSentencePaint);
}
if(mPanoStatus == PANO_STATUS.COMPLETING) {
@@ -412,6 +414,10 @@ public class PanoCaptureProcessView extends View implements SensorEventListener
}
}
}
+ } else {
+ canvas.rotate(-mPendingOrientation, canvas.getWidth()/2, canvas.getHeight()/2);
+ int textWidth = (int) mCompleteSentencePaint.measureText(mIntroSentence);
+ canvas.drawText(mIntroSentence, rectF.centerX() - textWidth / 2, canvas.getHeight()*4/5, mCompleteSentencePaint);
}
}
@@ -513,7 +519,7 @@ public class PanoCaptureProcessView extends View implements SensorEventListener
bitmapTask.x, bitmapTask.y, 0, bitmapTask.dir);
if(rtv < 0) {
mShouldFinish = true;
- stopPano(false, "The direction is changed. Stopping.");
+ stopPano(false, mActivity.getResources().getString(R.string.panocapture_direction_is_changed));
Log.w(TAG, "Keyframe return value: "+rtv);
}
bitmapTask.clear();