From 368b54dde0266670bd987ede349264bd0a61ad03 Mon Sep 17 00:00:00 2001 From: Byunghun Jeon Date: Tue, 10 May 2016 14:19:36 -0700 Subject: SnapdragonCamera: Update settingsManager and add Dual mode to Scene mode Update settingsManager and add Dual mode to Scene mode Change-Id: I508430840c3fb8c7d0b56a2a63e09b271754fcb4 CRs-Fixed: 1018118 --- src/com/android/camera/CameraActivity.java | 5 +- src/com/android/camera/CameraSettings.java | 10 +- src/com/android/camera/CaptureModule.java | 416 +++++++++++++++------------ src/com/android/camera/CaptureUI.java | 79 ++--- src/com/android/camera/ComboPreferences.java | 4 +- src/com/android/camera/ListPreference.java | 2 +- src/com/android/camera/SettingsManager.java | 289 +++++++++++++++---- src/com/android/camera/ui/ListMenu.java | 2 +- src/com/android/camera/util/PersistUtil.java | 2 +- 9 files changed, 526 insertions(+), 283 deletions(-) (limited to 'src/com/android') diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 543e67231..f5d99a65a 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -256,6 +256,7 @@ public class CameraActivity extends Activity public static int SETTING_LIST_WIDTH_2 = 250; private ImageView mThumbnail; + private UpdateThumbnailTask mUpdateThumbnailTask; private CircularDrawable mThumbnailDrawable; // FilmStripView.setDataAdapter fires 2 onDataLoaded calls before any data is actually loaded // Keep track of data request here to avoid creating useless UpdateThumbnailTask. @@ -767,7 +768,9 @@ public class CameraActivity extends Activity } public void updateThumbnail(final byte[] jpegData) { - (new UpdateThumbnailTask(jpegData, true)).execute(); + if (mUpdateThumbnailTask != null) mUpdateThumbnailTask.cancel(true); + mUpdateThumbnailTask = new UpdateThumbnailTask(jpegData, true); + mUpdateThumbnailTask.execute(); } public void updateThumbnail(final Bitmap bitmap) { diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index 3d2b3b6c6..dfadeed71 100644 --- a/src/com/android/camera/CameraSettings.java +++ b/src/com/android/camera/CameraSettings.java @@ -1263,14 +1263,8 @@ public class CameraSettings { } public static int getInitialCameraId(SharedPreferences pref) { - int id = Integer.parseInt(pref.getString(KEY_CAMERA_ID, "0")); - if (id == CaptureModule.BAYER_ID) { - int mode = Integer.parseInt(pref.getString(SettingsManager.KEY_DUAL_CAMERA, "1")); - if (mode == CaptureModule.MONO_MODE) return CaptureModule.MONO_ID; - else return CaptureModule.BAYER_ID; - } else { - return CaptureModule.FRONT_ID; - } + String value = pref.getString(SettingsManager.KEY_INITIAL_CAMERA, "0"); + return Integer.parseInt(value); } public static void writePreferredCameraId(SharedPreferences pref, diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index 7c6e5e73b..962ee486e 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -54,13 +54,13 @@ import android.util.SparseIntArray; import android.view.KeyEvent; import android.view.OrientationEventListener; import android.view.Surface; -import android.view.SurfaceHolder; import android.view.View; import android.widget.Toast; import com.android.camera.PhotoModule.NamedImages; import com.android.camera.PhotoModule.NamedImages.NamedEntity; import com.android.camera.ui.CountDownView; +import com.android.camera.ui.ModuleSwitcher; import com.android.camera.ui.RotateTextToast; import com.android.camera.util.CameraUtil; import com.android.camera.util.PersistUtil; @@ -71,8 +71,6 @@ import org.codeaurora.snapcam.filter.ClearSightImageProcessor; import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; @@ -85,10 +83,9 @@ public class CaptureModule implements CameraModule, PhotoController, public static final int DUAL_MODE = 0; public static final int BAYER_MODE = 1; public static final int MONO_MODE = 2; - //Todo: Read ids from the device dynamically public static final int BAYER_ID = 0; - public static final int MONO_ID = 1; - public static final int FRONT_ID = 1; + public static int MONO_ID = 1; + public static int FRONT_ID = 1; private static final int BACK_MODE = 0; private static final int FRONT_MODE = 1; private static final int CANCEL_TOUCH_FOCUS_DELAY = 3000; @@ -149,7 +146,9 @@ public class CaptureModule implements CameraModule, PhotoController, CaptureRequest.Key BayerMonoLinkSessionIdKey = new CaptureRequest.Key<>("org.codeaurora.qcamera3.dualcam_link_meta_data" + ".related_camera_id", Integer.class); - + public static CameraCharacteristics.Key MetaDataMonoOnlyKey = + new CameraCharacteristics.Key<>("org.codeaurora.qcamera3.sensor_meta_data.is_mono_only", + Byte.class); private boolean[] mTakingPicture = new boolean[MAX_NUM_CAM]; private int mControlAFMode = CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE; private int mLastResultAFState = -1; @@ -174,8 +173,6 @@ public class CaptureModule implements CameraModule, PhotoController, private FocusStateListener mFocusStateListener; private LocationManager mLocationManager; private SettingsManager mSettingsManager; - private int mLongShotCaptureCount; - private int mLongShotCaptureCountLimit; private long SECONDARY_SERVER_MEM; private boolean mLongshotActive = false; @@ -203,6 +200,9 @@ public class CaptureModule implements CameraModule, PhotoController, private ImageReader[] mImageReader = new ImageReader[MAX_NUM_CAM]; private NamedImages mNamedImages; private ContentResolver mContentResolver; + private byte[] mLastJpegData; + private int mJpegFileSizeEstimation; + private boolean mFirstPreviewLoaded; private class MediaSaveNotifyThread extends Thread { private Uri uri; @@ -227,6 +227,7 @@ public class CaptureModule implements CameraModule, PhotoController, if (uri != null) mActivity.notifyNewMedia(uri); mActivity.updateStorageSpaceAndHint(); + if (mLastJpegData != null) mActivity.updateThumbnail(mLastJpegData); } }); mediaSaveNotifyThread = null; @@ -248,6 +249,7 @@ public class CaptureModule implements CameraModule, PhotoController, if (uri != null) { mActivity.notifyNewMedia(uri); } + if (mLastJpegData != null) mActivity.updateThumbnail(mLastJpegData); } } }; @@ -291,7 +293,15 @@ public class CaptureModule implements CameraModule, PhotoController, private void process(CaptureResult result) { int id = (int) result.getRequest().getTag(); - + if (!mFirstPreviewLoaded) { + mActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mUI.hidePreviewCover(); + } + }); + mFirstPreviewLoaded = true; + } switch (mState[id]) { case STATE_PREVIEW: { break; @@ -403,7 +413,7 @@ public class CaptureModule implements CameraModule, PhotoController, @Override public void onError(CameraDevice cameraDevice, int error) { int id = Integer.parseInt(cameraDevice.getId()); - Log.d(TAG, "onError " + id + error); + Log.e(TAG, "onError " + id + " " + error); cameraDevice.close(); mCameraDevice[id] = null; mCameraOpenCloseLock.release(); @@ -422,6 +432,13 @@ public class CaptureModule implements CameraModule, PhotoController, }; + private boolean isMonoPreviewOn() { + String value = mSettingsManager.getValue(SettingsManager.KEY_MONO_PREVIEW); + if (value == null) return false; + if (value.equals("on")) return true; + else return false; + } + private boolean isBackMode() { String value = mSettingsManager.getValue(SettingsManager.KEY_CAMERA_ID); if (value == null) return true; @@ -430,8 +447,11 @@ public class CaptureModule implements CameraModule, PhotoController, } private int getMode() { - String value = mSettingsManager.getValue(SettingsManager.KEY_DUAL_CAMERA); - return Integer.parseInt(value); + String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE); + if (value != null && value.equals("-5")) return DUAL_MODE; + value = mSettingsManager.getValue(SettingsManager.KEY_MONO_ONLY); + if (value == null || !value.equals("on")) return BAYER_MODE; + return MONO_MODE; } private boolean isClearSightOn() { @@ -504,30 +524,8 @@ public class CaptureModule implements CameraModule, PhotoController, if (mPaused || !mCameraOpened[id] || !mSurfaceReady) return; Log.d(TAG, "createSession " + id); List list = new LinkedList(); - mUI.hidePreviewCover(); try { - Surface surface; - if (isBackMode()) { - if (id == BAYER_ID || (id == MONO_ID && getMode() == MONO_MODE)) { - SurfaceHolder sh = mUI.getSurfaceHolder(); - if (sh == null) { - return; - } - surface = sh.getSurface(); - } else { - SurfaceHolder sh = mUI.getSurfaceHolder2(); - if (sh == null) { - return; - } - surface = sh.getSurface(); - } - } else { - SurfaceHolder sh = mUI.getSurfaceHolder(); - if (sh == null) { - return; - } - surface = sh.getSurface(); - } + Surface surface = getPreviewSurface(id); // We set up a CaptureRequest.Builder with the output Surface. mPreviewRequestBuilder[id] = mCameraDevice[id].createCaptureRequest(CameraDevice .TEMPLATE_PREVIEW); @@ -601,11 +599,7 @@ public class CaptureModule implements CameraModule, PhotoController, } public void reinit() { - String pictureSize = mSettingsManager.getValue(SettingsManager - .KEY_PICTURE_SIZE); - - Size size = parsePictureSize(pictureSize); - mUI.setPreviewSize(size.getHeight(), size.getWidth()); + setCurrentMode(); mSettingsManager.reinit(getMainCameraId()); } @@ -621,6 +615,7 @@ public class CaptureModule implements CameraModule, PhotoController, mSettingsManager = SettingsManager.getInstance(); mSettingsManager.registerListener(this); mSettingsManager.init(); + mFirstPreviewLoaded = false; Log.d(TAG, "init"); for (int i = 0; i < MAX_NUM_CAM; i++) { mCameraOpened[i] = false; @@ -631,13 +626,11 @@ public class CaptureModule implements CameraModule, PhotoController, for (int i = 0; i < MAX_NUM_CAM; i++) { mState[i] = STATE_PREVIEW; } - + setCurrentMode(); mContentResolver = mActivity.getContentResolver(); mUI = new CaptureUI(activity, this, parent); mUI.initializeControlByIntent(); - String pictureSize = mSettingsManager.getValue(SettingsManager.KEY_PICTURE_SIZE); - Size size = parsePictureSize(pictureSize); - mUI.setPreviewSize(size.getHeight(), size.getWidth()); + mFocusStateListener = new FocusStateListener(mUI); mLocationManager = new LocationManager(mActivity, mUI); Storage.setSaveSDCard(mSettingsManager.getValue(SettingsManager @@ -775,77 +768,77 @@ public class CaptureModule implements CameraModule, PhotoController, mCaptureSession[id].stopRepeating(); if (mLongshotActive) { - mCaptureSession[id].setRepeatingRequest(captureBuilder.build(), new - CameraCaptureSession.CaptureCallback() { + Log.d(TAG, "captureStillPicture capture longshot " + id); + List burstList = new ArrayList<>(); + for (int i = 0; i < PersistUtil.getLongshotShotLimit(); i++) { + burstList.add(captureBuilder.build()); + } + mCaptureSession[id].captureBurst(burstList, new + CameraCaptureSession.CaptureCallback() { - @Override - public void onCaptureCompleted(CameraCaptureSession session, - CaptureRequest request, - TotalCaptureResult result) { - Log.d(TAG, "captureStillPicture Longshot onCaptureCompleted: " + id); - mActivity.updateStorageSpaceAndHint(); - if (checkLongShotMemoAndLimit()) { - cancelAutoFocus(); - return; - } - mActivity.runOnUiThread(new Runnable() { @Override - public void run() { - mUI.doShutterAnimation(); + public void onCaptureCompleted(CameraCaptureSession session, + CaptureRequest request, + TotalCaptureResult result) { + Log.d(TAG, "captureStillPicture Longshot onCaptureCompleted: " + id); + if (mLongshotActive) { + mActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mUI.doShutterAnimation(); + } + }); + } } - }); - mLongShotCaptureCount++; - } - @Override - public void onCaptureFailed(CameraCaptureSession session, - CaptureRequest request, - CaptureFailure result) { - Log.d(TAG, "captureStillPicture Longshot onCaptureFailed: " + id); - if (checkLongShotMemoAndLimit()) { - cancelAutoFocus(); - return; - } - mActivity.runOnUiThread(new Runnable() { @Override - public void run() { - mUI.doShutterAnimation(); + public void onCaptureFailed(CameraCaptureSession session, + CaptureRequest request, + CaptureFailure result) { + Log.d(TAG, "captureStillPicture Longshot onCaptureFailed: " + id); + if (mLongshotActive) { + mActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mUI.doShutterAnimation(); + } + }); + } } - }); - } - @Override - public void onCaptureSequenceCompleted(CameraCaptureSession session, int - sequenceId, long frameNumber) { - Log.d(TAG, "captureStillPicture Longshot onCaptureSequenceCompleted: " + - id); - unlockFocus(id); - } - }, mCaptureCallbackHandler); + @Override + public void onCaptureSequenceCompleted(CameraCaptureSession session, int + sequenceId, long frameNumber) { + Log.d(TAG, "captureStillPicture Longshot onCaptureSequenceCompleted: " + id); + mLongshotActive = false; + unlockFocus(id); + } + }, mCaptureCallbackHandler); } else { - mCaptureSession[id].capture(captureBuilder.build(), new CameraCaptureSession.CaptureCallback() { + mCaptureSession[id].capture(captureBuilder.build(), + new CameraCaptureSession.CaptureCallback() { - @Override - public void onCaptureCompleted(CameraCaptureSession session, - CaptureRequest request, - TotalCaptureResult result) { - Log.d(TAG, "captureStillPicture onCaptureCompleted: " + id); - } + @Override + public void onCaptureCompleted(CameraCaptureSession session, + CaptureRequest request, + TotalCaptureResult result) { + Log.d(TAG, "captureStillPicture onCaptureCompleted: " + id); + } - @Override - public void onCaptureFailed(CameraCaptureSession session, - CaptureRequest request, - CaptureFailure result) { - Log.d(TAG, "captureStillPicture onCaptureFailed: " + id); - } + @Override + public void onCaptureFailed(CameraCaptureSession session, + CaptureRequest request, + CaptureFailure result) { + Log.d(TAG, "captureStillPicture onCaptureFailed: " + id); + } - @Override - public void onCaptureSequenceCompleted(CameraCaptureSession session, int - sequenceId, long frameNumber) { - Log.d(TAG, "captureStillPicture onCaptureSequenceCompleted: " + id); - unlockFocus(id); - } - }, mCaptureCallbackHandler); + @Override + public void onCaptureSequenceCompleted(CameraCaptureSession session, int + sequenceId, long frameNumber) { + Log.d(TAG, "captureStillPicture onCaptureSequenceCompleted: " + id); + unlockFocus(id); + } + }, mCaptureCallbackHandler); } } } catch (CameraAccessException e) { @@ -882,13 +875,15 @@ public class CaptureModule implements CameraModule, PhotoController, * @param height The height of available size for camera preview */ private void setUpCameraOutputs() { + Log.d(TAG, "setUpCameraOutputs"); CameraManager manager = (CameraManager) mActivity.getSystemService(Context.CAMERA_SERVICE); try { String[] cameraIdList = manager.getCameraIdList(); for (int i = 0; i < cameraIdList.length; i++) { String cameraId = cameraIdList[i]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); - mCameraIdList.add(i); + if (isInMode(i)) + mCameraIdList.add(i); StreamConfigurationMap map = characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); if (map == null) { @@ -896,25 +891,16 @@ public class CaptureModule implements CameraModule, PhotoController, } mCameraId[i] = cameraId; - if(isClearSightOn()) { - Size largest = Collections.max( - Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)), - new CompareSizesByArea()); - ClearSightImageProcessor.getInstance().init( - largest.getWidth(), largest.getHeight(), mActivity, mOnMediaSavedListener); + String pictureSize = mSettingsManager.getValue(SettingsManager + .KEY_PICTURE_SIZE); + + Size size = parsePictureSize(pictureSize); + if (isClearSightOn()) { + ClearSightImageProcessor.getInstance().init(size.getWidth(), size.getHeight(), + mActivity, mOnMediaSavedListener); ClearSightImageProcessor.getInstance().setCallback(this); } else { // No Clearsight - // For still image captures, we use the largest available size. - Size largest = Collections.max( - Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), - new CompareSizesByArea()); - - String pictureSize = mSettingsManager.getValue(SettingsManager - .KEY_PICTURE_SIZE); - - Size size = parsePictureSize(pictureSize); - mImageReader[i] = ImageReader.newInstance(size.getWidth(), size.getHeight(), ImageFormat.JPEG, 3); mImageReader[i].setOnImageAvailableListener(new ImageAvailableListener(i) { @@ -930,6 +916,7 @@ public class CaptureModule implements CameraModule, PhotoController, ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; + mLastJpegData = bytes; buffer.get(bytes); mActivity.getMediaSaveService().addImage(bytes, title, date, @@ -939,6 +926,7 @@ public class CaptureModule implements CameraModule, PhotoController, } }, mImageAvailableHandler); } + } mAutoFocusSupported = mSettingsManager.isAutoFocusSupported(mCameraIdList); } catch (CameraAccessException e) { @@ -997,7 +985,6 @@ public class CaptureModule implements CameraModule, PhotoController, e.printStackTrace(); } } - mCaptureSession[i].close(); mCaptureSession[i] = null; } @@ -1035,7 +1022,6 @@ public class CaptureModule implements CameraModule, PhotoController, private void applySettingsForCapture(CaptureRequest.Builder builder, int id) { builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_IDLE); - applyFlash(builder, id); applyJpegQuality(builder); applyCommonSettings(builder, id); } @@ -1043,7 +1029,6 @@ public class CaptureModule implements CameraModule, PhotoController, private void applySettingsForPrecapture(CaptureRequest.Builder builder, int id) { builder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); - applyFlash(builder, id); applyCommonSettings(builder, id); } @@ -1063,6 +1048,7 @@ public class CaptureModule implements CameraModule, PhotoController, private void applyCommonSettings(CaptureRequest.Builder builder, int id) { builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode); + applyFlash(builder, id); applyWhiteBalance(builder); applyExposure(builder); applyIso(builder); @@ -1152,12 +1138,14 @@ public class CaptureModule implements CameraModule, PhotoController, @Override public void onPauseAfterSuper() { Log.d(TAG, "onPause"); - mUI.showPreviewCover(); if (mLocationManager != null) mLocationManager.recordLocation(false); if(isClearSightOn()) { ClearSightImageProcessor.getInstance().close(); } closeCamera(); + mUI.showPreviewCover(); + mUI.hideSurfaceView(); + mFirstPreviewLoaded = false; stopBackgroundThread(); mUI.onPause(); } @@ -1167,9 +1155,17 @@ public class CaptureModule implements CameraModule, PhotoController, mPaused = false; } + private void setCurrentMode() { + mCurrentMode = isBackMode() ? getMode() : FRONT_MODE; + } + @Override public void onResumeAfterSuper() { Log.d(TAG, "onResume " + getMode()); + mUI.showSurfaceView(); + String pictureSize = mSettingsManager.getValue(SettingsManager.KEY_PICTURE_SIZE); + Size size = parsePictureSize(pictureSize); + mUI.setPreviewSize(size.getWidth(), size.getHeight()); mUI.setSwitcherIndex(); mCameraIdList = new ArrayList<>(); setUpCameraOutputs(); @@ -1198,8 +1194,8 @@ public class CaptureModule implements CameraModule, PhotoController, } else { initializeSecondTime(); } - mUI.hidePreviewCover(); mActivity.updateStorageSpaceAndHint(); + estimateJpegFileSize(); mUI.enableShutter(true); } @@ -1265,6 +1261,22 @@ public class CaptureModule implements CameraModule, PhotoController, } } + private boolean isInMode(int cameraId) { + if (isBackMode()) { + switch (getMode()) { + case DUAL_MODE: + return cameraId == BAYER_ID || cameraId == MONO_ID; + case BAYER_MODE: + return cameraId == BAYER_ID; + case MONO_MODE: + return cameraId == MONO_ID; + } + } else { + return cameraId == FRONT_ID; + } + return false; + } + @Override public boolean isImageCaptureIntent() { return false; @@ -1347,7 +1359,7 @@ public class CaptureModule implements CameraModule, PhotoController, } } - private boolean isTouchToFocusAllowed() { + public boolean isTouchToFocusAllowed() { for (int i = 0; i < mTakingPicture.length; i++) { if (mTakingPicture[i]) return false; } @@ -1479,7 +1491,7 @@ public class CaptureModule implements CameraModule, PhotoController, @Override public void onShutterButtonFocus(boolean pressed) { if (!pressed && mLongshotActive) { - cancelLongshot(); + Log.d(TAG, "Longshot button up"); } } @@ -1503,11 +1515,6 @@ public class CaptureModule implements CameraModule, PhotoController, @Override public void onShutterButtonLongClick() { if (isBackMode() && getMode() == DUAL_MODE) return; - if (mActivity.getStorageSpaceBytes() <= Storage.LOW_STORAGE_THRESHOLD_BYTES) { - Log.i(TAG, "Not enough space or storage not ready. remaining=" - + mActivity.getStorageSpaceBytes()); - return; - } String longshot = mSettingsManager.getValue(SettingsManager.KEY_LONGSHOT); if (longshot.equals("on")) { @@ -1518,36 +1525,50 @@ public class CaptureModule implements CameraModule, PhotoController, //check whether current memory is enough for longshot. mActivity.updateStorageSpaceAndHint(); + long storageSpace = mActivity.getStorageSpaceBytes(); + int mLongShotCaptureCountLimit = PersistUtil.getLongshotShotLimit(); + + if (storageSpace <= Storage.LOW_STORAGE_THRESHOLD_BYTES + mLongShotCaptureCountLimit + * mJpegFileSizeEstimation) { + Log.i(TAG, "Not enough space or storage not ready. remaining=" + storageSpace); + return; + } + if (isLongshotNeedCancel()) { mLongshotActive = false; return; } - mLongShotCaptureCountLimit = PersistUtil.getLongshotShotLimit(); - mLongShotCaptureCount = 1; + + Log.d(TAG, "Start Longshot"); mLongshotActive = true; takePicture(); } } - private void cancelLongshot() { - Log.d(TAG, "cancelLongshot"); - mLongshotActive = false; - try { - if (isBackMode()) { - switch (getMode()) { - case BAYER_MODE: - mCaptureSession[BAYER_ID].stopRepeating(); - break; - case MONO_MODE: - mCaptureSession[MONO_MODE].stopRepeating(); - break; - } - } else { - mCaptureSession[FRONT_ID].stopRepeating(); + private void estimateJpegFileSize() { + String quality = mSettingsManager.getValue(SettingsManager + .KEY_JPEG_QUALITY); + int[] ratios = mActivity.getResources().getIntArray(R.array.jpegquality_compression_ratio); + String[] qualities = mActivity.getResources().getStringArray( + R.array.pref_camera_jpegquality_entryvalues); + int ratio = 0; + for (int i = ratios.length - 1; i >= 0; --i) { + if (qualities[i].equals(quality)) { + ratio = ratios[i]; + break; } - } catch (CameraAccessException e) { - e.printStackTrace(); } + String pictureSize = mSettingsManager.getValue(SettingsManager + .KEY_PICTURE_SIZE); + + Size size = parsePictureSize(pictureSize); + if (ratio == 0) { + Log.d(TAG, "mJpegFileSizeEstimation 0"); + } else { + mJpegFileSizeEstimation = size.getWidth() * size.getHeight() * 3 / ratio; + Log.d(TAG, "mJpegFileSizeEstimation " + mJpegFileSizeEstimation); + } + } private boolean isLongshotNeedCancel() { @@ -1588,29 +1609,14 @@ public class CaptureModule implements CameraModule, PhotoController, return false; } - private boolean checkLongShotMemoAndLimit() { - if (isLongshotNeedCancel()) { - return true; - } - - if (mLongShotCaptureCount == mLongShotCaptureCountLimit) { - return true; - } - return false; - } - private boolean isFlashOff(int id) { if (!mSettingsManager.isFlashSupported(id)) return true; - return mSettingsManager.getValue(SettingsManager.KEY_FLASH_MODE).equals("off"); + return mSettingsManager.getValue(SettingsManager.KEY_FLASH_MODE).equals("1"); } private void initializePreviewConfiguration(int id) { mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest .CONTROL_AF_TRIGGER_IDLE); - mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest - .CONTROL_AE_MODE_ON); - mPreviewRequestBuilder[id].set(CaptureRequest.FLASH_MODE, CaptureRequest - .FLASH_MODE_OFF); applyCommonSettings(mPreviewRequestBuilder[id], id); } @@ -1651,6 +1657,10 @@ public class CaptureModule implements CameraModule, PhotoController, updatePreview = true; applyExposure(mPreviewRequestBuilder[cameraId]); break; + case SettingsManager.KEY_FLASH_MODE: + updatePreview = true; + applyFlash(mPreviewRequestBuilder[cameraId], cameraId); + break; } return updatePreview; } @@ -1681,7 +1691,7 @@ public class CaptureModule implements CameraModule, PhotoController, String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE); if (value == null) return; int mode = Integer.parseInt(value); - if (mode != CaptureRequest.CONTROL_SCENE_MODE_DISABLED) { + if (mode != CaptureRequest.CONTROL_SCENE_MODE_DISABLED && mode != -5) { request.set(CaptureRequest.CONTROL_SCENE_MODE, mode); request.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE); } else { @@ -1773,12 +1783,7 @@ public class CaptureModule implements CameraModule, PhotoController, public void triggerFocusAtPoint(float x, float y, int id) { Log.d(TAG, "triggerFocusAtPoint " + x + " " + y + " " + id); - Point p; - if (id == getMainCameraId()) { - p = mUI.getSurfaceViewSize(); - } else { - p = mUI.getSurfaceView2Size(); - } + Point p = mUI.getSurfaceViewSize(); int width = p.x; int height = p.y; x = x / width; @@ -1829,8 +1834,8 @@ public class CaptureModule implements CameraModule, PhotoController, boolean updatePreviewBayer = false; boolean updatePreviewMono = false; boolean updatePreviewFront = false; + int count = 0; for (SettingsManager.SettingState settingState : settings) { - String key = settingState.key; SettingsManager.Values values = settingState.values; String value; @@ -1839,14 +1844,31 @@ public class CaptureModule implements CameraModule, PhotoController, } else { value = values.value; } - if (SettingsManager.KEY_CAMERA_SAVEPATH.equals(key)) { - Storage.setSaveSDCard(value.equals("1")); - mActivity.updateStorageSpaceAndHint(); - continue; - } - if (SettingsManager.KEY_JPEG_QUALITY.equals(key)) { - mJpegQuality = getQualityNumber(value); - continue; + switch (key) { + case SettingsManager.KEY_CAMERA_SAVEPATH: + Storage.setSaveSDCard(value.equals("1")); + mActivity.updateStorageSpaceAndHint(); + continue; + case SettingsManager.KEY_JPEG_QUALITY: + mJpegQuality = getQualityNumber(value); + estimateJpegFileSize(); + continue; + case SettingsManager.KEY_CAMERA2: + switchCameraMode(value); + return; + case SettingsManager.KEY_CAMERA_ID: + case SettingsManager.KEY_MONO_ONLY: + case SettingsManager.KEY_CLEARSIGHT: + case SettingsManager.KEY_PICTURE_SIZE: + case SettingsManager.KEY_MONO_PREVIEW: + if (count == 0) restart(); + return; + case SettingsManager.KEY_SCENE_MODE: + if (count == 0 && checkNeedToRestart(value)) { + restart(); + return; + } + break; } if (isBackMode()) { @@ -1865,6 +1887,7 @@ public class CaptureModule implements CameraModule, PhotoController, } else { updatePreviewFront |= applyPreferenceToPreview(FRONT_ID, key, value); } + count++; } if (updatePreviewBayer) { try { @@ -1892,6 +1915,29 @@ public class CaptureModule implements CameraModule, PhotoController, } } + private int mCurrentMode; + private boolean checkNeedToRestart(String value) { + if (value.equals("-5") && mCurrentMode != DUAL_MODE) return true; + if (!value.equals("-5") && mCurrentMode == DUAL_MODE) return true; + return false; + } + + private void restart() { + reinit(); + onPauseBeforeSuper(); + onPauseAfterSuper(); + onResumeBeforeSuper(); + onResumeAfterSuper(); + } + + private void switchCameraMode(String value) { + if (value.equals("enable")) { + mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX); + } else { + mActivity.onModuleSelected(ModuleSwitcher.PHOTO_MODULE_INDEX); + } + } + /** * Compares two {@code Size}s based on their areas. */ diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java index 331d2dfe0..bc0d31042 100644 --- a/src/com/android/camera/CaptureUI.java +++ b/src/com/android/camera/CaptureUI.java @@ -93,9 +93,7 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, SettingsManager.KEY_ISO, SettingsManager.KEY_EXPOSURE, SettingsManager.KEY_WHITE_BALANCE, - SettingsManager.KEY_CAMERA2, - SettingsManager.KEY_DUAL_CAMERA, - SettingsManager.KEY_CLEARSIGHT + SettingsManager.KEY_CAMERA2 }; String[] mDeveloperKeys = new String[]{ SettingsManager.KEY_FLASH_MODE, @@ -109,7 +107,7 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, SettingsManager.KEY_EXPOSURE, SettingsManager.KEY_WHITE_BALANCE, SettingsManager.KEY_CAMERA2, - SettingsManager.KEY_DUAL_CAMERA, + SettingsManager.KEY_MONO_ONLY, SettingsManager.KEY_CLEARSIGHT, SettingsManager.KEY_MONO_PREVIEW }; @@ -121,8 +119,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, private AutoFitSurfaceView mSurfaceView2; private SurfaceHolder mSurfaceHolder; private SurfaceHolder mSurfaceHolder2; - private boolean surface1created = false; - private boolean surface2created = false; private int mOrientation; private RotateLayout mMenuLayout; private RotateLayout mSubMenuLayout; @@ -135,6 +131,9 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, private PreviewGestures mGestures; private boolean mUIhidden = false; private SettingsManager mSettingsManager; + + private ImageView mThumbnail; + private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() { // SurfaceHolder callbacks @@ -147,15 +146,14 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, public void surfaceCreated(SurfaceHolder holder) { Log.v(TAG, "surfaceCreated"); mSurfaceHolder = holder; - if (surface2created) mModule.onPreviewUIReady(); - surface1created = true; + mModule.onPreviewUIReady(); + mActivity.updateThumbnail(mThumbnail); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.v(TAG, "surfaceDestroyed"); mSurfaceHolder = null; - surface1created = false; mModule.onPreviewUIDestroyed(); } }; @@ -189,14 +187,11 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, @Override public void surfaceCreated(SurfaceHolder holder) { mSurfaceHolder2 = holder; - if (surface1created) mModule.onPreviewUIReady(); - surface2created = true; } @Override public void surfaceDestroyed(SurfaceHolder holder) { mSurfaceHolder2 = null; - surface2created = false; } }; @@ -490,14 +485,13 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, startTime = System.currentTimeMillis(); } else if (event.getAction() == MotionEvent.ACTION_UP) { if (System.currentTimeMillis() - startTime < CLICK_THRESHOLD) { - mSettingsManager.setValueIndex(SettingsManager.KEY_SCENE_MODE, j); - updateSceneModeIcon(); for (View v1 : views) { v1.setBackgroundResource(R.drawable.scene_mode_view_border); } View border = v.findViewById(R.id.border); - border.setBackgroundResource(R.drawable - .scene_mode_view_border_selected); + border.setBackgroundResource(R.drawable.scene_mode_view_border_selected); + updateSceneModeIcon(j); + mSettingsManager.setValueIndex(SettingsManager.KEY_SCENE_MODE, j); removeSceneAndFilterMenu(true); } } @@ -527,6 +521,15 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, ((ImageView) mSceneModeSwitcher).setImageResource(thumbnail); } + public void updateSceneModeIcon(int idx) { + int[] thumbnails = mSettingsManager.getResource(SettingsManager.KEY_SCENE_MODE, + SettingsManager.RESOURCE_TYPE_THUMBNAIL); + int thumbnail = thumbnails[idx]; + if (thumbnail == -1) + thumbnail = 0; + ((ImageView) mSceneModeSwitcher).setImageResource(thumbnail); + } + public void addFilterMode() { if (mSettingsManager.getValue(SettingsManager.KEY_COLOR_EFFECT) == null) return; @@ -981,6 +984,14 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, } public void initializeControlByIntent() { + mThumbnail = (ImageView) mRootView.findViewById(R.id.preview_thumb); + mThumbnail.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!CameraControls.isAnimating() && mModule.isTouchToFocusAllowed()) + mActivity.gotoGallery(); + } + }); mMenuButton = mRootView.findViewById(R.id.menu); mMenuButton.setOnClickListener(new View.OnClickListener() { @Override @@ -1131,7 +1142,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, } } - private void initializeCountDown() { mActivity.getLayoutInflater().inflate(R.layout.count_down_to_capture, (ViewGroup) mRootView, true); @@ -1163,8 +1173,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, } public boolean collapseCameraControls() { - // TODO: Mode switcher should behave like a popup and should hide itself when there - // is a touch outside of it. mSwitcher.closePopup(); // Remove all the popups/dialog boxes boolean ret = false; @@ -1336,15 +1344,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, SettingsManager.Values values = setting.values; String value = (values.overriddenValue == null) ? values.value : values.overriddenValue; switch (key) { - case SettingsManager.KEY_CAMERA2: - switchCameraMode(value); - return; - case SettingsManager.KEY_CAMERA_ID: - case SettingsManager.KEY_DUAL_CAMERA: - case SettingsManager.KEY_CLEARSIGHT: - case SettingsManager.KEY_PICTURE_SIZE: - mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX); - return; case SettingsManager.KEY_COLOR_EFFECT: changeFilterModeControlIcon(value); updateFilterModeIcon(values.overriddenValue == null); @@ -1353,18 +1352,30 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, } } - public void setPreviewSize(int width, int height) { - mSurfaceView.setAspectRatio(width, height); + public void hideSurfaceView() { + mSurfaceView.setVisibility(View.INVISIBLE); + mSurfaceView2.setVisibility(View.INVISIBLE); + } + + public void showSurfaceView() { + mSurfaceView.setVisibility(View.VISIBLE); + mSurfaceView2.setVisibility(View.VISIBLE); } - private void switchCameraMode(String value) { - if (value.equals("enable")) { - mActivity.onModuleSelected(ModuleSwitcher.CAPTURE_MODULE_INDEX); + public void setSurfaceView(boolean show) { + if (show) { + mSurfaceView2.setVisibility(View.VISIBLE); } else { - mActivity.onModuleSelected(ModuleSwitcher.PHOTO_MODULE_INDEX); + mSurfaceView2.setVisibility(View.INVISIBLE); } } + public void setPreviewSize(int width, int height) { + mSurfaceView.getHolder().setFixedSize(width, height); + mCameraControls.setPreviewRatio(0, true); + mSurfaceView.setAspectRatio(height, width); + } + @Override public void onSettingChanged(ListPreference pref) { removeAllSettingMenu(); diff --git a/src/com/android/camera/ComboPreferences.java b/src/com/android/camera/ComboPreferences.java index 9e039bf1f..c37e9f5aa 100644 --- a/src/com/android/camera/ComboPreferences.java +++ b/src/com/android/camera/ComboPreferences.java @@ -157,7 +157,9 @@ public class ComboPreferences implements || key.equals(CameraSettings.KEY_POWER_SHUTTER) || key.equals(CameraSettings.KEY_MAX_BRIGHTNESS || key.equals(SettingsManager.KEY_CAMERA2) - || key.equals(SettingsManager.KEY_DUAL_CAMERA) + || key.equals(SettingsManager.KEY_INITIAL_CAMERA) + || key.equals(SettingsManager.KEY_CAMERA_ID) + || key.equals(SettingsManager.KEY_MONO_ONLY) || key.equals(SettingsManager.KEY_MONO_PREVIEW) || key.equals(SettingsManager.KEY_CLEARSIGHT); } diff --git a/src/com/android/camera/ListPreference.java b/src/com/android/camera/ListPreference.java index 9b8fd687d..a888d6587 100644 --- a/src/com/android/camera/ListPreference.java +++ b/src/com/android/camera/ListPreference.java @@ -38,7 +38,7 @@ public class ListPreference extends CameraPreference { private static final String TAG = "ListPreference"; private final String mKey; private String mValue; - private final CharSequence[] mDefaultValues; + public final CharSequence[] mDefaultValues; private CharSequence[] mEntries; private CharSequence[] mEntryValues; diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java index a79b642b5..86ecd6200 100644 --- a/src/com/android/camera/SettingsManager.java +++ b/src/com/android/camera/SettingsManager.java @@ -47,7 +47,9 @@ import org.codeaurora.snapcam.R; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -62,7 +64,7 @@ public class SettingsManager implements ListMenu.SettingsListener { public static final String KEY_FLASH_MODE = "pref_camera2_flashmode_key"; public static final String KEY_WHITE_BALANCE = "pref_camera2_whitebalance_key"; public static final String KEY_CAMERA2 = "pref_camera2_camera2_key"; - public static final String KEY_DUAL_CAMERA = "pref_camera2_dual_camera_key"; + public static final String KEY_MONO_ONLY = "pref_camera2_mono_only_key"; public static final String KEY_MONO_PREVIEW = "pref_camera2_mono_preview_key"; public static final String KEY_CLEARSIGHT = "pref_camera2_clearsight_key"; public static final String KEY_FILTER_MODE = "pref_camera2_filter_mode_key"; @@ -75,6 +77,7 @@ public class SettingsManager implements ListMenu.SettingsListener { public static final String KEY_EXPOSURE = "pref_camera2_exposure_key"; public static final String KEY_TIMER = "pref_camera2_timer_key"; public static final String KEY_LONGSHOT = "pref_camera2_longshot_key"; + public static final String KEY_INITIAL_CAMERA = "pref_camera2_initial_camera_key"; private static final String TAG = "SnapCam_SettingsManager"; private static final List mCharacteristics = new ArrayList<>(); private static final int NOT_FOUND = -1; @@ -86,12 +89,12 @@ public class SettingsManager implements ListMenu.SettingsListener { private Context mContext; private PreferenceGroup mPreferenceGroup; private ComboPreferences mPreferences; - private Map> mDependendsOnMap; + private Map> mDependendsOnMap; + private boolean mIsMonoCameraPresent = false; + private boolean mIsFrontCameraPresent = false; private SettingsManager(Context context) { mListeners = new ArrayList<>(); - mValuesMap = new HashMap<>(); - mDependendsOnMap = new HashMap<>(); mContext = context; mPreferences = new ComboPreferences(mContext); CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal(), mContext); @@ -100,10 +103,19 @@ public class SettingsManager implements ListMenu.SettingsListener { try { String[] cameraIdList = manager.getCameraIdList(); for (int i = 0; i < cameraIdList.length; i++) { - //TODO: determine front/back/bayer/mono and their ids String cameraId = cameraIdList[i]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); + Byte monoOnly = characteristics.get(CaptureModule.MetaDataMonoOnlyKey); + if (monoOnly == 1) { + CaptureModule.MONO_ID = i; + mIsMonoCameraPresent = true; + } + int facing = characteristics.get(CameraCharacteristics.LENS_FACING); + if (facing == CameraCharacteristics.LENS_FACING_FRONT) { + CaptureModule.FRONT_ID = i; + mIsFrontCameraPresent = true; + } mCharacteristics.add(i, characteristics); } } catch (CameraAccessException e) { @@ -138,6 +150,7 @@ public class SettingsManager implements ListMenu.SettingsListener { public void onSettingChanged(ListPreference pref) { String key = pref.getKey(); List changed = checkDependencyAndUpdate(key); + if (changed == null) return; notifyListeners(changed); } @@ -159,7 +172,8 @@ public class SettingsManager implements ListMenu.SettingsListener { PreferenceInflater inflater = new PreferenceInflater(mContext); mPreferenceGroup = (PreferenceGroup) inflater.inflate(R.xml.capture_preferences); - + mValuesMap = new HashMap<>(); + mDependendsOnMap = new HashMap<>(); filterPreferences(cameraId); initDepedencyTable(); initializeValueMap(); @@ -169,18 +183,30 @@ public class SettingsManager implements ListMenu.SettingsListener { for (int i = 0; i < mPreferenceGroup.size(); i++) { ListPreference pref = (ListPreference) mPreferenceGroup.get(i); String baseKey = pref.getKey(); - CharSequence[] dependencyList = pref.getDependencyList(); + CharSequence[] dependencyList = null; + if (!specialDepedency(baseKey)) dependencyList = pref.getDependencyList(); + else { + List keyValue = getSpecialDependencyList(pref); + if (keyValue.size() > 0) { + dependencyList = new CharSequence[keyValue.size()]; + int k = 0; + for (KeyValue kv: keyValue) { + dependencyList[k++] = kv.key; + } + } + pref.setDependencyList(dependencyList); + } if (dependencyList != null) { for (int j = 0; j < dependencyList.length; j++) { String key = dependencyList[j].toString(); pref = mPreferenceGroup.findPreference(key); if (pref == null) continue; //filtered? - List list = mDependendsOnMap.get(key); - if (list == null) { - list = new ArrayList(); + Set set = mDependendsOnMap.get(key); + if (set == null) { + set = new HashSet<>(); } - list.add(baseKey); - mDependendsOnMap.put(key, list); + set.add(baseKey); + mDependendsOnMap.put(key, set); } } } @@ -191,25 +217,36 @@ public class SettingsManager implements ListMenu.SettingsListener { for (int i = 0; i < mPreferenceGroup.size(); i++) { ListPreference pref = (ListPreference) mPreferenceGroup.get(i); String key = pref.getKey(); - if (mDependendsOnMap.get(key) != null) { + if (mDependendsOnMap.get(key) != null && mDependendsOnMap.get(key).size() != 0) { processLater.add(key); continue; } Values values = new Values(pref.getValue(), null); mValuesMap.put(pref.getKey(), values); } - for (String keyToProcess : processLater) { - List dependsOnList = mDependendsOnMap.get(keyToProcess); + Set dependsOnSet = mDependendsOnMap.get(keyToProcess); boolean active = true; - for (String s : dependsOnList) { - if (isOptionOn(s)) active = false; + List keyValue = null; + for (String s : dependsOnSet) { + if (specialDepedency(s) || isOptionOn(s)) { + active = false; + if (specialDepedency(s)) { + keyValue = getSpecialDependencyList(s); + } + } break; } ListPreference pref = mPreferenceGroup.findPreference(keyToProcess); Values values = new Values(pref.getValue(), null); if (!active) { - values.overriddenValue = pref.getOffValue(); + String offValue = pref.getOffValue(); + if (keyValue != null) { + String matchValue = getMatchingValue(keyToProcess, keyValue); + if (matchValue != null) + offValue = matchValue; + } + values.overriddenValue = offValue; } mValuesMap.put(keyToProcess, values); } @@ -221,49 +258,128 @@ public class SettingsManager implements ListMenu.SettingsListener { String key = changedPref.getKey(); String value = changedPref.getValue(); + boolean special = specialDepedency(changedPrefKey); + String prevValue = getValue(changedPrefKey); + if (value.equals(prevValue)) return null; + boolean turnedOff = value.equals(changedPref.getOffValue()); + boolean updateBackDependency = false; List changed = new ArrayList(); Values values = new Values(value, null); mValuesMap.put(key, values); changed.add(new SettingState(key, values)); - CharSequence[] dependencyList = changedPref.getDependencyList(); - if (!turnedOff) { // turned on - if (dependencyList != null) { - for (int j = 0; j < dependencyList.length; j++) { - key = dependencyList[j].toString(); - ListPreference pref = mPreferenceGroup.findPreference(key); - if (pref == null) continue; - values = mValuesMap.get(key); - if (values != null && values.overriddenValue != null) continue; - Values newValue = new Values(pref.getValue(), pref.getOffValue()); - mValuesMap.put(key, newValue); - changed.add(new SettingState(key, newValue)); + Set turnOn = new HashSet<>(); + Set turnOff = new HashSet<>(); + + CharSequence[] originalDependencyList = changedPref.getDependencyList(); + CharSequence[] dependencyList = null; + List keyValue = null; + if (special) { + keyValue = getSpecialDependencyList(changedPref); + if (keyValue.size() > 0) { + dependencyList = new CharSequence[keyValue.size()]; + int k = 0; + for (KeyValue kv : keyValue) { + dependencyList[k++] = kv.key; } } - } else { - if (dependencyList != null) { - for (int j = 0; j < dependencyList.length; j++) { - key = dependencyList[j].toString(); - List dependsOnList = mDependendsOnMap.get(key); - if (dependsOnList == null) continue; - boolean active = true; - for (String s : dependsOnList) { - if (isOptionOn(s)) active = false; - break; + } + + if (special) { + boolean same = Arrays.equals(originalDependencyList, dependencyList); + if (!same) { + changedPref.setDependencyList(dependencyList); + if (originalDependencyList != null) + for (CharSequence c : originalDependencyList) { + turnOn.add(c); + } + if (dependencyList != null) + for (CharSequence c : dependencyList) { + turnOff.add(c); } - if (active) { - values = mValuesMap.get(key); - values.overriddenValue = null; - mValuesMap.put(key, values); - changed.add(new SettingState(key, values)); + + if (originalDependencyList != null) + for (CharSequence c : originalDependencyList) { + turnOff.remove(c); + } + if (dependencyList != null) + for (CharSequence c : dependencyList) { + turnOn.remove(c); } + updateBackDependency = true; + } + } else { + if (originalDependencyList != null) { + for (CharSequence c : originalDependencyList) { + if (turnedOff) turnOn.add(c); + else turnOff.add(c); } } } + + for (CharSequence c : turnOn) {// turn back on + key = c.toString(); + Set dependsOnSet = mDependendsOnMap.get(key); + if (dependsOnSet == null) continue; + boolean active = true; + for (String s : dependsOnSet) { + if (s.equals(changedPrefKey)) continue; + if (isOptionOn(s)) active = false; + break; + } + if (active) { + values = mValuesMap.get(key); + if (values == null) continue; + values.overriddenValue = null; + mValuesMap.put(key, values); + changed.add(new SettingState(key, values)); + } + } + + for (CharSequence c : turnOff) {// turn off logic + key = c.toString(); + ListPreference pref = mPreferenceGroup.findPreference(key); + if (pref == null) continue; + values = mValuesMap.get(key); + if (values == null) continue; + if (values != null && values.overriddenValue != null) continue; + String offValue = pref.getOffValue(); + if (keyValue != null) { + String matchValue = getMatchingValue(key, keyValue); + if (matchValue != null) + offValue = matchValue; + } + Values newValue = new Values(pref.getValue(), offValue); + mValuesMap.put(key, newValue); + changed.add(new SettingState(key, newValue)); + } + + if (updateBackDependency) { + updateBackDependency(changedPrefKey, turnOn, turnOff); + } + return changed; } + private void updateBackDependency(String key, Set remove, Set + add) { + for (CharSequence c : remove) { + String currentKey = c.toString(); + Set dependsOnSet = mDependendsOnMap.get(currentKey); + if (dependsOnSet != null) dependsOnSet.remove(key); + } + for (CharSequence c : add) { + String currentKey = c.toString(); + Set dependsOnSet = mDependendsOnMap.get(currentKey); + if (dependsOnSet == null) { + dependsOnSet = new HashSet<>(); + mDependendsOnMap.put(currentKey, dependsOnSet); + } + dependsOnSet.add(key); + } + } + public void registerListener(Listener listener) { mListeners.add(listener); } @@ -311,11 +427,8 @@ public class SettingsManager implements ListMenu.SettingsListener { private void updateMapAndNotify(ListPreference pref) { String key = pref.getKey(); - Values values = mValuesMap.get(key); - values.overriddenValue = null; - values.value = pref.getValue(); - mValuesMap.put(key, values); List changed = checkDependencyAndUpdate(key); + if (changed == null) return; notifyListeners(changed); } @@ -355,6 +468,9 @@ public class SettingsManager implements ListMenu.SettingsListener { ListPreference pictureSize = mPreferenceGroup.findPreference(KEY_PICTURE_SIZE); ListPreference exposure = mPreferenceGroup.findPreference(KEY_EXPOSURE); ListPreference iso = mPreferenceGroup.findPreference(KEY_ISO); + ListPreference clearsight = mPreferenceGroup.findPreference(KEY_CLEARSIGHT); + ListPreference monoPreview = mPreferenceGroup.findPreference(KEY_MONO_PREVIEW); + ListPreference monoOnly = mPreferenceGroup.findPreference(KEY_MONO_ONLY); if (whiteBalance != null) { CameraSettings.filterUnsupportedOptions(mPreferenceGroup, @@ -388,6 +504,13 @@ public class SettingsManager implements ListMenu.SettingsListener { CameraSettings.filterUnsupportedOptions(mPreferenceGroup, iso, getSupportedIso(cameraId)); } + + if (!mIsMonoCameraPresent) { + if (clearsight != null) removePreference(mPreferenceGroup, KEY_CLEARSIGHT); + if (monoPreview != null) removePreference(mPreferenceGroup, KEY_MONO_PREVIEW); + if (monoOnly != null) removePreference(mPreferenceGroup, KEY_MONO_ONLY); + + } } private void buildExposureCompensation(int cameraId) { @@ -431,16 +554,23 @@ public class SettingsManager implements ListMenu.SettingsListener { private void buildCameraId() { int numOfCameras = mCharacteristics.size(); - if (numOfCameras < 2) { + if (!mIsFrontCameraPresent) { removePreference(mPreferenceGroup, KEY_CAMERA_ID); + return; } CharSequence[] entryValues = new CharSequence[numOfCameras]; + CharSequence[] entries = new CharSequence[numOfCameras]; //TODO: Modify this after bayer/mono/front/back determination is done entryValues[0] = "" + CaptureModule.BAYER_ID; - entryValues[1] = "" + CaptureModule.FRONT_ID; + entries[0] = "BACK"; + if (mIsFrontCameraPresent) { + entryValues[1] = "" + CaptureModule.FRONT_ID; + entries[1] = "FRONT"; + } ListPreference cameraIdPref = mPreferenceGroup.findPreference(KEY_CAMERA_ID); cameraIdPref.setEntryValues(entryValues); + cameraIdPref.setEntries(entries); } private boolean removePreference(PreferenceGroup group, String key) { @@ -537,6 +667,7 @@ public class SettingsManager implements ListMenu.SettingsListener { .CONTROL_AVAILABLE_SCENE_MODES); List modes = new ArrayList<>(); modes.add("0"); // need special case handle for auto scene mode + if (mIsMonoCameraPresent) modes.add("-5"); // need special case handle for dual mode for (int mode : sceneModes) { modes.add("" + mode); } @@ -579,10 +710,66 @@ public class SettingsManager implements ListMenu.SettingsListener { return supportedIso; } + private boolean specialDepedency(String key) { + return key.equals(KEY_SCENE_MODE); + } + + private List getSpecialDependencyList(String key) { + ListPreference pref = mPreferenceGroup.findPreference(key); + return getSpecialDependencyList(pref); + } + + private List getSpecialDependencyList(ListPreference pref) { + String key = pref.getKey(); + List dependency = new ArrayList<>(); + switch (key) { + case KEY_SCENE_MODE: + String value = pref.getValue(); + switch (value) { + case "0": + dependency.add(new KeyValue(KEY_CLEARSIGHT, "off")); + dependency.add(new KeyValue(KEY_MONO_PREVIEW, "off")); + break; + case "-5": + dependency.add(new KeyValue(KEY_LONGSHOT, "off")); + dependency.add(new KeyValue(KEY_MONO_ONLY, "off")); + break; + default: + dependency.add(new KeyValue(KEY_COLOR_EFFECT, "0")); + dependency.add(new KeyValue(KEY_FLASH_MODE, "2")); + dependency.add(new KeyValue(KEY_WHITE_BALANCE, "1")); + dependency.add(new KeyValue(KEY_EXPOSURE, "0")); + dependency.add(new KeyValue(KEY_CLEARSIGHT, "off")); + dependency.add(new KeyValue(KEY_MONO_PREVIEW, "off")); + break; + } + break; + } + return dependency; + } + public interface Listener { void onSettingsChanged(List settings); } + private String getMatchingValue(String key, List keyValue) { + for (KeyValue kv: keyValue) { + if (key.equals(kv.key)) { + return kv.value; + } + } + return null; + } + + static class KeyValue { + String key; + String value; + + KeyValue(String key, String value) { + this.key = key; + this.value = value; + } + } static class Values { String value; String overriddenValue; diff --git a/src/com/android/camera/ui/ListMenu.java b/src/com/android/camera/ui/ListMenu.java index 4cb35981e..decaad80f 100644 --- a/src/com/android/camera/ui/ListMenu.java +++ b/src/com/android/camera/ui/ListMenu.java @@ -117,7 +117,7 @@ public class ListMenu extends ListView if (position >= 0 && position < mEnabled.length) { view.setEnabled(mEnabled[position]); if (mForCamera2 && !mEnabled[position]) { - view.overrideSettings(pref.getOffValue()); + view.overrideSettings(mSettingsManager.getValue(pref.getKey())); } } else { Log.w(TAG, "Invalid input: enabled list length, " + mEnabled.length diff --git a/src/com/android/camera/util/PersistUtil.java b/src/com/android/camera/util/PersistUtil.java index 0f3f43f0b..c9a5a474a 100644 --- a/src/com/android/camera/util/PersistUtil.java +++ b/src/com/android/camera/util/PersistUtil.java @@ -45,7 +45,7 @@ public class PersistUtil { } public static int getLongshotShotLimit() { - return SystemProperties.getInt(PERSIST_LONGSHOT_SHOT_LIMIT, 0); + return SystemProperties.getInt(PERSIST_LONGSHOT_SHOT_LIMIT, 20); } } -- cgit v1.2.3