From f01e40c5e1a2dc708809d130652e33d8336026cf Mon Sep 17 00:00:00 2001 From: Justin Yun Date: Fri, 18 May 2018 20:39:45 +0900 Subject: [PATCH] Camera: Use fallback key if the requested key returns null If the key returns null, try with the fallback key to get the values. This is to support old key names for old camera hals. Bug: 79183654 Test: Launch GCA in P and P+OMR1 walleye devices. Change-Id: I1d55cc53b159401d4cd47da9a02f174cb6cb9e5e --- .../camera2/CameraCharacteristics.java | 9 ++++++ .../hardware/camera2/CaptureResult.java | 9 ++++++ .../camera2/impl/CameraMetadataNative.java | 31 ++++++++++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) 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);