diff options
3 files changed, 48 insertions, 1 deletions
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 4279b1972058..87c64cd12903 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -81,6 +81,15 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * * @hide */ + public Key(String name, String fallbackName, Class<T> type) { + mKey = new CameraMetadataNative.Key<T>(name, fallbackName, type); + } + + /** + * Visible for testing and vendor extensions only. + * + * @hide + */ public Key(String name, Class<T> type) { mKey = new CameraMetadataNative.Key<T>(name, type); } diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index c1566161eb6c..6439338428ee 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -87,6 +87,15 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * * @hide */ + public Key(String name, String fallbackName, Class<T> type) { + mKey = new CameraMetadataNative.Key<T>(name, fallbackName, type); + } + + /** + * Visible for testing and vendor extensions only. + * + * @hide + */ public Key(String name, Class<T> type) { mKey = new CameraMetadataNative.Key<T>(name, type); } diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index e4b1339fd663..4baf2638d888 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -84,6 +84,7 @@ public class CameraMetadataNative implements Parcelable { private final Class<T> mType; private final TypeReference<T> mTypeReference; private final String mName; + private final String mFallbackName; private final int mHash; /** @@ -96,6 +97,7 @@ public class CameraMetadataNative implements Parcelable { throw new NullPointerException("Type needs to be non-null"); } mName = name; + mFallbackName = null; mType = type; mVendorId = vendorId; mTypeReference = TypeReference.createSpecializedTypeReference(type); @@ -103,6 +105,22 @@ public class CameraMetadataNative implements Parcelable { } /** + * @hide + */ + public Key(String name, String fallbackName, Class<T> type) { + if (name == null) { + throw new NullPointerException("Key needs a valid name"); + } else if (type == null) { + throw new NullPointerException("Type needs to be non-null"); + } + mName = name; + mFallbackName = fallbackName; + mType = type; + mTypeReference = TypeReference.createSpecializedTypeReference(type); + mHash = mName.hashCode() ^ mTypeReference.hashCode(); + } + + /** * Visible for testing only. * * <p>Use the CameraCharacteristics.Key, CaptureResult.Key, or CaptureRequest.Key @@ -115,6 +133,7 @@ public class CameraMetadataNative implements Parcelable { throw new NullPointerException("Type needs to be non-null"); } mName = name; + mFallbackName = null; mType = type; mTypeReference = TypeReference.createSpecializedTypeReference(type); mHash = mName.hashCode() ^ mTypeReference.hashCode(); @@ -134,6 +153,7 @@ public class CameraMetadataNative implements Parcelable { throw new NullPointerException("TypeReference needs to be non-null"); } mName = name; + mFallbackName = null; mType = (Class<T>)typeReference.getRawType(); mTypeReference = typeReference; mHash = mName.hashCode() ^ mTypeReference.hashCode(); @@ -494,7 +514,16 @@ public class CameraMetadataNative implements Parcelable { int tag = nativeGetTagFromKeyLocal(key.getName()); byte[] values = readValues(tag); if (values == null) { - return null; + // If the key returns null, use the fallback key if exists. + // This is to support old key names for the newly published keys. + if (key.mFallbackName == null) { + return null; + } + tag = nativeGetTagFromKeyLocal(key.mFallbackName); + values = readValues(tag); + if (values == null) { + return null; + } } int nativeType = nativeGetTypeFromTagLocal(tag); |