diff options
-rw-r--r-- | AndroidManifest.xml | 10 | ||||
-rw-r--r-- | res/values/strings.xml | 6 | ||||
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 68 | ||||
-rw-r--r-- | src/com/android/camera/CameraSettings.java | 10 | ||||
-rw-r--r-- | src/com/android/camera/PermissionsActivity.java | 186 | ||||
-rw-r--r-- | src/com/android/camera/PhotoUI.java | 4 | ||||
-rw-r--r-- | src/com/android/camera/SettingsManager.java | 24 | ||||
-rw-r--r-- | src/com/android/camera/VideoModule.java | 8 | ||||
-rw-r--r-- | src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java | 75 | ||||
-rw-r--r-- | src/org/codeaurora/snapcam/filter/ClearSightNativeEngine.java | 6 |
10 files changed, 341 insertions, 56 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ac727e2a2..12a86bb9b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,7 +20,6 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.NFC" /> - <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> @@ -83,6 +82,15 @@ android:resource="@layout/keyguard_widget" /> </activity> + <activity + android:name="com.android.camera.PermissionsActivity" + android:label="@string/app_name" + android:parentActivityName="com.android.camera.CameraActivity" > + <meta-data + android:name="android.support.PARENT_ACTIVITY" + android:value="com.android.camera.CameraActivity" /> + </activity> + <activity-alias android:name="com.android.camera.CameraLauncher" android:icon="@mipmap/ic_launcher_camera" diff --git a/res/values/strings.xml b/res/values/strings.xml index 2b06e257f..898329a7f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -171,6 +171,12 @@ <!-- message for the dialog showing the camera is disabled because of security policies. Camera cannot be used. --> <string name="camera_disabled">Camera has been disabled because of security policies.</string> + <!-- message for the dialog showing that the app does not have sufficient permissions [CHAR LIMIT=NONE] --> + <string name="error_permissions">The app does not have critical permissions needed to run. Please check your permissions settings.</string> + + <!-- Dialog "Dismiss" button. Closes the dialog [CHAR LIMIT=12]--> + <string name="dialog_dismiss">Dismiss</string> + <!-- alert to the user to wait for some operation to complete --> <string name="wait">Please wait\u2026</string> diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index 61f05a6ad..1b6031b53 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -18,6 +18,7 @@ package com.android.camera; import android.view.Display; import android.graphics.Point; +import android.Manifest; import android.animation.Animator; import android.annotation.TargetApi; import android.app.ActionBar; @@ -32,6 +33,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.database.Cursor; import android.graphics.Bitmap; @@ -218,6 +220,7 @@ public class CameraActivity extends Activity private View mPreviewCover; private FrameLayout mPreviewContentLayout; private boolean mPaused = true; + private boolean mHasCriticalPermissions; private Uri[] mNfcPushUris = new Uri[1]; @@ -1377,6 +1380,11 @@ public class CameraActivity extends Activity @Override public void onCreate(Bundle state) { super.onCreate(state); + if (checkPermissions() || !mHasCriticalPermissions) { + Log.v(TAG, "onCreate: Missing critical permissions."); + finish(); + return; + } // Check if this is in the secure camera mode. Intent intent = getIntent(); String action = intent.getAction(); @@ -1571,7 +1579,9 @@ public class CameraActivity extends Activity @Override public void onUserInteraction() { super.onUserInteraction(); - mCurrentModule.onUserInteraction(); + if (mCurrentModule != null) { + mCurrentModule.onUserInteraction(); + } } @Override @@ -1625,8 +1635,50 @@ public class CameraActivity extends Activity if (focus) this.setSystemBarsVisibility(false); } + /** + * Checks if any of the needed Android runtime permissions are missing. + * If they are, then launch the permissions activity under one of the following conditions: + * a) If critical permissions are missing, display permission request again + * b) If non-critical permissions are missing, just display permission request once. + * Critical permissions are: camera, microphone and storage. The app cannot run without them. + * Non-critical permission is location. + */ + private boolean checkPermissions() { + boolean requestPermission = false; + + if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED && + checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED && + checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + mHasCriticalPermissions = true; + } else { + mHasCriticalPermissions = false; + } + + if ((checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || + !mHasCriticalPermissions) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + boolean isRequestShown = prefs.getBoolean(CameraSettings.KEY_REQUEST_PERMISSION, false); + if(!isRequestShown || !mHasCriticalPermissions) { + Log.v(TAG, "Request permission"); + Intent intent = new Intent(this, PermissionsActivity.class); + startActivity(intent); + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean(CameraSettings.KEY_REQUEST_PERMISSION, true); + editor.apply(); + requestPermission = true; + } + } + return requestPermission; + } + @Override public void onResume() { + if (checkPermissions() || !mHasCriticalPermissions) { + super.onResume(); + Log.v(TAG, "onResume: Missing critical permissions."); + finish(); + return; + } // Hide action bar first since we are in full screen mode first, and // switch the system UI to lights-out mode. this.setSystemBarsVisibility(false); @@ -1692,13 +1744,15 @@ public class CameraActivity extends Activity mWakeLock.release(); Log.d(TAG, "wake lock release"); } + SettingsManager.getInstance().destroyInstance(); + if (mCursor != null) { + getContentResolver().unregisterContentObserver(mLocalImagesObserver); + getContentResolver().unregisterContentObserver(mLocalVideosObserver); + unregisterReceiver(mSDcardMountedReceiver); - getContentResolver().unregisterContentObserver(mLocalImagesObserver); - getContentResolver().unregisterContentObserver(mLocalVideosObserver); - unregisterReceiver(mSDcardMountedReceiver); - - mCursor.close(); - mCursor=null; + mCursor.close(); + mCursor=null; + } super.onDestroy(); } diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index da203d52c..7a1cf8d74 100644 --- a/src/com/android/camera/CameraSettings.java +++ b/src/com/android/camera/CameraSettings.java @@ -251,6 +251,8 @@ public class CameraSettings { public static final String KEY_SHOW_MENU_HELP = "help_menu"; + public static final String KEY_REQUEST_PERMISSION = "request_permission"; + public static final String KEY_SELFIE_FLASH = "pref_selfie_flash_key"; public static final String EXPOSURE_DEFAULT_VALUE = "0"; @@ -278,7 +280,13 @@ public class CameraSettings { //video encoders VIDEO_ENCODER_TABLE.put(MediaRecorder.VideoEncoder.H263, "h263"); VIDEO_ENCODER_TABLE.put(MediaRecorder.VideoEncoder.H264, "h264"); - // VIDEO_ENCODER_TABLE.put(MediaRecorder.VideoEncoder.H265, "h265"); + int h265 = ApiHelper.getIntFieldIfExists(MediaRecorder.VideoEncoder.class, + "HEVC", null, MediaRecorder.VideoEncoder.DEFAULT); + if (h265 == MediaRecorder.VideoEncoder.DEFAULT) { + h265 = ApiHelper.getIntFieldIfExists(MediaRecorder.VideoEncoder.class, + "H265", null, MediaRecorder.VideoEncoder.DEFAULT); + } + VIDEO_ENCODER_TABLE.put(h265, "h265"); VIDEO_ENCODER_TABLE.put(MediaRecorder.VideoEncoder.MPEG_4_SP, "m4v"); //video qualities diff --git a/src/com/android/camera/PermissionsActivity.java b/src/com/android/camera/PermissionsActivity.java new file mode 100644 index 000000000..1d6219195 --- /dev/null +++ b/src/com/android/camera/PermissionsActivity.java @@ -0,0 +1,186 @@ +package com.android.camera; + +import android.Manifest; +import android.app.Activity; +import android.app.Dialog; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; +import org.codeaurora.snapcam.R; + +/** + * Activity that shows permissions request dialogs and handles lack of critical permissions. + */ +public class PermissionsActivity extends Activity { + private static final String TAG = "PermissionsActivity"; + + private static int PERMISSION_REQUEST_CODE = 1; + + private int mIndexPermissionRequestCamera; + private int mIndexPermissionRequestMicrophone; + private int mIndexPermissionRequestLocation; + private int mIndexPermissionRequestStorage; + private boolean mShouldRequestCameraPermission; + private boolean mShouldRequestMicrophonePermission; + private boolean mShouldRequestLocationPermission; + private boolean mShouldRequestStoragePermission; + private int mNumPermissionsToRequest; + private boolean mFlagHasCameraPermission; + private boolean mFlagHasMicrophonePermission; + private boolean mFlagHasStoragePermission; + private boolean mCriticalPermissionDenied; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + protected void onResume() { + super.onResume(); + if (!mCriticalPermissionDenied) { + mNumPermissionsToRequest = 0; + checkPermissions(); + } else { + mCriticalPermissionDenied = false; + } + } + + private void checkPermissions() { + if (checkSelfPermission(Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED) { + mNumPermissionsToRequest++; + mShouldRequestCameraPermission = true; + } else { + mFlagHasCameraPermission = true; + } + + if (checkSelfPermission(Manifest.permission.RECORD_AUDIO) + != PackageManager.PERMISSION_GRANTED) { + mNumPermissionsToRequest++; + mShouldRequestMicrophonePermission = true; + } else { + mFlagHasMicrophonePermission = true; + } + + if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + mNumPermissionsToRequest++; + mShouldRequestStoragePermission = true; + } else { + mFlagHasStoragePermission = true; + } + + if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + mNumPermissionsToRequest++; + mShouldRequestLocationPermission = true; + } + + if (mNumPermissionsToRequest != 0) { + buildPermissionsRequest(); + } else { + handlePermissionsSuccess(); + } + } + + private void buildPermissionsRequest() { + String[] permissionsToRequest = new String[mNumPermissionsToRequest]; + int permissionsRequestIndex = 0; + + if (mShouldRequestCameraPermission) { + permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA; + mIndexPermissionRequestCamera = permissionsRequestIndex; + permissionsRequestIndex++; + } + if (mShouldRequestMicrophonePermission) { + permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO; + mIndexPermissionRequestMicrophone = permissionsRequestIndex; + permissionsRequestIndex++; + } + if (mShouldRequestStoragePermission) { + permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE; + mIndexPermissionRequestStorage = permissionsRequestIndex; + permissionsRequestIndex++; + } + if (mShouldRequestLocationPermission) { + permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION; + mIndexPermissionRequestLocation = permissionsRequestIndex; + } + requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE); + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + + if (mShouldRequestCameraPermission) { + if (grantResults[mIndexPermissionRequestCamera] == PackageManager.PERMISSION_GRANTED) { + mFlagHasCameraPermission = true; + } else { + mCriticalPermissionDenied = true; + } + } + if (mShouldRequestMicrophonePermission) { + if (grantResults[mIndexPermissionRequestMicrophone] == PackageManager.PERMISSION_GRANTED) { + mFlagHasMicrophonePermission = true; + } else { + mCriticalPermissionDenied = true; + } + } + if (mShouldRequestStoragePermission) { + if (grantResults[mIndexPermissionRequestStorage] == PackageManager.PERMISSION_GRANTED) { + mFlagHasStoragePermission = true; + } else { + mCriticalPermissionDenied = true; + } + } + + if (mShouldRequestLocationPermission) { + if (grantResults[mIndexPermissionRequestLocation] == PackageManager.PERMISSION_GRANTED) { + // Do nothing + } else { + // Do nothing + } + } + + if (mFlagHasCameraPermission && mFlagHasMicrophonePermission && mFlagHasStoragePermission) { + handlePermissionsSuccess(); + } else if (mCriticalPermissionDenied) { + handlePermissionsFailure(); + } + } + + private void handlePermissionsSuccess() { + Intent intent = new Intent(this, CameraActivity.class); + startActivity(intent); + finish(); + } + + private void handlePermissionsFailure() { + new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.camera_error_title)) + .setMessage(getResources().getString(R.string.error_permissions)) + .setCancelable(false) + .setOnKeyListener(new Dialog.OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + finish(); + } + return true; + } + }) + .setPositiveButton(getResources().getString(R.string.dialog_dismiss), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }) + .show(); + } +} diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index 1cf88b50a..09e24a710 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -1067,7 +1067,9 @@ public class PhotoUI implements PieListener, mReviewImage.setVisibility(View.GONE); mOnScreenIndicators.setVisibility(View.VISIBLE); mMenuButton.setVisibility(View.VISIBLE); - mMenu.hideTopMenu(false); + if (mMenu != null) { + mMenu.hideTopMenu(false); + } CameraUtil.fadeOut(mReviewDoneButton); mShutterButton.setVisibility(View.VISIBLE); CameraUtil.fadeOut(mReviewRetakeButton); diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java index 1433f1cd0..a66a3d992 100644 --- a/src/com/android/camera/SettingsManager.java +++ b/src/com/android/camera/SettingsManager.java @@ -87,10 +87,9 @@ public class SettingsManager implements ListMenu.SettingsListener { 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<CameraCharacteristics> mCharacteristics = new ArrayList<>(); private static SettingsManager sInstance; - + private ArrayList<CameraCharacteristics> mCharacteristics; private ArrayList<Listener> mListeners; private Map<String, Values> mValuesMap; private Context mContext; @@ -102,6 +101,7 @@ public class SettingsManager implements ListMenu.SettingsListener { private SettingsManager(Context context) { mListeners = new ArrayList<>(); + mCharacteristics = new ArrayList<>(); mContext = context; mPreferences = new ComboPreferences(mContext); CameraSettings.upgradeGlobalPreferences(mPreferences.getGlobal(), mContext); @@ -145,6 +145,12 @@ public class SettingsManager implements ListMenu.SettingsListener { return sInstance; } + public void destroyInstance() { + if (sInstance != null) { + sInstance = null; + } + } + public List<String> getDisabledList() { List<String> list = new ArrayList<>(); Set<String> keySet = mValuesMap.keySet(); @@ -667,9 +673,19 @@ public class SettingsManager implements ListMenu.SettingsListener { CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size[] sizes = map.getOutputSizes(ImageFormat.JPEG); List<String> res = new ArrayList<>(); - for (int i = 0; i < sizes.length; i++) { - res.add(sizes[i].toString()); + if (sizes != null) { + for (int i = 0; i < sizes.length; i++) { + res.add(sizes[i].toString()); + } } + + Size[] highResSizes = map.getHighResolutionOutputSizes(ImageFormat.JPEG); + if (highResSizes != null) { + for (int i = 0; i < highResSizes.length; i++) { + res.add(highResSizes[i].toString()); + } + } + return res; } diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 9ad8f0197..96423044f 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -315,7 +315,13 @@ public class VideoModule implements CameraModule, VIDEO_ENCODER_TABLE.put("h263", MediaRecorder.VideoEncoder.H263); VIDEO_ENCODER_TABLE.put("h264", MediaRecorder.VideoEncoder.H264); - // VIDEO_ENCODER_TABLE.put("h265", MediaRecorder.VideoEncoder.H265); + int h265 = ApiHelper.getIntFieldIfExists(MediaRecorder.VideoEncoder.class, + "HEVC", null, MediaRecorder.VideoEncoder.DEFAULT); + if (h265 == MediaRecorder.VideoEncoder.DEFAULT) { + h265 = ApiHelper.getIntFieldIfExists(MediaRecorder.VideoEncoder.class, + "H265", null, MediaRecorder.VideoEncoder.DEFAULT); + } + VIDEO_ENCODER_TABLE.put("h265", h265); VIDEO_ENCODER_TABLE.put("m4v", MediaRecorder.VideoEncoder.MPEG_4_SP); VIDEO_ENCODER_TABLE.putDefault(MediaRecorder.VideoEncoder.DEFAULT); diff --git a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java index c33726322..bafbbb8eb 100644 --- a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java +++ b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java @@ -30,7 +30,6 @@ package org.codeaurora.snapcam.filter; import java.io.ByteArrayOutputStream; -import java.io.File; import java.nio.ByteBuffer; import java.util.ArrayDeque; import java.util.ArrayList; @@ -69,7 +68,6 @@ import com.android.camera.MediaSaveService; import com.android.camera.MediaSaveService.OnMediaSavedListener; import com.android.camera.PhotoModule.NamedImages; import com.android.camera.PhotoModule.NamedImages.NamedEntity; -import com.android.camera.SDCard; import com.android.camera.Storage; public class ClearSightImageProcessor { @@ -353,6 +351,7 @@ public class ClearSightImageProcessor { private ArrayDeque<Image> mMonoImages = new ArrayDeque<Image>( mNumBurstCount); private ReprocessableImage mClearSightFrame; + private NamedEntity mNamedEntity; private int[] mNumImagesToProcess = new int[NUM_CAM]; private ProcessState mState = ProcessState.IDLE; @@ -491,6 +490,10 @@ public class ClearSightImageProcessor { mCallback.onClearSightFailure(); return; } else { + // Generate filename + mNamedImages.nameNewImage(System.currentTimeMillis()); + mNamedEntity = mNamedImages.getNextNameEntity(); + int frameCount = Math.min(mMonoFrames.size(), mBayerFrames.size()); sendReprocessRequests(CAM_TYPE_BAYER, frameCount); sendReprocessRequests(CAM_TYPE_MONO, frameCount); @@ -587,10 +590,12 @@ public class ClearSightImageProcessor { Log.d(TAG, "reprocess - processNewImg"); if(mDumpImages) { - saveDebugImageAsJpeg(mMediaSaveService, image, isBayer); - if(mDumpYUV) { - saveDebugImageAsNV21(image, isBayer); - } + saveDebugImageAsJpeg(mMediaSaveService, image, isBayer, mNamedEntity, + ClearSightNativeEngine.getInstance().getImageCount(isBayer)); + } + if(mDumpYUV) { + saveDebugImageAsNV21(image, isBayer, mNamedEntity, + ClearSightNativeEngine.getInstance().getImageCount(isBayer)); } if (!ClearSightNativeEngine.getInstance() @@ -664,11 +669,12 @@ public class ClearSightImageProcessor { ClearSightNativeEngine.getInstance().reset(); mClearSightFrame = null; mState = ProcessState.IDLE; + mNamedEntity = null; } private void sendEncodeRequests() { mImageEncodeHandler.obtainMessage( - MSG_START_CAPTURE, (mClearSightFrame != null)?1:0, 0).sendToTarget(); + MSG_START_CAPTURE, (mClearSightFrame != null)?1:0, 0, mNamedEntity).sendToTarget(); // First Mono CameraCaptureSession session = mCaptureSessions[CAM_TYPE_MONO]; @@ -745,6 +751,7 @@ public class ClearSightImageProcessor { private Image mMonoImage; private Image mBayerImage; private Image mClearSightImage; + private NamedEntity mNamedEntity; public ImageEncodeHandler(Looper looper) { super(looper); @@ -755,6 +762,7 @@ public class ClearSightImageProcessor { switch (msg.what) { case MSG_START_CAPTURE: mClearsightEncode = (msg.arg1 == 1); + mNamedEntity = (NamedEntity) msg.obj; break; case MSG_NEW_IMG: case MSG_NEW_RESULT: @@ -786,10 +794,8 @@ public class ClearSightImageProcessor { } private void saveMpoImage() { - mNamedImages.nameNewImage(System.currentTimeMillis()); - NamedEntity name = mNamedImages.getNextNameEntity(); - String title = (name == null) ? null : name.title; - long date = (name == null) ? -1 : name.date; + String title = (mNamedEntity == null) ? null : mNamedEntity.title; + long date = (mNamedEntity == null) ? -1 : mNamedEntity.date; int width = mBayerImage.getWidth(); int height = mBayerImage.getHeight(); @@ -813,63 +819,52 @@ public class ClearSightImageProcessor { mClearSightImage.close(); mClearSightImage = null; } + mNamedEntity = null; } } public void saveDebugImageAsJpeg(MediaSaveService service, byte[] data, - int width, int height, boolean isBayer) { - mNamedImages.nameNewImage(System.currentTimeMillis()); - NamedEntity name = mNamedImages.getNextNameEntity(); - String title = (name == null) ? null : name.title; - long date = (name == null) ? -1 : name.date; - - if (isBayer) { - title += "_bayer"; - } else { - title += "_mono"; - } + int width, int height, boolean isBayer, NamedEntity namedEntity, int count) { + String type = isBayer?"bayer":"mono"; + long date = (namedEntity == null) ? -1 : namedEntity.date; + String title = String.format("%s_%s_%02d", namedEntity.title, type, count); service.addImage(data, title, date, null, width, height, 0, null, null, service.getContentResolver(), "jpeg"); } - public void saveDebugImageAsJpeg(MediaSaveService service, YuvImage image, boolean isBayer) { + public void saveDebugImageAsJpeg(MediaSaveService service, YuvImage image, boolean isBayer, + NamedEntity namedEntity, int count) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compressToJpeg( new Rect(0, 0, image.getWidth(), image.getHeight()), 100, baos); saveDebugImageAsJpeg(service, baos.toByteArray(), image.getWidth(), image.getHeight(), - isBayer); + isBayer, namedEntity, count); } - public void saveDebugImageAsJpeg(MediaSaveService service, Image image, boolean isBayer) { + public void saveDebugImageAsJpeg(MediaSaveService service, Image image, boolean isBayer, + NamedEntity namedEntity, int count) { if(image.getFormat() == ImageFormat.YUV_420_888) - saveDebugImageAsJpeg(service, createYuvImage(image), isBayer); + saveDebugImageAsJpeg(service, createYuvImage(image), isBayer, namedEntity, count); else if (image.getFormat() == ImageFormat.JPEG) { - saveDebugImageAsJpeg(service, getJpegData(image), image.getWidth(), image.getHeight(), isBayer); + saveDebugImageAsJpeg(service, getJpegData(image), image.getWidth(), image.getHeight(), + isBayer, namedEntity, count); } } - public void saveDebugImageAsNV21(Image image, boolean isBayer) { + public void saveDebugImageAsNV21(Image image, boolean isBayer, NamedEntity namedEntity, int count) { if(image.getFormat() != ImageFormat.YUV_420_888) { Log.d(TAG, "saveDebugImageAsNV21 - invalid param"); } - mNamedImages.nameNewImage(System.currentTimeMillis()); - NamedEntity name = mNamedImages.getNextNameEntity(); - StringBuilder pathSB = (name == null) ? new StringBuilder() : new StringBuilder(name.title); - pathSB.append("_" + image.getWidth() + "x" + image.getHeight()); - pathSB.append("_NV21"); - - if (isBayer) { - pathSB.append("_bayer"); - } else { - pathSB.append("_mono"); - } + String type = isBayer?"bayer":"mono"; + String title = String.format("%s_%dx%d_NV21_%s_%02d", namedEntity.title, + image.getWidth(), image.getHeight(), type, count); YuvImage yuv = createYuvImage(image); - String path = Storage.generateFilepath(pathSB.toString(), "yuv"); + String path = Storage.generateFilepath(title, "yuv"); Storage.writeFile(path, yuv.getYuvData(), null, "yuv"); } diff --git a/src/org/codeaurora/snapcam/filter/ClearSightNativeEngine.java b/src/org/codeaurora/snapcam/filter/ClearSightNativeEngine.java index 0fc23f1bf..f2793c822 100644 --- a/src/org/codeaurora/snapcam/filter/ClearSightNativeEngine.java +++ b/src/org/codeaurora/snapcam/filter/ClearSightNativeEngine.java @@ -157,7 +157,11 @@ public class ClearSightNativeEngine { } public boolean hasReferenceImage(boolean color) { - return !(color ? mSrcColor.isEmpty() : mSrcMono.isEmpty()); + return (getImageCount(color) > 0); + } + + public int getImageCount(boolean color) { + return color ? mSrcColor.size() : mSrcMono.size(); } public Image getReferenceImage(boolean color) { |