Camera NDK: New lifecycle for ACameraMetadata_fromCameraMetadata

Instead of requiring the user to call NewGlobalRef/DeleteGlobalRef
for keeping the java object alive when creating an NDK view into it,
reference count the real native data instead, so that there's no need
to keep track of the Java object lifecycle.

- Switch CameraMetadataNative to use std::shared_ptr internally
- Switch ACameraMetadata to use std::shared_ptr internally
- Always copy data in the ACameraMetadata copy constructor

Test: New CTS tests pass, fail without this CL
Bug: 148972471
Change-Id: I40a0ccb8b40c7a89ee7d3a6f7bac7c9c88d709f1
diff --git a/camera/ndk/impl/ACameraMetadata.cpp b/camera/ndk/impl/ACameraMetadata.cpp
index 18c5d3c..1bbb9c2 100644
--- a/camera/ndk/impl/ACameraMetadata.cpp
+++ b/camera/ndk/impl/ACameraMetadata.cpp
@@ -28,33 +28,24 @@
  * ACameraMetadata Implementation
  */
 ACameraMetadata::ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type) :
-        mData(new CameraMetadata(buffer)),
-        mOwnsData(true),
+        mData(std::make_shared<CameraMetadata>(buffer)),
         mType(type) {
     init();
 }
 
-ACameraMetadata::ACameraMetadata(CameraMetadata* cameraMetadata, ACAMERA_METADATA_TYPE type) :
+ACameraMetadata::ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata,
+        ACAMERA_METADATA_TYPE type) :
         mData(cameraMetadata),
-        mOwnsData(false),
         mType(type) {
     init();
 }
 
 ACameraMetadata::ACameraMetadata(const ACameraMetadata& other) :
-        mOwnsData(other.mOwnsData),
+        mData(std::make_shared<CameraMetadata>(*(other.mData))),
         mType(other.mType) {
-    if (other.mOwnsData) {
-        mData = new CameraMetadata(*(other.mData));
-    } else {
-        mData = other.mData;
-    }
 }
 
 ACameraMetadata::~ACameraMetadata() {
-    if (mOwnsData) {
-        delete mData;
-    }
 }
 
 void
@@ -373,7 +364,7 @@
 
     Mutex::Autolock _l(mLock);
 
-    camera_metadata_ro_entry rawEntry = static_cast<const CameraMetadata*>(mData)->find(tag);
+    camera_metadata_ro_entry rawEntry = static_cast<const CameraMetadata*>(mData.get())->find(tag);
     if (rawEntry.count == 0) {
         ALOGE("%s: cannot find metadata tag %d", __FUNCTION__, tag);
         return ACAMERA_ERROR_METADATA_NOT_FOUND;
diff --git a/camera/ndk/impl/ACameraMetadata.h b/camera/ndk/impl/ACameraMetadata.h
index a57b2ff..084a60b 100644
--- a/camera/ndk/impl/ACameraMetadata.h
+++ b/camera/ndk/impl/ACameraMetadata.h
@@ -18,6 +18,7 @@
 
 #include <unordered_set>
 #include <vector>
+#include <memory>
 
 #include <sys/types.h>
 #include <utils/Mutex.h>
@@ -50,14 +51,13 @@
     // Constructs a ACameraMetadata that takes ownership of `buffer`.
     ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type);
 
-    // Constructs a ACameraMetadata that is a view of `cameraMetadata`.
-    // `cameraMetadata` will not be deleted by ~ACameraMetadata().
-    ACameraMetadata(CameraMetadata* cameraMetadata, ACAMERA_METADATA_TYPE type);
+    // Constructs a ACameraMetadata that shares its data with something else, like a Java object
+    ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata,
+            ACAMERA_METADATA_TYPE type);
 
     // Copy constructor.
     //
-    // If `other` owns its CameraMetadata, then makes a deep copy.
-    // Otherwise, the new instance is also a view of the same data.
+    // Always makes a deep copy.
     ACameraMetadata(const ACameraMetadata& other);
 
     ~ACameraMetadata();
@@ -125,9 +125,7 @@
     // Guard access of public APIs: get/update/getTags.
     mutable Mutex mLock;
 
-    CameraMetadata* mData;
-    // If true, has ownership of mData. Otherwise, mData is a view of an external instance.
-    bool mOwnsData;
+    std::shared_ptr<CameraMetadata> mData;
 
     mutable Vector<uint32_t> mTags; // Updated by `getTags()`, cleared by `update()`.
     const ACAMERA_METADATA_TYPE mType;