Revert "Revert "Creates a vendor APEX for the emulated camera pr..."

Revert^2 "Use vendor APEX for camera provider HAL."

ca5d42c04c7ca150b9cb6ee1c0662a4759eb5fd8

Change-Id: I7d7d941b7ae28894f2e05453a0dfeef529062f49
diff --git a/common/hal/google_camera_hal/camera_provider.cc b/common/hal/google_camera_hal/camera_provider.cc
index ff1c807..fd00b58 100644
--- a/common/hal/google_camera_hal/camera_provider.cc
+++ b/common/hal/google_camera_hal/camera_provider.cc
@@ -26,11 +26,9 @@
 #include "vendor_tag_defs.h"
 #include "vendor_tag_utils.h"
 
+#if GCH_HWL_USE_DLOPEN
 // HWL layer implementation path
-#if defined(_LP64)
-std::string kCameraHwlLib = "/vendor/lib64/libgooglecamerahwl_impl.so";
-#else  // defined(_LP64)
-std::string kCameraHwlLib = "/vendor/lib/libgooglecamerahwl_impl.so";
+constexpr std::string_view kCameraHwlLib = "libgooglecamerahwl_impl.so";
 #endif
 
 namespace android {
@@ -301,11 +299,11 @@
 #if GCH_HWL_USE_DLOPEN
   CreateCameraProviderHwl_t create_hwl;
 
-  ALOGI("%s:Loading %s library", __FUNCTION__, kCameraHwlLib.c_str());
-  hwl_lib_handle_ = dlopen(kCameraHwlLib.c_str(), RTLD_NOW);
+  ALOGI("%s:Loading %s library", __FUNCTION__, kCameraHwlLib.data());
+  hwl_lib_handle_ = dlopen(kCameraHwlLib.data(), RTLD_NOW);
 
   if (hwl_lib_handle_ == nullptr) {
-    ALOGE("HWL loading %s failed due to error: %s", kCameraHwlLib.c_str(),
+    ALOGE("HWL loading %s failed due to error: %s", kCameraHwlLib.data(),
           dlerror());
     return NO_INIT;
   }
@@ -313,7 +311,7 @@
   create_hwl = (CreateCameraProviderHwl_t)dlsym(hwl_lib_handle_,
                                                 "CreateCameraProviderHwl");
   if (create_hwl == nullptr) {
-    ALOGE("%s: dlsym failed (%s).", __FUNCTION__, kCameraHwlLib.c_str());
+    ALOGE("%s: dlsym failed (%s).", __FUNCTION__, kCameraHwlLib.data());
     dlclose(hwl_lib_handle_);
     hwl_lib_handle_ = nullptr;
     return NO_INIT;
diff --git a/common/hal/hidl_service/Android.bp b/common/hal/hidl_service/Android.bp
index f10d6ef..786e7a6 100644
--- a/common/hal/hidl_service/Android.bp
+++ b/common/hal/hidl_service/Android.bp
@@ -119,7 +119,7 @@
     static_libs: [
         "android.hardware.camera.common@1.0-helper",
     ],
-    vintf_fragments: ["android.hardware.camera.provider@2.7-service-google.xml"],
+    vintf_fragments: [":android.hardware.camera.provider@2.7-service-google.xml"],
 }
 
 cc_binary {
@@ -140,3 +140,8 @@
     init_rc: ["android.hardware.camera.provider@2.7-service-google-lazy.rc"],
     cflags: ["-DLAZY_SERVICE"],
 }
+
+filegroup {
+    name: "android.hardware.camera.provider@2.7-service-google.xml",
+    srcs: ["android.hardware.camera.provider@2.7-service-google.xml"],
+}
diff --git a/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.cpp b/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.cpp
index 910c9cb..d3efc6e 100644
--- a/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.cpp
+++ b/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.cpp
@@ -35,11 +35,14 @@
 namespace android {
 
 // Location of the camera configuration files.
-const char* EmulatedCameraProviderHwlImpl::kConfigurationFileLocation[] = {
-    "/vendor/etc/config/emu_camera_back.json",
-    "/vendor/etc/config/emu_camera_front.json",
-    "/vendor/etc/config/emu_camera_depth.json",
+constexpr std::string_view kConfigurationFileNames[] = {
+    "emu_camera_back.json",
+    "emu_camera_front.json",
+    "emu_camera_depth.json",
 };
+constexpr std::string_view kConfigurationFileDirVendor = "/vendor/etc/config/";
+constexpr std::string_view kConfigurationFileDirApex =
+    "/apex/com.google.emulated.camera.provider.hal/etc/config/";
 
 constexpr StreamSize s240pStreamSize = std::pair(240, 180);
 constexpr StreamSize s720pStreamSize = std::pair(1280, 720);
@@ -698,11 +701,18 @@
   // accordingly, push any remaining physical cameras in the back.
   std::string config;
   size_t logical_id = 0;
-  std::vector<const char*> configurationFileLocation;
+  std::vector<std::string> config_file_locations;
+  std::string config_dir = "";
+  struct stat st;
+  if (stat(kConfigurationFileDirApex.data(), &st) == 0) {
+    config_dir += kConfigurationFileDirApex.data();
+  } else {
+    config_dir += kConfigurationFileDirVendor.data();
+  }
   char prop[PROPERTY_VALUE_MAX];
   if (!property_get_bool("ro.boot.qemu", false)) {
-    for (const auto& iter : kConfigurationFileLocation) {
-      configurationFileLocation.emplace_back(iter);
+    for (const auto& iter : kConfigurationFileNames) {
+      config_file_locations.emplace_back(config_dir + iter.data());
     }
   } else {
     // Android Studio Emulator
@@ -710,34 +720,38 @@
       if (WaitForQemuSfFakeCameraPropertyAvailable() == OK) {
         property_get("vendor.qemu.sf.fake_camera", prop, nullptr);
         if (strcmp(prop, "both") == 0) {
-          configurationFileLocation.emplace_back(kConfigurationFileLocation[0]);
-          configurationFileLocation.emplace_back(kConfigurationFileLocation[1]);
+          config_file_locations.emplace_back(config_dir +
+                                             kConfigurationFileNames[0].data());
+          config_file_locations.emplace_back(config_dir +
+                                             kConfigurationFileNames[1].data());
         } else if (strcmp(prop, "front") == 0) {
-          configurationFileLocation.emplace_back(kConfigurationFileLocation[1]);
+          config_file_locations.emplace_back(config_dir +
+                                             kConfigurationFileNames[1].data());
           logical_id = 1;
         } else if (strcmp(prop, "back") == 0) {
-          configurationFileLocation.emplace_back(kConfigurationFileLocation[0]);
+          config_file_locations.emplace_back(config_dir +
+                                             kConfigurationFileNames[0].data());
           logical_id = 1;
         }
       }
     }
   }
-  static_metadata_.resize(ARRAY_SIZE(kConfigurationFileLocation));
+  static_metadata_.resize(ARRAY_SIZE(kConfigurationFileNames));
 
-  for (const auto& config_path : configurationFileLocation) {
+  for (const auto& config_path : config_file_locations) {
     if (!android::base::ReadFileToString(config_path, &config)) {
       ALOGW("%s: Could not open configuration file: %s", __FUNCTION__,
-            config_path);
+            config_path.c_str());
       continue;
     }
 
     Json::CharReaderBuilder builder;
     std::unique_ptr<Json::CharReader> config_reader(builder.newCharReader());
     Json::Value root;
-    std::string errorMessage;
-    if (!config_reader->parse(&*config.begin(), &*config.end(), &root, &errorMessage)) {
-      ALOGE("Could not parse configuration file: %s",
-            errorMessage.c_str());
+    std::string error_message;
+    if (!config_reader->parse(&*config.begin(), &*config.end(), &root,
+                              &error_message)) {
+      ALOGE("Could not parse configuration file: %s", error_message.c_str());
       return BAD_VALUE;
     }
 
diff --git a/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.h b/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.h
index 455e045..57aeee2 100644
--- a/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.h
+++ b/devices/EmulatedCamera/hwl/EmulatedCameraProviderHWLImpl.h
@@ -80,8 +80,6 @@
   status_t WaitForQemuSfFakeCameraPropertyAvailable();
   bool SupportsMandatoryConcurrentStreams(uint32_t camera_id);
 
-  static const char* kConfigurationFileLocation[];
-
   std::vector<std::unique_ptr<HalCameraMetadata>> static_metadata_;
   // Logical to physical camera Id mapping. Empty value vector in case
   // of regular non-logical device.
diff --git a/devices/EmulatedCamera/hwl/apex/Android.bp b/devices/EmulatedCamera/hwl/apex/Android.bp
new file mode 100644
index 0000000..8f79f15
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/Android.bp
@@ -0,0 +1,69 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+apex_key {
+    name: "com.google.emulated.camera.provider.hal.key",
+    public_key: "com.google.emulated.camera.provider.hal.avbpubkey",
+    private_key: "com.google.emulated.camera.provider.hal.pem",
+}
+
+android_app_certificate {
+    name: "com.google.emulated.camera.provider.hal.certificate",
+    certificate: "com.google.emulated.camera.provider.hal",
+}
+
+prebuilt_etc {
+    name: "com.google.emulated.camera.provider.hal.rc",
+    src: "com.google.emulated.camera.provider.hal.rc",
+    installable: false,
+}
+
+apex {
+    name: "com.google.emulated.camera.provider.hal",
+    manifest: "apex_manifest.json",
+    key: "com.google.emulated.camera.provider.hal.key",
+    certificate: ":com.google.emulated.camera.provider.hal.certificate",
+    file_contexts: "file_contexts",
+    use_vndk_as_stable: true,
+    updatable: false,
+    // Install the apex in /vendor/apex
+    soc_specific: true,
+    binaries: [
+        "android.hardware.camera.provider@2.7-service-google",
+    ],
+    native_shared_libs: [
+        "libgooglecamerahwl_impl",
+    ],
+    overrides: [
+        "android.hardware.camera.provider@2.7-impl-google",
+        "android.hardware.camera.provider@2.7-service-google",
+        "libgooglecamerahwl_impl",
+    ],
+    prebuilts: [
+        "com.google.emulated.camera.provider.hal.rc",
+        "android.hardware.camera.concurrent.prebuilt.xml",
+        "android.hardware.camera.flash-autofocus.prebuilt.xml",
+        "android.hardware.camera.front.prebuilt.xml",
+        "android.hardware.camera.full.prebuilt.xml",
+        "android.hardware.camera.raw.prebuilt.xml",
+        "emu_camera_back.json",
+        "emu_camera_depth.json",
+        "emu_camera_front.json",
+    ],
+    vintf_fragments: [":android.hardware.camera.provider@2.7-service-google.xml"],
+}
diff --git a/devices/EmulatedCamera/hwl/apex/apex_manifest.json b/devices/EmulatedCamera/hwl/apex/apex_manifest.json
new file mode 100644
index 0000000..50c09a8
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/apex_manifest.json
@@ -0,0 +1,4 @@
+{
+  "name": "com.google.emulated.camera.provider.hal",
+  "version": 1
+}
diff --git a/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.avbpubkey b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.avbpubkey
new file mode 100644
index 0000000..0c28e11
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.avbpubkey
Binary files differ
diff --git a/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.pem b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.pem
new file mode 100644
index 0000000..94c79c9
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.pem
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.pk8 b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.pk8
new file mode 100644
index 0000000..f83b5da
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.pk8
Binary files differ
diff --git a/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.rc b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.rc
new file mode 100644
index 0000000..134cd8f
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.rc
@@ -0,0 +1,7 @@
+service vendor.camera-provider-2-7-google /apex/com.google.emulated.camera.provider.hal/bin/hw/android.hardware.camera.provider@2.7-service-google
+    class hal
+    user system
+    group system
+    capabilities SYS_NICE
+    rlimit rtprio 10 10
+    task_profiles CameraServiceCapacity CameraServicePerformance
diff --git a/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.x509.pem b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.x509.pem
new file mode 100644
index 0000000..528c923
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/com.google.emulated.camera.provider.hal.x509.pem
@@ -0,0 +1,34 @@
+-----BEGIN CERTIFICATE-----
+MIIF7TCCA9UCFHsvubLT/OxpJdqifK/l7sBMmpCoMA0GCSqGSIb3DQEBCwUAMIGx
+MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
+bnRhaW4gVmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEi
+MCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTEtMCsGA1UEAwwkY29t
+LmFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyMCAXDTIyMDEyNDIzMTMy
+NloYDzQ3NTkxMjIxMjMxMzI2WjCBsTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB0FuZHJv
+aWQxEDAOBgNVBAsMB0FuZHJvaWQxIjAgBgkqhkiG9w0BCQEWE2FuZHJvaWRAYW5k
+cm9pZC5jb20xLTArBgNVBAMMJGNvbS5hbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5w
+cm92aWRlcjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK9HkJ08NHPl
+75cP95BmQ+ODGQ/9QWKyFn0oCmXAuIgjPDgOyqyCQ5zuUW2xOALeRBsB9+7vf4ZG
+zxiXf5FoBAg5p5wdYd1rxMlVvFUFhr0ciGw8gRiML35Ve3+3G+GzJtUft+KfQ932
+VvcDA6SobNhSfPeSEhIFhWQO/Rll3P7p7ipPre5IVsQR8MdkVW5mw7+i2C2SLbkx
+F8qRWhbD38syqoaD1LQcUxQZLFfchf2oSaN9YrfWgoQNZiYBlEHMRo7XGfjsgrJU
+HjyM0fJyzMLs1GGUr/BNlU0+SQFrRDQ85tzLaj5rcjLeiKk2O4PN529LR6/q7eBW
+vNT37q7CrRSfUXBCcVxx1R9f341VKutIxnbazPcGycsShETFj5RmHJse/2EveB6h
+5ficqIiSA5eKpLIkogsgZHadlz/FHjL+Q+5a19q2vkeR1SRgE4XZCE9O22clTv/g
+oWM7CoeZOpdB4ZeRxynusSNaShWeDRYxrQRsiMRIjn8TdTD+Nd6nD4/QKITFpuGF
+5klnaqx1s+XxdHBTQ0QNttKuTE212F0Vc6CcA0UwvoQGFjQfzOAiXBktLmh9vMRY
+6tTDhS9OK+Z6Ioy9S/Vv9vi77CRJ5Fl8g+rXlbkdJtp84B8igLvx/oOxu95mB/M7
+2RWwMGHnFFKS3aUZm7ypuJNBHTxk0PLZAgMBAAEwDQYJKoZIhvcNAQELBQADggIB
+AFAY+aeKyZ/UjgWX8vqWH7fLVKa4zwQGgLpr7Uo9c7vMtXwWdJkgbSzKQjcsC8WL
+c7c26Acv1CpULo3U/b67N+3WnQr3F3K3YraKuiBCMCuTjeq0k3yZyuwr2ktzpo23
+Ei77ldprBu/I7CSOWYOzJCgsymuSbzJhjEt2LKTR+gNLWyKFQJhZZIY2oTq1LT2j
+CMVYvVnuDSWW/Dt6u2+tIgFr2u3ZB7TtkfSNgT797gmCdRn4rEJFDH6ExFFDHBa4
+cfWPqZDs+X871jOInqkJVjBT6RMdW/PewY9i2gb/BU7mTziR8/n9+QvHBReH44Ys
+nVNjC09/njG/jrAILB3y/df4zDJUJMz1jOZXZyuAE0bo08+YhG58Ms1wJ26oAu9E
+PXBNDv9ihISsepOoY7laoFyrPIlXitRtXd/zbY+k7Uw0dwNNJ3dwhcuKO+FDW5pb
+Lubh2w6TgQKUGqPwe9C3hLmvYVqc34U/R61Fq33dRwl6wxzoWQ6R+DuC42GWFyiz
+nXWTUTPBOy9xTHtNi2nDvGh4M3ILLBWPseNJfQkDloLOlOjBQpMMvOfW0qcBQeRd
+cexJXMTwx/mEeron+cxIjQerWdvjNMhAPPQdFGN/yDbsoNrZdYH+xszJ2paa4gTl
+9Cl3KC8vmRy2JyD6P7Cv9D1BGekHODIRR+ccyfarcfGm
+-----END CERTIFICATE-----
diff --git a/devices/EmulatedCamera/hwl/apex/file_contexts b/devices/EmulatedCamera/hwl/apex/file_contexts
new file mode 100644
index 0000000..2f0ab85
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/apex/file_contexts
@@ -0,0 +1,5 @@
+(/.*)?                                                             u:object_r:vendor_file:s0
+# Permission XMLs
+/etc/permissions(/.*)?                                             u:object_r:vendor_configs_file:s0
+# Service binary
+/bin/hw/android\.hardware\.camera\.provider@2\.7-service-google    u:object_r:hal_camera_default_exec:s0
diff --git a/devices/EmulatedCamera/hwl/configs/Android.bp b/devices/EmulatedCamera/hwl/configs/Android.bp
new file mode 100644
index 0000000..25690de
--- /dev/null
+++ b/devices/EmulatedCamera/hwl/configs/Android.bp
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package {
+    // See: http://go/android-license-faq
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_defaults {
+    name: "emu_camera_config_defaults",
+    relative_install_path: "config",
+    soc_specific: true,
+    installable: false,
+}
+
+prebuilt_etc {
+    name: "emu_camera_back.json",
+    src: "emu_camera_back.json",
+    defaults: ["emu_camera_config_defaults"],
+}
+
+prebuilt_etc {
+    name: "emu_camera_depth.json",
+    src: "emu_camera_depth.json",
+    defaults: ["emu_camera_config_defaults"],
+}
+
+prebuilt_etc {
+    name: "emu_camera_front.json",
+    src: "emu_camera_front.json",
+    defaults: ["emu_camera_config_defaults"],
+}