RM6785: Add libcamera_metadata shim for stripping out system camera cap

Change-Id: I8f7772fc9ec15a00c4b630866aa7fc162a52c1aa
Signed-off-by: SamarV-121 <samarvispute121@pm.me>
diff --git a/device.mk b/device.mk
index 0632a51..456987d 100644
--- a/device.mk
+++ b/device.mk
@@ -52,6 +52,9 @@
     android.hardware.camera.device@3.6.vendor:64 \
     android.hardware.camera.provider@2.6.vendor:64
 
+PRODUCT_PACKAGES += \
+    libshim_camera_metadata
+
 # Charger
 PRODUCT_PACKAGES += \
     charger_res_images_vendor
diff --git a/extract-files.sh b/extract-files.sh
index 9c38af6..21faee2 100755
--- a/extract-files.sh
+++ b/extract-files.sh
@@ -48,6 +48,9 @@
         vendor/lib/hw/audio.usb.mt6785.so)
             "$PATCHELF" --replace-needed "libalsautils.so" "libalsautils-v30.so" "$2"
             ;;
+        vendor/lib64/hw/android.hardware.camera.provider@2.6-impl-mediatek.so)
+            grep -q libshim_camera_metadata.so "$2" || "$PATCHELF" --add-needed libshim_camera_metadata.so "$2"
+            ;;
         vendor/lib64/libmtkcam_stdutils.so)
             "$PATCHELF" --replace-needed "libutils.so" "libutils-v30.so" "$2"
             ;;
diff --git a/libshims/Android.bp b/libshims/Android.bp
new file mode 100644
index 0000000..d6f813a
--- /dev/null
+++ b/libshims/Android.bp
@@ -0,0 +1,12 @@
+//
+// Copyright (C) 2022 The LineageOS Project
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+
+cc_library {
+    name: "libshim_camera_metadata",
+    shared_libs: ["libcamera_metadata"],
+    srcs: ["libshim_camera_metadata.cpp"],
+    vendor: true
+}
diff --git a/libshims/libshim_camera_metadata.cpp b/libshims/libshim_camera_metadata.cpp
new file mode 100644
index 0000000..95107c9
--- /dev/null
+++ b/libshims/libshim_camera_metadata.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022 The LineageOS Project
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <dlfcn.h>
+#include <system/camera_metadata.h>
+#include <vector>
+
+extern "C" int add_camera_metadata_entry(camera_metadata_t* dst, uint32_t tag, const void* data,
+                                         size_t data_count) {
+    static auto add_camera_metadata_entry_orig =
+            reinterpret_cast<typeof(add_camera_metadata_entry)*>(
+                    dlsym(RTLD_NEXT, "add_camera_metadata_entry"));
+
+    if (tag == ANDROID_REQUEST_AVAILABLE_CAPABILITIES) {
+        std::vector<uint8_t> caps;
+        auto u8 = reinterpret_cast<const uint8_t*>(data);
+
+        for (size_t i = 0; i < data_count; i++) {
+            if (u8[i] != ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA) {
+                caps.emplace_back(u8[i]);
+            }
+        }
+
+        return add_camera_metadata_entry_orig(dst, tag, caps.data(), caps.size());
+    }
+
+    return add_camera_metadata_entry_orig(dst, tag, data, data_count);
+}