diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 4279b1972058f..87c64cd129036 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -76,6 +76,15 @@ public final class CameraCharacteristics extends CameraMetadata(name, type, vendorId); } + /** + * Visible for testing and vendor extensions only. + * + * @hide + */ + public Key(String name, String fallbackName, Class type) { + mKey = new CameraMetadataNative.Key(name, fallbackName, type); + } + /** * Visible for testing and vendor extensions only. * diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index c1566161eb6c6..6439338428ee3 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> { * * @hide */ + public Key(String name, String fallbackName, Class type) { + mKey = new CameraMetadataNative.Key(name, fallbackName, type); + } + + /** + * Visible for testing and vendor extensions only. + * + * @hide + */ public Key(String name, Class type) { mKey = new CameraMetadataNative.Key(name, type); } diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index e4b1339fd6639..4baf2638d8888 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 mType; private final TypeReference mTypeReference; private final String mName; + private final String mFallbackName; private final int mHash; /** @@ -96,12 +97,29 @@ 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); mHash = mName.hashCode() ^ mTypeReference.hashCode(); } + /** + * @hide + */ + public Key(String name, String fallbackName, Class 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. * @@ -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)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);