diff options
Diffstat (limited to 'src/com/android/camera/util')
-rwxr-xr-x | src/com/android/camera/util/CameraUtil.java | 145 | ||||
-rw-r--r-- | src/com/android/camera/util/MultiMap.java | 45 | ||||
-rw-r--r-- | src/com/android/camera/util/PersistUtil.java | 6 | ||||
-rwxr-xr-x | src/com/android/camera/util/VendorTagUtil.java | 2 |
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 { |