summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/util')
-rwxr-xr-xsrc/com/android/camera/util/CameraUtil.java145
-rw-r--r--src/com/android/camera/util/MultiMap.java45
-rw-r--r--src/com/android/camera/util/PersistUtil.java6
-rwxr-xr-xsrc/com/android/camera/util/VendorTagUtil.java2
4 files changed, 161 insertions, 37 deletions
diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java
index 34787e4d8..db86e753f 100755
--- a/src/com/android/camera/util/CameraUtil.java
+++ b/src/com/android/camera/util/CameraUtil.java
@@ -43,6 +43,7 @@ import android.net.Uri;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
@@ -70,6 +71,7 @@ import java.io.Closeable;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
@@ -91,6 +93,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
+import java.util.TreeSet;
import static android.content.Context.MODE_PRIVATE;
@@ -109,7 +112,7 @@ public class CameraUtil {
public static final String KEY_SHOW_WHEN_LOCKED = "showWhenLocked";
// Orientation hysteresis amount used in rounding, in degrees
- public static final int ORIENTATION_HYSTERESIS = 5;
+ public static final int ORIENTATION_HYSTERESIS = 10;
public static final String REVIEW_ACTION = "com.android.camera.action.REVIEW";
// See android.hardware.Camera.ACTION_NEW_PICTURE.
@@ -133,6 +136,7 @@ public class CameraUtil {
public static final String SECURE_CAMERA_EXTRA = "secure_camera";
// Fields from android.hardware.Camera.Parameters
public static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
+ public static final String FOCUS_MODE_MW_CONTINUOUS_PICTURE = "mw_continuous-picture";
public static final String RECORDING_HINT = "recording-hint";
private static final String AUTO_EXPOSURE_LOCK_SUPPORTED = "auto-exposure-lock-supported";
private static final String AUTO_WHITE_BALANCE_LOCK_SUPPORTED = "auto-whitebalance-lock-supported";
@@ -142,6 +146,9 @@ public class CameraUtil {
public static final String TRUE = "true";
public static final String FALSE = "false";
+ // Hardware camera key mask
+ private static final int KEY_MASK_CAMERA = 0x20;
+
private static final Class<?>[] CTOR_SIGNATURE =
new Class[] {CaptureRequest.class, CameraMetadataNative.class, boolean.class, int.class};
@@ -181,6 +188,7 @@ public class CameraUtil {
}
public static boolean isVideoSnapshotSupported(Parameters params) {
+ if (params == null) return false;
return TRUE.equals(params.get(VIDEO_SNAPSHOT_SUPPORTED));
}
@@ -189,6 +197,10 @@ public class CameraUtil {
return (supported != null) && supported.contains(SCENE_MODE_HDR);
}
+ public static boolean hasCameraKey() {
+ return (sDeviceKeysPresent & KEY_MASK_CAMERA) != 0;
+ }
+
public static boolean isMeteringAreaSupported(Parameters params) {
return params.getMaxNumMeteringAreas() > 0;
}
@@ -199,6 +211,22 @@ public class CameraUtil {
params.getSupportedFocusModes()));
}
+ public static boolean isSupported(Parameters params, String key) {
+ return (params.get(key) != null && !"null".equals(params.get(key)));
+ }
+
+ public static int getNumSnapsPerShutter(Parameters params) {
+ String numJpegs = params.get("num-jpegs-per-shutter");
+ if (!TextUtils.isEmpty(numJpegs)) {
+ return Integer.valueOf(numJpegs);
+ }
+ String numSnaps = params.get("num-snaps-per-shutter");
+ if (!TextUtils.isEmpty(numSnaps)) {
+ return Integer.valueOf(numSnaps);
+ }
+ return 1;
+ }
+
// Private intent extras. Test only.
private static final String EXTRAS_CAMERA_FACING =
"android.intent.extras.CAMERA_FACING";
@@ -206,6 +234,9 @@ public class CameraUtil {
private static float sPixelDensity = 1;
private static ImageFileNamer sImageFileNamer;
+ // Get available hardware keys
+ private static int sDeviceKeysPresent;
+
private CameraUtil() {
}
@@ -217,6 +248,8 @@ public class CameraUtil {
sPixelDensity = metrics.density;
sImageFileNamer = new ImageFileNamer(
context.getString(R.string.image_file_name_format));
+ sDeviceKeysPresent = context.getResources().getInteger(
+ org.lineageos.platform.internal.R.integer.config_deviceHardwareKeys);
}
public static int dpToPixel(int dp) {
@@ -377,6 +410,37 @@ public class CameraUtil {
}
}
+ public static boolean isCamera2Supported(Context context) {
+ android.hardware.camera2.CameraManager manager = (android.hardware.camera2.CameraManager)
+ context.getSystemService(Context.CAMERA_SERVICE);
+
+ try {
+ String[] cameraIds = manager.getCameraIdList();
+
+ if (cameraIds != null && cameraIds.length > 0) {
+ CameraCharacteristics characteristics =
+ manager.getCameraCharacteristics(cameraIds[0]);
+ int deviceLevel =
+ characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+
+ switch (deviceLevel) {
+ case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:
+ return true;
+ case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL:
+ return true;
+ case CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3:
+ return true;
+ default:
+ return false;
+ }
+ }
+ } catch(CameraAccessException | NumberFormatException e) {
+ Log.e(TAG, "exception trying to get camera characteristics");
+ }
+
+ return false;
+ }
+
public static CameraManager.CameraProxy openCamera(
Activity activity, final int cameraId,
Handler handler, final CameraManager.CameraOpenErrorCallback cb) {
@@ -464,6 +528,11 @@ public class CameraUtil {
return 0;
}
+ public static boolean isScreenRotated(Activity activity) {
+ int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
+ return rotation != Surface.ROTATION_0 && rotation != Surface.ROTATION_180;
+ }
+
/**
* Calculate the default orientation of the device based on the width and
* height of the display when rotation = 0 (i.e. natural width and height)
@@ -514,7 +583,7 @@ public class CameraUtil {
} else {
int dist = Math.abs(orientation - orientationHistory);
dist = Math.min( dist, 360 - dist );
- changeOrientation = ( dist >= 45 + ORIENTATION_HYSTERESIS );
+ changeOrientation = ( dist >= 60 + ORIENTATION_HYSTERESIS );
}
if (changeOrientation) {
return ((orientation + 45) / 90 * 90) % 360;
@@ -578,7 +647,7 @@ public class CameraUtil {
// TODO(andyhuibers): Don't hardcode this but use device's measurements.
final int MAX_ASPECT_HEIGHT = 1080;
// Use a very small tolerance because we want an exact match.
- final double ASPECT_TOLERANCE = 0.01;
+ final double ASPECT_TOLERANCE = 0.02;
if (sizes == null) return -1;
int optimalSizeIndex = -1;
@@ -762,13 +831,25 @@ public class CameraUtil {
return optimalSize;
}
- public static void dumpParameters(Parameters parameters) {
- String flattened = parameters.flatten();
- StringTokenizer tokenizer = new StringTokenizer(flattened, ";");
- Log.d(TAG, "Dump all camera parameters:");
- while (tokenizer.hasMoreElements()) {
- Log.d(TAG, tokenizer.nextToken());
+ public static void dumpParameters(Parameters params) {
+ Set<String> sortedParams = new TreeSet<String>();
+ sortedParams.addAll(Arrays.asList(params.flatten().split(";")));
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ Iterator<String> i = sortedParams.iterator();
+ while (i.hasNext()) {
+ String nextParam = i.next();
+ if ((sb.length() + nextParam.length()) > 2044) {
+ Log.d(TAG, "Parameters: " + sb.toString());
+ sb = new StringBuilder();
+ }
+ sb.append(nextParam);
+ if (i.hasNext()) {
+ sb.append(", ");
+ }
}
+ sb.append("]");
+ Log.d(TAG, "Parameters: " + sb.toString());
}
/**
@@ -871,7 +952,7 @@ public class CameraUtil {
+ "," + rect.right + "," + rect.bottom + ")");
}
- public static void rectFToRect(RectF rectF, Rect rect) {
+ public static void inlineRectToRectF(RectF rectF, Rect rect) {
rect.left = Math.round(rectF.left);
rect.top = Math.round(rectF.top);
rect.right = Math.round(rectF.right);
@@ -880,7 +961,7 @@ public class CameraUtil {
public static Rect rectFToRect(RectF rectF) {
Rect rect = new Rect();
- rectFToRect(rectF, rect);
+ inlineRectToRectF(rectF, rect);
return rect;
}
@@ -900,21 +981,6 @@ public class CameraUtil {
matrix.postTranslate(viewWidth / 2f, viewHeight / 2f);
}
- public static void prepareMatrix(Matrix matrix, boolean mirror, int displayOrientation,
- Rect previewRect) {
- // Need mirror for front camera.
- matrix.setScale(mirror ? -1 : 1, 1);
- // This is the value for android.hardware.Camera.setDisplayOrientation.
- matrix.postRotate(displayOrientation);
-
- // Camera driver coordinates range from (-1000, -1000) to (1000, 1000).
- // We need to map camera driver coordinates to preview rect coordinates
- Matrix mapping = new Matrix();
- mapping.setRectToRect(new RectF(-1000, -1000, 1000, 1000), rectToRectF(previewRect),
- Matrix.ScaleToFit.FILL);
- matrix.setConcat(mapping, matrix);
- }
-
public static String createJpegName(long dateTaken, boolean refocus) {
synchronized (sImageFileNamer) {
return sImageFileNamer.generateName(dateTaken, refocus);
@@ -1057,6 +1123,20 @@ public class CameraUtil {
}
}
}
+
+ public static boolean isLowLuminance(Parameters parameters) {
+ String lC = parameters.get(CameraSettings.KEY_LUMINANCE_CONDITION);
+
+ if (lC != null) {
+ if (lC.equals(CameraSettings.LUMINANCE_CONDITION_LOW)) {
+ Log.d(TAG, "Parameter " + CameraSettings.KEY_LUMINANCE_CONDITION +
+ "=" + CameraSettings.LUMINANCE_CONDITION_LOW);
+ return true;
+ }
+ }
+ return false;
+ }
+
public static String getFilpModeString(int value){
switch(value){
case 0:
@@ -1132,6 +1212,15 @@ public class CameraUtil {
return new int[0];
}
+ public static int getMaxPreviewFps(Parameters params) {
+ List<Integer> frameRates = params.getSupportedPreviewFrameRates();
+ if (frameRates != null && frameRates.size() > 0) {
+ // The list is sorted. Return the last element.
+ return frameRates.get(frameRates.size() - 1).intValue();
+ }
+ return -1;
+ }
+
private static class ImageFileNamer {
private final SimpleDateFormat mFormat;
@@ -1259,10 +1348,6 @@ public class CameraUtil {
return ret;
}
- public static boolean volumeKeyShutterDisable(Context context) {
- return context.getResources().getBoolean(R.bool.volume_key_shutter_disable);
- }
-
public static int determineRatio(int width, int height) {
if (height != 0) {
return determineRatio(((float) width) / height);
diff --git a/src/com/android/camera/util/MultiMap.java b/src/com/android/camera/util/MultiMap.java
new file mode 100644
index 000000000..b2e9003fe
--- /dev/null
+++ b/src/com/android/camera/util/MultiMap.java
@@ -0,0 +1,45 @@
+package com.android.camera.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class MultiMap<K,V> {
+ Map<K,List<V>> map = new HashMap<K,List<V>>();
+
+ public void put(K key, V value) {
+ List<V> l = map.get(key);
+ if(l == null) {
+ l = new ArrayList<V>();
+ map.put(key, l);
+ }
+ l.add(value);
+ }
+
+ public List<V> get(K key) {
+ List<V> l = map.get(key);
+ if(l == null) { return Collections.emptyList(); }
+ else return l;
+ }
+
+ public List<V> remove(K key) {
+ List<V> l = map.remove(key);
+ if(l == null) { return Collections.emptyList(); }
+ else return l;
+ }
+
+ public Set<K> keySet() { return map.keySet(); }
+
+ public int size() {
+ int total = 0;
+ for(List<V> l : map.values()) {
+ total += l.size();
+ }
+ return total;
+ }
+
+ public boolean isEmpty() { return map.isEmpty(); }
+} \ No newline at end of file
diff --git a/src/com/android/camera/util/PersistUtil.java b/src/com/android/camera/util/PersistUtil.java
index 32b76d1e9..baba03cfa 100644
--- a/src/com/android/camera/util/PersistUtil.java
+++ b/src/com/android/camera/util/PersistUtil.java
@@ -52,8 +52,6 @@ public class PersistUtil {
SystemProperties.get("persist.sys.camera.preview.size", "");
private static final String PERSIST_CAMERA_VIDEO_SIZE =
SystemProperties.get("persist.sys.camera.video.size", "");
- private static final boolean PERSIST_CAMERA_CAMERA2 =
- SystemProperties.getBoolean("persist.sys.camera.camera2", true);
private static final boolean PERSIST_CAMERA_ZSL =
SystemProperties.getBoolean("persist.sys.camera.zsl.disabled", false);
private static final int PERSIST_CAMERA_CANCEL_TOUCHFOCUS_DELAY =
@@ -163,10 +161,6 @@ public class PersistUtil {
return result;
}
- public static boolean getCamera2Mode() {
- return PERSIST_CAMERA_CAMERA2;
- }
-
public static boolean getCameraZSLDisabled() {
return PERSIST_CAMERA_ZSL;
}
diff --git a/src/com/android/camera/util/VendorTagUtil.java b/src/com/android/camera/util/VendorTagUtil.java
index b2efbfa54..0cc6359ec 100755
--- a/src/com/android/camera/util/VendorTagUtil.java
+++ b/src/com/android/camera/util/VendorTagUtil.java
@@ -71,7 +71,7 @@ public class VendorTagUtil {
private static final int MANUAL_WB_CCT_MODE = 1;
private static final int MANUAL_WB_GAINS_MODE = 2;
- private static boolean isSupported(CaptureRequest.Builder builder,
+ public static boolean isSupported(CaptureRequest.Builder builder,
CaptureRequest.Key<?> key) {
boolean supported = true;
try {