zenfone9: Dynamicaly set vendor.camera.apk.usingname

based on

https://github.com/omnirom/android_device_oneplus_oneplus7pro/commit/f8c54c6a6f586bd14d4fc4ebd21f1dfb86e5c393

https://github.com/omnirom/android_device_oneplus_oneplus7pro/commit/197ae1884ff6ebf4c2c4dcbe7800ab88d9c3363e

Change-Id: Ia8aba937f07c859a5c29cd96a710be17bad94f5a
diff --git a/BoardConfig.mk b/BoardConfig.mk
index 8fb2a32..1a5c9f6 100755
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -89,6 +89,9 @@
 BUILD_BROKEN_DUP_RULES := true
 BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES := true
 
+# Camera
+TARGET_CAMERA_NEEDS_CLIENT_INFO := true
+
 # charger
 BOARD_CHARGER_DISABLE_INIT_BLANK := true
 
@@ -234,6 +237,7 @@
 include vendor/omni/sepolicy/sepolicy.mk
 include device/qcom/sepolicy_vendor/SEPolicy.mk
 BOARD_VENDOR_SEPOLICY_DIRS += $(DEVICE_PATH)/sepolicy/vendor
+SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS += $(DEVICE_PATH)/sepolicy/private
 
 # VNDK
 NEED_AIDL_NDK_PLATFORM_BACKEND := true
diff --git a/DeviceParts/src/org/omnirom/device/KeyHandler.java b/DeviceParts/src/org/omnirom/device/KeyHandler.java
index 74e72aa..676e597 100644
--- a/DeviceParts/src/org/omnirom/device/KeyHandler.java
+++ b/DeviceParts/src/org/omnirom/device/KeyHandler.java
@@ -104,6 +104,11 @@
 
     private static final String DT2W_CONTROL_PATH = "/proc/driver/dclick";
 
+    private static final String CLIENT_PACKAGE_NAME = "com.asus.camera";
+    private static final String CLIENT_PACKAGE_PATH = "/data/misc/omni/client_package_name";
+    private static final String VENDOR_PROPERTY_ACTIVITY = "vendor.camera.set.apk.activity";
+    private static final String VENDOR_PROPERTY_USINGNAME = "vendor.camera.set.apk.usingname";
+
     private static final int[] sSupportedGestures = new int[]{
         KEY_DOUBLE_TAP,
         KEY_GESTURE_E,
@@ -152,9 +157,10 @@
     private boolean mFPcheck;
     private boolean mDispOn;
     private boolean isFpgesture;
-    private boolean isOPCameraAvail;
+    private boolean isASUSCameraAvail;
     private boolean mRestoreUser;
     private boolean mDoubleTapToWake;
+    private ClientPackageNameObserver mClientObserver;
 
     private SensorEventListener mProximitySensor = new SensorEventListener() {
         @Override
@@ -279,6 +285,12 @@
         systemStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
         systemStateFilter.addAction(Intent.ACTION_USER_SWITCHED);
         mContext.registerReceiver(mSystemStateReceiver, systemStateFilter);
+
+        isASUSCameraAvail = PackageUtils.isAvailableApp(CLIENT_PACKAGE_NAME , context);
+        if (isASUSCameraAvail) {
+            mClientObserver = new ClientPackageNameObserver(CLIENT_PACKAGE_PATH);
+            mClientObserver.startWatching();
+        }
     }
 
     private class EventHandler extends Handler {
@@ -420,6 +432,10 @@
         if (mUseTiltCheck) {
             mSensorManager.unregisterListener(mTiltSensorListener, mTiltSensor);
         }
+        if ((mClientObserver == null) && (isASUSCameraAvail)) {
+            mClientObserver = new ClientPackageNameObserver(CLIENT_PACKAGE_PATH);
+            mClientObserver.startWatching();
+        }
     }
 
     private void updateDoubleTapToWake() {
@@ -441,6 +457,10 @@
             mSensorManager.registerListener(mTiltSensorListener, mTiltSensor,
                     SensorManager.SENSOR_DELAY_NORMAL);
         }
+        if (mClientObserver != null) {
+            mClientObserver.stopWatching();
+            mClientObserver = null;
+        }
     }
 
     private Intent createIntent(String value) {
@@ -600,4 +620,21 @@
     IStatusBarService getStatusBarService() {
         return IStatusBarService.Stub.asInterface(ServiceManager.getService("statusbar"));
     }
+
+    private class ClientPackageNameObserver extends FileObserver {
+
+        public ClientPackageNameObserver(String file) {
+            super(CLIENT_PACKAGE_PATH, MODIFY);
+        }
+
+        @Override
+        public void onEvent(int event, String file) {
+            String pkgName = Utils.getFileValue(CLIENT_PACKAGE_PATH, "0");
+            if (event == FileObserver.MODIFY) {
+                Log.d(TAG, "client_package" + file + " and " + pkgName);
+                SystemProperties.set(VENDOR_PROPERTY_ACTIVITY, pkgName);
+                SystemProperties.set(VENDOR_PROPERTY_USINGNAME, pkgName);
+            }
+        }
+    }
 }
diff --git a/prebuilt/system/etc/init/init.qcom.rc b/prebuilt/system/etc/init/init.qcom.rc
new file mode 100644
index 0000000..30e3482
--- /dev/null
+++ b/prebuilt/system/etc/init/init.qcom.rc
@@ -0,0 +1,5 @@
+on boot
+    mkdir /data/misc/omni 0770 cameraserver audio
+    write /data/misc/omni/client_package_name 0
+    chown cameraserver audio /data/misc/omni/client_package_name
+    chmod 0644 /data/misc/omni/client_package_name
diff --git a/sepolicy/private/cameraserver.te b/sepolicy/private/cameraserver.te
new file mode 100644
index 0000000..6c6b7ba
--- /dev/null
+++ b/sepolicy/private/cameraserver.te
@@ -0,0 +1,2 @@
+allow cameraserver omni_data_file:file rw_file_perms;
+allow cameraserver omni_data_file:dir write;
diff --git a/sepolicy/private/file.te b/sepolicy/private/file.te
new file mode 100644
index 0000000..1ba3a38
--- /dev/null
+++ b/sepolicy/private/file.te
@@ -0,0 +1,2 @@
+# Camera file
+type omni_data_file, file_type, data_file_type,  core_data_file_type;
diff --git a/sepolicy/private/file_contexts b/sepolicy/private/file_contexts
new file mode 100644
index 0000000..3586139
--- /dev/null
+++ b/sepolicy/private/file_contexts
@@ -0,0 +1,2 @@
+# Camera
+/data/misc/omni/client_package_name                u:object_r:omni_data_file:s0
diff --git a/sepolicy/private/hal_audio.te b/sepolicy/private/hal_audio.te
new file mode 100644
index 0000000..fb7de27
--- /dev/null
+++ b/sepolicy/private/hal_audio.te
@@ -0,0 +1 @@
+allow hal_audio system_suspend_hwservice:hwservice_manager find;
diff --git a/sepolicy/private/system_server.te b/sepolicy/private/system_server.te
new file mode 100644
index 0000000..e5938fe
--- /dev/null
+++ b/sepolicy/private/system_server.te
@@ -0,0 +1,2 @@
+# Camera
+allow system_server omni_data_file:file r_file_perms;
diff --git a/sepolicy/vendor/cameraserver.te b/sepolicy/vendor/cameraserver.te
new file mode 100644
index 0000000..6ba24bc
--- /dev/null
+++ b/sepolicy/vendor/cameraserver.te
@@ -0,0 +1,2 @@
+get_prop(cameraserver, vendor_set_camera_prop)
+set_prop(cameraserver, vendor_set_camera_prop)
diff --git a/sepolicy/vendor/platform_app.te b/sepolicy/vendor/platform_app.te
index 3e66ede..a820bb4 100644
--- a/sepolicy/vendor/platform_app.te
+++ b/sepolicy/vendor/platform_app.te
@@ -3,3 +3,6 @@
 get_prop(platform_app, vendor_camera_prop)
 
 allow platform_app ois_device:chr_file rw_file_perms;
+
+get_prop(platform_app, vendor_set_camera_prop)
+set_prop(platform_app, vendor_set_camera_prop)
diff --git a/sepolicy/vendor/priv_app.te b/sepolicy/vendor/priv_app.te
index 1071dac..037c071 100644
--- a/sepolicy/vendor/priv_app.te
+++ b/sepolicy/vendor/priv_app.te
@@ -1,3 +1,5 @@
 get_prop(priv_app, vendor_asus_prop)
 
 allow priv_app ois_device:chr_file rw_file_perms;
+
+get_prop(priv_app, vendor_set_camera_prop)
diff --git a/sepolicy/vendor/system_app.te b/sepolicy/vendor/system_app.te
index d3aa005..a826f1c 100644
--- a/sepolicy/vendor/system_app.te
+++ b/sepolicy/vendor/system_app.te
@@ -8,3 +8,6 @@
 
 get_prop(system_app, vendor_asus_usb_prop)
 allow system_app vendor_asus_usb_prop:property_service set;
+
+get_prop(system_app, vendor_set_camera_prop)
+set_prop(system_app, vendor_set_camera_prop)
diff --git a/sepolicy/vendor/system_server.te b/sepolicy/vendor/system_server.te
index 7d0f8b8..5aaf110 100644
--- a/sepolicy/vendor/system_server.te
+++ b/sepolicy/vendor/system_server.te
@@ -4,3 +4,6 @@
 get_prop(system_server, vendor_asus_prop)
 
 get_prop(system_server, vendor_alsp_prop)
+
+get_prop(system_server, vendor_set_camera_prop)
+set_prop(system_server, vendor_set_camera_prop)
diff --git a/sepolicy/vendor/vendor_init.te b/sepolicy/vendor/vendor_init.te
index 64f9511..e17a2bd 100644
--- a/sepolicy/vendor/vendor_init.te
+++ b/sepolicy/vendor/vendor_init.te
@@ -18,3 +18,5 @@
 
 get_prop(vendor_init, vendor_asus_storage_prop_2)
 set_prop(vendor_init, vendor_asus_storage_prop_2)
+
+get_prop(vendor_init, vendor_set_camera_prop)