summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml10
-rw-r--r--res/values/strings.xml6
-rw-r--r--src/com/android/camera/CameraActivity.java68
-rw-r--r--src/com/android/camera/CameraSettings.java10
-rw-r--r--src/com/android/camera/PermissionsActivity.java186
-rw-r--r--src/com/android/camera/PhotoUI.java4
-rw-r--r--src/com/android/camera/SettingsManager.java24
-rw-r--r--src/com/android/camera/VideoModule.java8
-rw-r--r--src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java75
-rw-r--r--src/org/codeaurora/snapcam/filter/ClearSightNativeEngine.java6
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) {